在字典中迭代字典

问题描述 投票:0回答:1

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

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

我需要迭代dicts中的dicts并创建任务,有点像这样:

- 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,但这似乎并不能满足我的需求。

亲切的问候,乔纳斯

ansible
1个回答
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,", 
    ""
]
© www.soinside.com 2019 - 2024. All rights reserved.