diff options
4 files changed, 30 insertions, 1 deletions
diff --git a/changelogs/fragments/78492-fix-invalid-run_once-value.yml b/changelogs/fragments/78492-fix-invalid-run_once-value.yml new file mode 100644 index 0000000000..e20f608f17 --- /dev/null +++ b/changelogs/fragments/78492-fix-invalid-run_once-value.yml @@ -0,0 +1,3 @@ +--- +bugfixes: + - "strategy plugins: get the correctly templated and validated run_once value on strategy linear (https://github.com/ansible/ansible/issues/78492)"
\ No newline at end of file diff --git a/lib/ansible/plugins/strategy/linear.py b/lib/ansible/plugins/strategy/linear.py index 6a76fe57f2..33a9baabc0 100644 --- a/lib/ansible/plugins/strategy/linear.py +++ b/lib/ansible/plugins/strategy/linear.py @@ -35,6 +35,7 @@ from ansible import constants as C from ansible.errors import AnsibleError, AnsibleAssertionError, AnsibleParserError from ansible.executor.play_iterator import IteratingStates, FailedStates from ansible.module_utils._text import to_text +from ansible.module_utils.parsing.convert_bool import boolean from ansible.playbook.handler import Handler from ansible.playbook.included_file import IncludedFile from ansible.playbook.task import Task @@ -213,7 +214,10 @@ class StrategyModule(StrategyBase): skip_rest = True break - run_once = templar.template(task.run_once) or action and getattr(action, 'BYPASS_HOST_LOOP', False) + if templar.is_template(task.run_once): + setattr(task, 'run_once', boolean(templar.template(task.run_once), strict=True)) + + run_once = task.run_once or action and getattr(action, 'BYPASS_HOST_LOOP', False) if (task.any_errors_fatal or run_once) and not task.ignore_errors: any_errors_fatal = True diff --git a/test/integration/targets/strategy_linear/runme.sh b/test/integration/targets/strategy_linear/runme.sh index cbb6aea3a5..a2734f97c9 100755 --- a/test/integration/targets/strategy_linear/runme.sh +++ b/test/integration/targets/strategy_linear/runme.sh @@ -5,3 +5,5 @@ set -eux ansible-playbook test_include_file_noop.yml -i inventory "$@" ansible-playbook task_action_templating.yml -i inventory "$@" + +ansible-playbook task_templated_run_once.yml -i inventory "$@" diff --git a/test/integration/targets/strategy_linear/task_templated_run_once.yml b/test/integration/targets/strategy_linear/task_templated_run_once.yml new file mode 100644 index 0000000000..bacf06a96e --- /dev/null +++ b/test/integration/targets/strategy_linear/task_templated_run_once.yml @@ -0,0 +1,20 @@ +- hosts: testhost,testhost2 + gather_facts: no + vars: + run_once_flag: false + tasks: + - debug: + msg: "I am {{ item }}" + run_once: "{{ run_once_flag }}" + register: reg1 + loop: + - "{{ inventory_hostname }}" + + - assert: + that: + - "reg1.results[0].msg == 'I am testhost'" + when: inventory_hostname == 'testhost' + - assert: + that: + - "reg1.results[0].msg == 'I am testhost2'" + when: inventory_hostname == 'testhost2' |