diff options
author | Matt Martz <matt@sivel.net> | 2018-10-23 11:08:48 -0500 |
---|---|---|
committer | Toshio Kuratomi <a.badger@gmail.com> | 2018-10-23 12:29:12 -0700 |
commit | 376b199c0540e39189bdf6b31b9a60eadffa3989 (patch) | |
tree | 8f7e20339ce192971884acfa8cff42596f2af021 | |
parent | 18f07e828e67c98c089ed282bc15f0644cd56606 (diff) | |
download | ansible-376b199c0540e39189bdf6b31b9a60eadffa3989.tar.gz |
[stable-2.7] Ensure we don't overwrite roles from include/import_role when loading the play (#47512)
* Ensure we don't overwrite roles from include/import_role when loading the play. Fixes #47454
* Add changelog fragment
(cherry picked from commit d5e4f37)
Co-authored-by: Matt Martz <matt@sivel.net>
5 files changed, 19 insertions, 1 deletions
diff --git a/changelogs/fragments/no-overwrite-roles.yaml b/changelogs/fragments/no-overwrite-roles.yaml new file mode 100644 index 0000000000..efd7061584 --- /dev/null +++ b/changelogs/fragments/no-overwrite-roles.yaml @@ -0,0 +1,2 @@ +bugfixes: +- roles - Ensure that we don't overwrite roles that have been registered (from imports) while parsing roles under the roles header (https://github.com/ansible/ansible/issues/47454) diff --git a/lib/ansible/playbook/play.py b/lib/ansible/playbook/play.py index 370a77f4df..2469122ca1 100644 --- a/lib/ansible/playbook/play.py +++ b/lib/ansible/playbook/play.py @@ -195,7 +195,12 @@ class Play(Base, Taggable, Become): roles = [] for ri in role_includes: roles.append(Role.load(ri, play=self)) - return roles + + return self._extend_value( + self.roles, + roles, + prepend=True + ) def _load_vars_prompt(self, attr, ds): new_ds = preprocess_vars(ds) diff --git a/test/integration/targets/include_import/public_exposure/no_overwrite_roles.yml b/test/integration/targets/include_import/public_exposure/no_overwrite_roles.yml new file mode 100644 index 0000000000..6a1d9bffcd --- /dev/null +++ b/test/integration/targets/include_import/public_exposure/no_overwrite_roles.yml @@ -0,0 +1,4 @@ +- hosts: localhost + gather_facts: false + roles: + - call_import diff --git a/test/integration/targets/include_import/public_exposure/roles/call_import/tasks/main.yml b/test/integration/targets/include_import/public_exposure/roles/call_import/tasks/main.yml new file mode 100644 index 0000000000..d6b28f09dd --- /dev/null +++ b/test/integration/targets/include_import/public_exposure/roles/call_import/tasks/main.yml @@ -0,0 +1,6 @@ +- import_role: + name: regular + +- assert: + that: + - regular_defaults_var is defined diff --git a/test/integration/targets/include_import/runme.sh b/test/integration/targets/include_import/runme.sh index 066c88ca28..308a8af809 100755 --- a/test/integration/targets/include_import/runme.sh +++ b/test/integration/targets/include_import/runme.sh @@ -82,3 +82,4 @@ test "$(grep -c '"item=foo"' test_include_dupe_loop.out)" = 3 ansible-playbook public_exposure/playbook.yml -i ../../inventory "$@" ansible-playbook public_exposure/no_bleeding.yml -i ../../inventory "$@" +ansible-playbook public_exposure/no_overwrite_roles.yml -i ../../inventory "$@" |