for-loop - 如何使用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 选项,但我也不能。如果有人可以帮助我解决这个问题,我将不胜感激。
解决方案
使用查找插件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 。根据您的需要调整默认值。
推荐阅读
- java - Java [Peer-To-Peer]:Runnable 意外停止/阻塞
- python - Python Tkinter [按钮之间的行分隔符]
- wxpython - 创建绘图后 wxpython 面板缩小
- php - 当我使用数组创建 PHP 表单时,我的班级出现问题
- authentication - 如何在 SPA 中正确使用 OAuth 2.0?
- linux - 尝试关闭计算机时,debian /etc/shutdown.allow 不会触发
- android - 使用 dagger2 在片段中使用活动级别依赖项
- android - react-native run-android 问题 - 找不到错误 Android 项目
- java - 使用 Apache POI 更改行的背景颜色
- android - 将使用 AndroidX 的自定义 .aar 库添加到 Cordova 插件