如何在Ansible中获取嵌套字典的键与子键并传入Jinja2模板
Ansible 嵌套字典遍历:获取键与子键并生成输出
问题场景
现有如下YAML数据结构:
blob: TEST: dest: barry: {y.y.y.y: null} john: {x.x.x.x: null} source: [1.2.3.4]
需要实现类似以下Python逻辑的遍历,获取blob的键(如TEST)以及对应dest下的子键(如barry、john),用于生成文件名或其他输出:
for i in blob.keys(): for s in blob[i]['dest'].keys(): # 使用i和s生成内容
期望输出示例:
key: TEST subkey: john key: TEST subkey: barry
原尝试方法的问题
你用with_subelements的写法无法生效,因为with_subelements要求第一个参数的列表元素中,必须包含第二个参数指定的嵌套字段(即每个元素是带有对应子字段的字典)。但你传入的blob.keys()是字符串列表,不存在blob[item.0]['dest'].keys()这样的嵌套结构,Ansible无法解析。
正确实现方式
方法1:结合with_dict与内层loop
逻辑清晰,先遍历blob的键值对,再内层遍历对应dest的子键:
- name: 遍历嵌套字典的键与子键 debug: msg: "key: {{ outer_item.key }} subkey: {{ inner_item }}" loop: "{{ outer_item.value.dest.keys() }}" loop_control: loop_var: inner_item with_dict: "{{ blob }}"
方法2:使用dict2items与subelements过滤器
通过dict2items将字典转换为键值对列表,再用subelements提取嵌套的dest子键,更贴合现代Ansible写法:
- name: 遍历嵌套字典的键与子键 debug: msg: "key: {{ item.0.key }} subkey: {{ item.1.key }}" loop: "{{ blob | dict2items | subelements('value.dest', skip_missing=True) }}"
注:
skip_missing=True用于避免部分blob项无dest字段时出错,可按需调整。
输出结果
两种方法都会生成符合预期的内容:
ok: [localhost] => (item=john) => { "msg": "key: TEST subkey: john" } ok: [localhost] => (item=barry) => { "msg": "key: TEST subkey: barry" }
内容的提问来源于stack exchange,提问作者MarkM
相关产品推荐
相关产品推荐

