diff --git a/lib/ansible/modules/windows/win_reboot.py b/lib/ansible/modules/windows/win_reboot.py index aca0b42d57..79b5f57d64 100644 --- a/lib/ansible/modules/windows/win_reboot.py +++ b/lib/ansible/modules/windows/win_reboot.py @@ -57,21 +57,23 @@ options: description: - Message to display to users default: Reboot initiated by Ansible +notes: +- If a shutdown was already scheduled on the system, C(win_reboot) will abort the scheduled shutdown and enforce its own shutdown. author: - Matt Davis (@nitzmahone) ''' EXAMPLES=''' -# unconditionally reboot the machine with all defaults +# Unconditionally reboot the machine with all defaults - win_reboot: -# apply updates and reboot if necessary +# Apply updates and reboot if necessary - win_updates: register: update_result - win_reboot: when: update_result.reboot_required -# reboot a slow machine that might have lots of updates to apply +# Reboot a slow machine that might have lots of updates to apply - win_reboot: shutdown_timeout_sec: 3600 reboot_timeout_sec: 3600 diff --git a/lib/ansible/plugins/action/win_reboot.py b/lib/ansible/plugins/action/win_reboot.py index 82c22963a0..82216207d4 100644 --- a/lib/ansible/plugins/action/win_reboot.py +++ b/lib/ansible/plugins/action/win_reboot.py @@ -83,9 +83,21 @@ class ActionModule(ActionBase): result = super(ActionModule, self).run(tmp, task_vars) - # initiate reboot + # Initiate reboot (rc, stdout, stderr) = self._connection.exec_command('shutdown /r /t %d /c "%s"' % (pre_reboot_delay_sec, msg)) + # Test for "A system shutdown has already been scheduled. (1190)" and handle it gracefully + if rc == 1190: + result['warnings'] = ( 'A scheduled reboot was pre-empted by Ansible.' ) + + # Try to abort (this may fail if it was already aborted) + (rc, stdout1, stderr1) = self._connection.exec_command('shutdown /a') + + # Initiate reboot again + (rc, stdout2, stderr2) = self._connection.exec_command('shutdown /r /t %d' % pre_reboot_delay_sec) + stdout += stdout1 + stdout2 + stderr += stderr1 + stderr2 + if rc != 0: result['failed'] = True result['rebooted'] = False