looping over dict elements

I have the following structure:

“a”: {
“v1”: 1,
“v2”: “A”
}
“b”: {
“v1”: 2,
“v2”: “B”
}

It is read from an external json source using:

- set_fact: envs="{{ external.stdout | from_json }}"

I can loop/iterate over it only by using with_dict:

- debug: msg="Item is {{ item.key }} with value {{ item.value.v1}} and{{ item.value.v2}}"
  with_dict: envs

but if I try anything else it throws exception:

AttributeError: ‘unicode’ object has no attribute ‘items’

I tried the following:

- set_fact: envs_list="{{ envs | dictsort }}"

and:

- debug: var=item
  with_items: envs.items()

and inside template:

{% for env in envs|dictsort %}

and:

{% for env, setting in envs.`iteritems`() %}

…with the same result.

I would need to use that structure inside a template…

I’m using ansible 1.9.1 on CentOS 6

Any idea how to solve that?

UPDATE: Python 2.6.6

  1. november 4., szerda 16:46:27 UTC+1 időpontban Bence Takács a következőt írta:

Use from_json during the “last mile”, as the set_fact is casting that output back to a string.

Such as:

{% for env in envs|from_json|dictsort %}

and drop from_json from your set_fact. Or just use external.stdout|from_json|dictsort where you need it, and don’t use set_fact.

Thanks, this works!

But in that case I need to put that expression everywhere I want to use that variable.

Is there a way to register new object variable while running the playbook?

  1. november 4., szerda 17:34:59 UTC+1 időpontban Matt Martz a következőt írta: