Ansible: Как изменить список диктовок - PullRequest
1 голос
/ 02 апреля 2020

Я хочу изменить дикты в списке в hostvars, добавив новую запись для IP-адреса, полученного от IPAM.

{
  "vm_guest_networks": [
    {
      "device_type": "vmxnet3",
      "state": "present",
      "subnet": "10.91.1.0/24"
    },
    {
      "device_type": "vmxnet3",
      "state": "present",
      "subnet": "10.91.0.0/24"
    }
  ]
}

В пределах oop У меня есть su bnet для идентификации правильный дикт и IP-адрес, который я хочу добавить с помощью ключа ipv4_address, чтобы результат выглядел следующим образом:

{
  "vm_guest_networks": [
    {
      "device_type": "vmxnet3",
      "state": "present",
      "subnet": "10.91.1.0/24",
      "ipv4_address": "10.91.1.216"
    },
    {
      "device_type": "vmxnet3",
      "state": "present",
      "subnet": "10.91.0.0/24",
      "ipv4_address": "10.91.0.21"
    }
  ]
}

Текущий код WIP ansible имеет значение https://pastebin.com/bFc1Ww2K

1 Ответ

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

Давайте предположим, что список IP-адресов доступен. Например,

ip4: [10.91.1.216, 10.91.0.21]

Давайте использовать объединить фильтр и Расширенные l oop переменные , чтобы создать новый список, в котором будет обновляться каждый словарь. Например

    - set_fact:
        mydata: "{{ mydata|default([]) +
                    [item|combine({'ipv4_address': ip4[ansible_loop.index0]})] }}"
      loop: "{{ vm_guest_networks }}"
      loop_control:
        extended: yes

    - set_fact:
        vm_guest_networks: "{{ mydata }}"
    - debug:
        var: vm_guest_networks

дай

    "vm_guest_networks": [
        {
            "device_type": "vmxnet3", 
            "ipv4_address": "10.91.1.216", 
            "state": "present", 
            "subnet": "10.91.1.0/24"
        }, 
        {
            "device_type": "vmxnet3", 
            "ipv4_address": "10.91.0.21", 
            "state": "present", 
            "subnet": "10.91.0.0/24"
        }
    ]
...