如何使用 ansible 中的变量为 cloud_init_nics 配置多个接口

如何使用 ansible 中的变量为 cloud_init_nics 配置多个接口

我需要一些关于使用变量文件配置多个 cloud_init_nics 的帮助。以下是我的变量文件示例:files/dict

vm:
  all:
    - name: rhel7
      hostname: rhel7
      dns: "8.8.8.8 8.8.4.4"
      nic:
        - nic_name: eth0
          ip: "10.10.10.10"
          netmask: "255.255.255.0"
          gateway: "10.10.10.1"
          bootproto: "static"
          onboot: "true"
        - nic_name: "eth1"
          ip: "10.10.10.11"
          netmask: "255.255.255.0"
          bootproto: "static"
          onboot: "true"

    - name: rhel8
      hostname: rhel8
      dns: "8.8.8.8 8.8.4.4"
      nic:
        - ip: "10.10.10.12"
          netmask: "255.255.255.0"
          gateway: "10.10.10.1"
          nic_name: "ens7"
          bootproto: "static"
          onboot: "true"

每个虚拟机可以拥有至少 1 个网卡,到 N 个网卡。

这是我的剧本(显然没有用),因为它会将第二个 nic 循环作为不同的任务。

- name: include vards
  include_vars: files/dict

- name: readvar
  ovirt_vm:
    cloud_init_nics:
    - nic_name: "{{item.nic|json_query('[*].nic_name') }}"
      nic_boot_protocol: "{{item.nic|json_query('[*].ip') }}"
    cloud_init_persist: no
    wait: false
  with_items: "{{vm.all}}"

从文档来看,似乎同一任务下需要多个“-nic_name”

  cloud_init_nics:
    - nic_name: eth0
      nic_boot_protocol: dhcp
    - nic_name: eth1
      nic_boot_protocol: static
      nic_ip_address: 10.34.60.86
      nic_netmask: 255.255.252.0

因为每个虚拟机的网卡数量不同,所以我不能使用文档中的示例。

所以我的问题是:我如何多次循环 cloud_init_nics 但仍然作为 1 个任务运行?这可能吗?如果不行,有什么我应该参考的想法吗?

是否可以将 item.all.nic 注册为变量,然后 cloud_init_nics: {{ var }} ?谢谢

答案1

翻译网卡列表以保留所需的属性并使用网卡模块中的列表

- name: readvar
  ovirt_vm:
    cloud_init_nics: "{{ item.nic }}"
    cloud_init_persist: no
    wait: false
  loop: "{{ vm.all }}"

您可以自行创建正确的数据。例如

    - set_fact:
        vm2: "{{ vm2|default([]) + [item|combine({'nic': nic|from_yaml})] }}"
      loop: "{{ vm.all }}"
      vars:
        nic: |
          {% for i in item.nic %}
            - nic_boot_protocol: {{ i.bootproto|default(omit) }}
              nic_boot_protocol_v6: {{ i.nic_boot_protocol_v6|default(omit) }}
              nic_gateway: {{ i.gateway|default(omit) }}
              nic_gateway_v6: {{ i.nic_gateway_v6|default(omit) }}
              nic_ip_address: {{ i.ip|default(omit) }}
              nic_ip_address_v6: {{ i.nic_ip_address_v6|default(omit) }}
              nic_name: {{ i.nic_name|default(omit) }}
              nic_netmask: {{ i.netmask|default(omit) }}
              nic_netmask_v6: {{ i.nic_netmask_v6|default(omit) }}
          {% endfor %}
    - debug:
        var: vm2

给出

vm2:
  - dns: 8.8.8.8 8.8.4.4
    hostname: rhel7
    name: rhel7
    nic:
    - nic_boot_protocol: static
      nic_gateway: 10.10.10.1
      nic_ip_address: 10.10.10.10
      nic_name: eth0
      nic_netmask: 255.255.255.0
    - nic_boot_protocol: static
      nic_ip_address: 10.10.10.11
      nic_name: eth1
      nic_netmask: 255.255.255.0
  - dns: 8.8.8.8 8.8.4.4
    hostname: rhel8
    name: rhel8
    nic:
    - nic_boot_protocol: static
      nic_gateway: 10.10.10.1
      nic_ip_address: 10.10.10.12
      nic_name: ens7
      nic_netmask: 255.255.255.0

相关内容