Merge/Combine 顶级词典

Merge/Combine top level of dictionary

我正在尝试根据存储在 ansible 中不同环境变量中的服务器创建字典。

我目前拥有的是:

env_loadbalancer_vservers2: "{{ hostvars[inventory_hostname] | dict2items | selectattr('key', 'match', 'env_.*_loadbalancer_vservers(?![_.])') | list | items2dict }} "

这将:

  1. 获取特定主机的所有变量,
  2. 将字典更改为项目类型
  3. 因为我们现在可以轻松访问键值,所以我将使用正则表达式只匹配我想要的键
  4. 将其改回列表
  5. 返回字典

问题是输出看起来像这样:

{
     "env_decision_manager_loadbalancer_vservers": {
         "decision_central": {
             "ip_or_dns": "ip",
             "port": "port",
             "protocol": "SSL",
             "ssl": true,
             "timeout": 600,
         }
     },
     "env_ftp_loadbalancer_vservers": {
         "ftp_1": {
             "ip_or_dns": "ip",
             "port": "port",
             "protocol": "FTP",
             "ssl": false,
             "timeout": 9010,
         }
     },
     "env_jboss_loadbalancer_vservers": {
         "jboss": {
             "ip_or_dns": "ip",
             "port": "port",
             "protocol": "SSL",
             "ssl": true,
             "timeout": 600,
         }
         "jboss_adm": {
             "ip_or_dns": "som_other_ip",
             "port": "rando_number",
             "protocol": "SSL",
             "ssl": true,
             "timeout": 86410,
         }
     }

虽然我想要的输出应该是这样的:

{
         "decision_central": {
             "ip_or_dns": "ip",
             "port": "port",
             "protocol": "SSL",
             "ssl": true,
             "timeout": 600,
         },
         "ftp_1": {
             "ip_or_dns": "ip",
             "port": "port",
             "protocol": "FTP",
             "ssl": false,
             "timeout": 9010,
         },
         "jboss": {
             "ip_or_dns": "ip",
             "port": "port",
             "protocol": "SSL",
             "ssl": true,
             "timeout": 600,
         },
         "jboss_adm": {
             "ip_or_dns": "som_other_ip",
             "port": "rando_number",
             "protocol": "SSL",
             "ssl": true,
             "timeout": 86410,
         }

所以实际上我需要删除“顶级密钥层”并合并它们的值。我在这个解决方案上花了很多时间,但没有取得任何进展,我很乐意提供任何建议:)

PS。解决方案应该是“干净的”,没有任何自定义模块或实际任务,最好的想法是向上面提到的过滤器管道添加一些功能,这将导致 dict

的正确格式

谢谢:)

Select属性值

  regexp: 'env_.*_loadbalancer_vservers(?![_.])'
  l1: "{{ hostvars[inventory_hostname]|
          dict2items|
          selectattr('key', 'match', regexp)|
          map(attribute='value')|
          list }}"

给出列表

  l1:
  - decision_central:
      ip_or_dns: ip
      port: port
      protocol: SSL
      ssl: true
      timeout: 600
  - ftp_1: null
      ip_or_dns: IP
      port: port
      protocol: FTP
      ssl: false
      timeout: 9010
  - jboss:
      ip_or_dns: ip
      port: port
      protocol: SSL
      ssl: true
      timeout: 600
    jboss_adm:
      ip_or_dns: som_other_ip
      port: rando_number
      protocol: SSL
      ssl: true
      timeout: 86410

合并列表中的项目

  d1: "{{ {}|combine(l1) }}"

提供您要查找的词典

  d1:
    decision_central:
      ip_or_dns: ip
      port: port
      protocol: SSL
      ssl: true
      timeout: 600
    ftp_1:
      ip_or_dns: ip
      port: port
      protocol: FTP
      ssl: false
      timeout: 9010
    jboss:
      ip_or_dns: ip
      port: port
      protocol: SSL
      ssl: true
      timeout: 600
    jboss_adm:
      ip_or_dns: som_other_ip
      port: rando_number
      protocol: SSL
      ssl: true
      timeout: 86410