From b37b51dceada262a6ee7cbb0b9d947e2a51ed12d Mon Sep 17 00:00:00 2001 From: James Cammarata Date: Tue, 7 Jun 2016 11:14:43 -0500 Subject: [PATCH] Fix variable precedence issue where set facts beat role params Also updates doc on variable precedence, as it was incorrect for the order of play vars/vars_prompt/vars_files in relation to set_fact and registered variables. Fixes #14702 Fixes #14826 --- docsite/rst/playbooks_variables.rst | 4 ++-- lib/ansible/vars/__init__.py | 15 +++++++-------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/docsite/rst/playbooks_variables.rst b/docsite/rst/playbooks_variables.rst index de74182b45..8cd5e8443c 100644 --- a/docsite/rst/playbooks_variables.rst +++ b/docsite/rst/playbooks_variables.rst @@ -803,11 +803,11 @@ In 2.x, we have made the order of precedence more specific (with the last listed * playbook group_vars * playbook host_vars * host facts - * registered vars - * set_facts * play vars * play vars_prompt * play vars_files + * registered vars + * set_facts * role and include vars * block vars (only for tasks in block) * task vars (only for the task) diff --git a/lib/ansible/vars/__init__.py b/lib/ansible/vars/__init__.py index 25dd9989aa..f64764a890 100644 --- a/lib/ansible/vars/__init__.py +++ b/lib/ansible/vars/__init__.py @@ -327,20 +327,19 @@ class VariableManager: for role in play.get_roles(): all_vars = combine_vars(all_vars, role.get_vars(include_params=False)) + if host: + all_vars = combine_vars(all_vars, self._vars_cache.get(host.get_name(), dict())) + all_vars = combine_vars(all_vars, self._nonpersistent_fact_cache.get(host.name, dict())) + if task: if task._role: all_vars = combine_vars(all_vars, task._role.get_vars(include_params=False)) all_vars = combine_vars(all_vars, task._role.get_role_params(task._block.get_dep_chain())) all_vars = combine_vars(all_vars, task.get_vars()) - if host: - all_vars = combine_vars(all_vars, self._vars_cache.get(host.get_name(), dict())) - all_vars = combine_vars(all_vars, self._nonpersistent_fact_cache.get(host.name, dict())) - - # special case for include tasks, where the include params - # may be specified in the vars field for the task, which should - # have higher precedence than the vars/np facts above - if task: + # special case for include tasks, where the include params + # may be specified in the vars field for the task, which should + # have higher precedence than the vars/np facts above all_vars = combine_vars(all_vars, task.get_include_params()) all_vars = combine_vars(all_vars, self._extra_vars)