mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
Adds 'ansible_check_mode' boolean magic variable
* Makes it possible to pass any options variable to VariableManager by changing `load_options_vars(options)` in `lib/ansible/utils/vars.py`
This commit is contained in:
parent
1942cd33dc
commit
eed6cf5dad
7 changed files with 54 additions and 2 deletions
|
@ -38,7 +38,25 @@ Example::
|
||||||
|
|
||||||
As a reminder, a task with a `when` clause evaluated to false, will
|
As a reminder, a task with a `when` clause evaluated to false, will
|
||||||
still be skipped even if it has a `always_run` clause evaluated to
|
still be skipped even if it has a `always_run` clause evaluated to
|
||||||
true.
|
true.
|
||||||
|
|
||||||
|
Also if you want to skip, or ignore errors on some tasks in check mode
|
||||||
|
you can use a boolean magic variable `ansible_check_mode` (added in version 2.1)
|
||||||
|
which will be set to `True` during check mode.
|
||||||
|
|
||||||
|
Example::
|
||||||
|
|
||||||
|
tasks:
|
||||||
|
|
||||||
|
- name: this task will be skipped in check mode
|
||||||
|
git: repo=ssh://git@github.com/mylogin/hello.git dest=/home/mylogin/hello
|
||||||
|
when: not ansible_check_mode
|
||||||
|
|
||||||
|
- name: this task will ignore errors in check mode
|
||||||
|
git: repo=ssh://git@github.com/mylogin/hello.git dest=/home/mylogin/hello
|
||||||
|
ignore_errors: "{{ ansible_check_mode }}"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. _diff_mode:
|
.. _diff_mode:
|
||||||
|
|
||||||
|
|
|
@ -674,7 +674,9 @@ Don't worry about any of this unless you think you need it. You'll know when yo
|
||||||
|
|
||||||
Also available, ``inventory_dir`` is the pathname of the directory holding Ansible's inventory host file, ``inventory_file`` is the pathname and the filename pointing to the Ansible's inventory host file.
|
Also available, ``inventory_dir`` is the pathname of the directory holding Ansible's inventory host file, ``inventory_file`` is the pathname and the filename pointing to the Ansible's inventory host file.
|
||||||
|
|
||||||
And finally, ``role_path`` will return the current role's pathname (since 1.8). This will only work inside a role.
|
We then have ``role_path`` which will return the current role's pathname (since 1.8). This will only work inside a role.
|
||||||
|
|
||||||
|
And finally, ``ansible_check_mode`` (added in version 2.1), a boolean magic variable which will be set to ``True`` if you run Ansible with ``--check``.
|
||||||
|
|
||||||
.. _variable_file_separation_details:
|
.. _variable_file_separation_details:
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,7 @@ from ansible.parsing.splitter import parse_kv
|
||||||
from ansible.playbook.play import Play
|
from ansible.playbook.play import Play
|
||||||
from ansible.plugins import get_all_plugin_loaders
|
from ansible.plugins import get_all_plugin_loaders
|
||||||
from ansible.utils.vars import load_extra_vars
|
from ansible.utils.vars import load_extra_vars
|
||||||
|
from ansible.utils.vars import load_options_vars
|
||||||
from ansible.utils.unicode import to_unicode
|
from ansible.utils.unicode import to_unicode
|
||||||
from ansible.vars import VariableManager
|
from ansible.vars import VariableManager
|
||||||
|
|
||||||
|
@ -123,6 +124,8 @@ class AdHocCLI(CLI):
|
||||||
variable_manager = VariableManager()
|
variable_manager = VariableManager()
|
||||||
variable_manager.extra_vars = load_extra_vars(loader=loader, options=self.options)
|
variable_manager.extra_vars = load_extra_vars(loader=loader, options=self.options)
|
||||||
|
|
||||||
|
variable_manager.options_vars = load_options_vars(self.options)
|
||||||
|
|
||||||
inventory = Inventory(loader=loader, variable_manager=variable_manager, host_list=self.options.inventory)
|
inventory = Inventory(loader=loader, variable_manager=variable_manager, host_list=self.options.inventory)
|
||||||
variable_manager.set_inventory(inventory)
|
variable_manager.set_inventory(inventory)
|
||||||
|
|
||||||
|
|
|
@ -33,6 +33,7 @@ from ansible.parsing.dataloader import DataLoader
|
||||||
from ansible.playbook.block import Block
|
from ansible.playbook.block import Block
|
||||||
from ansible.playbook.play_context import PlayContext
|
from ansible.playbook.play_context import PlayContext
|
||||||
from ansible.utils.vars import load_extra_vars
|
from ansible.utils.vars import load_extra_vars
|
||||||
|
from ansible.utils.vars import load_options_vars
|
||||||
from ansible.vars import VariableManager
|
from ansible.vars import VariableManager
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
@ -125,6 +126,8 @@ class PlaybookCLI(CLI):
|
||||||
variable_manager = VariableManager()
|
variable_manager = VariableManager()
|
||||||
variable_manager.extra_vars = load_extra_vars(loader=loader, options=self.options)
|
variable_manager.extra_vars = load_extra_vars(loader=loader, options=self.options)
|
||||||
|
|
||||||
|
variable_manager.options_vars = load_options_vars(self.options)
|
||||||
|
|
||||||
# create the inventory, and filter it based on the subset specified (if any)
|
# create the inventory, and filter it based on the subset specified (if any)
|
||||||
inventory = Inventory(loader=loader, variable_manager=variable_manager, host_list=self.options.inventory)
|
inventory = Inventory(loader=loader, variable_manager=variable_manager, host_list=self.options.inventory)
|
||||||
variable_manager.set_inventory(inventory)
|
variable_manager.set_inventory(inventory)
|
||||||
|
|
|
@ -111,6 +111,13 @@ def load_extra_vars(loader, options):
|
||||||
extra_vars = combine_vars(extra_vars, data)
|
extra_vars = combine_vars(extra_vars, data)
|
||||||
return extra_vars
|
return extra_vars
|
||||||
|
|
||||||
|
def load_options_vars(options):
|
||||||
|
options_vars = {}
|
||||||
|
# For now only return check mode, but we can easily return more
|
||||||
|
# options if we need variables for them
|
||||||
|
options_vars['ansible_check_mode'] = options.check
|
||||||
|
return options_vars
|
||||||
|
|
||||||
def isidentifier(ident):
|
def isidentifier(ident):
|
||||||
"""
|
"""
|
||||||
Determines, if string is valid Python identifier using the ast module.
|
Determines, if string is valid Python identifier using the ast module.
|
||||||
|
|
|
@ -99,6 +99,7 @@ class VariableManager:
|
||||||
self._inventory = None
|
self._inventory = None
|
||||||
self._hostvars = None
|
self._hostvars = None
|
||||||
self._omit_token = '__omit_place_holder__%s' % sha1(os.urandom(64)).hexdigest()
|
self._omit_token = '__omit_place_holder__%s' % sha1(os.urandom(64)).hexdigest()
|
||||||
|
self._options_vars = defaultdict(dict)
|
||||||
|
|
||||||
def __getstate__(self):
|
def __getstate__(self):
|
||||||
data = dict(
|
data = dict(
|
||||||
|
@ -109,6 +110,7 @@ class VariableManager:
|
||||||
host_vars_files = self._host_vars_files,
|
host_vars_files = self._host_vars_files,
|
||||||
group_vars_files = self._group_vars_files,
|
group_vars_files = self._group_vars_files,
|
||||||
omit_token = self._omit_token,
|
omit_token = self._omit_token,
|
||||||
|
options_vars = self._options_vars,
|
||||||
#inventory = self._inventory,
|
#inventory = self._inventory,
|
||||||
)
|
)
|
||||||
return data
|
return data
|
||||||
|
@ -122,6 +124,7 @@ class VariableManager:
|
||||||
self._group_vars_files = data.get('group_vars_files', defaultdict(dict))
|
self._group_vars_files = data.get('group_vars_files', defaultdict(dict))
|
||||||
self._omit_token = data.get('omit_token', '__omit_place_holder__%s' % sha1(os.urandom(64)).hexdigest())
|
self._omit_token = data.get('omit_token', '__omit_place_holder__%s' % sha1(os.urandom(64)).hexdigest())
|
||||||
self._inventory = data.get('inventory', None)
|
self._inventory = data.get('inventory', None)
|
||||||
|
self._options_vars = data.get('options_vars', dict())
|
||||||
|
|
||||||
def _get_cache_entry(self, play=None, host=None, task=None):
|
def _get_cache_entry(self, play=None, host=None, task=None):
|
||||||
play_id = "NONE"
|
play_id = "NONE"
|
||||||
|
@ -152,6 +155,17 @@ class VariableManager:
|
||||||
def set_inventory(self, inventory):
|
def set_inventory(self, inventory):
|
||||||
self._inventory = inventory
|
self._inventory = inventory
|
||||||
|
|
||||||
|
@property
|
||||||
|
def options_vars(self):
|
||||||
|
''' ensures a clean copy of the options_vars are made '''
|
||||||
|
return self._options_vars.copy()
|
||||||
|
|
||||||
|
@options_vars.setter
|
||||||
|
def options_vars(self, value):
|
||||||
|
''' ensures a clean copy of the options_vars are used to set the value '''
|
||||||
|
assert isinstance(value, dict)
|
||||||
|
self._options_vars = value.copy()
|
||||||
|
|
||||||
def _preprocess_vars(self, a):
|
def _preprocess_vars(self, a):
|
||||||
'''
|
'''
|
||||||
Ensures that vars contained in the parameter passed in are
|
Ensures that vars contained in the parameter passed in are
|
||||||
|
@ -392,6 +406,9 @@ class VariableManager:
|
||||||
# the 'omit' value alows params to be left out if the variable they are based on is undefined
|
# the 'omit' value alows params to be left out if the variable they are based on is undefined
|
||||||
variables['omit'] = self._omit_token
|
variables['omit'] = self._omit_token
|
||||||
variables['ansible_version'] = CLI.version_info(gitinfo=False)
|
variables['ansible_version'] = CLI.version_info(gitinfo=False)
|
||||||
|
# Set options vars
|
||||||
|
for option, option_value in self._options_vars.iteritems():
|
||||||
|
variables[option] = option_value
|
||||||
|
|
||||||
if self._hostvars is not None and include_hostvars:
|
if self._hostvars is not None and include_hostvars:
|
||||||
variables['hostvars'] = self._hostvars
|
variables['hostvars'] = self._hostvars
|
||||||
|
|
|
@ -49,6 +49,8 @@ class TestVariableManager(unittest.TestCase):
|
||||||
del vars['vars']
|
del vars['vars']
|
||||||
if 'ansible_version' in vars:
|
if 'ansible_version' in vars:
|
||||||
del vars['ansible_version']
|
del vars['ansible_version']
|
||||||
|
if 'ansible_check_mode' in vars:
|
||||||
|
del vars['ansible_check_mode']
|
||||||
|
|
||||||
self.assertEqual(vars, dict(playbook_dir='.'))
|
self.assertEqual(vars, dict(playbook_dir='.'))
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue