Debian11服务器用Ansible获取网卡名与MAC地址字典
在Debian 11服务器上用Ansible v5.9.0生成网卡名与MAC地址的字典
需求说明
需要将原有的MAC地址列表改为**{网卡名称: MAC地址}**的字典格式,用于后续生成/etc/systemd/network/10-persistent-net.link配置文件。
修改后的Ansible任务代码
- name: 收集并生成网卡名与MAC地址的字典 set_fact: interface_mac_dict: "{{ dict( ansible_interfaces | select('match', '^(eth|ens|br)\\w*$') # 可选:仅保留eth/ens/br开头的网卡 | map('regex_replace', '^', 'ansible_') | map('extract', hostvars[inventory_hostname]) | selectattr('macaddress', 'defined') | map(lambda x: (x.name, x.macaddress)) | list ) }}"
代码解释
- 筛选网卡类型:通过
select('match', '^(eth|ens|br)\\w*$')过滤出符合ethx/enspx/brx格式的网卡(若不需要过滤可直接删除这一行) - 映射主机变量:给网卡名添加
ansible_前缀,匹配Ansible自动收集的主机网络变量 - 过滤有效网卡:仅保留包含
macaddress属性的网卡(排除lo等无MAC的本地接口) - 生成键值对:用
lambda函数将每个网卡对象转换为(网卡名, MAC地址)的元组 - 转换为字典:通过
dict()函数将元组列表转换为目标字典格式
执行结果示例
ok: [target1] => interface_mac_dict: eth0: 08:00:27:d6:08:1a ens33: 08:00:27:3a:3e:ff br0: f6:ac:58:a9:35:33
传递给后续任务的示例
生成字典后,可通过interface_mac_dict变量直接传递给后续配置任务,比如用template模块生成systemd网络配置文件:
1. 定义Jinja2模板文件(templates/10-persistent-net.link.j2)
[Match] {% for iface, mac in interface_mac_dict.items() %} MACAddress={{ mac }} {% endfor %} [Link] NamePolicy=kernel database onboard slot path MACAddressPolicy=persistent
2. Ansible配置任务
- name: 部署systemd持久化网卡配置 template: src: 10-persistent-net.link.j2 dest: /etc/systemd/network/10-persistent-net.link mode: '0644' notify: 重启systemd-networkd服务 # 可选:添加handler重启网络服务 handlers: - name: 重启systemd-networkd服务 service: name: systemd-networkd state: restarted
内容的提问来源于stack exchange,提问作者Sinux
相关产品推荐
相关产品推荐

