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
相关产品推荐
相关产品推荐

