Fix fact cleaning (#42595)
* fix fact cleanup
fixes #41684
(cherry picked from commit 006f08da99
)
This commit is contained in:
parent
e8ff717ba8
commit
944161c9ea
4 changed files with 17 additions and 6 deletions
2
changelogs/fragments/fix_fact_clean.yaml
Normal file
2
changelogs/fragments/fix_fact_clean.yaml
Normal file
|
@ -0,0 +1,2 @@
|
|||
bugfixes:
|
||||
- restores filtering out conflicting facts https://github.com/ansible/ansible/issues/41684
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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', {})}))
|
||||
|
|
Loading…
Reference in a new issue