From 292e2da4e10253eb5de388736cc89295cd860183 Mon Sep 17 00:00:00 2001 From: James Cammarata Date: Thu, 10 Sep 2015 17:36:06 -0400 Subject: [PATCH] Fix some bugs related to facts/nonpersistent-facts cache split Fixes #12313 --- lib/ansible/plugins/strategies/__init__.py | 7 +++++-- lib/ansible/vars/__init__.py | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/lib/ansible/plugins/strategies/__init__.py b/lib/ansible/plugins/strategies/__init__.py index 4ca4f937605..0a9d7c481f4 100644 --- a/lib/ansible/plugins/strategies/__init__.py +++ b/lib/ansible/plugins/strategies/__init__.py @@ -267,7 +267,7 @@ class StrategyBase: return v var_value = _wrap_var(var_value) - self._variable_manager.set_host_facts(host, {var_name: var_value}) + self._variable_manager.set_nonpersistent_facts(host, {var_name: var_value}) elif result[0] in ('set_host_var', 'set_host_facts'): host = result[1] @@ -293,7 +293,10 @@ class StrategyBase: self._variable_manager.set_host_variable(target_host, var_name, var_value) elif result[0] == 'set_host_facts': facts = result[4] - self._variable_manager.set_host_facts(target_host, facts) + if task.action == 'set_fact': + self._variable_manager.set_nonpersistent_facts(target_host, facts) + else: + self._variable_manager.set_host_facts(target_host, facts) else: raise AnsibleError("unknown result message received: %s" % result[0]) diff --git a/lib/ansible/vars/__init__.py b/lib/ansible/vars/__init__.py index 90008fcd986..52679b11ca9 100644 --- a/lib/ansible/vars/__init__.py +++ b/lib/ansible/vars/__init__.py @@ -390,6 +390,21 @@ class VariableManager: assert isinstance(facts, dict) + if host.name not in self._fact_cache: + self._fact_cache[host.name] = facts + else: + try: + self._fact_cache[host.name].update(facts) + except KeyError: + self._fact_cache[host.name] = facts + + def set_nonpersistent_facts(self, host, facts): + ''' + Sets or updates the given facts for a host in the fact cache. + ''' + + assert isinstance(facts, dict) + if host.name not in self._nonpersistent_fact_cache: self._nonpersistent_fact_cache[host.name] = facts else: