Ansible >= 2.7(于2018年10月发布)
使用内置的reboot模块:
- name: Wait for server to restart
reboot:
reboot_timeout: 3600
Ansible < 2.7
将重启作为一个任务
- name: restart server
shell: 'sleep 1 && shutdown -r now "Reboot triggered by Ansible" && sleep 1'
async: 1
poll: 0
become: true
这将作为
异步任务运行shell命令,因此Ansible不会等待命令结束。通常
async
参数为任务提供最长时间,但由于将
poll
设置为0,如果命令已完成,Ansible将永远不会轮询-它将使此命令成为“fire and forget”。在
shutdown
之前和之后的休眠是为了防止在重启期间断开SSH连接,而Ansible仍然连接到您的远程主机。
等待作为任务
您可以直接使用:
- name: Wait for server to restart
local_action:
module: wait_for
host={{ inventory_hostname }}
port=22
delay=10
become: false
..但是你可能更喜欢使用{{ ansible_ssh_host }}
变量作为主机名和/或{{ ansible_ssh_port }}
作为SSH主机和端口,如果你使用如下条目:
hostname ansible_ssh_host=some.other.name.com ansible_ssh_port=2222
在您的清单 (Ansible hosts
文件) 中。
这将在运行 Ansible 的机器上运行 wait_for 任务。该任务将等待远程主机上的端口 22 开放,延迟 10 秒后开始等待。
重启并等待作为处理程序
但我建议将两者都用作处理程序,而不是任务。
这样做有两个主要原因:
在此处 了解有关处理程序的更多信息。
作为处理程序重新启动并等待重新启动:
handlers:
- name: Restart server
command: 'sleep 1 && shutdown -r now "Reboot triggered by Ansible" && sleep 1'
async: 1
poll: 0
ignore_errors: true
become: true
- name: Wait for server to restart
local_action:
module: wait_for
host={{ inventory_hostname }}
port=22
delay=10
become: false
..并且按照顺序在您的任务中使用它,就像这样,这里与重新启动服务器处理程序配对使用:
tasks:
- name: Set hostname
hostname: name=somename
notify:
- Restart server
- Wait for server to restart
请注意
处理程序按照定义的顺序运行,而不是在notify
中列出的顺序!。