diff --git a/lib/ansible/playbook/playbook_include.py b/lib/ansible/playbook/playbook_include.py index d278ea6cbed..dfa0971263b 100644 --- a/lib/ansible/playbook/playbook_include.py +++ b/lib/ansible/playbook/playbook_include.py @@ -27,6 +27,8 @@ from ansible.playbook.taggable import Taggable from ansible.utils.collection_loader import AnsibleCollectionConfig from ansible.utils.collection_loader._collection_finder import _get_collection_name_from_path, _get_collection_playbook_path from ansible._internal._templating._engine import TemplateEngine +from ansible.errors import AnsibleError +from ansible import constants as C class PlaybookInclude(Base, Conditional, Taggable): @@ -36,6 +38,18 @@ class PlaybookInclude(Base, Conditional, Taggable): _post_validate_object = True # manually post_validate to get free arg validation/coercion + def preprocess_data(self, ds): + keys = {action for action in C._ACTION_IMPORT_PLAYBOOK if action in ds} + + if len(keys) != 1: + raise AnsibleError(f'Found conflicting import_playbook actions: {", ".join(sorted(keys))}') + + key = next(iter(keys)) + + ds['import_playbook'] = ds.pop(key) + + return ds + @staticmethod def load(data, basedir, variable_manager=None, loader=None): return PlaybookInclude().load_data(ds=data, basedir=basedir, variable_manager=variable_manager, loader=loader) diff --git a/test/integration/targets/include_import/playbook/test_import_playbook.yml b/test/integration/targets/include_import/playbook/test_import_playbook.yml index e59126c29e6..e5910c4f1a7 100644 --- a/test/integration/targets/include_import/playbook/test_import_playbook.yml +++ b/test/integration/targets/include_import/playbook/test_import_playbook.yml @@ -1,14 +1,14 @@ # Test and validate playbook import -- import_playbook: '{{ "playbook1.yml" }}' # ensure templating occurs correctly +- import_playbook: '{{ "playbook1.yml" }}' # ensure templating occurs - import_playbook: validate1.yml # Test and validate conditional import - import_playbook: playbook2.yml when: no -- import_playbook: validate2.yml +- ansible.builtin.import_playbook: validate2.yml # intentionally testing ansible.builtin -- import_playbook: playbook3.yml +- ansible.legacy.import_playbook: playbook3.yml # intentionally testing ansible.legacy - import_playbook: playbook4.yml when: include_next_playbook