ansible 根据属性合并两个列表

2023-12-22

我在我的剧本中扮演一个角色,使用 set_fact 生成两个列表。 这两个事实用于不同的任务。 然后我需要将它们合并以完成最终任务。

list1:
  - name: alice
    roles: ['role1', 'role2']
  - name: bob
    roles: ['role1']

list2:
  - name: alice
    roles: ['role3']
  - name: charlie
    roles: ['role2']

对于我的最终任务,我需要输出为:

list3:
  - name: alice
    roles: ['role1', 'role2', 'role3']
  - name: bob
    roles: ['role1']
  - name: charlie
    roles: ['role2']

我在评论中询问了列表与字典的问题,因为它会对解决方案产生影响。如果您要像这样重组数据:

dict1:
  alice: ['role1', 'role2']
  bob: ['role1']

dict2:
  alice: ['role3']
  charlie: ['role2']

那么你的解决方案就变成了:

- set_fact:
    dict3: >-
      {{
      dict3|default([])|combine({
      item: (dict1[item]|default([]) + dict2[item]|default([]))|unique
      })
      }}
  loop: "{{ (dict1.keys()|list + dict2.keys()|list)|unique }}"

- debug:
    var: dict3

哪个输出:

TASK [debug] **********************************************************************************************************************************************************************************
ok: [localhost] => {
    "dict3": {
        "alice": [
            "role1", 
            "role2", 
            "role3"
        ], 
        "bob": [
            "role1"
        ], 
        "charlie": [
            "role2"
        ]
    }
}

如果您坚持使用列表,我们可以改进json_queryZeitounator 建议的解决方案:

- set_fact:
    list3: >-
      {{
      list3|default([]) + [{
      'name': item,
      'roles': (list1|json_query('[?name==`' + item + '`].roles[]') + list2|json_query('[?name==`' + item + '`].roles[]'))|unique
      }]
      }}
  loop: "{{ (list1|json_query('[].name') + list2|json_query('[].name'))|unique }}"

- debug:
    var: list3

这会产生您想要的输出:

TASK [debug] **********************************************************************************************************************************************************************************
ok: [localhost] => {
    "list3": [
        {
            "name": "alice", 
            "roles": [
                "role1", 
                "role2", 
                "role3"
            ]
        }, 
        {
            "name": "bob", 
            "roles": [
                "role1"
            ]
        }, 
        {
            "name": "charlie", 
            "roles": [
                "role2"
            ]
        }
    ]
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ansible 根据属性合并两个列表 的相关文章

  • 使用 Ansible 配置 EC2 实例时遇到问题

    我对如何使用 Ansible 启动 EC2 实例感到非常困惑 我正在尝试使用 ec2 py 库存脚本 我不确定应该使用哪一个 因为 Ansible 安装了三个 ansible lib ansible module utils ec2 py
  • ansible 用户模块总是显示已更改

    我正在努力正确使用 ansible 的用户模块 问题是每次我运行我的剧本时 我创建的用户always显示为已更改 即使我已经创建了它们 我在这里发现其他人也有同样的问题 https github com ansible ansible is
  • 在ansible中合并字典

    我目前正在构建一个使用 ansible 安装 PHP 的角色 并且在合并字典时遇到一些困难 我尝试了多种方法来做到这一点 但我无法让它像我想要的那样工作 A vars file my default values key value my
  • Ansible 测试变量以什么开头

    我需要能够安装 MySQL 库 Python 有 1 个用于 v2 的包和另一个用于 v3 的包 我需要能够告诉 Ansible 要安装哪个包 name Ensure MySQL python is installed pip name M
  • 连接到上游时 Nginx 错误:(13:权限被拒绝)

    我在我的中收到此错误nginx error log file 2014 02 17 03 42 20 crit 5455 0 1 connect to unix tmp uwsgi sock failed 13 Permission den
  • 如何更改 ansible_default_ipv4?

    我想将 ansible default ipv4 更改为指向 eth1 而不是 eth0 我可以在剧本中或通过 extra vars 选项来执行此操作吗 ansible 使用命令 https github com ansible ansib
  • ansible 重新启动 2.1.1.0 失败

    我一直在尝试创建一个非常简单的 Ansible 剧本 它将重新启动服务器并等待它回来 我过去在 Ansible 1 9 上有一个可以运行的 但我最近升级到 2 1 1 0 并且失败了 我正在重新启动的主机名为 idm IP 为 192 16
  • 开发/生产中的 Ansible 服务器/组

    我所处的情况是看不到正确的使用方法 我有多个分配了不同角色的服务器 分布在多个组中 与生产 登台环境相比 我在本地 Vagrant 环境中遇到了一些使用 group vars 的困难 在生产中 有更多的服务器 分配的组更少 在我的 Vagr
  • 正在中止,目标使用 selinux 但未安装 Python 绑定 (libselinux-Python)

    我正在尝试运行 Ansible playbook 命令并收到如下错误 fatal localhost FAILED gt changed false msg Aborting target uses selinux but python b
  • 如何使用 Vagrant 自动安装 Ansible Galaxy 角色?

    仅使用一本剧本 则不可能让 Ansible 自动安装依赖角色 至少按照这个所以线程 https stackoverflow com questions 25230376 how to automatically install ansibl
  • 无法获得与取消存档模块一起使用的“排除”选项

    我有一个 tar gzip 文件 我正在使用 ansible 取消归档模块将其提取到主机列表中 以下是configs tgz的部分内容列表 rw rw r ian ian 1295 2015 09 25 15 27 Makefile rw
  • 在 sudo 用户下应用角色

    是否可以在 Ansible 中应用 sudo 等特定角色 具体来说 这些是从 ansible galaxy 获取的角色 因此来源不在我的控制范围内 这个例子 https raymii org s tutorials Ansible Bett
  • 如何在 Ansible 中创建相对符号链接?

    在我的剧本中 我需要为存储库创建符号链接 使用命令 shell 它可能像这样工作 Create symbolic link name Create symbolic link shell ln s SOURCE FOLDER SYMLINK
  • 如何使用ansible扩展Windows路径变量

    使用 win environment 可以向 Windows 主机添加 删除环境变量 但是要修改已经存在的变量 win environment 似乎没有用 因为您无法读取旧值来修改和更新变量 正确的 EDIT 从 Ansible 2 3 开
  • Cloudformation 堆栈在执行所有用户数据之前显示为完整

    在我的 cloudformation 堆栈中 我有一个启动配置 它在用户数据中运行 ansible 脚本 这里的问题是 我的堆栈状态显示CREATE COMPLETE即使 ansible 脚本尚未完成执行 在我 ssh 进入 ec2 实例后
  • Ansible - 任务系列 1 逆序

    我想创建两本剧本 一本用于停止环境 另一本用于启动它 环境的一部分是 RabbitMQ 集群 对于其停止 启动顺序非常重要 特别是最后一个停止的节点需要是第一个启动的节点 我想知道是否有一种方法可以指定针对组运行任务的相反顺序 这样我就可以
  • ansible unarchive 模块如何查找 tar 二进制文件?

    我正在尝试执行一个 ansible 剧本 该剧本的任务是利用unarchive模块 因为我是在 OSX 上执行此操作 所以我需要使用它gnu tar 而不是bsd tar通常与 OSX 一起提供 因为BSD tar 不受官方支持 https
  • 在 Ansible 中为多个任务定义一个通知块

    是否可以定义一个notify阻止多个任务 在下一个代码片段中notify restart tomcat定义了 3 次 但我只想定义一次并 应用 到任务列表 name template context xml template src con
  • Ansible:findall 正则表达式中变量的正确语法是什么

    我使用的是 Ansible 版本 2 9 我想做一个 GET 它返回一个信息块 从该信息中正则表达式一个 ID 该 ID 对应于我目前正在迭代的任何主机 然后使用该 ID 执行操作 我有正则表达式工作 https regex101 com
  • 单个文件中的 Ansible 事实

    我正在尝试使用以下命令使用 ansible 收集服务器清单 ansible all m setup a tree facts 但这会在facts文件夹下为每个主机生成很多单个文件 我希望所有服务器输出在一个唯一的文件中 我注意到内容类似于

随机推荐