gpt4 book ai didi

ansible - 创建系统接口(interface)名称列表及其 MAC 地址

转载 作者:行者123 更新时间:2023-12-05 03:20:00 26 4
gpt4 key购买 nike

我正在尝试从 Debian 11 服务器创建一个接口(interface)名称列表及其 mac 地址,最初,我只是试图按顺序获取 mac 地址,但现在我意识到我需要一个看起来像这样的列表:

eth0 <SOME_MAC>
eth1 <SOME_MAC>
...

我想将这个列表作为变量传递,然后在下一个任务中使用它在 /etc/systemd/network< 中创建一个 10-persistent-net.link 文件 目录。

我正在使用的当前任务是:

- name: Get mac addresses of all interfaces except local
debug:
msg: "{{ ansible_interfaces |
map('regex_replace','^','ansible_') |
map('extract',hostvars[inventory_hostname]) |
selectattr('macaddress','defined') |
map(attribute='macaddress') |
list }}"

如您所见,我正在使用 debug 模块来测试我的代码,但我不知道如何创建所需的列表并将其作为变量传递。

上面的代码给出了以下结果:

ok: [target1] => 
msg:
- 08:00:27:d6:08:1a
- 08:00:27:3a:3e:ff
- f6:ac:58:a9:35:33
- 08:00:27:3f:82:c2
- 08:00:27:64:6a:f8
ok: [target2] =>
msg:
- 08:00:27:34:70:60
- 42:04:1a:ff:6c:46
- 42:04:1a:ff:6c:46
- 08:00:27:d6:08:1a
- 08:00:27:9c:d7:af
- f6:ac:58:a9:35:33

对于使用哪个模块将列表作为变量传递以及如何首先创建列表的任何帮助,我们将不胜感激。

请注意,我使用的是 Ansible v5.9.0,每个服务器可能有任意数量的接口(interface),其中一些可能有 ethx 接口(interface)名称格式,而其他可能有enspx, brx等接口(interface)格式

更新:根据评论中的建议,我必须提到我需要为每个目标创建一个列表,该列表将在针对每个目标运行的自然主机循环任务中使用。

更新 2: 由于我是 Ansible 的新手,并且根据我同事的建议,我的印象是接口(interface)名称列表及其 MAC 地址由空格分隔是我需要的变量传递给下一个任务,但是,在整个评论和答案中,我现在意识到我绝对是在错误的方向上前进。请接受我的道歉,并将其归咎于我缺乏 Ansible 的经验和知识。最后,事实证明接口(interface)名称及其 MAC 地址的字典最适合 Ansible 中的此类操作。

最佳答案

获取变量列表

blacklist: ['lo']
interfaces: "{{ ['ansible_']|
product(ansible_interfaces|
difference(blacklist))|
map('join')|list }}"

获取变量的值并创建字典

devices: "{{ interfaces|
map('extract', vars)|
items2dict(key_name='device',
value_name='macaddress') }}"

<支持>

注释

  • 与列表相比,字典更有效。 key 必须是唯一的。
  • YAML 字典又名 mapping是“一组无序的键/值节点对,每个键都是唯一的限制”。
  • As of Python version 3.7, dictionaries are ordered. .因此,在使用 Python 3.7 及更高版本时,也会对 Ansible (YAML) 词典进行排序。例如,
  devices:
docker0: 02:42:35:39:f7:f5
eth0: 80:3f:5d:14:b1:d3
eth1: e4:6f:13:f5:09:80
wlan0: 64:5d:86:5d:16:b9
xenbr0: 80:3f:5d:14:b1:d3
  • 参见 Jinja关于如何创建各种格式的输出。例如,
    - debug:
msg: |-
{% for ifc, mac in devices.items() %}
{{ ifc }} {{ mac }}
{% endfor %}

给予

  msg: |-
wlan0 64:5d:86:5d:16:b9
eth0 80:3f:5d:14:b1:d3
eth1 e4:6f:13:f5:09:80
xenbr0 80:3f:5d:14:b1:d3
docker0 02:42:35:39:f7:f5

可以看到Jinja的输出是无序的。实际上,当你重复这个任务时,顺序甚至都不是持久的。使用过滤器 sort如果你想订购线路。例如,

    - debug:
msg: |-
{% for ifc, mac in devices.items()|sort %}
{{ ifc }} {{ mac }}
{% endfor %}

给予

  msg: |-
docker0 02:42:35:39:f7:f5
eth0 80:3f:5d:14:b1:d3
eth1 e4:6f:13:f5:09:80
wlan0 64:5d:86:5d:16:b9
xenbr0 80:3f:5d:14:b1:d3

关于ansible - 创建系统接口(interface)名称列表及其 MAC 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73294924/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com