diff --git a/changelogs/fragments/70484-bool-ansible-become.yaml b/changelogs/fragments/70484-bool-ansible-become.yaml new file mode 100644 index 00000000000..ffe879dae1e --- /dev/null +++ b/changelogs/fragments/70484-bool-ansible-become.yaml @@ -0,0 +1,3 @@ +bugfixes: + - The `ansible_become` value was not being treated as a boolean value when set in an INI format + inventory file (fixes bug https://github.com/ansible/ansible/issues/70476). diff --git a/lib/ansible/executor/task_executor.py b/lib/ansible/executor/task_executor.py index 53998eec060..91e24eb1196 100644 --- a/lib/ansible/executor/task_executor.py +++ b/lib/ansible/executor/task_executor.py @@ -18,6 +18,7 @@ from ansible import constants as C from ansible.errors import AnsibleError, AnsibleParserError, AnsibleUndefinedVariable, AnsibleConnectionFailure, AnsibleActionFail, AnsibleActionSkip from ansible.executor.task_result import TaskResult from ansible.executor.module_common import get_action_args_with_defaults +from ansible.module_utils.parsing.convert_bool import boolean from ansible.module_utils.six import iteritems, string_types, binary_type from ansible.module_utils.six.moves import xrange from ansible.module_utils._text import to_text, to_native @@ -907,7 +908,7 @@ class TaskExecutor: raise AnsibleError("the connection plugin '%s' was not found" % conn_type) # load become plugin if needed - if cvars.get('ansible_become', self._task.become): + if boolean(cvars.get('ansible_become', self._task.become)): become_plugin = self._get_become(cvars.get('ansible_become_method', self._task.become_method)) try: diff --git a/test/integration/targets/inventory_ini/aliases b/test/integration/targets/inventory_ini/aliases new file mode 100644 index 00000000000..3005e4b26d0 --- /dev/null +++ b/test/integration/targets/inventory_ini/aliases @@ -0,0 +1 @@ +shippable/posix/group4 diff --git a/test/integration/targets/inventory_ini/inventory.ini b/test/integration/targets/inventory_ini/inventory.ini new file mode 100644 index 00000000000..a0c99adee06 --- /dev/null +++ b/test/integration/targets/inventory_ini/inventory.ini @@ -0,0 +1,5 @@ +[local] +testhost ansible_connection=local ansible_become=no ansible_become_user=ansibletest1 + +[all:vars] +ansible_python_interpreter="{{ ansible_playbook_python }}" diff --git a/test/integration/targets/inventory_ini/runme.sh b/test/integration/targets/inventory_ini/runme.sh new file mode 100755 index 00000000000..81bf1475904 --- /dev/null +++ b/test/integration/targets/inventory_ini/runme.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash + +set -eux + +ansible-playbook -v -i inventory.ini test_ansible_become.yml diff --git a/test/integration/targets/inventory_ini/test_ansible_become.yml b/test/integration/targets/inventory_ini/test_ansible_become.yml new file mode 100644 index 00000000000..55bbe7da3fe --- /dev/null +++ b/test/integration/targets/inventory_ini/test_ansible_become.yml @@ -0,0 +1,11 @@ +- hosts: testhost + gather_facts: no + tasks: + - name: Test proper bool evaluation of ansible_become (issue #70476) + shell: whoami + register: output + + - name: Assert we are NOT the become user specified + assert: + that: + - "output.stdout != 'ansibletest1'"