Ansible批量检查网卡状态应以operstate为准:通过command模块读取/sys/class/net//operstate,排除lo、veth等虚拟接口,值为up表示链路层连通,down表示断开或被禁用。

在 Linux 中用 Ansible 批量检查网卡运行状态,核心是通过 setup 模块(或 ansible_facts)获取网卡信息,再结合 shell 或 command 模块执行 ip link show、cat /sys/class/net/*/operstate 等命令判断物理/逻辑状态。关键在于统一识别“是否 up”——即 operstate 为 up 且接口未被 administratively down(如 ip link set dev eth0 down 后状态为 down)。
快速检查所有主机的网卡 operstate
最轻量的方法是直接读取内核 sysfs 接口,无需额外工具:
- 使用
command模块遍历/sys/class/net/下非虚拟接口(排除lo、docker0、veth*等) - 只关注
operstate文件内容:值为up表示链路层已通,down表示断开或被禁用 - 示例命令:
find /sys/class/net/ -maxdepth 1 -type l ! -name lo ! -name '*veth*' -exec basename {} \; -exec cat {}/operstate 2>/dev/null \;
用 setup 模块提取基础网卡列表再过滤
setup 模块能自动收集 ansible_interfaces 和各接口的 ansible_<iface>_active</iface>、ansible_<iface>_speed</iface> 等字段,适合快速筛查:
- 运行
ansible all -m setup -a "filter=ansible_interfaces"获取每台主机启用的接口名 - 对每个接口,查
ansible_<iface>_active</iface>:值为True表示内核识别且未标记为 down - 注意:该字段不反映物理链路(如网线拔掉但接口未 down,仍可能为
True),需配合operstate判断
编写 playbook 统一输出结构化结果
以下 playbook 可批量检查并高亮异常状态:
- name: Check network interface operstate
hosts: all
gather_facts: false
tasks:
- name: Get all physical interfaces (exclude loopback, veth, docker, br)
command: >
find /sys/class/net/ -maxdepth 1 -type l
! -name lo
! -name 'veth*'
! -name 'docker*'
! -name 'br-*'
! -name 'virbr*'
-exec basename {} \;
register: ifaces
<pre class='brush:php;toolbar:false;'>- name: Check operstate for each interface
command: cat /sys/class/net/{{ item }}/operstate 2>/dev/null
loop: "{{ ifaces.stdout_lines }}"
ignore_errors: true
register: operstates
- name: Show interface status
debug:
msg: "{{ item.item }}: {{ item.stdout | default('unknown') }}"
loop: "{{ operstates.results }}"执行后,每台主机将输出类似 eth0: up、ens33: down 的结果,便于人工或脚本进一步处理。
补充说明:区分 admin state 和 oper state
Linux 网卡有两个关键状态:
-
admin state(管理状态):由
ip link set dev eth0 up/down控制,对应ip link show eth0中的UP标志 -
oper state(操作状态):由底层驱动和物理链路决定,对应
/sys/class/net/eth0/operstate,更真实反映是否可通信 - 推荐以
operstate为准;若需同时检查管理状态,可用ip link show {{ item }} | grep -q 'state UP'


















