如何用Ansible创建使用主网卡的OpenvSwitch网桥并避免锁机
我之前也踩过这个坑!用Ansible通过SSH配置OpenvSwitch网桥时,直接执行ip addr flush dev eth0绝对会把SSH会话搞断——毕竟你的连接就跑在eth0上呢。下面是我亲测有效的几个解决思路,帮你避开这个问题:
方案1:临时IP过渡(最稳妥的常规操作)
核心思路是先给eth0加一个同网段的临时IP,这样即使flush掉原主IP,SSH会话还能通过临时IP维持,等网桥配置完成后再清理临时IP。
- name: 给eth0添加临时过渡IP ansible.builtin.command: ip addr add 192.168.128.99/24 dev eth0 - name: 清空eth0原有IP地址 ansible.builtin.command: ip addr flush dev eth0 - name: 给br0配置目标IP ansible.builtin.command: ip addr add 192.168.128.5/24 dev br0 - name: 启动br0网桥 ansible.builtin.command: ip link set br0 up - name: 移除eth0上的临时IP(可选,清理冗余) ansible.builtin.command: ip addr del 192.168.128.99/24 dev eth0
注意:临时IP要和目标IP在同一网段,而且要确保防火墙/安全组允许这个临时IP的SSH访问,不然还是会断连。
方案2:后台异步执行+等待重连
如果不想用临时IP,可以把网桥配置命令打包成脚本后台执行,让Ansible不用等命令完成就返回,然后等待网桥的IP恢复连通性后再继续后续任务。
- name: 创建网桥配置脚本 ansible.builtin.copy: content: | #!/bin/bash # 先给br0加IP再清空eth0,尽量缩短断连窗口 ip addr add 192.168.128.5/24 dev br0 ip link set br0 up ip addr flush dev eth0 dest: /tmp/setup_ovs_bridge.sh mode: '0755' - name: 后台执行网桥配置脚本 ansible.builtin.command: /tmp/setup_ovs_bridge.sh async: 30 # 命令最长执行30秒 poll: 0 # 立即返回,不等待执行完成 - name: 等待br0的IP恢复SSH连通性 ansible.builtin.wait_for: host: 192.168.128.5 port: 22 delay: 5 # 延迟5秒再开始检测,给配置留时间 timeout: 30 # 最多等待30秒
这个方案的好处是不需要额外的临时IP,缺点是断连窗口存在,需要确保wait_for能正确检测到连通性。
方案3:用OVS官方Ansible模块规范配置
Ansible有专门的OpenvSwitch模块,用它来管理网桥和端口会更规范,减少手动命令的风险。不过还是要配合IP切换的逻辑,避免断连:
- name: 创建OVS网桥br0 openvswitch.openvswitch.ovs_bridge: bridge: br0 state: present - name: 将eth0添加到br0网桥 openvswitch.openvswitch.ovs_port: bridge: br0 port: eth0 state: present - name: 给br0配置目标IP(先加IP再清空eth0) ansible.builtin.command: ip addr add 192.168.128.5/24 dev br0 - name: 启动br0网桥 ansible.builtin.command: ip link set br0 up - name: 清空eth0原有IP地址 ansible.builtin.command: ip addr flush dev eth0
这里调整了顺序:先给br0加IP并启动,再清空eth0的IP,这样能尽量缩短断连时间,最好还是配合方案1的临时IP一起用,更保险。
内容的提问来源于stack exchange,提问作者sorin
相关产品推荐
相关产品推荐

