summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Martz <matt@sivel.net>2018-10-23 11:08:48 -0500
committerToshio Kuratomi <a.badger@gmail.com>2018-10-23 12:29:12 -0700
commit376b199c0540e39189bdf6b31b9a60eadffa3989 (patch)
tree8f7e20339ce192971884acfa8cff42596f2af021
parent18f07e828e67c98c089ed282bc15f0644cd56606 (diff)
downloadansible-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>
-rw-r--r--changelogs/fragments/no-overwrite-roles.yaml2
-rw-r--r--lib/ansible/playbook/play.py7
-rw-r--r--test/integration/targets/include_import/public_exposure/no_overwrite_roles.yml4
-rw-r--r--test/integration/targets/include_import/public_exposure/roles/call_import/tasks/main.yml6
-rwxr-xr-xtest/integration/targets/include_import/runme.sh1
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 "$@"