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

如何让Ansible Playbook在服务器IP变更后继续执行?

如何让Ansible Playbook在服务器IP变更后继续执行?

嘿,我太懂你遇到的这个坑了——改完IP重启服务器后,Ansible还死抓着旧IP不放,直接断联报错,后面的任务根本跑不起来对吧?这是个超级常见的场景,核心问题就是Ansible默认会用playbook启动时的初始主机IP维持连接,重启后旧IP失效,自然就连不上了。

下面给你梳理清楚解决思路和调整后的playbook:

问题根源

你原来的playbook里,重启服务器后直接去设置ansible_host事实,但这时候Ansible已经和旧IP断开连接了,这个任务根本没机会执行。我们得先让Ansible切换到新IP重新建立连接,再继续后续操作。

修改后的Playbook示例

- name: 配置静态IP并处理重启后连接
  hosts: your_host
  gather_facts: no  # 先跳过facts收集,避免初始连接可能出问题
  tasks:
    - name: 使用Jinja2模板生成网卡配置文件
      template:
        src: templates/interface_config.jinja2
        dest: "/etc/sysconfig/network-scripts/ifcfg-{{ nat_int }}"
      become: yes

    - name: 重启服务器应用新IP配置
      become: yes
      reboot:
        reboot_timeout: 180
      register: reboot_result

    - name: 切换到新IP并等待连接恢复
      ansible.builtin.wait_for_connection:
        timeout: 200  # 给足时间让服务器重启并联网
      vars:
        ansible_host: "192.168.1.253"  # 指定新的静态IP

    - name: 收集更新后的主机信息(可选,确认新IP生效)
      ansible.builtin.setup:

    - name: 永久设置新的ansible_host事实(后续任务复用)
      set_fact:
        ansible_host: "192.168.1.253"
      delegate_to: localhost  # 把事实存在控制节点,避免目标主机重启丢失
      run_once: yes

关键步骤解析

  1. wait_for_connection 模块:这是解决问题的核心!通过vars临时覆盖ansible_host为新IP,让Ansible自动尝试用新IP重新连接目标主机,直到连接成功或者超时,完美解决重启后的断联问题。
  2. gather_facts: no:初始执行时跳过facts收集,避免用旧IP收集信息可能出现的异常,等切换到新IP后再用setup模块获取最新的主机信息。
  3. delegate_to: localhost:把新IP的事实存储在控制节点而非目标主机上,这样后续针对该主机的任务都会自动使用新IP,不会因为目标主机重启导致事实丢失。

额外注意点

  • 确保控制节点能ping通新的静态IP,并且目标主机的防火墙允许SSH(默认22端口)连接,不然wait_for_connection会超时失败。
  • 检查你的Jinja2模板,一定要包含ONBOOT=yes、BOOTPROTO=static这些关键配置项,保证重启后新IP能正常生效。
  • 如果是多主机场景,注意run_once: yes的使用,避免重复设置相同的事实。

备注:内容来源于stack exchange,提问作者UME

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 16:24:39