首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Ansible,将字典合并为一次

Ansible,将字典合并为一次
EN

Stack Overflow用户
提问于 2019-07-11 01:26:39
回答 1查看 1.6K关注 0票数 2

我有这个示例yaml文件(haproxy.yml):

代码语言:javascript
复制
---
rules:
  aa:
    PHP53:
      - url: php53-1-aa.my-example.com
    PHP55:
      - url: php55-1-aa.my-example.com
    PHP56:
      - url: php56-1-aa.my-example.com
      - url: php56-2-aa.my-example.com
      - url: php56-3-aa.my-example.com
    PHP72:
      - url: php72-1-aa.my-example.com
      - url: php72-2-aa.my-example.com
      - url: php72-3-aa.my-example.com
  bb:
    PHP53:
      - url: php53-1-bb.my-example.com
      - url: php53-2-bb.my-example.com
      - url: php53-3-bb.my-example.com

    PHP55:
      - url: php55-1-bb.my-example.com
    PHP56:
      - url: php56-1-bb.my-example.com
      - url: php56-2-bb.my-example.com
      - url: php56-3-bb.my-example.com
    PHP72:
      - url: php72-1-bb.my-example.com
      - url: php72-2-bb.my-example.com
      - url: php72-3-bb.my-example.com
  cc:
    PHP55:
      - url: php55-1-cc.my-example.com
    PHP56:
      - url: php56-1-cc.my-example.com
      - url: php56-2-cc.my-example.com
      - url: php56-3-cc.my-example.com
...

我使用这个剧本来加载这个文件:

代码语言:javascript
复制
---
- name: 'stack-example'
  hosts: localhost
  gather_facts: no
  tasks:
    - name: 'include'
      include_vars:
        file: 'haproxy.yml'

    - set_fact:
        try: '{{ try|default({}) | combine(item.value) }}'
      loop: '{{ lookup("dict", rules) }}'

    - debug:
        var: try

所有的文件都是两个解释和重现我的问题:-)

我需要使用set_fact来处理我的变量。

我的主要目标是将所有PHP**合并/分组为一个组。这是我需要的一个例子,我用combine map lookup尝试了很多东西,但都没有得到我期望的结果。

我试着这样做:

代码语言:javascript
复制
{
  "PHP53": [
      { "url": "php53-1-aa.my-example.com" },
      { "url": "php53-1-bb.my-example.com" },
      { "url": "php53-2-bb.my-example.com" },
      { "url": "php53-3-bb.my-example.com" }
  ],
  "PHP55": [
      { "url": "php55-1-aa.my-example.com" },
      { "url": "php55-1-bb.my-example.com" },
      { "url": "php55-1-cc.my-example.com" }
  ],
  "PHP56": [
      { "url": "php56-1-aa.my-example.com" },
      { "url": "php56-2-aa.my-example.com" },
      { "url": "php56-3-aa.my-example.com" },
      { "url": "php56-1-bb.my-example.com" },
      { "url": "php56-2-bb.my-example.com" },
      { "url": "php56-3-bb.my-example.com" },
      { "url": "php56-1-cc.my-example.com" },
      { "url": "php56-2-cc.my-example.com" },
      { "url": "php56-3-cc.my-example.com" },
  ],
  "PHP72": [
      { "url": "php72-1-aa.my-example.com" },
      { "url": "php72-2-aa.my-example.com" },
      { "url": "php72-3-aa.my-example.com" },
      { "url": "php72-1-bb.my-example.com" },
      { "url": "php72-2-bb.my-example.com" },
      { "url": "php72-3-bb.my-example.com" }
  ]
}

如果有人有这样的想法呢?非常感谢您的帮助,致以最诚挚的问候

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-11 03:13:58

下面的任务可以做到这一点

代码语言:javascript
复制
- set_fact:
    rules_grouped: "{{ rules_grouped|
                       default({})|
                       combine({item.0: item.1|json_query('[].value')|flatten})
                       }}"
  loop: "{{ rules|
            dict2items|
            json_query('[*].value')|
            map('dict2items')|list|flatten|
            groupby('key')
            }}"

要了解循环是如何工作的,请将其放入debug并逐步添加过滤器。

代码语言:javascript
复制
   - debug
       msg: "{{ rules|
                dict2items
                }}"

   - debug
       msg: "{{ rules|
                dict2items|
                json_query('[*].value')
                }}"

   - debug
       msg: "{{ rules|
                dict2items|
                json_query('[*].value')|
                map('dict2items')|list|flatten
                }}"

   - debug
       msg: "{{ rules|
                dict2items|
                json_query('[*].value')|
                map('dict2items')|list|flatten|
                groupby('key')
                }}"
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56975784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档