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

Ansible如何循环字典列表并与另一字典列表合并?

解决方案

直接在inventory中利用Ansible的过滤器组合来实现列表合并与字段转换,无需依赖变量文件的Jinja2模板。

1. 定义基础变量

先在inventory里定义你的基础ZFS列表和Docker应用列表:

# inventory.yaml 中的变量定义
docker_applications:
  - name: nextcloud
    zfs_opts: "-o compression=lz4 -o atime=off"
  - name: plex
    zfs_opts: "-o compression=zstd -o recordsize=1M"

# 基础ZFS文件系统列表
zfs_filesystems_base:
  - name: docker
    zfs_opts: "-o mountpoint=/var/lib/docker"

2. 生成合并后的ZFS列表

在inventory中添加最终变量的定义,通过过滤器完成转换与合并:

zfs_filesystems: "{{ zfs_filesystems_base + docker_applications | map('combine', {'name': 'docker/' ~ item.name}) | list }}"

如果担心部分docker_applications条目缺少zfs_opts字段,可以添加默认值避免报错:

zfs_filesystems: "{{ zfs_filesystems_base + docker_applications | map('combine', {'name': 'docker/' ~ item.name, 'zfs_opts': item.zfs_opts | default('')}) | list }}"

3. 预期输出

最终zfs_filesystems变量的结构会自动生成为:

zfs_filesystems:
  - name: docker
    zfs_opts: "-o mountpoint=/var/lib/docker"
  - name: docker/nextcloud
    zfs_opts: "-o compression=lz4 -o atime=off"
  - name: docker/plex
    zfs_opts: "-o compression=zstd -o recordsize=1M"

原理说明

  • map('combine', {'name': 'docker/' ~ item.name}):遍历docker_applications列表中的每个条目,用combine过滤器替换原有name字段的值,加上docker/前缀。
  • +运算符:将基础ZFS列表与转换后的Docker应用ZFS条目列表直接合并,得到最终的完整列表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 22:50:33