Ansible字典列表循环:如何正确提取键值对注入命令?
问题分析与解决方案
你的问题核心在于:my_example_list里的每个元素是仅包含单个动态键名的字典(比如第一个元素是{"key1": "value_of_first_key"},键名是key1而非统一的key字段),所以直接用item.key和item.value会找不到对应字段——因为这些字典根本没有叫key或value的键。
先修正你的变量定义(Ansible中变量赋值不用=,正确写法如下):
my_example_list: - {"key1": "value_of_first_key"} - {"key2": "value_of_second_key"} - {"key3": "value_of_third_key"}
方法1:用dict2items过滤器统一结构
这个过滤器可以把单个键值对的字典转换成{"key": "xxx", "value": "yyy"}的标准结构,这样就能直接用item.key和item.value了:
- name: 遍历字典列表并输出键值 debug: msg: "Here is my {{ item.key }} which keeps {{ item.value }}" loop: "{{ my_example_list | map('dict2items') | map('first') | list }}"
解释:
map('dict2items')把每个字典转成包含键值对的列表(比如{"key1": "xxx"}变成[{"key": "key1", "value": "xxx"}])map('first')取出每个列表里的唯一元素list把结果转成可循环的列表
方法2:直接提取动态键和值
因为每个字典只有一个键值对,所以可以直接用first过滤器取键和值:
- name: 遍历字典列表并输出键值 debug: msg: "Here is my {{ item.keys() | first }} which keeps {{ item.values() | first }}" loop: "{{ my_example_list }}"
解释:
item.keys() | first取出当前字典的唯一键名(比如key1)item.values() | first取出对应的值
你之前尝试失败的原因
my_example_list[1] | last:my_example_list[1]是列表的第二个元素(字典{"key2": "..."}),对字典用last会取最后一个键名,而你想取列表最后一个元素应该写my_example_list | lastmy_example_list[1] | first:同样是对字典操作,取的是字典的第一个键名key2,而非你想要的元素值item.key/item.value失败:因为每个item的键名是动态的key1/key2/key3,没有统一的key字段
内容的提问来源于stack exchange,提问作者v124
相关产品推荐
相关产品推荐

