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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 10:27:46