summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSloane Hertel <shertel@redhat.com>2020-07-16 11:21:39 -0400
committerGitHub <noreply@github.com>2020-07-16 11:21:39 -0400
commit8c213c93345db5489c24458880ec3ff81b334dbd (patch)
tree964e7794c69fdc63a8a8cd9754b7541e1fc421dd
parent055871cbb89739039b18bd670af4d07f32ef80c0 (diff)
downloadansible-8c213c93345db5489c24458880ec3ff81b334dbd.tar.gz
template connection variables accessed directly before using (#70657)
* template variables accessed directly when using them instead of FieldAttributes
-rw-r--r--lib/ansible/executor/task_executor.py17
-rwxr-xr-xtest/integration/targets/var_templating/runme.sh2
-rw-r--r--test/integration/targets/var_templating/test_connection_vars.yml26
-rw-r--r--test/integration/targets/var_templating/vars/connection.yml3
4 files changed, 45 insertions, 3 deletions
diff --git a/lib/ansible/executor/task_executor.py b/lib/ansible/executor/task_executor.py
index 4d7162803c..33e2de2ea5 100644
--- a/lib/ansible/executor/task_executor.py
+++ b/lib/ansible/executor/task_executor.py
@@ -798,7 +798,10 @@ class TaskExecutor:
cvars = variables
# use magic var if it exists, if not, let task inheritance do it's thing.
- self._play_context.connection = cvars.get('ansible_connection', self._task.connection)
+ if cvars.get('ansible_connection') is not None:
+ self._play_context.connection = templar.template(cvars['ansible_connection'])
+ else:
+ self._play_context.connection = self._task.connection
# TODO: play context has logic to update the conneciton for 'smart'
# (default value, will chose between ssh and paramiko) and 'persistent'
@@ -819,8 +822,16 @@ class TaskExecutor:
raise AnsibleError("the connection plugin '%s' was not found" % conn_type)
# load become plugin if needed
- if boolean(cvars.get('ansible_become', self._task.become)):
- become_plugin = self._get_become(cvars.get('ansible_become_method', self._task.become_method))
+ if cvars.get('ansible_become') is not None:
+ become = boolean(templar.template(cvars['ansible_become']))
+ else:
+ become = self._task.become
+
+ if become:
+ if cvars.get('ansible_become_method'):
+ become_plugin = self._get_become(templar.template(cvars['ansible_become_method']))
+ else:
+ become_plugin = self._get_become(self._task.become_method)
try:
connection.set_become_plugin(become_plugin)
diff --git a/test/integration/targets/var_templating/runme.sh b/test/integration/targets/var_templating/runme.sh
index ed436cfe7d..0d3ac6bb1a 100755
--- a/test/integration/targets/var_templating/runme.sh
+++ b/test/integration/targets/var_templating/runme.sh
@@ -13,3 +13,5 @@ ansible-playbook undall.yml -i inventory -v "$@"
# test hostvars templating
ansible-playbook task_vars_templating.yml -v "$@"
+
+ansible-playbook test_connection_vars.yml -v "$@" 2>&1 | grep 'sudo'
diff --git a/test/integration/targets/var_templating/test_connection_vars.yml b/test/integration/targets/var_templating/test_connection_vars.yml
new file mode 100644
index 0000000000..2b22eea68a
--- /dev/null
+++ b/test/integration/targets/var_templating/test_connection_vars.yml
@@ -0,0 +1,26 @@
+---
+- hosts: localhost
+ gather_facts: no
+ vars:
+ my_var:
+ become_method: sudo
+ connection: local
+ become: 1
+ tasks:
+
+ - include_vars: "./vars/connection.yml"
+
+ - command: whoami
+ ignore_errors: yes
+ register: result
+ failed_when: result is not success and (result.module_stderr is defined or result.module_stderr is defined)
+
+ - assert:
+ that:
+ - "'sudo' in result.module_stderr"
+ when: result is not success and result.module_stderr is defined
+
+ - assert:
+ that:
+ - "'Invalid become method specified' not in result.msg"
+ when: result is not success and result.msg is defined
diff --git a/test/integration/targets/var_templating/vars/connection.yml b/test/integration/targets/var_templating/vars/connection.yml
new file mode 100644
index 0000000000..263929a890
--- /dev/null
+++ b/test/integration/targets/var_templating/vars/connection.yml
@@ -0,0 +1,3 @@
+ansible_become: "{{ my_var.become }}"
+ansible_become_method: "{{ my_var.become_method }}"
+ansible_connection: "{{ my_var.connection }}"