如何用原生Ansible扁平化嵌套字典以生成TOML配置文件?
原生Ansible实现嵌套字典扁平化并生成TOML配置(适配v2.10)
核心思路
通过Ansible原生过滤器拆分嵌套字典结构,区分顶级键值对和段落(section)内的键值对,再利用community.general.ini_file模块分别写入配置文件,无需依赖Jinja模板或临时hack方案。
分步实现
1. 拆分嵌套字典
使用dict2items将顶层字典转换为键值对列表,再通过subelements过滤器提取段落内的子项,同时跳过非字典类型的顶级参数。
2. 分批次写入配置
- 处理顶级参数:直接写入无section的配置项(对应TOML的顶级键值)
- 处理段落内参数:循环每个段落的子项,指定section为原父键(对应TOML的
[section]块)
完整Playbook示例
- name: 生成符合要求的TOML配置文件 hosts: localhost vars: config: param0_1: value0_1 # 无段落/表的键值对 section1: # 对应段落/表"section1"的字典 param1_1: value1_1 section2: # 段落/表"section2" param2_1: value2_1 param2_2: value2_2 toml_file_path: "./config.toml" tasks: # 写入顶级参数(无section的键值对) - name: 写入顶级配置项 community.general.ini_file: path: "{{ toml_file_path }}" section: "" option: "{{ item.key }}" value: "'{{ item.value }}'" state: present no_extra_spaces: yes loop: "{{ config | dict2items }}" when: item.value is not mapping # 写入段落内的参数 - name: 写入段落内的配置项 community.general.ini_file: path: "{{ toml_file_path }}" section: "{{ item.0.key }}" option: "{{ item.1.key }}" value: "'{{ item.1.value }}'" state: present no_extra_spaces: yes loop: "{{ config | dict2items | subelements('value', skip_missing=True) }}"
关键说明
- 过滤器兼容性:
dict2items和subelements在Ansible 2.10中均为原生支持的过滤器,无需额外依赖 - TOML格式兼容:
ini_file生成的无section项对应TOML顶级键值,section块对应TOML的[section]表结构,满足格式要求 - 增量修改支持:
state=present确保仅添加/更新指定配置项,不会覆盖外部修改的内容(符合你提到的文件会被外部修改的需求) - 值格式处理:给value添加单引号,适配TOML的字符串格式要求
执行效果
生成的config.toml内容与你期望的完全一致:
param0_1 = 'value0_1' [section1] param1_1 = 'value1_1' [section2] param2_1 = 'value2_1' param2_2 = 'value2_2'
内容的提问来源于stack exchange,提问作者CDuv
相关产品推荐
相关产品推荐

