diff --git a/changelogs/fragments/include_role_templating.yaml b/changelogs/fragments/include_role_templating.yaml new file mode 100644 index 00000000000..12d439d4dcd --- /dev/null +++ b/changelogs/fragments/include_role_templating.yaml @@ -0,0 +1,2 @@ +bugfixes: +- include_role - Fix parameter templating (https://github.com/ansible/ansible/pull/36372) diff --git a/lib/ansible/playbook/included_file.py b/lib/ansible/playbook/included_file.py index 7d9bd4e6114..99452441056 100644 --- a/lib/ansible/playbook/included_file.py +++ b/lib/ansible/playbook/included_file.py @@ -146,13 +146,14 @@ class IncludedFile: if role_name is not None: role_name = templar.template(role_name) - original_task._role_name = role_name - for from_arg in original_task.FROM_ARGS: + new_task = original_task.copy() + new_task._role_name = role_name + for from_arg in new_task.FROM_ARGS: if from_arg in include_variables: from_key = from_arg.replace('_from', '') - original_task._from_files[from_key] = templar.template(include_variables[from_arg]) + new_task._from_files[from_key] = templar.template(include_variables[from_arg]) - inc_file = IncludedFile("role", include_variables, original_task, is_role=True) + inc_file = IncludedFile("role", include_variables, new_task, is_role=True) try: pos = included_files.index(inc_file) diff --git a/test/integration/targets/include_import/role/test_include_role.yml b/test/integration/targets/include_import/role/test_include_role.yml index 79f4a78f0b6..2e20a14cedd 100644 --- a/test/integration/targets/include_import/role/test_include_role.yml +++ b/test/integration/targets/include_import/role/test_include_role.yml @@ -47,12 +47,18 @@ - name: Test role include with a loop include_role: name: "{{ item }}" - register: loop_test with_items: - role1 - role3 - role2 + - name: Assert that roles run with_items + assert: + that: + - _role1_result.msg == 'In role1' + - _role2_result.msg == 'In role2' + - _role3_result.msg == 'In role3' + - name: Test including a task file from a role include_role: name: role1 diff --git a/test/integration/targets/include_import/roles/role2/tasks/main.yml b/test/integration/targets/include_import/roles/role2/tasks/main.yml index 80d6a81fc30..82934f67cf0 100644 --- a/test/integration/targets/include_import/roles/role2/tasks/main.yml +++ b/test/integration/targets/include_import/roles/role2/tasks/main.yml @@ -1,2 +1,3 @@ - debug: msg: In role2 + register: _role2_result diff --git a/test/integration/targets/include_import/roles/role3/tasks/main.yml b/test/integration/targets/include_import/roles/role3/tasks/main.yml index 76608a9b198..bb70dad3967 100644 --- a/test/integration/targets/include_import/roles/role3/tasks/main.yml +++ b/test/integration/targets/include_import/roles/role3/tasks/main.yml @@ -1,2 +1,3 @@ - debug: msg: In role3 + register: _role3_result