You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
      ) 
    }}"

代码解释

  1. 筛选网卡类型:通过select('match', '^(eth|ens|br)\\w*$')过滤出符合ethx/enspx/brx格式的网卡(若不需要过滤可直接删除这一行)
  2. 映射主机变量:给网卡名添加ansible_前缀,匹配Ansible自动收集的主机网络变量
  3. 过滤有效网卡:仅保留包含macaddress属性的网卡(排除lo等无MAC的本地接口)
  4. 生成键值对:用lambda函数将每个网卡对象转换为(网卡名, MAC地址)的元组
  5. 转换为字典:通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 21:06:24