如何通过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
关键逻辑说明
- 加载配置:通过
include_vars将源YAML文件加载为Ansible变量myfile。 - 提取主机并添加域名:使用
map(attribute='host')提取每个集群下的主机名,再通过regex_replace统一追加.domain后缀。 - 构建目标字典:通过
combine方法逐步将集群名称与处理后的主机列表组合成目标格式的字典。
内容的提问来源于stack exchange,提问作者devopstechy
相关产品推荐
相关产品推荐

