From 006f08da99b89f018d8a34bee97fb6f511ec7039 Mon Sep 17 00:00:00 2001 From: Brian Coca Date: Thu, 12 Jul 2018 16:12:42 -0400 Subject: [PATCH] Fix fact cleaning (#42595) * fix fact cleanup fixes #41684 --- lib/ansible/constants.py | 12 ++++++++---- lib/ansible/vars/clean.py | 7 ++++++- lib/ansible/vars/manager.py | 4 ++-- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/lib/ansible/constants.py b/lib/ansible/constants.py index 02adef40e3..cf7962a32f 100644 --- a/lib/ansible/constants.py +++ b/lib/ansible/constants.py @@ -22,7 +22,7 @@ def _warning(msg): try: from __main__ import display display.warning(msg) - except: + except Exception: import sys sys.stderr.write(' [WARNING] %s\n' % (msg)) @@ -32,7 +32,7 @@ def _deprecated(msg, version='2.8'): try: from __main__ import display display.deprecated(msg, version=version) - except: + except Exception: import sys sys.stderr.write(' [DEPRECATED] %s, to be removed in %s\n' % (msg, version)) @@ -53,7 +53,7 @@ def get_config(parser, section, key, env_var, default_value, value_type=None, ex if value is None: try: value = get_ini_config_value(parser, {'key': key, 'section': section}) - except: + except Exception: pass if value is None: value = default_value @@ -123,6 +123,10 @@ VAULT_VERSION_MAX = 1.0 # object. The dictionary values are tuples, to account for aliases # in variable names. +COMMON_CONNECTION_VARS = frozenset(set(('ansible_connection', 'ansbile_host', 'ansible_user', 'ansible_shell_executable', + 'ansible_port', 'ansible_pipelining', 'ansible_password', 'ansible_timeout', + 'ansible_shell_type', 'ansible_module_compression', 'ansible_private_key_file'))) + MAGIC_VARIABLE_MAPPING = dict( # base @@ -193,7 +197,7 @@ for setting in config.data.get_settings(): value = literal_eval(value) except ValueError: pass # not a python data structure - except: + except Exception: pass # not templatable value = ensure_type(value, setting.type) diff --git a/lib/ansible/vars/clean.py b/lib/ansible/vars/clean.py index c83709df4d..64bb042054 100644 --- a/lib/ansible/vars/clean.py +++ b/lib/ansible/vars/clean.py @@ -63,8 +63,13 @@ def clean_facts(facts): fact_keys = set(data.keys()) # first we add all of our magic variable names to the set of # keys we want to remove from facts + # NOTE: these will eventually disappear in favor of others below for magic_var in C.MAGIC_VARIABLE_MAPPING: remove_keys.update(fact_keys.intersection(C.MAGIC_VARIABLE_MAPPING[magic_var])) + + # remove common connection vars + remove_keys.update(fact_keys.intersection(C.COMMON_CONNECTION_VARS)) + # next we remove any connection plugin specific vars for conn_path in connection_loader.all(path_only=True): try: @@ -72,7 +77,7 @@ def clean_facts(facts): re_key = re.compile('^ansible_%s_' % conn_name) for fact_key in fact_keys: # most lightweight VM or container tech creates devices with this pattern, this avoids filtering them out - if re_key.match(fact_key) and not fact_key.endswith(('_bridge', '_gwbridge')): + if (re_key.match(fact_key) and not fact_key.endswith(('_bridge', '_gwbridge'))) or re_key.startswith('ansible_become_'): remove_keys.add(fact_key) except AttributeError: pass diff --git a/lib/ansible/vars/manager.py b/lib/ansible/vars/manager.py index 07669ec625..01525f08e5 100644 --- a/lib/ansible/vars/manager.py +++ b/lib/ansible/vars/manager.py @@ -43,7 +43,7 @@ from ansible.template import Templar from ansible.utils.listify import listify_lookup_plugin_terms from ansible.utils.vars import combine_vars from ansible.utils.unsafe_proxy import wrap_var -from ansible.vars.clean import namespace_facts +from ansible.vars.clean import namespace_facts, clean_facts try: from __main__ import display @@ -313,7 +313,7 @@ class VariableManager: # push facts to main namespace if C.INJECT_FACTS_AS_VARS: - all_vars = combine_vars(all_vars, wrap_var(facts)) + all_vars = combine_vars(all_vars, wrap_var(clean_facts(facts))) else: # always 'promote' ansible_local all_vars = combine_vars(all_vars, wrap_var({'ansible_local': facts.get('ansible_local', {})}))