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

如何通过Ansible从意图文件生成指定格式的字典?

Ansible实现从YAML文件生成目标字典的完整方案

需求说明

现有YAML配置文件myfile.yml内容如下:

"ABC":
    "ABC-C01":
       - host: "a1"
         prefixlen: "19"
       - host: "a2"
         prefixlen: "19"
"DEF":
    "DEF-C01":
       - host: "d1"
         prefixlen: "19"
       - host: "d2"
         prefixlen: "19"

需要生成如下格式的字典:

ABC-C01:
    - a1.domain
    - a2.domain
  DEF-C01:
    - d1.domain
    - d2.domain

完整Playbook实现方案

方案一:循环遍历构建

- name: 生成目标格式字典
  hosts: localhost
  gather_facts: false
  tasks:
    - name: 加载源配置文件
      include_vars:
        file: myfile.yml
        name: myfile

    - name: 逐步构建目标字典
      set_fact:
        target_dict: >-
          {{
            target_dict | default({}) | combine({
              cluster_name: myfile[dc_key][cluster_name] | map(attribute='host') | map('regex_replace', '^(.*)$', '\1.domain') | list
            })
          }}
      loop: "{{ myfile.keys() | list }}"
      loop_control:
        loop_var: dc_key
      vars:
        cluster_name: "{{ myfile[dc_key].keys() | first }}"

    - name: 输出最终结果
      debug:
        var: target_dict

方案二:用json_query简化处理

- name: 生成目标格式字典
  hosts: localhost
  gather_facts: false
  tasks:
    - name: 加载源配置文件
      include_vars:
        file: myfile.yml
        name: myfile

    - name: 提取集群与主机列表
      set_fact:
        temp_dict: >-
          {{
            myfile | dict2items | json_query('[].value | dict2items | [].{key: key, value: value[].host}') | items2dict
          }}

    - name: 为主机添加域名后缀
      set_fact:
        target_dict: >-
          {{
            target_dict | default({}) | combine({
              item.key: item.value | map('regex_replace', '^(.*)$', '\1.domain') | list
            })
          }}
      loop: "{{ temp_dict | dict2items }}"

    - name: 输出最终结果
      debug:
        var: target_dict

关键逻辑说明

  1. 加载配置:通过include_vars将源YAML文件加载为Ansible变量myfile。
  2. 提取主机并添加域名:使用map(attribute='host')提取每个集群下的主机名,再通过regex_replace统一追加.domain后缀。
  3. 构建目标字典:通过combine方法逐步将集群名称与处理后的主机列表组合成目标格式的字典。

内容的提问来源于stack exchange,提问作者devopstechy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 10:55:16