首页 > 解决方案 > 如何使用for在ansible中嵌套变量

问题描述

我正在使用 Ansible,我需要显示主机网络接口的列表。在 Jinja2 格式模板中,我需要以下值:每个接口的名称、IP、掩码和网络。为了获得这些信息,我使用了 ansible_facts 但在制作 for 时遇到了问题。

我从这里获取网络接口:

"ansible_interfaces": [
    "eth1",
    "eth0",
    "lo"
],

到目前为止一切顺利,我做了一个 for 并且它向我展示了这三个。我的问题是我需要的每个接口的信息都用 jason 分隔:

"ansible_eth0": {
    "active": true,
    "device": "eth0",
    "hw_timestamp_filters": [],
    "ipv4": {
        "address": "x.x.x.x",
        "broadcast": "x.x.x.x",
        "netmask": "255.255.192.0",
        "network": "x.x.x.x"
    },
    "ipv4_secondaries": [
        {
            "address": "x.x.x.x",
            "broadcast": "x.x.x.x",
            "netmask": "255.255.0.0",
            "network": "x.x.x.x"
        }
    ],
    "ipv6": [
        {
            "address": "",
            "prefix": "64",
            "scope": "link"
        }
    ],
    "macaddress": "",
    "module": "virtio_net",
    "mtu": 1500,
    "pciid": "virtio0",
    "promisc": false,
    "speed": -1,
    "timestamping": [
        "tx_software",
        "rx_software",
        "software"
    ],
    "type": "ether"
},
"ansible_eth1": {
    "active": true,
    "device": "eth1",
    "hw_timestamp_filters": [],
    "ipv4": {
        "address": "x.x.x.x",
        "broadcast": "x.x.x.x",
        "netmask": "255.255.240.0",
        "network": "x.x.x.x"
    },
    "ipv6": [
        {
            "address": "",
            "prefix": "64",
            "scope": "link"
        }
    ],
    "macaddress": "",
    "module": "virtio_net",
    "mtu": 1500,
    "pciid": "virtio1",
    "promisc": false,
    "speed": -1,
    "timestamping": [
        "tx_software",
        "rx_software",
        "software"
    ],
    "type": "ether"
},

为了获得这些信息,我尝试了以下方式:

{{% for interfaz in ansible_interfaces %}}
{{% for item in ansible_['interfaz'] %}}

Name: {{ item.device }}
IP: {{ item.ipv4.address }}
Netmask: {{ item.ipv4.metmask }}
Red: {{ item.ipv4.network }}

{{% endfor %}}
{{% endfor %}}

我以不同的方式尝试过,但不知道该怎么做。在我看来,for 返回给我的是一个字符串。我尝试使用 iteritems 选项,但我也不能。如果有人可以帮助我解决这个问题,我将不胜感激。

标签: for-loopansibleansible-factsansible-template

解决方案


使用查找插件vars。通过在 shell 中运行查看详细信息ansible-doc -t lookup vars。例如

    - debug:
        msg: |
          {% for i in ansible_interfaces %}
          {% set dev = lookup('vars', 'ansible_' ~ i) %}
          Name: {{ dev.device }}
          IP: {{ dev.ipv4.address|default(None) }}
          Netmask: {{ dev.ipv4.netmask|default(None) }}
          Red: {{ dev.ipv4.network|default(None) }}

          {% endfor %}

给我的笔记本电脑

  msg: |-
    Name: lo
    IP: 127.0.0.1
    Netmask: 255.0.0.0
    Red: 127.0.0.0
  
    Name: wlan0
    IP:
    Netmask:
    Red:
  
    Name: eth0
    IP: 10.1.0.27
    Netmask: 255.255.255.0
    Red: 10.1.0.0

可能缺少属性ipv4 。根据您的需要调整默认值。


推荐阅读