Ansible,将字典合并为一次

时间:2019-07-10 17:26:39

标签: ansible yaml jinja2

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

---
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
...

我使用此剧本加载此文件:

---
- 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尝试了很多事情,但没有任何结果给我期望的结果。

我尝试拥有这个:

{
  "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" }
  ]
}

如果有人有这样做的想法? 非常感谢您的帮助 最好的问候

1 个答案:

答案 0 :(得分:1)

下面的任务可以做到

- 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
       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')
                }}"