Ansible中SSH服务重启时如何等待或恢复连接?
Ansible中SSH服务重启时如何等待或恢复连接?
这个场景我太熟了!之前改完SSH配置直接用service模块重启,结果Ansible直接报连接中断的错,当时也纠结要不要重启机器,后来摸索出几个不用重启主机就能恢复连接的实用方法,给你讲讲:
方法一:手动断开+等待SSH端口恢复
这是我最常用的方案,步骤清晰容错性强:
- 先重启SSH服务,但因为重启后连接会断,所以要忽略这个步骤的错误,不然Playbook直接终止
- 主动杀掉本地的Ansible连接进程,避免它一直挂着尝试重连
- 从本地等待目标主机的SSH端口(默认22)重新开放
- 之后的任务就能正常建立连接执行了
具体的Playbook代码示例:
- name: 重启SSH服务(忽略连接中断导致的错误) ansible.builtin.service: name: sshd # 注意:Ubuntu/Debian系统要改成`ssh` state: restarted ignore_errors: yes - name: 主动终止本地的Ansible连接进程 ansible.builtin.command: pkill -f ansible-connection delegate_to: localhost changed_when: false # 标记这个任务不会改变系统状态,避免在输出里显示changed - name: 等待目标主机的SSH端口恢复可用 ansible.builtin.wait_for: host: "{{ inventory_hostname }}" port: 22 delay: 5 # 先等5秒再开始检测,给服务重启留缓冲时间 timeout: 60 # 超时时间设为60秒,足够大部分机器完成重启 delegate_to: localhost - name: 验证连接是否正常恢复(可选步骤) ansible.builtin.command: whoami register: login_user debug: var: login_user.stdout
方法二:用Ansible内置的连接重置模块
这个方法更简洁,利用Ansible的meta模块重置连接,省去手动杀进程的步骤:
- name: 修改SSH配置(示例:禁用密码登录) ansible.builtin.lineinfile: path: /etc/ssh/sshd_config regexp: '^PasswordAuthentication' line: 'PasswordAuthentication no' - name: 重启SSH服务,忽略连接中断错误 ansible.builtin.service: name: sshd state: restarted ignore_errors: yes - name: 让Ansible重置当前连接 ansible.builtin.meta: reset_connection - name: 等待SSH端口完全就绪 ansible.builtin.wait_for: port: 22 timeout: 30
几个小提示:
- 如果你的SSH用的是非默认端口,记得把
wait_for里的port值改成对应端口 - 可以根据目标主机的性能调整
delay和timeout的数值,比如老旧机器可以把超时设长到120秒 - 有些系统的SSH服务名是
sshd(RHEL/CentOS系列),有些是ssh(Debian/Ubuntu系列),一定要对应上,不然重启会失败
备注:内容来源于stack exchange,提问作者Jibun no Kage




