Ansible создание списка словарей и добавление в список в словаре - PullRequest
0 голосов
/ 01 апреля 2020

Используя этот сокращенный пример набора инвентарных хостов:

{
    "_meta": {
        "hostvars": {
            "host-a.foo.com": {
                "host_domain": "foo.com",
                "subnet_address": "192.168.1.0",
                "subnet_mask": "255.255.254.0"
            },
            "host-b.foo.com": {
                "host_domain": "foo.com",
                "subnet_address": "192.168.2.0",
                "subnet_mask": "255.255.254.0"
            },
            "host-c.bar.com": {
                "host_domain": "bar.com",
                "subnet_address": "192.168.2.0",
                "subnet_mask": "255.255.254.0"
            }
        }
    }
}

Я пытаюсь создать что-то, представляющее следующее в ansible:

[
    {
        "192.168.1.0": {
            "mask": "255.255.254.0",
            "domains": [
                "foo.com"
            ]
        },
        "192.168.2.0": {
            "mask": "255.255.254.0",
            "domains": [
                "foo.com",
                "bar.com"
            ]
        }
    }
]

Пока что у меня есть это, но я не уверен, как добавить в список доменов для каждого элемента словаря (вместо того, чтобы перезаписать его):

- name: inventory subnets
  set_fact:
    inventory_subnets: "{{ inventory_subnets | default({}) | combine({
      hostvars[item].subnet_address: {
        'mask': hostvars[item]['subnet_mask'],
        'domains': [
          # How to build this list?
        ]
      }
    }) }}"
  loop: "{{ query('inventory_hostnames', 'all') }}"

Можно ли как-то выполнить другое объединение в определении словаря?

1 Ответ

0 голосов
/ 01 апреля 2020

Задачи ниже

- set_fact:
    hostvars_list: "{{ hostvars_list|default([]) +
                       [{'host': item.key}|combine(item.value)] }}"
  loop: "{{ hostvars|dict2items }}"
- set_fact:
    subnets: "{{ subnets|default([]) +
                 [{item.0: {'mask': item.1|json_query('[].subnet_mask')|first,
                            'domains': item.1|json_query('[].host_domain')}}] }}"
  loop: "{{ hostvars_list|groupby('subnet_address') }}"
- debug:
    var: subnets

дают

    "subnets": [
        {
            "192.168.1.0": {
                "domains": [
                    "foo.com"
                ], 
                "mask": "255.255.254.0"
            }
        }, 
        {
            "192.168.2.0": {
                "domains": [
                    "foo.com", 
                    "bar.com"
                ], 
                "mask": "255.255.254.0"
            }
        }
    ]
...