Ansible遍历字典列表打印各字典键值对的实现方案
问题原因
报错的核心原因是你列表内的字典不存在名为key、value的固定键:你代码里写的item.key是尝试读取当前字典中键为key的对应值,但你实际的字典键是key1、key2、key3,自然会触发属性不存在的错误。
可行实现方案
根据你的场景(列表中每个字典为单键值对结构),有以下几种常用正确写法:
方案1:直接取单键字典的首个键值(写法最简洁,适配你当前的单键字典场景)
直接遍历原列表,对每个字典提取第一个键和对应值即可:
- hosts: localhost gather_facts: no tasks: - set_fact: mylst: "{{ lookup('file', '/home/ansible/test.json') | from_json }}" - debug: msg: "Key/values are {{ item.keys() | first }} and {{ item.values() | first }}" loop: "{{ mylst }}"
方案2:合并字典后转键值对列表(和你预期的item.key/item.value写法完全匹配)
先把列表里的所有小字典合并为一个大字典,再通过dict2items过滤器转成自带key/value属性的列表遍历,注意该方法要求所有字典的键不重复,否则会出现键覆盖:
- hosts: localhost gather_facts: no tasks: - set_fact: mylst: "{{ lookup('file', '/home/ansible/test.json') | from_json }}" - debug: msg: "Key/values are {{ item.key }} and {{ item.value }}" loop: "{{ mylst | combine | dict2items }}"
方案3:逐字典转换键值对(通用性最强,即使单个字典包含多个键值对也能正常遍历)
对列表中每个字典单独做键值对转换,适合后续可能调整JSON结构、单个字典存在多组键值的场景:
- hosts: localhost gather_facts: no tasks: - set_fact: mylst: "{{ lookup('file', '/home/ansible/test.json') | from_json }}" - debug: msg: "Key/values are {{ kv.key }} and {{ kv.value }}" loop: "{{ mylst | map('dict2items') | flatten }}" loop_control: loop_var: kv
注:旧版本Ansible中如果
loop关键字不生效,可以替换为with_items,效果完全一致。
内容的提问来源于stack exchange,提问作者linuxfan
相关产品推荐
相关产品推荐

