Ansible 2.4.2.0:如何用loop的item作为哈希键构建目标哈希
解决Ansible动态构建哈希结构的语法问题
在Ansible 2.4.2.0中,你尝试的set_fact写法语法有误——Ansible不允许直接在set_fact的键位使用{{ host[item.item] }}这种动态变量表达式。要构建你需要的哈希结构,我们可以用两种简洁可行的方案实现:
方案一:使用items2dict过滤器(推荐,高效简洁)
Ansible 2.3及以上版本支持items2dict过滤器,可以直接将列表转换为键值对字典,完美匹配你的需求:
- name: 从结果列表生成内部键值对字典 set_fact: inner_dict: "{{ json.results | items2dict(key_name='item', value_name='stdout_lines') }}" - name: 构建最终目标哈希结构 set_fact: final_hash: "{{ { host: inner_dict } }}"
说明:
items2dict(key_name='item', value_name='stdout_lines')会遍历json.results中的每个元素,用每个元素的item字段作为键,stdout_lines字段作为值,生成{"myname": "abc", "myname2": "xyz"}这样的内部字典。- 第二步通过
{ host: inner_dict }的语法,将host变量的值(mymachine)作为外层字典的键,内部字典作为对应值,正好得到你想要的结构。
方案二:循环累加构建字典(适合理解底层逻辑)
如果你希望手动控制字典的构建过程,可以用循环结合combine过滤器逐步合并键值对:
- name: 循环累加键值对到内部字典 set_fact: inner_dict: "{{ inner_dict | default({}) | combine({ item.item: item.stdout_lines }) }}" with_items: "{{ json.results }}" - name: 组装最终哈希结构 set_fact: final_hash: "{{ { host: inner_dict } }}"
说明:
default({})用于初始化一个空字典,避免第一次循环时变量不存在的错误。combine过滤器会把当前循环得到的键值对({ item.item: item.stdout_lines })合并到inner_dict中,最终生成和方案一一致的内部字典。
执行完成后,final_hash变量就会是你需要的结构:
{ "mymachine": { "myname": "abc", "myname2": "xyz" } }
内容的提问来源于stack exchange,提问作者Maik
相关产品推荐
相关产品推荐

