如何让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
关键步骤解析
wait_for_connection模块:这是解决问题的核心!通过vars临时覆盖ansible_host为新IP,让Ansible自动尝试用新IP重新连接目标主机,直到连接成功或者超时,完美解决重启后的断联问题。gather_facts: no:初始执行时跳过facts收集,避免用旧IP收集信息可能出现的异常,等切换到新IP后再用setup模块获取最新的主机信息。delegate_to: localhost:把新IP的事实存储在控制节点而非目标主机上,这样后续针对该主机的任务都会自动使用新IP,不会因为目标主机重启导致事实丢失。
额外注意点
- 确保控制节点能ping通新的静态IP,并且目标主机的防火墙允许SSH(默认22端口)连接,不然
wait_for_connection会超时失败。 - 检查你的Jinja2模板,一定要包含
ONBOOT=yes、BOOTPROTO=static这些关键配置项,保证重启后新IP能正常生效。 - 如果是多主机场景,注意
run_once: yes的使用,避免重复设置相同的事实。
备注:内容来源于stack exchange,提问作者UME
相关产品推荐
相关产品推荐

