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

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

逻辑说明:

  1. dict2items:将顶层的发行版字典(如Debian、Ubuntu)转换为键值对列表
  2. subelements:展开每个发行版下的版本子字典
  3. combine:将发行版名称、版本号、发行版别名(name)、镜像地址字段合并为单个字典
  4. omit:移除不需要保留的images嵌套键
  5. 循环将每个合并后的字典追加到结果列表中

方法2:使用社区通用过滤器

如果觉得原生过滤器链过于繁琐,可以使用community.general集合中的通用扁平化类过滤器,不过需要先安装community.general集合:

ansible-galaxy collection install community.general

部分社区过滤器支持通过参数指定层级键名(如你示例中的dim1='distribution'),能进一步简化操作。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 08:30:10