在字典中迭代字典

时间:2019-04-16 14:06:40

标签: ansible

我有一个像这样的json结构:

{
  "group_a": {
    "setting_one": "text one",
    "setting_two": "text two"
  },
  "group_b": {
    "setting_three": "text three",
    "setting_four": "text four"
  }
}

我需要遍历字典内部的字典并创建任务,就像这样:

- name: Task group_a setting_one
  ...
- name: Task group_a setting_two
  ...
- name: Task group_b setting_three
  ...
- name: Task group_b setting_four
  ...

我希望做这样的事情:

- name: Insert {{ group }} {{ setting }}
  ini_file:
    path: settings.ini
    section: "{{ group }}"
    option: "{{ setting }}"
    value: "{{ setting_value }}"
  with_nested:
    - "{{ data.keys() }}" # Can I get this key and use in the next loop?
    - "{{ data.key.keys() }}"

我该怎么做?我一直在和loopwith_itemswith_dict等混为一谈,但是我无法完全按照自己的方式来获得它。我也尝试过with_nested,但这似乎也无法满足我的需要。

亲切的问候,乔纳斯

1 个答案:

答案 0 :(得分:0)

让我们将结构简化为具有相同信息的

my_data:
  group_a:
    - one
    - two
  group_b:
    - three
    - four

然后在下面播放

- debug:
    msg: "{{ item.0.key }} setting_{{ item.1 }}"
  with_subelements:
    - "{{ my_data|dict2items }}"
    - value

给予:

"msg": "group_b setting_three"
"msg": "group_b setting_four"
"msg": "group_a setting_one"
"msg": "group_a setting_two"

使用原始数据并非易事。下面的播放将键和值分开

  tasks:
    - set_fact:
        my_groups: "{{ my_data.keys()}}"
    - debug:
        msg: "{{ item }} {{ my_data|dict2items|json_query(my_query)|to_yaml }}"
      loop: "{{ my_groups }}"
      vars:
        my_query: "[?key=='{{ item }}'].value"

并给出:

"msg": "group_b - - {setting_three: text three}\n  - {setting_four: text four}\n"
"msg": "group_a - - {setting_one: text one}\n  - {setting_two: text two}\n"

需要执行多步循环。例如下面的播放

- set_fact:
    my_data1: |
      {% for group, values in my_data.items() %}
      {% for value in values %}
      {% for item_key, item_val in value.items() %}
      Task {{ group }} {{ item_key }},
      {% endfor %}{% endfor %}{% endfor %}
- debug:
    msg: "{{ my_data1.split('\n') }}"

给予:

"msg": [
    "Task group_b setting_three,", 
    "Task group_b setting_four,", 
    "Task group_a setting_one,", 
    "Task group_a setting_two,", 
    ""
]