RHEL9中使用Ansible nmcli设置IPv4默认网关异常排查
问题排查与修复方案
你的问题核心大概率是Ansible nmcli模块参数名错误,再结合NetworkManager的配置逻辑问题导致的,以下是具体分析和修复步骤:
1. 致命错误:参数名使用错误
你提到设置ens192的never_default4为true,但community.general.nmcli模块中,禁用默认网关的正确参数是ipv4_never_default,而非never_default4。错误的参数名会导致模块无法识别配置,甚至可能破坏原有网关设置,这是网关丢失的核心原因。
2. 混淆网卡设备名与NetworkManager连接名
NetworkManager的配置基于「连接(Connection)」而非物理网卡设备。模板克隆的VM中,网卡对应的连接名可能是System ens192或自定义名称,并非一定和设备名完全一致。直接用设备名操作会导致配置应用到临时设备实例,而非持久化连接。
验证命令:在目标机器执行nmcli connection show,查看NAME列对应网卡的连接名称。
3. DHCP与静态配置的冲突
如果模板中的网卡是DHCP模式(ipv4.method=auto),直接手动设置网关会被DHCP推送的配置覆盖。要固定网关,需将ens224切换为静态模式,同时指定IP地址;ens192若保留DHCP,只需禁用默认网关即可。
4. 配置未持久化与操作顺序问题
- 未设置
save: yes会导致配置仅在内存中生效,重启NetworkManager后丢失(解释了重启效果不稳定的现象) - 修改配置后需重启对应连接,而非直接激活设备,确保配置生效
修正后的Playbook示例
- name: 切换默认网关至ens224 hosts: target_hosts become: true tasks: # 获取网卡对应的连接名 - name: 获取ens192的活跃连接名 ansible.builtin.command: nmcli -t connection show --active | grep ens192 | cut -d: -f1 register: ens192_conn changed_when: false - name: 获取ens224的活跃连接名 ansible.builtin.command: nmcli -t connection show --active | grep ens224 | cut -d: -f1 register: ens224_conn changed_when: false # 禁用ens192的默认网关(保留DHCP的话无需改method) - name: 配置ens192禁用默认网关 community.general.nmcli: conn_name: "{{ ens192_conn.stdout }}" type: ethernet ipv4_never_default: true state: present save: yes # 配置ens224为静态IP+默认网关 - name: 配置ens224静态IP与默认网关 community.general.nmcli: conn_name: "{{ ens224_conn.stdout }}" type: ethernet ipv4_method: manual ipv4_address: "10.59.41.XX/24" # 替换为实际静态IP ipv4_gateway: "10.59.41.1" state: present save: yes # 重启连接使配置生效 - name: 重启ens192连接 community.general.nmcli: conn_name: "{{ ens192_conn.stdout }}" state: up - name: 重启ens224连接 community.general.nmcli: conn_name: "{{ ens224_conn.stdout }}" state: up # 验证默认网关 - name: 检查默认路由 ansible.builtin.command: ip route show default register: default_route changed_when: false notify: print_default_route handlers: - name: print_default_route ansible.builtin.debug: msg: "当前默认网关: {{ default_route.stdout }}"
额外排查步骤
- 查看NetworkManager日志:
journalctl -u NetworkManager.service,检查执行Playbook时是否有配置错误提示 - 确认community.general.nmcli模块参数:你的8.3.0版本完全支持
ipv4_never_default等参数,无需升级模块
内容的提问来源于stack exchange,提问作者André Fernandes
相关产品推荐
相关产品推荐

