![无法让 Ansible 等待服务器重启并继续运行 playbook](https://linux22.com/image/1501582/%E6%97%A0%E6%B3%95%E8%AE%A9%20Ansible%20%E7%AD%89%E5%BE%85%E6%9C%8D%E5%8A%A1%E5%99%A8%E9%87%8D%E5%90%AF%E5%B9%B6%E7%BB%A7%E7%BB%AD%E8%BF%90%E8%A1%8C%20playbook.png)
我正在创建一个剧本来安装软件,并且我需要在剧本中间重新启动服务器。
我需要我的 Ansible 主机等到服务器恢复并执行我的其余任务,但这并没有发生。
这些是与重启和等待相关的 Ansible 任务:
...
- name: restart server
shell: shutdown -r now
async: 1
poll: 0
become: yes
become_method: sudo
ignore_errors: true
- name: waiting for server to come back after reboot
local_action: wait_for host={{ ansible_ssh_host }} state=started port=22 delay=30 timeout=300 connect_timeout=15
....
这是运行我的剧本的输出:
...
TASK [restart server] **********************************************************
fatal: [X.X.X.X]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh.", "unreachable": true}
to retry, use: --limit @ansible_pb.retry
PLAY RECAP *********************************************************************
X.X.X.X : ok=2 changed=0 unreachable=1 failed=0
知道哪里出了问题以及我该如何修复它?
答案1
这是一个众所周知的问题。请参阅重新启动服务器并等待其恢复. 自 Ansible 1.9.4 起 SSH 在继续执行下一个任务之前会丢失连接。
您需要在命令前添加延迟(sleep
)shutdown
:
- name: restart server
shell: sleep 2 && shutdown -r now
async: 1
poll: 0
become: yes
become_method: sudo
ignore_errors: true
- name: waiting for server to come back after reboot
wait_for_connection:
....
答案2
答案3
我发现这对 EX-407 (基于 Ansible 2.3) 有用:
- name: restart the server
shell: (sleep 2 && shutdown -r now) &
async: 1
poll: 0
ignore_errors: true
- name: wait for the server to come back
wait_for:
host: "{{ inventory_hostname }}"
port: 22
delay: 15
delegate_to: localhost
令我惊讶的是,wait_for
模块中的“state: started”选项最初导致整个过程失败;wait_for
无法发现端口 22 再次打开。但无法解释这种行为。一旦删除“state”选项,剧本就会开始按预期工作。