ansible-core 2.18.5rc1__py3-none-any.whl → 2.19.0b1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ansible/_internal/__init__.py +53 -0
- ansible/_internal/_ansiballz.py +265 -0
- ansible/_internal/_datatag/__init__.py +0 -0
- ansible/_internal/_datatag/_tags.py +130 -0
- ansible/_internal/_datatag/_utils.py +19 -0
- ansible/_internal/_datatag/_wrappers.py +33 -0
- ansible/_internal/_errors/__init__.py +0 -0
- ansible/_internal/_errors/_captured.py +128 -0
- ansible/_internal/_errors/_handler.py +91 -0
- ansible/_internal/_errors/_utils.py +310 -0
- ansible/_internal/_json/__init__.py +160 -0
- ansible/_internal/_json/_legacy_encoder.py +34 -0
- ansible/_internal/_json/_profiles/__init__.py +0 -0
- ansible/_internal/_json/_profiles/_cache_persistence.py +55 -0
- ansible/_internal/_json/_profiles/_inventory_legacy.py +40 -0
- ansible/_internal/_json/_profiles/_legacy.py +198 -0
- ansible/_internal/_locking.py +21 -0
- ansible/_internal/_plugins/__init__.py +0 -0
- ansible/_internal/_plugins/_cache.py +57 -0
- ansible/_internal/_task.py +78 -0
- ansible/_internal/_templating/__init__.py +10 -0
- ansible/_internal/_templating/_access.py +86 -0
- ansible/_internal/_templating/_chain_templar.py +63 -0
- ansible/_internal/_templating/_datatag.py +95 -0
- ansible/_internal/_templating/_engine.py +588 -0
- ansible/_internal/_templating/_errors.py +28 -0
- ansible/_internal/_templating/_jinja_bits.py +1066 -0
- ansible/_internal/_templating/_jinja_common.py +332 -0
- ansible/_internal/_templating/_jinja_patches.py +44 -0
- ansible/_internal/_templating/_jinja_plugins.py +351 -0
- ansible/_internal/_templating/_lazy_containers.py +633 -0
- ansible/_internal/_templating/_marker_behaviors.py +103 -0
- ansible/_internal/_templating/_transform.py +63 -0
- ansible/_internal/_templating/_utils.py +107 -0
- ansible/_internal/_wrapt.py +1052 -0
- ansible/_internal/_yaml/__init__.py +0 -0
- ansible/_internal/_yaml/_constructor.py +240 -0
- ansible/_internal/_yaml/_dumper.py +62 -0
- ansible/_internal/_yaml/_errors.py +166 -0
- ansible/_internal/_yaml/_loader.py +66 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/README.md +11 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/action/debug.py +36 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/apply_trust.py +19 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/dump_object.py +18 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/finalize.py +16 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/origin.py +18 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.py +24 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.yml +33 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/tag_names.py +16 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/true_type.py +17 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/unmask.py +49 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.py +21 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.yml +2 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.py +15 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.yml +19 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.py +18 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.yml +19 -0
- ansible/cli/__init__.py +153 -89
- ansible/cli/_ssh_askpass.py +47 -0
- ansible/cli/adhoc.py +14 -7
- ansible/cli/arguments/option_helpers.py +154 -7
- ansible/cli/config.py +43 -68
- ansible/cli/console.py +10 -8
- ansible/cli/doc.py +48 -46
- ansible/cli/galaxy.py +27 -20
- ansible/cli/inventory.py +28 -26
- ansible/cli/playbook.py +4 -12
- ansible/cli/pull.py +51 -11
- ansible/cli/scripts/ansible_connection_cli_stub.py +7 -7
- ansible/cli/vault.py +12 -11
- ansible/compat/__init__.py +2 -2
- ansible/config/base.yml +165 -108
- ansible/config/manager.py +52 -49
- ansible/constants.py +3 -4
- ansible/errors/__init__.py +277 -235
- ansible/executor/interpreter_discovery.py +28 -149
- ansible/executor/module_common.py +426 -493
- ansible/executor/play_iterator.py +22 -27
- ansible/executor/playbook_executor.py +11 -11
- ansible/executor/powershell/async_watchdog.ps1 +97 -102
- ansible/executor/powershell/async_wrapper.ps1 +202 -151
- ansible/executor/powershell/become_wrapper.ps1 +89 -144
- ansible/executor/powershell/bootstrap_wrapper.ps1 +24 -9
- ansible/executor/powershell/coverage_wrapper.ps1 +82 -135
- ansible/executor/powershell/exec_wrapper.ps1 +462 -196
- ansible/executor/powershell/module_manifest.py +417 -265
- ansible/executor/powershell/module_wrapper.ps1 +169 -186
- ansible/executor/powershell/psrp_fetch_file.ps1 +41 -0
- ansible/executor/powershell/psrp_put_file.ps1 +122 -0
- ansible/executor/powershell/winrm_fetch_file.ps1 +46 -0
- ansible/executor/powershell/winrm_put_file.ps1 +36 -0
- ansible/executor/process/worker.py +136 -76
- ansible/executor/stats.py +5 -5
- ansible/executor/task_executor.py +237 -236
- ansible/executor/task_queue_manager.py +62 -38
- ansible/executor/task_result.py +21 -12
- ansible/galaxy/__init__.py +2 -2
- ansible/galaxy/api.py +22 -18
- ansible/galaxy/collection/__init__.py +1 -1
- ansible/galaxy/collection/concrete_artifact_manager.py +8 -11
- ansible/galaxy/dependency_resolution/dataclasses.py +14 -4
- ansible/galaxy/dependency_resolution/providers.py +1 -1
- ansible/galaxy/dependency_resolution/reporters.py +81 -0
- ansible/galaxy/role.py +4 -8
- ansible/galaxy/token.py +28 -21
- ansible/inventory/data.py +47 -57
- ansible/inventory/group.py +44 -72
- ansible/inventory/helpers.py +9 -0
- ansible/inventory/host.py +32 -54
- ansible/inventory/manager.py +77 -34
- ansible/keyword_desc.yml +1 -1
- ansible/module_utils/_internal/__init__.py +55 -0
- ansible/module_utils/_internal/_ambient_context.py +58 -0
- ansible/module_utils/_internal/_ansiballz.py +133 -0
- ansible/module_utils/_internal/_concurrent/_daemon_threading.py +1 -0
- ansible/module_utils/_internal/_dataclass_annotation_patch.py +64 -0
- ansible/module_utils/_internal/_dataclass_validation.py +217 -0
- ansible/module_utils/_internal/_datatag/__init__.py +928 -0
- ansible/module_utils/_internal/_datatag/_tags.py +38 -0
- ansible/module_utils/_internal/_debugging.py +31 -0
- ansible/module_utils/_internal/_errors.py +30 -0
- ansible/module_utils/_internal/_json/__init__.py +63 -0
- ansible/module_utils/_internal/_json/_legacy_encoder.py +26 -0
- ansible/module_utils/_internal/_json/_profiles/__init__.py +410 -0
- ansible/module_utils/_internal/_json/_profiles/_fallback_to_str.py +73 -0
- ansible/module_utils/_internal/_json/_profiles/_module_legacy_c2m.py +31 -0
- ansible/module_utils/_internal/_json/_profiles/_module_legacy_m2c.py +35 -0
- ansible/module_utils/_internal/_json/_profiles/_module_modern_c2m.py +35 -0
- ansible/module_utils/_internal/_json/_profiles/_module_modern_m2c.py +33 -0
- ansible/module_utils/_internal/_json/_profiles/_tagless.py +50 -0
- ansible/module_utils/_internal/_patches/__init__.py +66 -0
- ansible/module_utils/_internal/_patches/_dataclass_annotation_patch.py +55 -0
- ansible/module_utils/_internal/_patches/_socket_patch.py +34 -0
- ansible/module_utils/_internal/_patches/_sys_intern_patch.py +34 -0
- ansible/module_utils/_internal/_plugin_exec_context.py +49 -0
- ansible/module_utils/_internal/_testing.py +0 -0
- ansible/module_utils/_internal/_traceback.py +89 -0
- ansible/module_utils/ansible_release.py +2 -2
- ansible/module_utils/api.py +1 -2
- ansible/module_utils/basic.py +154 -120
- ansible/module_utils/common/_utils.py +24 -28
- ansible/module_utils/common/collections.py +1 -2
- ansible/module_utils/common/dict_transformations.py +2 -2
- ansible/module_utils/common/file.py +2 -2
- ansible/module_utils/common/json.py +90 -84
- ansible/module_utils/common/locale.py +2 -2
- ansible/module_utils/common/messages.py +108 -0
- ansible/module_utils/common/parameters.py +27 -24
- ansible/module_utils/common/process.py +2 -2
- ansible/module_utils/common/respawn.py +41 -19
- ansible/module_utils/common/sentinel.py +66 -0
- ansible/module_utils/common/sys_info.py +8 -8
- ansible/module_utils/common/text/converters.py +16 -37
- ansible/module_utils/common/validation.py +35 -24
- ansible/module_utils/common/warnings.py +86 -25
- ansible/module_utils/common/yaml.py +29 -3
- ansible/module_utils/compat/datetime.py +33 -21
- ansible/module_utils/compat/paramiko.py +21 -10
- ansible/module_utils/compat/typing.py +6 -5
- ansible/module_utils/connection.py +2 -2
- ansible/module_utils/csharp/Ansible.Basic.cs +14 -11
- ansible/module_utils/csharp/Ansible.Become.cs +1 -0
- ansible/module_utils/csharp/Ansible._Async.cs +517 -0
- ansible/module_utils/datatag.py +46 -0
- ansible/module_utils/distro/__init__.py +2 -2
- ansible/module_utils/facts/ansible_collector.py +4 -5
- ansible/module_utils/facts/collector.py +13 -14
- ansible/module_utils/facts/compat.py +4 -4
- ansible/module_utils/facts/default_collectors.py +1 -1
- ansible/module_utils/facts/hardware/aix.py +34 -0
- ansible/module_utils/facts/hardware/base.py +1 -1
- ansible/module_utils/facts/hardware/darwin.py +1 -3
- ansible/module_utils/facts/hardware/freebsd.py +2 -2
- ansible/module_utils/facts/hardware/linux.py +4 -4
- ansible/module_utils/facts/namespace.py +1 -1
- ansible/module_utils/facts/network/base.py +1 -1
- ansible/module_utils/facts/network/fc_wwn.py +1 -2
- ansible/module_utils/facts/network/iscsi.py +1 -2
- ansible/module_utils/facts/network/nvme.py +1 -2
- ansible/module_utils/facts/other/facter.py +1 -2
- ansible/module_utils/facts/other/ohai.py +2 -3
- ansible/module_utils/facts/system/apparmor.py +1 -2
- ansible/module_utils/facts/system/caps.py +1 -1
- ansible/module_utils/facts/system/chroot.py +1 -2
- ansible/module_utils/facts/system/cmdline.py +1 -2
- ansible/module_utils/facts/system/date_time.py +5 -3
- ansible/module_utils/facts/system/distribution.py +9 -8
- ansible/module_utils/facts/system/dns.py +1 -1
- ansible/module_utils/facts/system/env.py +1 -2
- ansible/module_utils/facts/system/fips.py +7 -20
- ansible/module_utils/facts/system/loadavg.py +1 -2
- ansible/module_utils/facts/system/local.py +1 -2
- ansible/module_utils/facts/system/lsb.py +1 -2
- ansible/module_utils/facts/system/pkg_mgr.py +1 -2
- ansible/module_utils/facts/system/platform.py +1 -2
- ansible/module_utils/facts/system/python.py +1 -2
- ansible/module_utils/facts/system/selinux.py +1 -1
- ansible/module_utils/facts/system/service_mgr.py +1 -2
- ansible/module_utils/facts/system/ssh_pub_keys.py +1 -1
- ansible/module_utils/facts/system/systemd.py +1 -1
- ansible/module_utils/facts/system/user.py +1 -2
- ansible/module_utils/facts/utils.py +3 -3
- ansible/module_utils/facts/virtual/base.py +1 -1
- ansible/module_utils/facts/virtual/sunos.py +3 -15
- ansible/module_utils/facts/virtual/sysctl.py +3 -16
- ansible/module_utils/json_utils.py +2 -2
- ansible/module_utils/parsing/convert_bool.py +1 -1
- ansible/module_utils/service.py +18 -21
- ansible/module_utils/splitter.py +7 -7
- ansible/module_utils/testing.py +31 -0
- ansible/module_utils/urls.py +60 -31
- ansible/modules/add_host.py +4 -4
- ansible/modules/apt.py +60 -46
- ansible/modules/apt_key.py +19 -12
- ansible/modules/apt_repository.py +19 -16
- ansible/modules/assemble.py +6 -6
- ansible/modules/assert.py +4 -4
- ansible/modules/async_status.py +10 -12
- ansible/modules/async_wrapper.py +8 -3
- ansible/modules/blockinfile.py +6 -7
- ansible/modules/command.py +10 -17
- ansible/modules/copy.py +57 -144
- ansible/modules/cron.py +20 -15
- ansible/modules/deb822_repository.py +8 -9
- ansible/modules/debconf.py +5 -5
- ansible/modules/debug.py +4 -4
- ansible/modules/dnf.py +8 -8
- ansible/modules/dnf5.py +39 -13
- ansible/modules/dpkg_selections.py +4 -4
- ansible/modules/expect.py +8 -10
- ansible/modules/fail.py +4 -4
- ansible/modules/fetch.py +4 -4
- ansible/modules/file.py +174 -133
- ansible/modules/find.py +19 -17
- ansible/modules/gather_facts.py +3 -3
- ansible/modules/get_url.py +59 -53
- ansible/modules/getent.py +7 -9
- ansible/modules/git.py +28 -25
- ansible/modules/group.py +6 -6
- ansible/modules/group_by.py +4 -4
- ansible/modules/hostname.py +13 -29
- ansible/modules/import_playbook.py +6 -6
- ansible/modules/import_role.py +6 -6
- ansible/modules/import_tasks.py +6 -6
- ansible/modules/include_role.py +6 -6
- ansible/modules/include_tasks.py +6 -6
- ansible/modules/include_vars.py +6 -6
- ansible/modules/iptables.py +86 -73
- ansible/modules/known_hosts.py +10 -10
- ansible/modules/lineinfile.py +5 -5
- ansible/modules/meta.py +4 -4
- ansible/modules/mount_facts.py +2 -2
- ansible/modules/package.py +4 -4
- ansible/modules/package_facts.py +22 -10
- ansible/modules/pause.py +6 -6
- ansible/modules/ping.py +6 -6
- ansible/modules/pip.py +10 -11
- ansible/modules/raw.py +4 -4
- ansible/modules/reboot.py +6 -6
- ansible/modules/replace.py +9 -13
- ansible/modules/rpm_key.py +7 -8
- ansible/modules/script.py +4 -4
- ansible/modules/service.py +7 -8
- ansible/modules/service_facts.py +87 -10
- ansible/modules/set_fact.py +5 -5
- ansible/modules/set_stats.py +4 -4
- ansible/modules/setup.py +2 -2
- ansible/modules/shell.py +6 -6
- ansible/modules/slurp.py +6 -6
- ansible/modules/stat.py +9 -23
- ansible/modules/subversion.py +15 -15
- ansible/modules/systemd.py +6 -6
- ansible/modules/systemd_service.py +6 -6
- ansible/modules/sysvinit.py +6 -6
- ansible/modules/tempfile.py +5 -6
- ansible/modules/template.py +6 -6
- ansible/modules/unarchive.py +32 -11
- ansible/modules/uri.py +33 -26
- ansible/modules/user.py +53 -34
- ansible/modules/validate_argument_spec.py +10 -7
- ansible/modules/wait_for.py +32 -27
- ansible/modules/wait_for_connection.py +6 -6
- ansible/modules/yum_repository.py +6 -6
- ansible/parsing/ajson.py +14 -32
- ansible/parsing/dataloader.py +99 -54
- ansible/parsing/mod_args.py +28 -44
- ansible/parsing/plugin_docs.py +21 -86
- ansible/parsing/quoting.py +1 -1
- ansible/parsing/splitter.py +27 -12
- ansible/parsing/utils/addresses.py +24 -24
- ansible/parsing/utils/yaml.py +32 -61
- ansible/parsing/vault/__init__.py +319 -87
- ansible/parsing/yaml/__init__.py +0 -18
- ansible/parsing/yaml/dumper.py +6 -120
- ansible/parsing/yaml/loader.py +6 -39
- ansible/parsing/yaml/objects.py +36 -339
- ansible/playbook/__init__.py +1 -1
- ansible/playbook/attribute.py +8 -3
- ansible/playbook/base.py +182 -132
- ansible/playbook/block.py +26 -24
- ansible/playbook/collectionsearch.py +1 -15
- ansible/playbook/conditional.py +3 -77
- ansible/playbook/handler.py +8 -2
- ansible/playbook/helpers.py +41 -53
- ansible/playbook/included_file.py +6 -15
- ansible/playbook/loop_control.py +2 -2
- ansible/playbook/play.py +85 -44
- ansible/playbook/play_context.py +12 -17
- ansible/playbook/playbook_include.py +14 -15
- ansible/playbook/role/__init__.py +24 -26
- ansible/playbook/role/definition.py +15 -17
- ansible/playbook/role/include.py +2 -4
- ansible/playbook/role/metadata.py +10 -11
- ansible/playbook/role_include.py +3 -3
- ansible/playbook/taggable.py +13 -8
- ansible/playbook/task.py +188 -118
- ansible/playbook/task_include.py +5 -5
- ansible/plugins/__init__.py +68 -21
- ansible/plugins/action/__init__.py +209 -176
- ansible/plugins/action/add_host.py +1 -1
- ansible/plugins/action/assemble.py +1 -1
- ansible/plugins/action/assert.py +54 -66
- ansible/plugins/action/copy.py +7 -11
- ansible/plugins/action/debug.py +37 -31
- ansible/plugins/action/dnf.py +3 -4
- ansible/plugins/action/fail.py +1 -1
- ansible/plugins/action/fetch.py +4 -5
- ansible/plugins/action/gather_facts.py +7 -6
- ansible/plugins/action/group_by.py +1 -1
- ansible/plugins/action/include_vars.py +10 -11
- ansible/plugins/action/package.py +3 -6
- ansible/plugins/action/pause.py +2 -2
- ansible/plugins/action/script.py +15 -8
- ansible/plugins/action/service.py +6 -11
- ansible/plugins/action/set_fact.py +3 -12
- ansible/plugins/action/set_stats.py +3 -8
- ansible/plugins/action/template.py +35 -59
- ansible/plugins/action/unarchive.py +1 -1
- ansible/plugins/action/validate_argument_spec.py +5 -5
- ansible/plugins/action/wait_for_connection.py +1 -1
- ansible/plugins/become/__init__.py +31 -8
- ansible/plugins/become/runas.py +71 -0
- ansible/plugins/become/su.py +13 -8
- ansible/plugins/become/sudo.py +19 -0
- ansible/plugins/cache/__init__.py +35 -44
- ansible/plugins/cache/base.py +8 -0
- ansible/plugins/cache/jsonfile.py +10 -16
- ansible/plugins/cache/memory.py +6 -12
- ansible/plugins/callback/__init__.py +141 -123
- ansible/plugins/callback/default.py +30 -23
- ansible/plugins/callback/junit.py +28 -24
- ansible/plugins/callback/minimal.py +17 -14
- ansible/plugins/callback/oneline.py +13 -7
- ansible/plugins/callback/tree.py +10 -6
- ansible/plugins/connection/__init__.py +47 -34
- ansible/plugins/connection/local.py +150 -54
- ansible/plugins/connection/paramiko_ssh.py +21 -18
- ansible/plugins/connection/psrp.py +76 -165
- ansible/plugins/connection/ssh.py +301 -78
- ansible/plugins/connection/winrm.py +58 -140
- ansible/plugins/doc_fragments/action_common_attributes.py +14 -14
- ansible/plugins/doc_fragments/action_core.py +6 -6
- ansible/plugins/doc_fragments/backup.py +2 -2
- ansible/plugins/doc_fragments/checksum_common.py +27 -0
- ansible/plugins/doc_fragments/constructed.py +6 -2
- ansible/plugins/doc_fragments/decrypt.py +2 -2
- ansible/plugins/doc_fragments/default_callback.py +2 -2
- ansible/plugins/doc_fragments/files.py +2 -2
- ansible/plugins/doc_fragments/inventory_cache.py +2 -2
- ansible/plugins/doc_fragments/result_format_callback.py +2 -2
- ansible/plugins/doc_fragments/return_common.py +2 -2
- ansible/plugins/doc_fragments/template_common.py +4 -4
- ansible/plugins/doc_fragments/url.py +17 -1
- ansible/plugins/doc_fragments/url_windows.py +2 -2
- ansible/plugins/doc_fragments/validate.py +2 -2
- ansible/plugins/doc_fragments/vars_plugin_staging.py +2 -2
- ansible/plugins/filter/__init__.py +6 -2
- ansible/plugins/filter/b64decode.yml +22 -0
- ansible/plugins/filter/b64encode.yml +22 -0
- ansible/plugins/filter/bool.yml +11 -4
- ansible/plugins/filter/core.py +218 -108
- ansible/plugins/filter/encryption.py +32 -32
- ansible/plugins/filter/flatten.yml +3 -2
- ansible/plugins/filter/human_to_bytes.yml +1 -1
- ansible/plugins/filter/mathstuff.py +30 -37
- ansible/plugins/filter/password_hash.yml +8 -0
- ansible/plugins/filter/regex_search.yml +1 -4
- ansible/plugins/filter/split.yml +1 -1
- ansible/plugins/filter/to_nice_yaml.yml +0 -4
- ansible/plugins/filter/to_yaml.yml +0 -4
- ansible/plugins/filter/unvault.yml +1 -1
- ansible/plugins/filter/urls.py +1 -1
- ansible/plugins/filter/urlsplit.py +8 -9
- ansible/plugins/filter/vault.yml +14 -9
- ansible/plugins/filter/win_basename.yml +6 -1
- ansible/plugins/filter/win_dirname.yml +5 -0
- ansible/plugins/inventory/__init__.py +97 -77
- ansible/plugins/inventory/advanced_host_list.py +7 -5
- ansible/plugins/inventory/auto.py +11 -4
- ansible/plugins/inventory/constructed.py +21 -24
- ansible/plugins/inventory/generator.py +16 -11
- ansible/plugins/inventory/host_list.py +7 -5
- ansible/plugins/inventory/ini.py +78 -44
- ansible/plugins/inventory/script.py +189 -119
- ansible/plugins/inventory/toml.py +16 -126
- ansible/plugins/inventory/yaml.py +10 -8
- ansible/plugins/list.py +3 -3
- ansible/plugins/loader.py +197 -82
- ansible/plugins/lookup/__init__.py +21 -4
- ansible/plugins/lookup/config.py +21 -35
- ansible/plugins/lookup/csvfile.py +3 -2
- ansible/plugins/lookup/dict.py +1 -6
- ansible/plugins/lookup/env.py +12 -9
- ansible/plugins/lookup/file.py +5 -8
- ansible/plugins/lookup/first_found.py +86 -55
- ansible/plugins/lookup/indexed_items.py +1 -10
- ansible/plugins/lookup/ini.py +14 -13
- ansible/plugins/lookup/items.py +1 -1
- ansible/plugins/lookup/lines.py +8 -1
- ansible/plugins/lookup/list.py +1 -1
- ansible/plugins/lookup/nested.py +2 -18
- ansible/plugins/lookup/password.py +5 -5
- ansible/plugins/lookup/pipe.py +5 -7
- ansible/plugins/lookup/sequence.py +18 -8
- ansible/plugins/lookup/subelements.py +1 -4
- ansible/plugins/lookup/template.py +42 -36
- ansible/plugins/lookup/together.py +0 -12
- ansible/plugins/lookup/unvault.py +1 -5
- ansible/plugins/lookup/url.py +2 -8
- ansible/plugins/lookup/vars.py +16 -24
- ansible/plugins/shell/__init__.py +2 -2
- ansible/plugins/shell/cmd.py +2 -2
- ansible/plugins/shell/powershell.py +39 -22
- ansible/plugins/shell/sh.py +3 -2
- ansible/plugins/strategy/__init__.py +94 -113
- ansible/plugins/strategy/debug.py +2 -2
- ansible/plugins/strategy/free.py +13 -28
- ansible/plugins/strategy/host_pinned.py +2 -2
- ansible/plugins/strategy/linear.py +31 -33
- ansible/plugins/terminal/__init__.py +4 -4
- ansible/plugins/test/__init__.py +7 -2
- ansible/plugins/test/core.py +54 -20
- ansible/plugins/test/files.py +1 -1
- ansible/plugins/test/mathstuff.py +3 -3
- ansible/plugins/test/uri.py +3 -3
- ansible/plugins/vars/host_group_vars.py +7 -14
- ansible/release.py +2 -2
- ansible/template/__init__.py +368 -944
- ansible/utils/__init__.py +0 -18
- ansible/utils/_ssh_agent.py +657 -0
- ansible/utils/collection_loader/__init__.py +52 -5
- ansible/utils/collection_loader/_collection_config.py +5 -6
- ansible/utils/collection_loader/_collection_finder.py +79 -93
- ansible/utils/collection_loader/_collection_meta.py +13 -8
- ansible/utils/display.py +428 -58
- ansible/utils/encrypt.py +27 -19
- ansible/utils/fqcn.py +2 -2
- ansible/utils/hashing.py +2 -2
- ansible/utils/helpers.py +2 -2
- ansible/utils/listify.py +8 -8
- ansible/utils/lock.py +2 -2
- ansible/utils/path.py +4 -4
- ansible/utils/plugin_docs.py +14 -13
- ansible/utils/sentinel.py +4 -62
- ansible/utils/singleton.py +2 -0
- ansible/utils/ssh_functions.py +1 -1
- ansible/utils/unsafe_proxy.py +23 -332
- ansible/utils/vars.py +28 -8
- ansible/utils/version.py +2 -2
- ansible/vars/clean.py +4 -4
- ansible/vars/hostvars.py +60 -90
- ansible/vars/manager.py +205 -264
- ansible/vars/reserved.py +8 -9
- ansible_core-2.19.0b1.dist-info/BSD-3-Clause.txt +28 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b1.dist-info}/METADATA +5 -4
- ansible_core-2.19.0b1.dist-info/RECORD +1070 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b1.dist-info}/WHEEL +1 -1
- ansible_test/_data/completion/docker.txt +7 -7
- ansible_test/_data/completion/remote.txt +6 -6
- ansible_test/_data/completion/windows.txt +1 -0
- ansible_test/_data/requirements/ansible.txt +2 -2
- ansible_test/_data/requirements/sanity.ansible-doc.txt +3 -3
- ansible_test/_data/requirements/sanity.changelog.txt +1 -1
- ansible_test/_data/requirements/sanity.import.plugin.txt +2 -2
- ansible_test/_data/requirements/sanity.pylint.txt +4 -4
- ansible_test/_data/requirements/sanity.validate-modules.txt +2 -2
- ansible_test/_data/requirements/sanity.yamllint.txt +1 -1
- ansible_test/_data/requirements/units.txt +1 -0
- ansible_test/_internal/__init__.py +1 -0
- ansible_test/_internal/ansible_util.py +2 -0
- ansible_test/_internal/become.py +1 -0
- ansible_test/_internal/bootstrap.py +1 -0
- ansible_test/_internal/cache.py +1 -0
- ansible_test/_internal/cgroup.py +1 -0
- ansible_test/_internal/ci/__init__.py +1 -0
- ansible_test/_internal/ci/azp.py +1 -0
- ansible_test/_internal/ci/local.py +1 -0
- ansible_test/_internal/classification/__init__.py +1 -0
- ansible_test/_internal/classification/common.py +1 -0
- ansible_test/_internal/classification/csharp.py +1 -0
- ansible_test/_internal/classification/powershell.py +1 -0
- ansible_test/_internal/classification/python.py +1 -0
- ansible_test/_internal/cli/__init__.py +1 -0
- ansible_test/_internal/cli/actions.py +1 -0
- ansible_test/_internal/cli/argparsing/__init__.py +1 -0
- ansible_test/_internal/cli/argparsing/actions.py +1 -0
- ansible_test/_internal/cli/argparsing/argcompletion.py +1 -0
- ansible_test/_internal/cli/argparsing/parsers.py +1 -0
- ansible_test/_internal/cli/commands/__init__.py +11 -0
- ansible_test/_internal/cli/commands/coverage/__init__.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/__init__.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/__init__.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/combine.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/expand.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/filter.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/generate.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/missing.py +1 -0
- ansible_test/_internal/cli/commands/coverage/combine.py +1 -0
- ansible_test/_internal/cli/commands/coverage/erase.py +1 -0
- ansible_test/_internal/cli/commands/coverage/html.py +1 -0
- ansible_test/_internal/cli/commands/coverage/report.py +1 -0
- ansible_test/_internal/cli/commands/coverage/xml.py +1 -0
- ansible_test/_internal/cli/commands/env.py +1 -0
- ansible_test/_internal/cli/commands/integration/__init__.py +1 -0
- ansible_test/_internal/cli/commands/integration/network.py +1 -0
- ansible_test/_internal/cli/commands/integration/posix.py +1 -0
- ansible_test/_internal/cli/commands/integration/windows.py +1 -0
- ansible_test/_internal/cli/commands/sanity.py +9 -0
- ansible_test/_internal/cli/commands/shell.py +1 -0
- ansible_test/_internal/cli/commands/units.py +1 -0
- ansible_test/_internal/cli/compat.py +1 -0
- ansible_test/_internal/cli/completers.py +1 -0
- ansible_test/_internal/cli/converters.py +1 -0
- ansible_test/_internal/cli/environments.py +1 -0
- ansible_test/_internal/cli/epilog.py +1 -0
- ansible_test/_internal/cli/parsers/__init__.py +1 -0
- ansible_test/_internal/cli/parsers/base_argument_parsers.py +1 -0
- ansible_test/_internal/cli/parsers/helpers.py +1 -0
- ansible_test/_internal/cli/parsers/host_config_parsers.py +1 -0
- ansible_test/_internal/cli/parsers/key_value_parsers.py +1 -0
- ansible_test/_internal/cli/parsers/value_parsers.py +1 -0
- ansible_test/_internal/commands/__init__.py +1 -0
- ansible_test/_internal/commands/coverage/__init__.py +2 -1
- ansible_test/_internal/commands/coverage/analyze/__init__.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/__init__.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/combine.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/expand.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/filter.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/generate.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/missing.py +1 -0
- ansible_test/_internal/commands/coverage/combine.py +2 -1
- ansible_test/_internal/commands/coverage/erase.py +1 -0
- ansible_test/_internal/commands/coverage/html.py +1 -0
- ansible_test/_internal/commands/coverage/report.py +1 -0
- ansible_test/_internal/commands/coverage/xml.py +1 -0
- ansible_test/_internal/commands/env/__init__.py +2 -0
- ansible_test/_internal/commands/integration/__init__.py +4 -0
- ansible_test/_internal/commands/integration/cloud/__init__.py +1 -0
- ansible_test/_internal/commands/integration/cloud/acme.py +2 -1
- ansible_test/_internal/commands/integration/cloud/aws.py +1 -0
- ansible_test/_internal/commands/integration/cloud/azure.py +1 -0
- ansible_test/_internal/commands/integration/cloud/cs.py +1 -0
- ansible_test/_internal/commands/integration/cloud/digitalocean.py +1 -0
- ansible_test/_internal/commands/integration/cloud/galaxy.py +3 -2
- ansible_test/_internal/commands/integration/cloud/hcloud.py +1 -0
- ansible_test/_internal/commands/integration/cloud/httptester.py +2 -1
- ansible_test/_internal/commands/integration/cloud/nios.py +2 -1
- ansible_test/_internal/commands/integration/cloud/opennebula.py +1 -0
- ansible_test/_internal/commands/integration/cloud/openshift.py +1 -0
- ansible_test/_internal/commands/integration/cloud/scaleway.py +1 -0
- ansible_test/_internal/commands/integration/cloud/vcenter.py +1 -0
- ansible_test/_internal/commands/integration/cloud/vultr.py +1 -0
- ansible_test/_internal/commands/integration/coverage.py +1 -0
- ansible_test/_internal/commands/integration/filters.py +1 -0
- ansible_test/_internal/commands/integration/network.py +1 -0
- ansible_test/_internal/commands/integration/posix.py +1 -0
- ansible_test/_internal/commands/integration/windows.py +1 -0
- ansible_test/_internal/commands/sanity/__init__.py +16 -1
- ansible_test/_internal/commands/sanity/ansible_doc.py +1 -0
- ansible_test/_internal/commands/sanity/bin_symlinks.py +1 -0
- ansible_test/_internal/commands/sanity/compile.py +1 -0
- ansible_test/_internal/commands/sanity/ignores.py +1 -0
- ansible_test/_internal/commands/sanity/import.py +1 -0
- ansible_test/_internal/commands/sanity/integration_aliases.py +1 -0
- ansible_test/_internal/commands/sanity/pep8.py +1 -0
- ansible_test/_internal/commands/sanity/pslint.py +1 -0
- ansible_test/_internal/commands/sanity/pylint.py +24 -26
- ansible_test/_internal/commands/sanity/shellcheck.py +1 -0
- ansible_test/_internal/commands/sanity/validate_modules.py +1 -0
- ansible_test/_internal/commands/sanity/yamllint.py +1 -0
- ansible_test/_internal/commands/shell/__init__.py +1 -0
- ansible_test/_internal/commands/units/__init__.py +1 -0
- ansible_test/_internal/compat/__init__.py +1 -0
- ansible_test/_internal/compat/packaging.py +1 -0
- ansible_test/_internal/compat/yaml.py +1 -0
- ansible_test/_internal/completion.py +1 -0
- ansible_test/_internal/config.py +2 -0
- ansible_test/_internal/connections.py +1 -0
- ansible_test/_internal/constants.py +1 -0
- ansible_test/_internal/containers.py +1 -0
- ansible_test/_internal/content_config.py +1 -0
- ansible_test/_internal/core_ci.py +1 -0
- ansible_test/_internal/coverage_util.py +11 -10
- ansible_test/_internal/data.py +1 -0
- ansible_test/_internal/delegation.py +1 -0
- ansible_test/_internal/dev/__init__.py +1 -0
- ansible_test/_internal/dev/container_probe.py +1 -0
- ansible_test/_internal/diff.py +3 -2
- ansible_test/_internal/docker_util.py +2 -1
- ansible_test/_internal/encoding.py +1 -0
- ansible_test/_internal/executor.py +1 -0
- ansible_test/_internal/git.py +1 -0
- ansible_test/_internal/host_configs.py +1 -0
- ansible_test/_internal/host_profiles.py +1 -0
- ansible_test/_internal/http.py +1 -0
- ansible_test/_internal/init.py +1 -0
- ansible_test/_internal/inventory.py +35 -3
- ansible_test/_internal/io.py +1 -0
- ansible_test/_internal/metadata.py +1 -0
- ansible_test/_internal/payload.py +1 -0
- ansible_test/_internal/provider/__init__.py +1 -0
- ansible_test/_internal/provider/layout/__init__.py +1 -0
- ansible_test/_internal/provider/layout/ansible.py +1 -0
- ansible_test/_internal/provider/layout/collection.py +1 -0
- ansible_test/_internal/provider/layout/unsupported.py +1 -0
- ansible_test/_internal/provider/source/__init__.py +1 -0
- ansible_test/_internal/provider/source/git.py +1 -0
- ansible_test/_internal/provider/source/installed.py +1 -0
- ansible_test/_internal/provider/source/unsupported.py +1 -0
- ansible_test/_internal/provider/source/unversioned.py +1 -0
- ansible_test/_internal/provisioning.py +1 -0
- ansible_test/_internal/pypi_proxy.py +6 -5
- ansible_test/_internal/python_requirements.py +1 -0
- ansible_test/_internal/ssh.py +1 -0
- ansible_test/_internal/target.py +1 -0
- ansible_test/_internal/test.py +3 -2
- ansible_test/_internal/thread.py +1 -0
- ansible_test/_internal/timeout.py +1 -0
- ansible_test/_internal/util.py +1 -0
- ansible_test/_internal/util_common.py +5 -2
- ansible_test/_internal/venv.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/action-plugin-docs.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/changelog/sphinx.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/changelog.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/empty-init.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/line-endings.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/no-assert.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/no-get-exception.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/no-illegal-filenames.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/no-smart-quotes.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/replace-urlopen.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/runtime-metadata.py +28 -1
- ansible_test/_util/controller/sanity/code-smell/shebang.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/symlinks.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/use-argspec-type-path.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/use-compat-six.py +1 -0
- ansible_test/_util/controller/sanity/integration-aliases/yaml_to_json.py +2 -1
- ansible_test/_util/controller/sanity/pep8/current-ignore.txt +4 -0
- ansible_test/_util/controller/sanity/pylint/config/ansible-test-target.cfg +7 -5
- ansible_test/_util/controller/sanity/pylint/config/ansible-test.cfg +7 -5
- ansible_test/_util/controller/sanity/pylint/config/code-smell.cfg +7 -5
- ansible_test/_util/controller/sanity/pylint/config/collection.cfg +3 -5
- ansible_test/_util/controller/sanity/pylint/config/default.cfg +7 -7
- ansible_test/_util/controller/sanity/pylint/plugins/deprecated.py +1 -13
- ansible_test/_util/controller/sanity/pylint/plugins/hide_unraisable.py +1 -0
- ansible_test/_util/controller/sanity/pylint/plugins/string_format.py +1 -8
- ansible_test/_util/controller/sanity/pylint/plugins/unwanted.py +1 -8
- ansible_test/_util/controller/sanity/validate-modules/validate_modules/main.py +55 -28
- ansible_test/_util/controller/sanity/validate-modules/validate_modules/module_args.py +12 -5
- ansible_test/_util/controller/sanity/validate-modules/validate_modules/schema.py +13 -2
- ansible_test/_util/controller/sanity/validate-modules/validate_modules/utils.py +1 -0
- ansible_test/_util/controller/sanity/yamllint/yamllinter.py +35 -17
- ansible_test/_util/controller/tools/collection_detail.py +1 -0
- ansible_test/_util/controller/tools/yaml_to_json.py +2 -1
- ansible_test/_util/target/pytest/plugins/ansible_forked.py +6 -1
- ansible_test/_util/target/pytest/plugins/ansible_pytest_collections.py +2 -1
- ansible_test/_util/target/pytest/plugins/ansible_pytest_coverage.py +1 -0
- ansible_test/_util/target/sanity/compile/compile.py +1 -0
- ansible_test/_util/target/sanity/import/importer.py +15 -16
- ansible_test/_util/target/setup/bootstrap.sh +9 -20
- ansible_test/_util/target/setup/probe_cgroups.py +1 -0
- ansible_test/_util/target/setup/quiet_pip.py +1 -0
- ansible_test/_util/target/setup/requirements.py +35 -27
- ansible_test/_util/target/tools/virtualenvcheck.py +2 -1
- ansible_test/_util/target/tools/yamlcheck.py +2 -1
- ansible/compat/selectors.py +0 -32
- ansible/errors/yaml_strings.py +0 -138
- ansible/executor/action_write_locks.py +0 -44
- ansible/executor/discovery/python_target.py +0 -47
- ansible/executor/powershell/module_powershell_wrapper.ps1 +0 -86
- ansible/executor/powershell/module_script_wrapper.ps1 +0 -22
- ansible/module_utils/compat/importlib.py +0 -26
- ansible/module_utils/compat/selectors.py +0 -32
- ansible/module_utils/pycompat24.py +0 -73
- ansible/parsing/utils/jsonify.py +0 -36
- ansible/parsing/yaml/constructor.py +0 -178
- ansible/template/native_helpers.py +0 -251
- ansible/template/template.py +0 -43
- ansible/template/vars.py +0 -77
- ansible/utils/native_jinja.py +0 -11
- ansible/vars/fact_cache.py +0 -71
- ansible_core-2.18.5rc1.dist-info/RECORD +0 -992
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b1.dist-info}/Apache-License.txt +0 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b1.dist-info}/COPYING +0 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b1.dist-info}/MIT-license.txt +0 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b1.dist-info}/PSF-license.txt +0 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b1.dist-info}/entry_points.txt +0 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b1.dist-info}/simplified_bsd.txt +0 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b1.dist-info}/top_level.txt +0 -0
ansible/playbook/play.py
CHANGED
@@ -19,8 +19,8 @@ from __future__ import annotations
|
|
19
19
|
|
20
20
|
from ansible import constants as C
|
21
21
|
from ansible import context
|
22
|
+
from ansible.errors import AnsibleError
|
22
23
|
from ansible.errors import AnsibleParserError, AnsibleAssertionError
|
23
|
-
from ansible.module_utils.common.text.converters import to_native
|
24
24
|
from ansible.module_utils.common.collections import is_sequence
|
25
25
|
from ansible.module_utils.six import binary_type, string_types, text_type
|
26
26
|
from ansible.playbook.attribute import NonInheritableFieldAttribute
|
@@ -31,6 +31,7 @@ from ansible.playbook.helpers import load_list_of_blocks, load_list_of_roles
|
|
31
31
|
from ansible.playbook.role import Role
|
32
32
|
from ansible.playbook.task import Task
|
33
33
|
from ansible.playbook.taggable import Taggable
|
34
|
+
from ansible.parsing.vault import EncryptedString
|
34
35
|
from ansible.utils.display import Display
|
35
36
|
|
36
37
|
display = Display()
|
@@ -99,6 +100,15 @@ class Play(Base, Taggable, CollectionSearch):
|
|
99
100
|
def __repr__(self):
|
100
101
|
return self.get_name()
|
101
102
|
|
103
|
+
def _get_cached_role(self, role):
|
104
|
+
role_path = role.get_role_path()
|
105
|
+
role_cache = self.role_cache[role_path]
|
106
|
+
try:
|
107
|
+
idx = role_cache.index(role)
|
108
|
+
return role_cache[idx]
|
109
|
+
except ValueError:
|
110
|
+
raise AnsibleError(f'Cannot locate {role.get_name()} in role cache')
|
111
|
+
|
102
112
|
def _validate_hosts(self, attribute, name, value):
|
103
113
|
# Only validate 'hosts' if a value was passed in to original data set.
|
104
114
|
if 'hosts' in self._ds:
|
@@ -113,11 +123,11 @@ class Play(Base, Taggable, CollectionSearch):
|
|
113
123
|
elif not isinstance(entry, (binary_type, text_type)):
|
114
124
|
raise AnsibleParserError("Hosts list contains an invalid host value: '{host!s}'".format(host=entry))
|
115
125
|
|
116
|
-
elif not isinstance(value, (binary_type, text_type)):
|
126
|
+
elif not isinstance(value, (binary_type, text_type, EncryptedString)):
|
117
127
|
raise AnsibleParserError("Hosts list must be a sequence or string. Please check your playbook.")
|
118
128
|
|
119
129
|
def get_name(self):
|
120
|
-
|
130
|
+
""" return the name of the Play """
|
121
131
|
if self.name:
|
122
132
|
return self.name
|
123
133
|
|
@@ -136,9 +146,9 @@ class Play(Base, Taggable, CollectionSearch):
|
|
136
146
|
return p.load_data(data, variable_manager=variable_manager, loader=loader)
|
137
147
|
|
138
148
|
def preprocess_data(self, ds):
|
139
|
-
|
149
|
+
"""
|
140
150
|
Adjusts play datastructure to cleanup old/legacy items
|
141
|
-
|
151
|
+
"""
|
142
152
|
|
143
153
|
if not isinstance(ds, dict):
|
144
154
|
raise AnsibleAssertionError('while preprocessing data (%s), ds should be a dict but was a %s' % (ds, type(ds)))
|
@@ -158,55 +168,57 @@ class Play(Base, Taggable, CollectionSearch):
|
|
158
168
|
|
159
169
|
return super(Play, self).preprocess_data(ds)
|
160
170
|
|
171
|
+
# DTFIX-FUTURE: these do nothing but augment the exception message; DRY and nuke
|
172
|
+
|
161
173
|
def _load_tasks(self, attr, ds):
|
162
|
-
|
174
|
+
"""
|
163
175
|
Loads a list of blocks from a list which may be mixed tasks/blocks.
|
164
176
|
Bare tasks outside of a block are given an implicit block.
|
165
|
-
|
177
|
+
"""
|
166
178
|
try:
|
167
179
|
return load_list_of_blocks(ds=ds, play=self, variable_manager=self._variable_manager, loader=self._loader)
|
168
|
-
except AssertionError as
|
169
|
-
raise AnsibleParserError("A malformed block was encountered while loading tasks
|
180
|
+
except AssertionError as ex:
|
181
|
+
raise AnsibleParserError("A malformed block was encountered while loading tasks.", obj=self._ds) from ex
|
170
182
|
|
171
183
|
def _load_pre_tasks(self, attr, ds):
|
172
|
-
|
184
|
+
"""
|
173
185
|
Loads a list of blocks from a list which may be mixed tasks/blocks.
|
174
186
|
Bare tasks outside of a block are given an implicit block.
|
175
|
-
|
187
|
+
"""
|
176
188
|
try:
|
177
189
|
return load_list_of_blocks(ds=ds, play=self, variable_manager=self._variable_manager, loader=self._loader)
|
178
|
-
except AssertionError as
|
179
|
-
raise AnsibleParserError("A malformed block was encountered while loading pre_tasks", obj=self._ds
|
190
|
+
except AssertionError as ex:
|
191
|
+
raise AnsibleParserError("A malformed block was encountered while loading pre_tasks.", obj=self._ds) from ex
|
180
192
|
|
181
193
|
def _load_post_tasks(self, attr, ds):
|
182
|
-
|
194
|
+
"""
|
183
195
|
Loads a list of blocks from a list which may be mixed tasks/blocks.
|
184
196
|
Bare tasks outside of a block are given an implicit block.
|
185
|
-
|
197
|
+
"""
|
186
198
|
try:
|
187
199
|
return load_list_of_blocks(ds=ds, play=self, variable_manager=self._variable_manager, loader=self._loader)
|
188
|
-
except AssertionError as
|
189
|
-
raise AnsibleParserError("A malformed block was encountered while loading post_tasks", obj=self._ds
|
200
|
+
except AssertionError as ex:
|
201
|
+
raise AnsibleParserError("A malformed block was encountered while loading post_tasks.", obj=self._ds) from ex
|
190
202
|
|
191
203
|
def _load_handlers(self, attr, ds):
|
192
|
-
|
204
|
+
"""
|
193
205
|
Loads a list of blocks from a list which may be mixed handlers/blocks.
|
194
206
|
Bare handlers outside of a block are given an implicit block.
|
195
|
-
|
207
|
+
"""
|
196
208
|
try:
|
197
209
|
return self._extend_value(
|
198
210
|
self.handlers,
|
199
211
|
load_list_of_blocks(ds=ds, play=self, use_handlers=True, variable_manager=self._variable_manager, loader=self._loader),
|
200
212
|
prepend=True
|
201
213
|
)
|
202
|
-
except AssertionError as
|
203
|
-
raise AnsibleParserError("A malformed block was encountered while loading handlers", obj=self._ds
|
214
|
+
except AssertionError as ex:
|
215
|
+
raise AnsibleParserError("A malformed block was encountered while loading handlers.", obj=self._ds) from ex
|
204
216
|
|
205
217
|
def _load_roles(self, attr, ds):
|
206
|
-
|
218
|
+
"""
|
207
219
|
Loads and returns a list of RoleInclude objects from the datastructure
|
208
220
|
list of role definitions and creates the Role from those objects
|
209
|
-
|
221
|
+
"""
|
210
222
|
|
211
223
|
if ds is None:
|
212
224
|
ds = []
|
@@ -214,8 +226,8 @@ class Play(Base, Taggable, CollectionSearch):
|
|
214
226
|
try:
|
215
227
|
role_includes = load_list_of_roles(ds, play=self, variable_manager=self._variable_manager,
|
216
228
|
loader=self._loader, collection_search_list=self.collections)
|
217
|
-
except AssertionError as
|
218
|
-
raise AnsibleParserError("A malformed role declaration was encountered.", obj=self._ds
|
229
|
+
except AssertionError as ex:
|
230
|
+
raise AnsibleParserError("A malformed role declaration was encountered.", obj=self._ds) from ex
|
219
231
|
|
220
232
|
roles = []
|
221
233
|
for ri in role_includes:
|
@@ -242,13 +254,13 @@ class Play(Base, Taggable, CollectionSearch):
|
|
242
254
|
return vars_prompts
|
243
255
|
|
244
256
|
def _compile_roles(self):
|
245
|
-
|
257
|
+
"""
|
246
258
|
Handles the role compilation step, returning a flat list of tasks
|
247
259
|
with the lowest level dependencies first. For example, if a role R
|
248
260
|
has a dependency D1, which also has a dependency D2, the tasks from
|
249
261
|
D2 are merged first, followed by D1, and lastly by the tasks from
|
250
262
|
the parent role R last. This is done for all roles in the Play.
|
251
|
-
|
263
|
+
"""
|
252
264
|
|
253
265
|
block_list = []
|
254
266
|
|
@@ -263,10 +275,10 @@ class Play(Base, Taggable, CollectionSearch):
|
|
263
275
|
return block_list
|
264
276
|
|
265
277
|
def compile_roles_handlers(self):
|
266
|
-
|
278
|
+
"""
|
267
279
|
Handles the role handler compilation step, returning a flat list of Handlers
|
268
280
|
This is done for all roles in the Play.
|
269
|
-
|
281
|
+
"""
|
270
282
|
|
271
283
|
block_list = []
|
272
284
|
|
@@ -279,25 +291,39 @@ class Play(Base, Taggable, CollectionSearch):
|
|
279
291
|
return block_list
|
280
292
|
|
281
293
|
def compile(self):
|
282
|
-
|
294
|
+
"""
|
283
295
|
Compiles and returns the task list for this play, compiled from the
|
284
296
|
roles (which are themselves compiled recursively) and/or the list of
|
285
297
|
tasks specified in the play.
|
286
|
-
|
287
|
-
|
298
|
+
"""
|
288
299
|
# create a block containing a single flush handlers meta
|
289
300
|
# task, so we can be sure to run handlers at certain points
|
290
301
|
# of the playbook execution
|
291
|
-
flush_block = Block
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
302
|
+
flush_block = Block(play=self)
|
303
|
+
|
304
|
+
t = Task(block=flush_block)
|
305
|
+
t.action = 'meta'
|
306
|
+
t.resolved_action = 'ansible.builtin.meta'
|
307
|
+
t.args['_raw_params'] = 'flush_handlers'
|
308
|
+
t.implicit = True
|
309
|
+
t.set_loader(self._loader)
|
310
|
+
|
311
|
+
if self.tags:
|
312
|
+
# Avoid calling flush_handlers in case the whole play is skipped on tags,
|
313
|
+
# this could be performance improvement since calling flush_handlers on
|
314
|
+
# large inventories could be expensive even if no hosts are notified
|
315
|
+
# since we call flush_handlers per host.
|
316
|
+
# Block.filter_tagged_tasks ignores evaluating tags on implicit meta
|
317
|
+
# tasks so we need to explicitly call Task.evaluate_tags here.
|
318
|
+
t.tags = self.tags
|
319
|
+
if t.evaluate_tags(self.only_tags, self.skip_tags, all_vars=self.vars):
|
320
|
+
flush_block.block = [t]
|
321
|
+
else:
|
322
|
+
flush_block.block = [t]
|
300
323
|
|
324
|
+
# NOTE keep flush_handlers tasks even if a section has no regular tasks,
|
325
|
+
# there may be notified handlers from the previous section
|
326
|
+
# (typically when a handler notifies a handler defined before)
|
301
327
|
block_list = []
|
302
328
|
if self.force_handlers:
|
303
329
|
noop_task = Task()
|
@@ -307,18 +333,33 @@ class Play(Base, Taggable, CollectionSearch):
|
|
307
333
|
noop_task.set_loader(self._loader)
|
308
334
|
|
309
335
|
b = Block(play=self)
|
310
|
-
|
336
|
+
if self.pre_tasks:
|
337
|
+
b.block = self.pre_tasks
|
338
|
+
else:
|
339
|
+
nt = noop_task.copy(exclude_parent=True)
|
340
|
+
nt._parent = b
|
341
|
+
b.block = [nt]
|
311
342
|
b.always = [flush_block]
|
312
343
|
block_list.append(b)
|
313
344
|
|
314
345
|
tasks = self._compile_roles() + self.tasks
|
315
346
|
b = Block(play=self)
|
316
|
-
|
347
|
+
if tasks:
|
348
|
+
b.block = tasks
|
349
|
+
else:
|
350
|
+
nt = noop_task.copy(exclude_parent=True)
|
351
|
+
nt._parent = b
|
352
|
+
b.block = [nt]
|
317
353
|
b.always = [flush_block]
|
318
354
|
block_list.append(b)
|
319
355
|
|
320
356
|
b = Block(play=self)
|
321
|
-
|
357
|
+
if self.post_tasks:
|
358
|
+
b.block = self.post_tasks
|
359
|
+
else:
|
360
|
+
nt = noop_task.copy(exclude_parent=True)
|
361
|
+
nt._parent = b
|
362
|
+
b.block = [nt]
|
322
363
|
b.always = [flush_block]
|
323
364
|
block_list.append(b)
|
324
365
|
|
ansible/playbook/play_context.py
CHANGED
@@ -65,11 +65,11 @@ RESET_VARS = (
|
|
65
65
|
|
66
66
|
class PlayContext(Base):
|
67
67
|
|
68
|
-
|
68
|
+
"""
|
69
69
|
This class is used to consolidate the connection information for
|
70
70
|
hosts in a play and child tasks, where the task may override some
|
71
71
|
connection/authentication information.
|
72
|
-
|
72
|
+
"""
|
73
73
|
|
74
74
|
# base
|
75
75
|
module_compression = FieldAttribute(isa='string', default=C.DEFAULT_MODULE_COMPRESSION)
|
@@ -88,7 +88,7 @@ class PlayContext(Base):
|
|
88
88
|
# networking modules
|
89
89
|
network_os = FieldAttribute(isa='string')
|
90
90
|
|
91
|
-
#
|
91
|
+
# FIXME: docker - remove these
|
92
92
|
docker_extra_args = FieldAttribute(isa='string')
|
93
93
|
|
94
94
|
# ???
|
@@ -103,10 +103,6 @@ class PlayContext(Base):
|
|
103
103
|
become_flags = FieldAttribute(isa='string', default=C.DEFAULT_BECOME_FLAGS)
|
104
104
|
prompt = FieldAttribute(isa='string')
|
105
105
|
|
106
|
-
# general flags
|
107
|
-
only_tags = FieldAttribute(isa='set', default=set)
|
108
|
-
skip_tags = FieldAttribute(isa='set', default=set)
|
109
|
-
|
110
106
|
start_at_task = FieldAttribute(isa='string')
|
111
107
|
step = FieldAttribute(isa='bool', default=False)
|
112
108
|
|
@@ -158,11 +154,11 @@ class PlayContext(Base):
|
|
158
154
|
self.force_handlers = play.force_handlers
|
159
155
|
|
160
156
|
def set_attributes_from_cli(self):
|
161
|
-
|
157
|
+
"""
|
162
158
|
Configures this connection information instance with data from
|
163
159
|
options specified by the user on the command line. These have a
|
164
160
|
lower precedence than those set on the play or host.
|
165
|
-
|
161
|
+
"""
|
166
162
|
if context.CLIARGS.get('timeout', False):
|
167
163
|
self.timeout = int(context.CLIARGS['timeout'])
|
168
164
|
|
@@ -175,14 +171,14 @@ class PlayContext(Base):
|
|
175
171
|
self.start_at_task = context.CLIARGS.get('start_at_task', None) # Else default
|
176
172
|
|
177
173
|
def set_task_and_variable_override(self, task, variables, templar):
|
178
|
-
|
174
|
+
"""
|
179
175
|
Sets attributes from the task if they are set, which will override
|
180
176
|
those from the play.
|
181
177
|
|
182
178
|
:arg task: the task object with the parameters that were set on it
|
183
179
|
:arg variables: variables from inventory
|
184
180
|
:arg templar: templar instance if templating variables is needed
|
185
|
-
|
181
|
+
"""
|
186
182
|
|
187
183
|
new_info = self.copy()
|
188
184
|
|
@@ -201,8 +197,7 @@ class PlayContext(Base):
|
|
201
197
|
# In the case of a loop, the delegated_to host may have been
|
202
198
|
# templated based on the loop variable, so we try and locate
|
203
199
|
# the host name in the delegated variable dictionary here
|
204
|
-
|
205
|
-
delegated_vars = variables.get('ansible_delegated_vars', dict()).get(delegated_host_name, dict())
|
200
|
+
delegated_vars = variables.get('ansible_delegated_vars', dict()).get(task.delegate_to, dict())
|
206
201
|
|
207
202
|
delegated_transport = C.DEFAULT_TRANSPORT
|
208
203
|
for transport_var in C.MAGIC_VARIABLE_MAPPING.get('connection'):
|
@@ -218,8 +213,8 @@ class PlayContext(Base):
|
|
218
213
|
if address_var in delegated_vars:
|
219
214
|
break
|
220
215
|
else:
|
221
|
-
display.debug("no remote address found for delegated host %s\nusing its name, so success depends on DNS resolution" %
|
222
|
-
delegated_vars['ansible_host'] =
|
216
|
+
display.debug("no remote address found for delegated host %s\nusing its name, so success depends on DNS resolution" % task.delegate_to)
|
217
|
+
delegated_vars['ansible_host'] = task.delegate_to
|
223
218
|
|
224
219
|
# reset the port back to the default if none was specified, to prevent
|
225
220
|
# the delegated host from inheriting the original host's setting
|
@@ -312,10 +307,10 @@ class PlayContext(Base):
|
|
312
307
|
self._become_plugin = plugin
|
313
308
|
|
314
309
|
def update_vars(self, variables):
|
315
|
-
|
310
|
+
"""
|
316
311
|
Adds 'magic' variables relating to connections to the variable dictionary provided.
|
317
312
|
In case users need to access from the play, this is a legacy from runner.
|
318
|
-
|
313
|
+
"""
|
319
314
|
|
320
315
|
for prop, var_list in C.MAGIC_VARIABLE_MAPPING.items():
|
321
316
|
try:
|
@@ -22,16 +22,16 @@ import os
|
|
22
22
|
import ansible.constants as C
|
23
23
|
from ansible.errors import AnsibleParserError, AnsibleAssertionError
|
24
24
|
from ansible.module_utils.common.text.converters import to_bytes
|
25
|
+
from ansible.module_utils._internal._datatag import AnsibleTagHelper
|
25
26
|
from ansible.module_utils.six import string_types
|
26
27
|
from ansible.parsing.splitter import split_args
|
27
|
-
from ansible.parsing.yaml.objects import AnsibleBaseYAMLObject, AnsibleMapping
|
28
28
|
from ansible.playbook.attribute import NonInheritableFieldAttribute
|
29
29
|
from ansible.playbook.base import Base
|
30
30
|
from ansible.playbook.conditional import Conditional
|
31
31
|
from ansible.playbook.taggable import Taggable
|
32
32
|
from ansible.utils.collection_loader import AnsibleCollectionConfig
|
33
33
|
from ansible.utils.collection_loader._collection_finder import _get_collection_name_from_path, _get_collection_playbook_path
|
34
|
-
from ansible.
|
34
|
+
from ansible._internal._templating._engine import TemplateEngine
|
35
35
|
from ansible.utils.display import Display
|
36
36
|
|
37
37
|
display = Display()
|
@@ -47,10 +47,10 @@ class PlaybookInclude(Base, Conditional, Taggable):
|
|
47
47
|
return PlaybookInclude().load_data(ds=data, basedir=basedir, variable_manager=variable_manager, loader=loader)
|
48
48
|
|
49
49
|
def load_data(self, ds, variable_manager=None, loader=None, basedir=None):
|
50
|
-
|
50
|
+
"""
|
51
51
|
Overrides the base load_data(), as we're actually going to return a new
|
52
52
|
Playbook() object rather than a PlaybookInclude object
|
53
|
-
|
53
|
+
"""
|
54
54
|
|
55
55
|
# import here to avoid a dependency loop
|
56
56
|
from ansible.playbook import Playbook
|
@@ -65,7 +65,7 @@ class PlaybookInclude(Base, Conditional, Taggable):
|
|
65
65
|
if variable_manager:
|
66
66
|
all_vars |= variable_manager.get_vars()
|
67
67
|
|
68
|
-
templar =
|
68
|
+
templar = TemplateEngine(loader=loader, variables=all_vars)
|
69
69
|
|
70
70
|
# then we use the object to load a Playbook
|
71
71
|
pb = Playbook(loader=loader)
|
@@ -122,19 +122,17 @@ class PlaybookInclude(Base, Conditional, Taggable):
|
|
122
122
|
return pb
|
123
123
|
|
124
124
|
def preprocess_data(self, ds):
|
125
|
-
|
125
|
+
"""
|
126
126
|
Reorganizes the data for a PlaybookInclude datastructure to line
|
127
127
|
up with what we expect the proper attributes to be
|
128
|
-
|
128
|
+
"""
|
129
129
|
|
130
130
|
if not isinstance(ds, dict):
|
131
131
|
raise AnsibleAssertionError('ds (%s) should be a dict but was a %s' % (ds, type(ds)))
|
132
132
|
|
133
|
-
# the new, cleaned datastructure, which will have legacy
|
134
|
-
#
|
135
|
-
new_ds =
|
136
|
-
if isinstance(ds, AnsibleBaseYAMLObject):
|
137
|
-
new_ds.ansible_pos = ds.ansible_pos
|
133
|
+
# the new, cleaned datastructure, which will have legacy items reduced to a standard structure suitable for the
|
134
|
+
# attributes of the task class; copy any tagged data to preserve things like origin
|
135
|
+
new_ds = AnsibleTagHelper.tag_copy(ds, {})
|
138
136
|
|
139
137
|
for (k, v) in ds.items():
|
140
138
|
if k in C._ACTION_IMPORT_PLAYBOOK:
|
@@ -152,9 +150,9 @@ class PlaybookInclude(Base, Conditional, Taggable):
|
|
152
150
|
return super(PlaybookInclude, self).preprocess_data(new_ds)
|
153
151
|
|
154
152
|
def _preprocess_import(self, ds, new_ds, k, v):
|
155
|
-
|
153
|
+
"""
|
156
154
|
Splits the playbook import line up into filename and parameters
|
157
|
-
|
155
|
+
"""
|
158
156
|
if v is None:
|
159
157
|
raise AnsibleParserError("playbook import parameter is missing", obj=ds)
|
160
158
|
elif not isinstance(v, string_types):
|
@@ -166,4 +164,5 @@ class PlaybookInclude(Base, Conditional, Taggable):
|
|
166
164
|
if len(items) == 0:
|
167
165
|
raise AnsibleParserError("import_playbook statements must specify the file name to import", obj=ds)
|
168
166
|
|
169
|
-
|
167
|
+
# DTFIX-RELEASE: investigate this as a possible "problematic strip"
|
168
|
+
new_ds['import_playbook'] = AnsibleTagHelper.tag_copy(v, items[0].strip())
|
@@ -24,9 +24,9 @@ from types import MappingProxyType
|
|
24
24
|
|
25
25
|
from ansible import constants as C
|
26
26
|
from ansible.errors import AnsibleError, AnsibleParserError, AnsibleAssertionError
|
27
|
+
from ansible.module_utils.common.sentinel import Sentinel
|
27
28
|
from ansible.module_utils.common.text.converters import to_text
|
28
29
|
from ansible.module_utils.six import binary_type, text_type
|
29
|
-
from ansible.playbook.attribute import FieldAttribute
|
30
30
|
from ansible.playbook.base import Base
|
31
31
|
from ansible.playbook.collectionsearch import CollectionSearch
|
32
32
|
from ansible.playbook.conditional import Conditional
|
@@ -37,7 +37,6 @@ from ansible.playbook.taggable import Taggable
|
|
37
37
|
from ansible.plugins.loader import add_all_plugin_dirs
|
38
38
|
from ansible.utils.collection_loader import AnsibleCollectionConfig
|
39
39
|
from ansible.utils.path import is_subpath
|
40
|
-
from ansible.utils.sentinel import Sentinel
|
41
40
|
from ansible.utils.vars import combine_vars
|
42
41
|
|
43
42
|
__all__ = ['Role', 'hash_params']
|
@@ -200,9 +199,9 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
|
|
200
199
|
|
201
200
|
return r
|
202
201
|
|
203
|
-
except
|
202
|
+
except RecursionError as ex:
|
204
203
|
raise AnsibleError("A recursion loop was detected with the roles specified. Make sure child roles do not have dependencies on parent roles",
|
205
|
-
obj=role_include._ds)
|
204
|
+
obj=role_include._ds) from ex
|
206
205
|
|
207
206
|
def _load_role_data(self, role_include, parent_role=None):
|
208
207
|
self._role_name = role_include.role
|
@@ -274,18 +273,17 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
|
|
274
273
|
if task_data:
|
275
274
|
try:
|
276
275
|
self._task_blocks = load_list_of_blocks(task_data, play=self._play, role=self, loader=self._loader, variable_manager=self._variable_manager)
|
277
|
-
except AssertionError as
|
278
|
-
raise AnsibleParserError("The tasks/main.yml file for role
|
279
|
-
obj=task_data, orig_exc=e)
|
276
|
+
except AssertionError as ex:
|
277
|
+
raise AnsibleParserError(f"The tasks/main.yml file for role {self._role_name!r} must contain a list of tasks.", obj=task_data) from ex
|
280
278
|
|
281
279
|
handler_data = self._load_role_yaml('handlers', main=self._from_files.get('handlers'))
|
282
280
|
if handler_data:
|
283
281
|
try:
|
284
282
|
self._handler_blocks = load_list_of_blocks(handler_data, play=self._play, role=self, use_handlers=True, loader=self._loader,
|
285
283
|
variable_manager=self._variable_manager)
|
286
|
-
except AssertionError as
|
287
|
-
raise AnsibleParserError("The handlers/main.yml file for role
|
288
|
-
obj=handler_data
|
284
|
+
except AssertionError as ex:
|
285
|
+
raise AnsibleParserError(f"The handlers/main.yml file for role {self._role_name!r} must contain a list of tasks.",
|
286
|
+
obj=handler_data) from ex
|
289
287
|
|
290
288
|
def _get_role_argspecs(self):
|
291
289
|
"""Get the role argument spec data.
|
@@ -316,7 +314,7 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
|
|
316
314
|
return getattr(self._metadata, 'argument_specs', {})
|
317
315
|
|
318
316
|
def _prepend_validation_task(self, task_data, argspecs):
|
319
|
-
|
317
|
+
"""Insert a role validation task if we have a role argument spec.
|
320
318
|
|
321
319
|
This method will prepend a validation task to the front of the role task
|
322
320
|
list to perform argument spec validation before any other tasks, if an arg spec
|
@@ -326,7 +324,7 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
|
|
326
324
|
:param argspecs: The role argument spec data dict.
|
327
325
|
|
328
326
|
:returns: The (possibly modified) task list.
|
329
|
-
|
327
|
+
"""
|
330
328
|
if argspecs:
|
331
329
|
# Determine the role entry point so we can retrieve the correct argument spec.
|
332
330
|
# This comes from the `tasks_from` value to include_role or import_role.
|
@@ -345,13 +343,13 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
|
|
345
343
|
return task_data
|
346
344
|
|
347
345
|
def _create_validation_task(self, argument_spec, entrypoint_name):
|
348
|
-
|
346
|
+
"""Create a new task data structure that uses the validate_argument_spec action plugin.
|
349
347
|
|
350
348
|
:param argument_spec: The arg spec definition for a particular role entry point.
|
351
349
|
This will be the entire arg spec for the entry point as read from the input file.
|
352
350
|
:param entrypoint_name: The name of the role entry point associated with the
|
353
351
|
supplied `argument_spec`.
|
354
|
-
|
352
|
+
"""
|
355
353
|
|
356
354
|
# If the arg spec provides a short description, use it to flesh out the validation task name
|
357
355
|
task_name = "Validating arguments against arg spec '%s'" % entrypoint_name
|
@@ -376,7 +374,7 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
|
|
376
374
|
}
|
377
375
|
|
378
376
|
def _load_role_yaml(self, subdir, main=None, allow_dir=False):
|
379
|
-
|
377
|
+
"""
|
380
378
|
Find and load role YAML files and return data found.
|
381
379
|
:param subdir: subdir of role to search (vars, files, tasks, handlers, defaults)
|
382
380
|
:type subdir: string
|
@@ -387,7 +385,7 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
|
|
387
385
|
:type allow_dir: bool
|
388
386
|
|
389
387
|
:returns: data from the matched file(s), type can be dict or list depending on vars or tasks.
|
390
|
-
|
388
|
+
"""
|
391
389
|
data = None
|
392
390
|
file_path = os.path.join(self._role_path, subdir)
|
393
391
|
if self._loader.path_exists(file_path) and self._loader.is_directory(file_path):
|
@@ -412,7 +410,7 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
|
|
412
410
|
raise AnsibleParserError("Failed loading '%s' for role (%s) as it is not inside the expected role path: '%s'" %
|
413
411
|
(to_text(found), self._role_name, to_text(file_path)))
|
414
412
|
|
415
|
-
new_data = self._loader.load_from_file(found)
|
413
|
+
new_data = self._loader.load_from_file(found, trusted_as_template=True)
|
416
414
|
if new_data:
|
417
415
|
if data is not None and isinstance(new_data, Mapping):
|
418
416
|
data = combine_vars(data, new_data)
|
@@ -430,10 +428,10 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
|
|
430
428
|
return data
|
431
429
|
|
432
430
|
def _load_dependencies(self):
|
433
|
-
|
431
|
+
"""
|
434
432
|
Recursively loads role dependencies from the metadata list of
|
435
433
|
dependencies, if it exists
|
436
|
-
|
434
|
+
"""
|
437
435
|
|
438
436
|
deps = []
|
439
437
|
for role_include in self._metadata.dependencies:
|
@@ -445,7 +443,7 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
|
|
445
443
|
# other functions
|
446
444
|
|
447
445
|
def add_parent(self, parent_role):
|
448
|
-
|
446
|
+
""" adds a role to the list of this roles parents """
|
449
447
|
if not isinstance(parent_role, Role):
|
450
448
|
raise AnsibleAssertionError()
|
451
449
|
|
@@ -533,10 +531,10 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
|
|
533
531
|
return self._dependencies[:]
|
534
532
|
|
535
533
|
def get_all_dependencies(self):
|
536
|
-
|
534
|
+
"""
|
537
535
|
Returns a list of all deps, built recursively from all child dependencies,
|
538
536
|
in the proper order in which they should be executed or evaluated.
|
539
|
-
|
537
|
+
"""
|
540
538
|
if self._all_dependencies is None:
|
541
539
|
|
542
540
|
self._all_dependencies = []
|
@@ -579,15 +577,15 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
|
|
579
577
|
return block_list
|
580
578
|
|
581
579
|
def has_run(self, host):
|
582
|
-
|
580
|
+
"""
|
583
581
|
Returns true if this role has been iterated over completely and
|
584
582
|
at least one task was run
|
585
|
-
|
583
|
+
"""
|
586
584
|
|
587
585
|
return host.name in self._completed
|
588
586
|
|
589
587
|
def compile(self, play, dep_chain=None):
|
590
|
-
|
588
|
+
"""
|
591
589
|
Returns the task list for this role, which is created by first
|
592
590
|
recursively compiling the tasks for all direct dependencies, and
|
593
591
|
then adding on the tasks for this role.
|
@@ -595,7 +593,7 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
|
|
595
593
|
The role compile() also remembers and saves the dependency chain
|
596
594
|
with each task, so tasks know by which route they were found, and
|
597
595
|
can correctly take their parent's tags/conditionals into account.
|
598
|
-
|
596
|
+
"""
|
599
597
|
from ansible.playbook.block import Block
|
600
598
|
from ansible.playbook.task import Task
|
601
599
|
|