You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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值改成对应端口
  • 可以根据目标主机的性能调整delaytimeout的数值,比如老旧机器可以把超时设长到120秒
  • 有些系统的SSH服务名是sshd(RHEL/CentOS系列),有些是ssh(Debian/Ubuntu系列),一定要对应上,不然重启会失败

备注:内容来源于stack exchange,提问作者Jibun no Kage

火山引擎 最新活动