首页 > 解决方案 > Ansible:如何修改字典列表

问题描述

我想使用从 IPAM 获得的 IP 地址的新条目来修改 hostvars 列表中的字典。

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

在一个循环中,我有子网来识别正确的字典和我想用 ipv4_address 键添加的 IP 地址,因此结果应该如下所示:

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

标签: ansiblejinja2

解决方案


假设 IP 列表可用。例如

ip4: [10.91.1.216, 10.91.0.21]

让我们使用组合过滤器和扩展循环变量来创建一个新列表,其中每个字典都将被更新。例如

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

推荐阅读