
使用 Ansible 如何在 SSH 服务重新启动时等待或恢复?我有一个 ansible playbook,它对 SSH 配置做了一些更改,但是当 ssh 重新启动时,Ansible 当然会丢失 SSH 连接。我正在使用内置的 ansible 模块来执行服务重启。
我可以触发重新启动并等待,但当我只需要等待一会儿服务完成重新启动时,这似乎有些过度,有人有办法解决这个问题吗?
答案1
只需在 ssh 服务重启任务后添加一个 wait_for 模块的新任务即可。以下是参考来自官方 Ansible 文档。
# Do not assume the inventory_hostname is resolvable and delay 10 seconds at start
- name: Wait 300 seconds for port 22 to become open and contain "OpenSSH"
ansible.builtin.wait_for:
port: 22
host: '{{ (ansible_ssh_host|default(ansible_host))|default(inventory_hostname) }}'
search_regex: OpenSSH
delay: 10
connection: local
在默认的 Ansible 示例中,延迟为 10 秒,但我还在我的示例(如下)中将超时时间添加到 300 秒,因此它将每 10 秒重试一次,如果它无法连接到库存主机上的端口 22,它将在 300 秒后失败。请根据需要随意修改它。
这是您任务的示例。我在提供解决方案之前已经测试过了。它包含三个任务。第一个任务是重新启动 ssh 守护进程。第二个任务将等待 300 秒,每 10 秒重试一次。如果连接成功,它将继续执行下一个任务,我已经使用 ping 模块对其进行了测试。
---
- name: Reload service ssh, in all cases
hosts: yourinventoryname
become: true
tasks:
- name: Reload SSH service
ansible.builtin.systemd:
name: sshd
state: restarted
- name: Wait for SSH service to be available
hosts: all
gather_facts: false
tasks:
- name: Wait for port 22 to become open and contain "OpenSSH"
ansible.builtin.wait_for:
port: 22
host: '{{ (ansible_ssh_host|default(ansible_host))|default(inventory_hostname) }}'
search_regex: OpenSSH
delay: 10
timeout: 300
connection: local
- name: Test SSH connection
gather_facts: false
hosts: yourinventoryname
tasks:
- name: Ping hosts
ansible.builtin.ping: