Ansible多维字典扁平化:是否有通用插件可用?
关于Ansible多维字典扁平化的插件需求
我有一个用于配置多发行版镜像获取地址的多维字典,具体结构如下:
- name: Test Playbook hosts: localhost gather_facts: false vars: distributions_images: Debian: 12: name: bookworm images: cloud: <url> lxc: <url> classic: <url> 11: name: bullseye images: cloud: <url> lxc: <url> classic: <url> Ubuntu: 24: name: noble images: cloud: <url> lxc: <url> classic: <url> desktop: <url> 22: name: jammy images: cloud: <url> lxc: <url> classic: <url> desktop: <url> tasks: - name: Get all images ansible.builtin.debug: var: distributions_images | <flatten_dict dim1='distribution', dim2='version'>
我希望将所有键值对扁平化,得到如下格式的结果:
- distribution: Debian version: 12 name: bookworm cloud: <url> lxc: <url> classic: <url> ... - distribution: Ubuntu version: 22 name: jammy cloud: <url> lxc: <url> classic: <url> desktop: <url>
我需要一个实现此功能的通用插件,请问是否存在这类通用插件,还是需要自行编写?
回答
不需要自行编写全新插件,通过Ansible原生过滤器组合就能实现需求,也可以借助社区维护的通用过滤器:
方法1:使用原生过滤器组合
通过dict2items、subelements、combine和omit这些原生过滤器的组合,可以快速完成扁平化:
- name: 扁平化发行版镜像字典 ansible.builtin.set_fact: flattened_images: "{{ flattened_images | default([]) + [ {'distribution': item.0.key, 'version': item.1.key} | combine(item.1.value) | combine(item.1.value.images) | omit('images') ] }}" loop: "{{ distributions_images | dict2items | subelements('value') }}"
逻辑说明:
dict2items:将顶层的发行版字典(如Debian、Ubuntu)转换为键值对列表subelements:展开每个发行版下的版本子字典combine:将发行版名称、版本号、发行版别名(name)、镜像地址字段合并为单个字典omit:移除不需要保留的images嵌套键- 循环将每个合并后的字典追加到结果列表中
方法2:使用社区通用过滤器
如果觉得原生过滤器链过于繁琐,可以使用community.general集合中的通用扁平化类过滤器,不过需要先安装community.general集合:
ansible-galaxy collection install community.general
部分社区过滤器支持通过参数指定层级键名(如你示例中的dim1='distribution'),能进一步简化操作。
内容的提问来源于stack exchange,提问作者Yves Guduszeit
相关产品推荐
相关产品推荐

