reboot - add boot_time_command parameter (#62680)

Allow the built in commands for checking boot time to be overridden. This is mainly for containers and other odd systems where it would add too much complexity to the plugin code to try and discern the correct command to use.
This commit is contained in:
Sam Doran 2020-01-21 13:42:32 -05:00 committed by GitHub
parent 617fbad743
commit 2b7393141f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 39 additions and 1 deletions

View file

@ -0,0 +1,5 @@
bugfixes:
- >-
reboot, win_reboot - add ``boot_time_command`` parameter to override the default command used to
determine whether or not a system was rebooted
(https://github.com/ansible/ansible/issues/58868)

View file

@ -65,6 +65,14 @@ options:
type: list type: list
default: ['/sbin', '/usr/sbin', '/usr/local/sbin'] default: ['/sbin', '/usr/sbin', '/usr/local/sbin']
version_added: '2.8' version_added: '2.8'
boot_time_command:
description:
- Command to run that returns a unique string indicating the last time the system was booted.
- Setting this to a command that has different output each time it is run will cause the task to fail.
type: str
default: 'cat /proc/sys/kernel/random/boot_id'
version_added: '2.10'
seealso: seealso:
- module: win_reboot - module: win_reboot
author: author:

View file

@ -61,6 +61,13 @@ options:
- Message to display to users. - Message to display to users.
type: str type: str
default: Reboot initiated by Ansible default: Reboot initiated by Ansible
boot_time_command:
description:
- Command to run that returns a unique string indicating the last time the system was booted.
- Setting this to a command that has different output each time it is run will cause the task to fail.
type: str
default: '(Get-WmiObject -ClassName Win32_OperatingSystem).LastBootUpTime'
version_added: '2.10'
notes: notes:
- If a shutdown was already scheduled on the system, C(win_reboot) will abort the scheduled shutdown and enforce its own shutdown. - If a shutdown was already scheduled on the system, C(win_reboot) will abort the scheduled shutdown and enforce its own shutdown.
- Beware that when C(win_reboot) returns, the Windows system may not have settled yet and some base services could be in limbo. - Beware that when C(win_reboot) returns, the Windows system may not have settled yet and some base services could be in limbo.

View file

@ -13,6 +13,7 @@ from datetime import datetime, timedelta
from ansible.errors import AnsibleError, AnsibleConnectionFailure from ansible.errors import AnsibleError, AnsibleConnectionFailure
from ansible.module_utils._text import to_native, to_text from ansible.module_utils._text import to_native, to_text
from ansible.module_utils.common.collections import is_string from ansible.module_utils.common.collections import is_string
from ansible.module_utils.common.validation import check_type_str
from ansible.plugins.action import ActionBase from ansible.plugins.action import ActionBase
from ansible.utils.display import Display from ansible.utils.display import Display
@ -25,7 +26,16 @@ class TimedOutException(Exception):
class ActionModule(ActionBase): class ActionModule(ActionBase):
TRANSFERS_FILES = False TRANSFERS_FILES = False
_VALID_ARGS = frozenset(('connect_timeout', 'msg', 'post_reboot_delay', 'pre_reboot_delay', 'test_command', 'reboot_timeout', 'search_paths')) _VALID_ARGS = frozenset((
'boot_time_command',
'connect_timeout',
'msg',
'post_reboot_delay',
'pre_reboot_delay',
'test_command',
'reboot_timeout',
'search_paths'
))
DEFAULT_REBOOT_TIMEOUT = 600 DEFAULT_REBOOT_TIMEOUT = 600
DEFAULT_CONNECT_TIMEOUT = None DEFAULT_CONNECT_TIMEOUT = None
@ -178,6 +188,14 @@ class ActionModule(ActionBase):
def get_system_boot_time(self, distribution): def get_system_boot_time(self, distribution):
boot_time_command = self._get_value_from_facts('BOOT_TIME_COMMANDS', distribution, 'DEFAULT_BOOT_TIME_COMMAND') boot_time_command = self._get_value_from_facts('BOOT_TIME_COMMANDS', distribution, 'DEFAULT_BOOT_TIME_COMMAND')
if self._task.args.get('boot_time_command'):
boot_time_command = self._task.args.get('boot_time_command')
try:
check_type_str(boot_time_command, allow_conversion=False)
except TypeError as e:
raise AnsibleError("Invalid value given for 'boot_time_command': %s." % to_native(e))
display.debug("{action}: getting boot time with command: '{command}'".format(action=self._task.action, command=boot_time_command)) display.debug("{action}: getting boot time with command: '{command}'".format(action=self._task.action, command=boot_time_command))
command_result = self._low_level_execute_command(boot_time_command, sudoable=self.DEFAULT_SUDOABLE) command_result = self._low_level_execute_command(boot_time_command, sudoable=self.DEFAULT_SUDOABLE)