You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 } }}"

说明:

  1. items2dict(key_name='item', value_name='stdout_lines')会遍历json.results中的每个元素,用每个元素的item字段作为键,stdout_lines字段作为值,生成{"myname": "abc", "myname2": "xyz"}这样的内部字典。
  2. 第二步通过{ 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:54:25