Ansible, объединить словари в один раз - PullRequest
1 голос
/ 10 июля 2019

У меня есть этот пример 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 Ответ

1 голос
/ 10 июля 2019

Задача ниже делает это

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