UPDATE: This method is old and outdated. Most of the time this is probably what you actually want – https://docs.ansible.com/ansible/latest/modules/reboot_module.html.
Sometimes when using Ansible there is the need to reboot a server and wait for it to return. This simple recipe will allow you to achieve that while also getting some nice feedback so you know what is going on. You can place these tasks into a role or just in your playbook:
- name: Store target host and user
set_fact:
target_host: "{{ ansible_host }}"
target_user: "{{ ansible_user }}"
- name: Reboot the server
shell: sleep 2 && shutdown -r now "Ansible package updates triggered"
async: 1
poll: 0
ignore_errors: true
- name: Wait for server to shutdown
local_action: shell ssh -o BatchMode=yes -o ConnectTimeout=2 -o StrictHostKeyChecking=no "{{ target_user }}@{{ target_host }}" true
register: result
until: result.rc != 0
failed_when: result.rc == -1
retries: 200
delay: 1
- name: Wait for server to be ready
local_action: shell ssh -o BatchMode=yes -o ConnectTimeout=2 -o StrictHostKeyChecking=no "{{ target_user }}@{{ target_host }}" true
register: result
until: result.rc == 0
retries: 200
delay: 3