百战RHCE(运维实战:Ansible网络自动化之nmcli模块深度解析与应用) 1. nmcli模块基础入门刚接触Linux网络配置的朋友可能会被ifconfig、ip addr这些命令搞得晕头转向。我在实际运维工作中发现nmcli才是真正的高效网络管理神器。特别是在使用Ansible进行批量管理时nmcli模块简直就是运维人员的瑞士军刀。nmcli是NetworkManager的命令行工具它最大的优势在于可以统一管理各种网络连接类型。我遇到过这样一个场景某次机房搬迁需要为200多台服务器重新配置静态IP。如果手动操作不仅容易出错光是一个个SSH连接就能让人崩溃。而用Ansible的nmcli模块一个Playbook就能搞定所有机器。先来看几个最常用的参数conn_name给你的连接起个有意义的名字比如prod-eth0比Wired connection 1直观多了ifname指定物理网卡名称ens192、eth0这些常见网卡名要记牢ip4设置IPv4地址时一定要带上子网掩码192.168.1.100/24这种格式gw4网关设置错误会导致整个网络不可用建议先用ping测试dns4可以设置多个DNS服务器用逗号分隔- name: 配置基础网络 nmcli: conn_name: prod-eth0 ifname: eth0 type: ethernet ip4: 192.168.1.100/24 gw4: 192.168.1.1 dns4: 8.8.8.8,114.114.114.114 state: present autoconnect: yes这个简单的Playbook我已经在多个生产环境验证过特别适合新服务器初始化。有次我给50台新机器部署时发现其中3台配置失败检查后发现是网卡名不一致有的用eth0有的用ens192。所以建议先用ansible all -m setup -a filteransible_interfaces收集所有机器的网卡信息。2. 企业级网络配置实战2.1 批量修改DNS服务器去年我们公司遇到个典型问题原DNS服务器要下线迁移需要更新整个机房的DNS配置。手动改/etc/resolv.conf虽然可行但重启后可能被覆盖。用nmcli才是持久化配置的正确姿势。我设计的方案是先用ansible批量备份现有配置ansible all -m shell -a nmcli con show /tmp/network_backup_$(date %F).txt然后使用以下Playbook进行更新- name: 更新DNS配置 hosts: all tasks: - name: 修改主DNS nmcli: conn_name: {{ item }} dns4: 10.10.1.10 state: present loop: {{ ansible_facts.network_connections | map(attributename) | list }} when: item ! lo这里有几个实用技巧使用loop遍历所有网络连接排除lo回环接口ansible_facts.network_connections可以获取所有连接信息建议先在测试环境验证用--check模式试运行2.2 多网卡绑定配置对于数据库服务器等关键设备我们通常需要配置网卡绑定bonding提高可靠性。nmcli处理这种复杂配置也很优雅- name: 配置网卡绑定 hosts: db_servers tasks: - name: 创建bond接口 nmcli: type: bond conn_name: bond0 ifname: bond0 mode: active-backup ip4: 10.0.0.100/24 gw4: 10.0.0.1 state: present - name: 添加从属接口 nmcli: type: bond-slave conn_name: bond0-slave-eth0 ifname: eth0 master: bond0 state: present notify: reload_network handlers: - name: reload_network service: name: NetworkManager state: restarted这个配置我用了active-backup模式当主网卡故障时会自动切换。曾经有次机房交换机故障多亏这个配置业务才没中断。注意bonding有多种模式balance-rr轮询模式提高吞吐量active-backup主备模式提高可靠性802.3ad需要交换机支持LACP3. 故障排查与调试技巧3.1 常见错误处理刚开始用nmcli模块时我踩过不少坑这里分享几个典型问题连接已存在错误当conn_name重复时会报错。解决方法- name: 确保旧连接不存在 nmcli: conn_name: old_conn state: absent参数不生效有时修改了Playbook但配置没变。建议加上- name: 重新加载连接 command: nmcli con reload连接不激活配置正确但网卡没起来。可以- name: 激活连接 nmcli: conn_name: my_conn state: up3.2 调试技巧遇到网络问题时我常用的排查步骤先用nmcli con show查看所有连接状态nmcli dev status检查设备状态对于复杂问题开启详细日志ansible-playbook playbook.yml -vvv debug.log 21在目标机器上查看NetworkManager日志journalctl -u NetworkManager -f有次凌晨3点处理网络故障发现是MTU设置问题。后来我在Playbook里都加上mtu: 1500 # 根据实际网络环境调整4. 高级应用场景4.1 安全加固配置对于需要高安全性的环境我们可以用nmcli配置MAC地址过滤和防火墙联动- name: 安全网络配置 nmcli: conn_name: secure-eth0 ifname: eth0 type: ethernet ip4: 192.168.1.200/24 gw4: 192.168.1.1 mac: {{ ansible_facts.interfaces.eth0.macaddress }} firewalld_zone: dmz state: present这个配置做了三件事锁定MAC地址防止ARP欺骗将接口分配到dmz防火墙区域自动应用该区域的防火墙规则4.2 多环境适配方案我们公司有开发、测试、生产三套环境网络配置各不相同。我的解决方案是定义变量文件# group_vars/dev/network.yml network_config: ip4: 10.1.1.100/24 gw4: 10.1.1.1 dns4: 10.1.1.53 # group_vars/prod/network.yml network_config: ip4: 192.168.100.100/24 gw4: 192.168.100.1 dns4: 192.168.100.53通用Playbook- name: 多环境网络配置 nmcli: conn_name: {{ env }}-eth0 ifname: eth0 type: ethernet ip4: {{ network_config.ip4 }} gw4: {{ network_config.gw4 }} dns4: {{ network_config.dns4 }} state: present这套方案在新机房扩容时节省了80%的配置时间。关键是要提前规划好IP地址分配建议用IPAM工具管理。