namespace facts (#18445)

* namespace facts

always namespace facts, make the polluting of 'main' conditional on config

* updated to 2.4

* Update intro_configuration.rst
pull/22677/head
Brian Coca 8 years ago committed by scottb
parent 12f6beaebd
commit dd8d699981

@ -762,6 +762,27 @@ always default to the current user if this is not defined::
remote_user = root remote_user = root
.. _restrict_facts_namespace:
restrict_facts_namespace
========================
.. versionadded:: 2.4
This allows restricting facts in their own namespace (under ansible_facts) instead of pushing them into the main.
False by default. Can also be set via the environment variable `ANSIBLE_RESTRICT_FACTS`. Using `ansible_system` as an example:
When False::
- debug: var=ansible_system
When True::
- debug: var=ansible_facts.ansible_system
.. _retry_files_enabled: .. _retry_files_enabled:
retry_files_enabled retry_files_enabled

@ -288,6 +288,10 @@
# only update this setting if you know how this works, otherwise it can break module execution # only update this setting if you know how this works, otherwise it can break module execution
#network_group_modules=['eos', 'nxos', 'ios', 'iosxr', 'junos', 'vyos'] #network_group_modules=['eos', 'nxos', 'ios', 'iosxr', 'junos', 'vyos']
# This keeps facts from polluting the main namespace as variables.
# Setting to True keeps them under the ansible_facts namespace, the default is False
#restrict_facts_namespace: True
[privilege_escalation] [privilege_escalation]
#become=True #become=True
#become_method=sudo #become_method=sudo

@ -236,6 +236,7 @@ DEFAULT_VAR_COMPRESSION_LEVEL = get_config(p, DEFAULTS, 'var_compression_level',
DEFAULT_INTERNAL_POLL_INTERVAL = get_config(p, DEFAULTS, 'internal_poll_interval', None, 0.001, value_type='float') DEFAULT_INTERNAL_POLL_INTERVAL = get_config(p, DEFAULTS, 'internal_poll_interval', None, 0.001, value_type='float')
ERROR_ON_MISSING_HANDLER = get_config(p, DEFAULTS, 'error_on_missing_handler', 'ANSIBLE_ERROR_ON_MISSING_HANDLER', True, value_type='boolean') ERROR_ON_MISSING_HANDLER = get_config(p, DEFAULTS, 'error_on_missing_handler', 'ANSIBLE_ERROR_ON_MISSING_HANDLER', True, value_type='boolean')
SHOW_CUSTOM_STATS = get_config(p, DEFAULTS, 'show_custom_stats', 'ANSIBLE_SHOW_CUSTOM_STATS', False, value_type='boolean') SHOW_CUSTOM_STATS = get_config(p, DEFAULTS, 'show_custom_stats', 'ANSIBLE_SHOW_CUSTOM_STATS', False, value_type='boolean')
NAMESPACE_FACTS = get_config(p, DEFAULTS, 'restrict_facts_namespace', 'ANSIBLE_RESTRICT_FACTS', False, value_type='boolean')
# static includes # static includes
DEFAULT_TASK_INCLUDES_STATIC = get_config(p, DEFAULTS, 'task_includes_static', 'ANSIBLE_TASK_INCLUDES_STATIC', False, value_type='boolean') DEFAULT_TASK_INCLUDES_STATIC = get_config(p, DEFAULTS, 'task_includes_static', 'ANSIBLE_TASK_INCLUDES_STATIC', False, value_type='boolean')

@ -557,7 +557,9 @@ class TaskExecutor:
return failed_when_result return failed_when_result
if 'ansible_facts' in result: if 'ansible_facts' in result:
if not C.NAMESPACE_FACTS:
vars_copy.update(result['ansible_facts']) vars_copy.update(result['ansible_facts'])
vars_copy.update({'ansible_facts': result['ansible_facts']})
# set the failed property if the result has a non-zero rc. This will be # set the failed property if the result has a non-zero rc. This will be
# overridden below if the failed_when property is set # overridden below if the failed_when property is set
@ -596,7 +598,9 @@ class TaskExecutor:
variables[self._task.register] = wrap_var(result) variables[self._task.register] = wrap_var(result)
if 'ansible_facts' in result: if 'ansible_facts' in result:
if not C.NAMESPACE_FACTS:
variables.update(result['ansible_facts']) variables.update(result['ansible_facts'])
variables.update({'ansible_facts': result['ansible_facts']})
# save the notification target in the result, if it was specified, as # save the notification target in the result, if it was specified, as
# this task may be running in a loop in which case the notification # this task may be running in a loop in which case the notification

@ -733,7 +733,7 @@ class ActionBase(with_metaclass(ABCMeta, object)):
# actually execute # actually execute
res = self._low_level_execute_command(cmd, sudoable=sudoable, in_data=in_data) res = self._low_level_execute_command(cmd, sudoable=sudoable, in_data=in_data)
# parse the main result, also cleans up internal keys # parse the main result
data = self._parse_returned_data(res) data = self._parse_returned_data(res)
#NOTE: INTERNAL KEYS ONLY ACCESSIBLE HERE #NOTE: INTERNAL KEYS ONLY ACCESSIBLE HERE

@ -281,7 +281,11 @@ class VariableManager:
# finally, the facts caches for this host, if it exists # finally, the facts caches for this host, if it exists
try: try:
host_facts = wrap_var(self._fact_cache.get(host.name, dict())) host_facts = wrap_var(self._fact_cache.get(host.name, dict()))
if not C.NAMESPACE_FACTS:
# allow facts to polute main namespace
all_vars = combine_vars(all_vars, host_facts) all_vars = combine_vars(all_vars, host_facts)
# always return namespaced facts
all_vars = combine_vars(all_vars, {'ansible_facts': host_facts})
except KeyError: except KeyError:
pass pass

Loading…
Cancel
Save