diff --git a/lib/ansible/executor/task_executor.py b/lib/ansible/executor/task_executor.py index 4d7162803c863e..33e2de2ea5ea6f 100644 --- a/lib/ansible/executor/task_executor.py +++ b/lib/ansible/executor/task_executor.py @@ -798,7 +798,10 @@ def _get_connection(self, variables, templar): 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 @@ def _get_connection(self, variables, templar): 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 ed436cfe7d0f33..0d3ac6bb1af9ab 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 00000000000000..2b22eea68a8aab --- /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 00000000000000..263929a890f207 --- /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 }}"