ansible-core 2.18.7rc1__py3-none-any.whl → 2.19.0__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.
Potentially problematic release.
This version of ansible-core might be problematic. Click here for more details.
- ansible/_internal/__init__.py +53 -0
- ansible/_internal/_ansiballz/__init__.py +0 -0
- ansible/_internal/_ansiballz/_builder.py +101 -0
- ansible/_internal/_ansiballz/_wrapper.py +262 -0
- ansible/_internal/_collection_proxy.py +47 -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/_alarm_timeout.py +66 -0
- ansible/_internal/_errors/_captured.py +123 -0
- ansible/_internal/_errors/_error_factory.py +89 -0
- ansible/_internal/_errors/_error_utils.py +240 -0
- ansible/_internal/_errors/_handler.py +91 -0
- ansible/_internal/_errors/_task_timeout.py +28 -0
- ansible/_internal/_event_formatting.py +127 -0
- ansible/_internal/_json/__init__.py +214 -0
- ansible/_internal/_json/_legacy_encoder.py +34 -0
- ansible/_internal/_json/_profiles/__init__.py +0 -0
- ansible/_internal/_json/_profiles/_cache_persistence.py +57 -0
- ansible/_internal/_json/_profiles/_inventory_legacy.py +40 -0
- ansible/_internal/_json/_profiles/_legacy.py +189 -0
- ansible/_internal/_locking.py +21 -0
- ansible/_internal/_plugins/__init__.py +0 -0
- ansible/_internal/_plugins/_cache.py +57 -0
- ansible/_internal/_ssh/__init__.py +0 -0
- ansible/_internal/_ssh/_agent_launch.py +91 -0
- ansible/_internal/_ssh/_ssh_agent.py +619 -0
- ansible/_internal/_task.py +78 -0
- ansible/_internal/_templating/__init__.py +12 -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 +592 -0
- ansible/_internal/_templating/_errors.py +28 -0
- ansible/_internal/_templating/_jinja_bits.py +1106 -0
- ansible/_internal/_templating/_jinja_common.py +323 -0
- ansible/_internal/_templating/_jinja_patches.py +44 -0
- ansible/_internal/_templating/_jinja_plugins.py +375 -0
- ansible/_internal/_templating/_lazy_containers.py +633 -0
- ansible/_internal/_templating/_marker_behaviors.py +103 -0
- ansible/_internal/_templating/_template_vars.py +72 -0
- ansible/_internal/_templating/_transform.py +70 -0
- ansible/_internal/_templating/_utils.py +108 -0
- ansible/_internal/_testing.py +26 -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 +70 -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 +27 -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 +93 -104
- ansible/cli/_ssh_askpass.py +54 -0
- ansible/cli/adhoc.py +20 -10
- ansible/cli/arguments/option_helpers.py +163 -10
- ansible/cli/config.py +43 -68
- ansible/cli/console.py +13 -11
- ansible/cli/doc.py +134 -77
- ansible/cli/galaxy.py +27 -20
- ansible/cli/inventory.py +28 -28
- ansible/cli/playbook.py +4 -12
- ansible/cli/pull.py +6 -3
- ansible/cli/scripts/ansible_connection_cli_stub.py +7 -7
- ansible/cli/vault.py +12 -11
- ansible/compat/__init__.py +2 -2
- ansible/compat/importlib_resources.py +9 -12
- ansible/config/base.yml +218 -133
- ansible/config/manager.py +220 -159
- ansible/constants.py +2 -65
- ansible/errors/__init__.py +350 -256
- ansible/executor/interpreter_discovery.py +28 -149
- ansible/executor/module_common.py +480 -514
- 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 +204 -153
- ansible/executor/powershell/become_wrapper.ps1 +107 -144
- ansible/executor/powershell/bootstrap_wrapper.ps1 +46 -9
- ansible/executor/powershell/coverage_wrapper.ps1 +91 -135
- ansible/executor/powershell/exec_wrapper.ps1 +675 -196
- ansible/executor/powershell/module_manifest.py +469 -265
- ansible/executor/powershell/module_wrapper.ps1 +195 -186
- ansible/executor/powershell/powershell_expand_user.ps1 +20 -0
- ansible/executor/powershell/powershell_mkdtemp.ps1 +17 -0
- 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 +139 -149
- ansible/executor/stats.py +5 -5
- ansible/executor/task_executor.py +270 -297
- ansible/executor/task_queue_manager.py +135 -137
- ansible/executor/task_result.py +182 -79
- ansible/galaxy/__init__.py +2 -2
- ansible/galaxy/api.py +26 -25
- ansible/galaxy/collection/__init__.py +6 -14
- ansible/galaxy/collection/concrete_artifact_manager.py +12 -21
- ansible/galaxy/dependency_resolution/dataclasses.py +14 -4
- ansible/galaxy/dependency_resolution/providers.py +4 -4
- ansible/galaxy/dependency_resolution/reporters.py +81 -0
- ansible/galaxy/role.py +6 -10
- ansible/galaxy/token.py +28 -21
- ansible/inventory/data.py +47 -57
- ansible/inventory/group.py +50 -73
- ansible/inventory/helpers.py +9 -0
- ansible/inventory/host.py +37 -54
- ansible/inventory/manager.py +79 -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/__init__.py +0 -0
- ansible/module_utils/_internal/_ansiballz/_extensions/__init__.py +0 -0
- ansible/module_utils/_internal/_ansiballz/_extensions/_coverage.py +45 -0
- ansible/module_utils/_internal/_ansiballz/_extensions/_pydevd.py +62 -0
- ansible/module_utils/_internal/_ansiballz/_loader.py +81 -0
- ansible/module_utils/_internal/_ansiballz/_respawn.py +32 -0
- ansible/module_utils/_internal/_ansiballz/_respawn_wrapper.py +23 -0
- ansible/module_utils/_internal/_concurrent/_daemon_threading.py +1 -0
- ansible/module_utils/_internal/_dataclass_validation.py +217 -0
- ansible/module_utils/_internal/_datatag/__init__.py +961 -0
- ansible/module_utils/_internal/_datatag/_tags.py +16 -0
- ansible/module_utils/_internal/_debugging.py +31 -0
- ansible/module_utils/_internal/_deprecator.py +157 -0
- ansible/module_utils/_internal/_errors.py +101 -0
- ansible/module_utils/_internal/_event_utils.py +61 -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 +428 -0
- ansible/module_utils/_internal/_json/_profiles/_fallback_to_str.py +73 -0
- ansible/module_utils/_internal/_json/_profiles/_module_legacy_c2m.py +33 -0
- ansible/module_utils/_internal/_json/_profiles/_module_legacy_m2c.py +37 -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 +52 -0
- ansible/module_utils/_internal/_messages.py +130 -0
- ansible/module_utils/_internal/_patches/__init__.py +66 -0
- ansible/module_utils/_internal/_patches/_dataclass_annotation_patch.py +53 -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_info.py +38 -0
- ansible/module_utils/_internal/_stack.py +22 -0
- ansible/module_utils/_internal/_testing.py +0 -0
- ansible/module_utils/_internal/_text_utils.py +6 -0
- ansible/module_utils/_internal/_traceback.py +92 -0
- ansible/module_utils/_internal/_validation.py +14 -0
- ansible/module_utils/ansible_release.py +2 -2
- ansible/module_utils/api.py +1 -2
- ansible/module_utils/basic.py +303 -202
- ansible/module_utils/common/_utils.py +24 -28
- ansible/module_utils/common/arg_spec.py +8 -3
- ansible/module_utils/common/collections.py +7 -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/parameters.py +27 -24
- ansible/module_utils/common/process.py +2 -3
- ansible/module_utils/common/respawn.py +11 -33
- 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 +143 -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 +10 -13
- ansible/module_utils/csharp/Ansible.Basic.cs +15 -12
- ansible/module_utils/csharp/Ansible.Become.cs +1 -0
- ansible/module_utils/csharp/Ansible.Privilege.cs +2 -2
- ansible/module_utils/csharp/Ansible._Async.cs +517 -0
- ansible/module_utils/datatag.py +49 -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 +2 -2
- 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 +5 -5
- 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 +2 -3
- ansible/module_utils/facts/other/ohai.py +2 -3
- ansible/module_utils/facts/sysctl.py +4 -6
- ansible/module_utils/facts/system/apparmor.py +1 -2
- ansible/module_utils/facts/system/caps.py +3 -3
- 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 +27 -13
- 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 +2 -3
- 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/linux.py +3 -3
- 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 +7 -1
- ansible/module_utils/powershell/Ansible.ModuleUtils.AddType.psm1 +1 -1
- ansible/module_utils/powershell/Ansible.ModuleUtils.CamelConversion.psm1 +1 -1
- ansible/module_utils/powershell/Ansible.ModuleUtils.CommandUtil.psm1 +1 -1
- ansible/module_utils/powershell/Ansible.ModuleUtils.WebRequest.psm1 +1 -1
- ansible/module_utils/service.py +21 -31
- ansible/module_utils/splitter.py +7 -7
- ansible/module_utils/testing.py +31 -0
- ansible/module_utils/urls.py +64 -35
- ansible/modules/add_host.py +4 -4
- ansible/modules/apt.py +69 -49
- ansible/modules/apt_key.py +19 -12
- ansible/modules/apt_repository.py +32 -51
- ansible/modules/assemble.py +16 -14
- ansible/modules/assert.py +4 -4
- ansible/modules/async_status.py +24 -24
- ansible/modules/async_wrapper.py +20 -25
- ansible/modules/blockinfile.py +6 -7
- ansible/modules/command.py +13 -20
- ansible/modules/copy.py +60 -147
- ansible/modules/cron.py +24 -21
- 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 +13 -15
- ansible/modules/fail.py +4 -4
- ansible/modules/fetch.py +4 -4
- ansible/modules/file.py +184 -144
- ansible/modules/find.py +22 -20
- ansible/modules/gather_facts.py +3 -3
- ansible/modules/get_url.py +77 -54
- ansible/modules/getent.py +7 -9
- ansible/modules/git.py +38 -38
- ansible/modules/group.py +6 -6
- ansible/modules/group_by.py +4 -4
- ansible/modules/hostname.py +15 -32
- 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 +22 -24
- ansible/modules/lineinfile.py +5 -5
- ansible/modules/meta.py +4 -4
- ansible/modules/mount_facts.py +2 -2
- ansible/modules/package.py +10 -4
- ansible/modules/package_facts.py +22 -10
- ansible/modules/pause.py +6 -6
- ansible/modules/ping.py +6 -6
- ansible/modules/pip.py +21 -26
- ansible/modules/raw.py +6 -6
- ansible/modules/reboot.py +6 -6
- ansible/modules/replace.py +10 -14
- ansible/modules/rpm_key.py +7 -8
- ansible/modules/script.py +4 -4
- ansible/modules/service.py +10 -17
- 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 +16 -19
- ansible/modules/stat.py +15 -31
- ansible/modules/subversion.py +15 -15
- ansible/modules/systemd.py +7 -7
- ansible/modules/systemd_service.py +7 -7
- ansible/modules/sysvinit.py +9 -9
- ansible/modules/tempfile.py +5 -6
- ansible/modules/template.py +6 -6
- ansible/modules/unarchive.py +38 -17
- ansible/modules/uri.py +33 -26
- ansible/modules/user.py +45 -32
- ansible/modules/validate_argument_spec.py +10 -7
- ansible/modules/wait_for.py +70 -60
- ansible/modules/wait_for_connection.py +6 -6
- ansible/modules/yum_repository.py +10 -9
- ansible/parsing/ajson.py +17 -37
- ansible/parsing/dataloader.py +99 -54
- ansible/parsing/mod_args.py +62 -60
- 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/jsonify.py +5 -1
- ansible/parsing/utils/yaml.py +32 -61
- ansible/parsing/vault/__init__.py +327 -99
- 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 +43 -335
- ansible/playbook/__init__.py +1 -1
- ansible/playbook/attribute.py +8 -3
- ansible/playbook/base.py +187 -134
- 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 +32 -26
- ansible/playbook/loop_control.py +2 -2
- ansible/playbook/play.py +85 -44
- ansible/playbook/play_context.py +14 -17
- ansible/playbook/playbook_include.py +27 -62
- ansible/playbook/role/__init__.py +64 -49
- 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 +28 -12
- ansible/playbook/task.py +192 -121
- ansible/playbook/task_include.py +5 -5
- ansible/plugins/__init__.py +58 -26
- ansible/plugins/action/__init__.py +188 -186
- ansible/plugins/action/add_host.py +2 -2
- ansible/plugins/action/assemble.py +11 -18
- ansible/plugins/action/assert.py +55 -67
- ansible/plugins/action/async_status.py +7 -2
- ansible/plugins/action/copy.py +14 -17
- 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 +7 -8
- ansible/plugins/action/gather_facts.py +13 -14
- ansible/plugins/action/group_by.py +1 -1
- ansible/plugins/action/include_vars.py +10 -11
- ansible/plugins/action/package.py +8 -14
- ansible/plugins/action/pause.py +2 -2
- ansible/plugins/action/script.py +27 -38
- ansible/plugins/action/service.py +9 -18
- ansible/plugins/action/set_fact.py +3 -12
- ansible/plugins/action/set_stats.py +3 -8
- ansible/plugins/action/template.py +47 -67
- ansible/plugins/action/unarchive.py +6 -16
- ansible/plugins/action/uri.py +9 -20
- 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 +52 -63
- 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 +294 -201
- ansible/plugins/callback/default.py +99 -95
- ansible/plugins/callback/junit.py +44 -43
- ansible/plugins/callback/minimal.py +28 -25
- ansible/plugins/callback/oneline.py +34 -21
- ansible/plugins/callback/tree.py +27 -16
- ansible/plugins/connection/__init__.py +47 -34
- ansible/plugins/connection/local.py +156 -60
- ansible/plugins/connection/paramiko_ssh.py +34 -24
- ansible/plugins/connection/psrp.py +76 -165
- ansible/plugins/connection/ssh.py +326 -86
- ansible/plugins/connection/winrm.py +62 -141
- 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 +8 -4
- 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 +245 -120
- ansible/plugins/filter/encryption.py +42 -34
- 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/pow.yml +1 -1
- ansible/plugins/filter/regex_search.yml +1 -4
- ansible/plugins/filter/root.yml +1 -1
- ansible/plugins/filter/split.yml +1 -1
- ansible/plugins/filter/strftime.yml +3 -3
- ansible/plugins/filter/to_nice_yaml.yml +0 -4
- ansible/plugins/filter/to_uuid.yml +1 -1
- 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 +107 -86
- 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 +190 -120
- ansible/plugins/inventory/toml.py +16 -126
- ansible/plugins/inventory/yaml.py +10 -8
- ansible/plugins/list.py +72 -19
- ansible/plugins/loader.py +383 -198
- ansible/plugins/lookup/__init__.py +21 -4
- ansible/plugins/lookup/config.py +21 -35
- ansible/plugins/lookup/csvfile.py +19 -73
- 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 +87 -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 +47 -36
- ansible/plugins/lookup/together.py +0 -12
- ansible/plugins/lookup/unvault.py +1 -5
- ansible/plugins/lookup/url.py +4 -10
- ansible/plugins/lookup/vars.py +16 -24
- ansible/plugins/shell/__init__.py +58 -4
- ansible/plugins/shell/cmd.py +2 -2
- ansible/plugins/shell/powershell.py +106 -31
- ansible/plugins/shell/sh.py +13 -7
- ansible/plugins/strategy/__init__.py +168 -193
- ansible/plugins/strategy/debug.py +2 -2
- ansible/plugins/strategy/free.py +16 -31
- ansible/plugins/strategy/host_pinned.py +2 -2
- ansible/plugins/strategy/linear.py +41 -41
- ansible/plugins/terminal/__init__.py +4 -4
- ansible/plugins/test/__init__.py +7 -2
- ansible/plugins/test/core.py +75 -35
- ansible/plugins/test/files.py +1 -1
- ansible/plugins/test/finished.yml +1 -1
- ansible/plugins/test/mathstuff.py +3 -3
- ansible/plugins/test/uri.py +5 -8
- ansible/plugins/vars/host_group_vars.py +7 -14
- ansible/release.py +2 -2
- ansible/template/__init__.py +353 -943
- ansible/utils/__init__.py +0 -18
- ansible/utils/collection_loader/__init__.py +54 -5
- ansible/utils/collection_loader/_collection_config.py +5 -6
- ansible/utils/collection_loader/_collection_finder.py +82 -96
- ansible/utils/collection_loader/_collection_meta.py +15 -8
- ansible/utils/display.py +485 -73
- ansible/utils/encrypt.py +27 -19
- ansible/utils/fqcn.py +2 -2
- ansible/utils/galaxy.py +2 -2
- ansible/utils/hashing.py +8 -10
- ansible/utils/helpers.py +2 -2
- ansible/utils/listify.py +10 -8
- ansible/utils/lock.py +2 -2
- ansible/utils/path.py +10 -12
- ansible/utils/plugin_docs.py +16 -14
- ansible/utils/py3compat.py +2 -7
- ansible/utils/sentinel.py +4 -62
- ansible/utils/singleton.py +2 -0
- ansible/utils/ssh_functions.py +6 -2
- ansible/utils/unsafe_proxy.py +23 -332
- ansible/utils/vars.py +55 -8
- ansible/utils/version.py +2 -2
- ansible/vars/clean.py +5 -5
- ansible/vars/hostvars.py +60 -90
- ansible/vars/manager.py +220 -285
- ansible/vars/plugins.py +4 -4
- ansible/vars/reserved.py +13 -12
- {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/METADATA +4 -3
- ansible_core-2.19.0.dist-info/RECORD +1097 -0
- ansible_core-2.19.0.dist-info/licenses/licenses/BSD-3-Clause.txt +28 -0
- 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 +2 -2
- ansible_test/_data/requirements/sanity.import.plugin.txt +2 -2
- ansible_test/_data/requirements/sanity.pep8.txt +1 -1
- ansible_test/_data/requirements/sanity.pylint.txt +5 -5
- 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 +6 -0
- ansible_test/_internal/ansible_util.py +3 -1
- 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 -5
- 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 +52 -5
- 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 +3 -2
- 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 +22 -5
- 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 +3 -2
- 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 +8 -2
- 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 +19 -2
- 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 +12 -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 +25 -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 +44 -4
- ansible_test/_internal/commands/units/__init__.py +5 -1
- 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 +23 -13
- 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/debugging.py +166 -0
- ansible_test/_internal/delegation.py +22 -13
- 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 +260 -16
- ansible_test/_internal/http.py +1 -0
- ansible_test/_internal/init.py +1 -0
- ansible_test/_internal/inventory.py +39 -3
- ansible_test/_internal/io.py +1 -0
- ansible_test/_internal/metadata.py +95 -4
- ansible_test/_internal/payload.py +1 -0
- ansible_test/_internal/processes.py +80 -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 +11 -4
- ansible_test/_internal/pypi_proxy.py +6 -5
- ansible_test/_internal/python_requirements.py +28 -0
- ansible_test/_internal/ssh.py +2 -5
- ansible_test/_internal/target.py +9 -0
- ansible_test/_internal/test.py +3 -2
- ansible_test/_internal/thread.py +3 -1
- ansible_test/_internal/timeout.py +2 -1
- ansible_test/_internal/util.py +41 -12
- ansible_test/_internal/util_common.py +18 -5
- 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 +8 -5
- ansible_test/_util/controller/sanity/pylint/config/ansible-test.cfg +8 -5
- ansible_test/_util/controller/sanity/pylint/config/code-smell.cfg +8 -5
- ansible_test/_util/controller/sanity/pylint/config/collection.cfg +4 -5
- ansible_test/_util/controller/sanity/pylint/config/default.cfg +8 -7
- ansible_test/_util/controller/sanity/pylint/plugins/deprecated_calls.py +541 -0
- ansible_test/_util/controller/sanity/pylint/plugins/deprecated_comment.py +137 -0
- 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/injector/python.py +8 -0
- 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 +38 -36
- 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/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.7rc1.dist-info/RECORD +0 -992
- ansible_test/_util/controller/sanity/pylint/plugins/deprecated.py +0 -411
- {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/WHEEL +0 -0
- {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/entry_points.txt +0 -0
- {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/licenses/COPYING +0 -0
- {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/Apache-License.txt +0 -0
- {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/MIT-license.txt +0 -0
- {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/PSF-license.txt +0 -0
- {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/simplified_bsd.txt +0 -0
- {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/top_level.txt +0 -0
|
@@ -18,15 +18,16 @@
|
|
|
18
18
|
from __future__ import annotations
|
|
19
19
|
|
|
20
20
|
import os
|
|
21
|
+
import typing as _t
|
|
21
22
|
|
|
22
23
|
from collections.abc import Container, Mapping, Set, Sequence
|
|
23
24
|
from types import MappingProxyType
|
|
24
25
|
|
|
25
26
|
from ansible import constants as C
|
|
26
27
|
from ansible.errors import AnsibleError, AnsibleParserError, AnsibleAssertionError
|
|
28
|
+
from ansible.module_utils.common.sentinel import Sentinel
|
|
27
29
|
from ansible.module_utils.common.text.converters import to_text
|
|
28
30
|
from ansible.module_utils.six import binary_type, text_type
|
|
29
|
-
from ansible.playbook.attribute import FieldAttribute
|
|
30
31
|
from ansible.playbook.base import Base
|
|
31
32
|
from ansible.playbook.collectionsearch import CollectionSearch
|
|
32
33
|
from ansible.playbook.conditional import Conditional
|
|
@@ -37,9 +38,18 @@ from ansible.playbook.taggable import Taggable
|
|
|
37
38
|
from ansible.plugins.loader import add_all_plugin_dirs
|
|
38
39
|
from ansible.utils.collection_loader import AnsibleCollectionConfig
|
|
39
40
|
from ansible.utils.path import is_subpath
|
|
40
|
-
from ansible.utils.sentinel import Sentinel
|
|
41
41
|
from ansible.utils.vars import combine_vars
|
|
42
42
|
|
|
43
|
+
# NOTE: This import is only needed for the type-checking in __init__. While there's an alternative
|
|
44
|
+
# available by using forward references this seems not to work well with commonly used IDEs.
|
|
45
|
+
# Therefore the TYPE_CHECKING hack seems to be a more universal approach, even if not being very elegant.
|
|
46
|
+
# References:
|
|
47
|
+
# * https://stackoverflow.com/q/39740632/199513
|
|
48
|
+
# * https://peps.python.org/pep-0484/#forward-references
|
|
49
|
+
if _t.TYPE_CHECKING:
|
|
50
|
+
from ansible.playbook.block import Block
|
|
51
|
+
from ansible.playbook.play import Play
|
|
52
|
+
|
|
43
53
|
__all__ = ['Role', 'hash_params']
|
|
44
54
|
|
|
45
55
|
# TODO: this should be a utility function, but can't be a member of
|
|
@@ -98,13 +108,19 @@ def hash_params(params):
|
|
|
98
108
|
|
|
99
109
|
class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
|
|
100
110
|
|
|
101
|
-
def __init__(self,
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
111
|
+
def __init__(self,
|
|
112
|
+
play: Play = None,
|
|
113
|
+
from_files: dict[str, list[str]] = None,
|
|
114
|
+
from_include: bool = False,
|
|
115
|
+
validate: bool = True,
|
|
116
|
+
public: bool = None,
|
|
117
|
+
static: bool = True) -> None:
|
|
118
|
+
self._role_name: str = None
|
|
119
|
+
self._role_path: str = None
|
|
120
|
+
self._role_collection: str = None
|
|
121
|
+
self._role_params: dict[str, dict[str, str]] = dict()
|
|
106
122
|
self._loader = None
|
|
107
|
-
self.static = static
|
|
123
|
+
self.static: bool = static
|
|
108
124
|
|
|
109
125
|
# includes (static=false) default to private, while imports (static=true) default to public
|
|
110
126
|
# but both can be overridden by global config if set
|
|
@@ -117,26 +133,26 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
|
|
|
117
133
|
else:
|
|
118
134
|
self.public = public
|
|
119
135
|
|
|
120
|
-
self._metadata = RoleMetadata()
|
|
121
|
-
self._play = play
|
|
122
|
-
self._parents = []
|
|
123
|
-
self._dependencies = []
|
|
124
|
-
self._all_dependencies = None
|
|
125
|
-
self._task_blocks = []
|
|
126
|
-
self._handler_blocks = []
|
|
127
|
-
self._compiled_handler_blocks = None
|
|
128
|
-
self._default_vars = dict()
|
|
129
|
-
self._role_vars = dict()
|
|
130
|
-
self._had_task_run = dict()
|
|
131
|
-
self._completed = dict()
|
|
132
|
-
self._should_validate = validate
|
|
136
|
+
self._metadata: RoleMetadata = RoleMetadata()
|
|
137
|
+
self._play: Play = play
|
|
138
|
+
self._parents: list[Role] = []
|
|
139
|
+
self._dependencies: list[Role] = []
|
|
140
|
+
self._all_dependencies: list[Role] | None = None
|
|
141
|
+
self._task_blocks: list[Block] = []
|
|
142
|
+
self._handler_blocks: list[Block] = []
|
|
143
|
+
self._compiled_handler_blocks: list[Block] | None = None
|
|
144
|
+
self._default_vars: dict[str, str] | None = dict()
|
|
145
|
+
self._role_vars: dict[str, str] | None = dict()
|
|
146
|
+
self._had_task_run: dict[str, bool] = dict()
|
|
147
|
+
self._completed: dict[str, bool] = dict()
|
|
148
|
+
self._should_validate: bool = validate
|
|
133
149
|
|
|
134
150
|
if from_files is None:
|
|
135
151
|
from_files = {}
|
|
136
|
-
self._from_files = from_files
|
|
152
|
+
self._from_files: dict[str, list[str]] = from_files
|
|
137
153
|
|
|
138
154
|
# Indicates whether this role was included via include/import_role
|
|
139
|
-
self.from_include = from_include
|
|
155
|
+
self.from_include: bool = from_include
|
|
140
156
|
|
|
141
157
|
self._hash = None
|
|
142
158
|
|
|
@@ -200,9 +216,9 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
|
|
|
200
216
|
|
|
201
217
|
return r
|
|
202
218
|
|
|
203
|
-
except
|
|
219
|
+
except RecursionError as ex:
|
|
204
220
|
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)
|
|
221
|
+
obj=role_include._ds) from ex
|
|
206
222
|
|
|
207
223
|
def _load_role_data(self, role_include, parent_role=None):
|
|
208
224
|
self._role_name = role_include.role
|
|
@@ -274,18 +290,17 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
|
|
|
274
290
|
if task_data:
|
|
275
291
|
try:
|
|
276
292
|
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)
|
|
293
|
+
except AssertionError as ex:
|
|
294
|
+
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
295
|
|
|
281
296
|
handler_data = self._load_role_yaml('handlers', main=self._from_files.get('handlers'))
|
|
282
297
|
if handler_data:
|
|
283
298
|
try:
|
|
284
299
|
self._handler_blocks = load_list_of_blocks(handler_data, play=self._play, role=self, use_handlers=True, loader=self._loader,
|
|
285
300
|
variable_manager=self._variable_manager)
|
|
286
|
-
except AssertionError as
|
|
287
|
-
raise AnsibleParserError("The handlers/main.yml file for role
|
|
288
|
-
obj=handler_data
|
|
301
|
+
except AssertionError as ex:
|
|
302
|
+
raise AnsibleParserError(f"The handlers/main.yml file for role {self._role_name!r} must contain a list of tasks.",
|
|
303
|
+
obj=handler_data) from ex
|
|
289
304
|
|
|
290
305
|
def _get_role_argspecs(self):
|
|
291
306
|
"""Get the role argument spec data.
|
|
@@ -316,7 +331,7 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
|
|
|
316
331
|
return getattr(self._metadata, 'argument_specs', {})
|
|
317
332
|
|
|
318
333
|
def _prepend_validation_task(self, task_data, argspecs):
|
|
319
|
-
|
|
334
|
+
"""Insert a role validation task if we have a role argument spec.
|
|
320
335
|
|
|
321
336
|
This method will prepend a validation task to the front of the role task
|
|
322
337
|
list to perform argument spec validation before any other tasks, if an arg spec
|
|
@@ -326,7 +341,7 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
|
|
|
326
341
|
:param argspecs: The role argument spec data dict.
|
|
327
342
|
|
|
328
343
|
:returns: The (possibly modified) task list.
|
|
329
|
-
|
|
344
|
+
"""
|
|
330
345
|
if argspecs:
|
|
331
346
|
# Determine the role entry point so we can retrieve the correct argument spec.
|
|
332
347
|
# This comes from the `tasks_from` value to include_role or import_role.
|
|
@@ -345,13 +360,13 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
|
|
|
345
360
|
return task_data
|
|
346
361
|
|
|
347
362
|
def _create_validation_task(self, argument_spec, entrypoint_name):
|
|
348
|
-
|
|
363
|
+
"""Create a new task data structure that uses the validate_argument_spec action plugin.
|
|
349
364
|
|
|
350
365
|
:param argument_spec: The arg spec definition for a particular role entry point.
|
|
351
366
|
This will be the entire arg spec for the entry point as read from the input file.
|
|
352
367
|
:param entrypoint_name: The name of the role entry point associated with the
|
|
353
368
|
supplied `argument_spec`.
|
|
354
|
-
|
|
369
|
+
"""
|
|
355
370
|
|
|
356
371
|
# If the arg spec provides a short description, use it to flesh out the validation task name
|
|
357
372
|
task_name = "Validating arguments against arg spec '%s'" % entrypoint_name
|
|
@@ -359,8 +374,8 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
|
|
|
359
374
|
task_name = task_name + ' - ' + argument_spec['short_description']
|
|
360
375
|
|
|
361
376
|
return {
|
|
362
|
-
'action':
|
|
363
|
-
|
|
377
|
+
'action': 'ansible.builtin.validate_argument_spec',
|
|
378
|
+
'args': {
|
|
364
379
|
# Pass only the 'options' portion of the arg spec to the module.
|
|
365
380
|
'argument_spec': argument_spec.get('options', {}),
|
|
366
381
|
'provided_arguments': self._role_params,
|
|
@@ -376,7 +391,7 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
|
|
|
376
391
|
}
|
|
377
392
|
|
|
378
393
|
def _load_role_yaml(self, subdir, main=None, allow_dir=False):
|
|
379
|
-
|
|
394
|
+
"""
|
|
380
395
|
Find and load role YAML files and return data found.
|
|
381
396
|
:param subdir: subdir of role to search (vars, files, tasks, handlers, defaults)
|
|
382
397
|
:type subdir: string
|
|
@@ -387,7 +402,7 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
|
|
|
387
402
|
:type allow_dir: bool
|
|
388
403
|
|
|
389
404
|
:returns: data from the matched file(s), type can be dict or list depending on vars or tasks.
|
|
390
|
-
|
|
405
|
+
"""
|
|
391
406
|
data = None
|
|
392
407
|
file_path = os.path.join(self._role_path, subdir)
|
|
393
408
|
if self._loader.path_exists(file_path) and self._loader.is_directory(file_path):
|
|
@@ -412,7 +427,7 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
|
|
|
412
427
|
raise AnsibleParserError("Failed loading '%s' for role (%s) as it is not inside the expected role path: '%s'" %
|
|
413
428
|
(to_text(found), self._role_name, to_text(file_path)))
|
|
414
429
|
|
|
415
|
-
new_data = self._loader.load_from_file(found)
|
|
430
|
+
new_data = self._loader.load_from_file(found, trusted_as_template=True)
|
|
416
431
|
if new_data:
|
|
417
432
|
if data is not None and isinstance(new_data, Mapping):
|
|
418
433
|
data = combine_vars(data, new_data)
|
|
@@ -430,10 +445,10 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
|
|
|
430
445
|
return data
|
|
431
446
|
|
|
432
447
|
def _load_dependencies(self):
|
|
433
|
-
|
|
448
|
+
"""
|
|
434
449
|
Recursively loads role dependencies from the metadata list of
|
|
435
450
|
dependencies, if it exists
|
|
436
|
-
|
|
451
|
+
"""
|
|
437
452
|
|
|
438
453
|
deps = []
|
|
439
454
|
for role_include in self._metadata.dependencies:
|
|
@@ -445,7 +460,7 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
|
|
|
445
460
|
# other functions
|
|
446
461
|
|
|
447
462
|
def add_parent(self, parent_role):
|
|
448
|
-
|
|
463
|
+
""" adds a role to the list of this roles parents """
|
|
449
464
|
if not isinstance(parent_role, Role):
|
|
450
465
|
raise AnsibleAssertionError()
|
|
451
466
|
|
|
@@ -533,10 +548,10 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
|
|
|
533
548
|
return self._dependencies[:]
|
|
534
549
|
|
|
535
550
|
def get_all_dependencies(self):
|
|
536
|
-
|
|
551
|
+
"""
|
|
537
552
|
Returns a list of all deps, built recursively from all child dependencies,
|
|
538
553
|
in the proper order in which they should be executed or evaluated.
|
|
539
|
-
|
|
554
|
+
"""
|
|
540
555
|
if self._all_dependencies is None:
|
|
541
556
|
|
|
542
557
|
self._all_dependencies = []
|
|
@@ -579,15 +594,15 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
|
|
|
579
594
|
return block_list
|
|
580
595
|
|
|
581
596
|
def has_run(self, host):
|
|
582
|
-
|
|
597
|
+
"""
|
|
583
598
|
Returns true if this role has been iterated over completely and
|
|
584
599
|
at least one task was run
|
|
585
|
-
|
|
600
|
+
"""
|
|
586
601
|
|
|
587
602
|
return host.name in self._completed
|
|
588
603
|
|
|
589
604
|
def compile(self, play, dep_chain=None):
|
|
590
|
-
|
|
605
|
+
"""
|
|
591
606
|
Returns the task list for this role, which is created by first
|
|
592
607
|
recursively compiling the tasks for all direct dependencies, and
|
|
593
608
|
then adding on the tasks for this role.
|
|
@@ -595,7 +610,7 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
|
|
|
595
610
|
The role compile() also remembers and saves the dependency chain
|
|
596
611
|
with each task, so tasks know by which route they were found, and
|
|
597
612
|
can correctly take their parent's tags/conditionals into account.
|
|
598
|
-
|
|
613
|
+
"""
|
|
599
614
|
from ansible.playbook.block import Block
|
|
600
615
|
from ansible.playbook.task import Task
|
|
601
616
|
|
|
@@ -21,14 +21,14 @@ import os
|
|
|
21
21
|
|
|
22
22
|
from ansible import constants as C
|
|
23
23
|
from ansible.errors import AnsibleError, AnsibleAssertionError
|
|
24
|
+
from ansible.module_utils._internal._datatag import AnsibleTagHelper
|
|
24
25
|
from ansible.module_utils.six import string_types
|
|
25
|
-
from ansible.parsing.yaml.objects import AnsibleBaseYAMLObject, AnsibleMapping
|
|
26
26
|
from ansible.playbook.attribute import NonInheritableFieldAttribute
|
|
27
27
|
from ansible.playbook.base import Base
|
|
28
28
|
from ansible.playbook.collectionsearch import CollectionSearch
|
|
29
29
|
from ansible.playbook.conditional import Conditional
|
|
30
30
|
from ansible.playbook.taggable import Taggable
|
|
31
|
-
from ansible.
|
|
31
|
+
from ansible._internal._templating._engine import TemplateEngine
|
|
32
32
|
from ansible.utils.collection_loader import AnsibleCollectionRef
|
|
33
33
|
from ansible.utils.collection_loader._collection_finder import _get_collection_role_path
|
|
34
34
|
from ansible.utils.path import unfrackpath
|
|
@@ -70,7 +70,7 @@ class RoleDefinition(Base, Conditional, Taggable, CollectionSearch):
|
|
|
70
70
|
if isinstance(ds, int):
|
|
71
71
|
ds = "%s" % ds
|
|
72
72
|
|
|
73
|
-
if not isinstance(ds, dict) and not isinstance(ds, string_types)
|
|
73
|
+
if not isinstance(ds, dict) and not isinstance(ds, string_types):
|
|
74
74
|
raise AnsibleAssertionError()
|
|
75
75
|
|
|
76
76
|
if isinstance(ds, dict):
|
|
@@ -79,12 +79,9 @@ class RoleDefinition(Base, Conditional, Taggable, CollectionSearch):
|
|
|
79
79
|
# save the original ds for use later
|
|
80
80
|
self._ds = ds
|
|
81
81
|
|
|
82
|
-
#
|
|
83
|
-
#
|
|
84
|
-
|
|
85
|
-
new_ds = AnsibleMapping()
|
|
86
|
-
if isinstance(ds, AnsibleBaseYAMLObject):
|
|
87
|
-
new_ds.ansible_pos = ds.ansible_pos
|
|
82
|
+
# the new, cleaned datastructure, which will have legacy items reduced to a standard structure suitable for the
|
|
83
|
+
# attributes of the task class; copy any tagged data to preserve things like origin
|
|
84
|
+
new_ds = AnsibleTagHelper.tag_copy(ds, {})
|
|
88
85
|
|
|
89
86
|
# first we pull the role name out of the data structure,
|
|
90
87
|
# and then use that to determine the role path (which may
|
|
@@ -110,11 +107,11 @@ class RoleDefinition(Base, Conditional, Taggable, CollectionSearch):
|
|
|
110
107
|
return new_ds
|
|
111
108
|
|
|
112
109
|
def _load_role_name(self, ds):
|
|
113
|
-
|
|
110
|
+
"""
|
|
114
111
|
Returns the role name (either the role: or name: field) from
|
|
115
112
|
the role definition, or (when the role definition is a simple
|
|
116
113
|
string), just that string
|
|
117
|
-
|
|
114
|
+
"""
|
|
118
115
|
|
|
119
116
|
if isinstance(ds, string_types):
|
|
120
117
|
return ds
|
|
@@ -127,18 +124,18 @@ class RoleDefinition(Base, Conditional, Taggable, CollectionSearch):
|
|
|
127
124
|
# contains a variable, try and template it now
|
|
128
125
|
if self._variable_manager:
|
|
129
126
|
all_vars = self._variable_manager.get_vars(play=self._play)
|
|
130
|
-
templar =
|
|
127
|
+
templar = TemplateEngine(loader=self._loader, variables=all_vars)
|
|
131
128
|
role_name = templar.template(role_name)
|
|
132
129
|
|
|
133
130
|
return role_name
|
|
134
131
|
|
|
135
132
|
def _load_role_path(self, role_name):
|
|
136
|
-
|
|
133
|
+
"""
|
|
137
134
|
the 'role', as specified in the ds (or as a bare string), can either
|
|
138
135
|
be a simple name or a full path. If it is a full path, we use the
|
|
139
136
|
basename as the role name, otherwise we take the name as-given and
|
|
140
137
|
append it to the default role path
|
|
141
|
-
|
|
138
|
+
"""
|
|
142
139
|
|
|
143
140
|
# create a templar class to template the dependency names, in
|
|
144
141
|
# case they contain variables
|
|
@@ -147,7 +144,7 @@ class RoleDefinition(Base, Conditional, Taggable, CollectionSearch):
|
|
|
147
144
|
else:
|
|
148
145
|
all_vars = dict()
|
|
149
146
|
|
|
150
|
-
templar =
|
|
147
|
+
templar = TemplateEngine(loader=self._loader, variables=all_vars)
|
|
151
148
|
role_name = templar.template(role_name)
|
|
152
149
|
|
|
153
150
|
role_tuple = None
|
|
@@ -198,13 +195,14 @@ class RoleDefinition(Base, Conditional, Taggable, CollectionSearch):
|
|
|
198
195
|
return (role_name, role_path)
|
|
199
196
|
|
|
200
197
|
searches = (self._collection_list or []) + role_search_paths
|
|
198
|
+
|
|
201
199
|
raise AnsibleError("the role '%s' was not found in %s" % (role_name, ":".join(searches)), obj=self._ds)
|
|
202
200
|
|
|
203
201
|
def _split_role_params(self, ds):
|
|
204
|
-
|
|
202
|
+
"""
|
|
205
203
|
Splits any random role params off from the role spec and store
|
|
206
204
|
them in a dictionary of params for parsing later
|
|
207
|
-
|
|
205
|
+
"""
|
|
208
206
|
|
|
209
207
|
role_def = dict()
|
|
210
208
|
role_params = dict()
|
ansible/playbook/role/include.py
CHANGED
|
@@ -19,10 +19,8 @@ from __future__ import annotations
|
|
|
19
19
|
|
|
20
20
|
from ansible.errors import AnsibleError, AnsibleParserError
|
|
21
21
|
from ansible.module_utils.six import string_types
|
|
22
|
-
from ansible.parsing.yaml.objects import AnsibleBaseYAMLObject
|
|
23
22
|
from ansible.playbook.delegatable import Delegatable
|
|
24
23
|
from ansible.playbook.role.definition import RoleDefinition
|
|
25
|
-
from ansible.module_utils.common.text.converters import to_native
|
|
26
24
|
|
|
27
25
|
|
|
28
26
|
__all__ = ['RoleInclude']
|
|
@@ -42,8 +40,8 @@ class RoleInclude(RoleDefinition, Delegatable):
|
|
|
42
40
|
@staticmethod
|
|
43
41
|
def load(data, play, current_role_path=None, parent_role=None, variable_manager=None, loader=None, collection_list=None):
|
|
44
42
|
|
|
45
|
-
if not (isinstance(data, string_types) or isinstance(data, dict)
|
|
46
|
-
raise AnsibleParserError("Invalid role definition
|
|
43
|
+
if not (isinstance(data, string_types) or isinstance(data, dict)):
|
|
44
|
+
raise AnsibleParserError("Invalid role definition.", obj=data)
|
|
47
45
|
|
|
48
46
|
if isinstance(data, string_types) and ',' in data:
|
|
49
47
|
raise AnsibleError("Invalid old style role requirement: %s" % data)
|
|
@@ -20,7 +20,6 @@ from __future__ import annotations
|
|
|
20
20
|
import os
|
|
21
21
|
|
|
22
22
|
from ansible.errors import AnsibleParserError, AnsibleError
|
|
23
|
-
from ansible.module_utils.common.text.converters import to_native
|
|
24
23
|
from ansible.module_utils.six import string_types
|
|
25
24
|
from ansible.playbook.attribute import NonInheritableFieldAttribute
|
|
26
25
|
from ansible.playbook.base import Base
|
|
@@ -32,10 +31,10 @@ __all__ = ['RoleMetadata']
|
|
|
32
31
|
|
|
33
32
|
|
|
34
33
|
class RoleMetadata(Base, CollectionSearch):
|
|
35
|
-
|
|
34
|
+
"""
|
|
36
35
|
This class wraps the parsing and validation of the optional metadata
|
|
37
36
|
within each Role (meta/main.yml).
|
|
38
|
-
|
|
37
|
+
"""
|
|
39
38
|
|
|
40
39
|
allow_duplicates = NonInheritableFieldAttribute(isa='bool', default=False)
|
|
41
40
|
dependencies = NonInheritableFieldAttribute(isa='list', default=list)
|
|
@@ -48,9 +47,9 @@ class RoleMetadata(Base, CollectionSearch):
|
|
|
48
47
|
|
|
49
48
|
@staticmethod
|
|
50
49
|
def load(data, owner, variable_manager=None, loader=None):
|
|
51
|
-
|
|
50
|
+
"""
|
|
52
51
|
Returns a new RoleMetadata object based on the datastructure passed in.
|
|
53
|
-
|
|
52
|
+
"""
|
|
54
53
|
|
|
55
54
|
if not isinstance(data, dict):
|
|
56
55
|
raise AnsibleParserError("the 'meta/main.yml' for role %s is not a dictionary" % owner.get_name())
|
|
@@ -59,10 +58,10 @@ class RoleMetadata(Base, CollectionSearch):
|
|
|
59
58
|
return m
|
|
60
59
|
|
|
61
60
|
def _load_dependencies(self, attr, ds):
|
|
62
|
-
|
|
61
|
+
"""
|
|
63
62
|
This is a helper loading function for the dependencies list,
|
|
64
63
|
which returns a list of RoleInclude objects
|
|
65
|
-
|
|
64
|
+
"""
|
|
66
65
|
|
|
67
66
|
roles = []
|
|
68
67
|
if ds:
|
|
@@ -80,8 +79,8 @@ class RoleMetadata(Base, CollectionSearch):
|
|
|
80
79
|
if def_parsed.get('name'):
|
|
81
80
|
role_def['name'] = def_parsed['name']
|
|
82
81
|
roles.append(role_def)
|
|
83
|
-
except AnsibleError as
|
|
84
|
-
raise AnsibleParserError(
|
|
82
|
+
except AnsibleError as ex:
|
|
83
|
+
raise AnsibleParserError("Error parsing role dependencies.", obj=role_def) from ex
|
|
85
84
|
|
|
86
85
|
current_role_path = None
|
|
87
86
|
collection_search_list = None
|
|
@@ -105,8 +104,8 @@ class RoleMetadata(Base, CollectionSearch):
|
|
|
105
104
|
return load_list_of_roles(roles, play=self._owner._play, current_role_path=current_role_path,
|
|
106
105
|
variable_manager=self._variable_manager, loader=self._loader,
|
|
107
106
|
collection_search_list=collection_search_list)
|
|
108
|
-
except AssertionError as
|
|
109
|
-
raise AnsibleParserError("A malformed list of role dependencies was encountered.", obj=self._ds
|
|
107
|
+
except AssertionError as ex:
|
|
108
|
+
raise AnsibleParserError("A malformed list of role dependencies was encountered.", obj=self._ds) from ex
|
|
110
109
|
|
|
111
110
|
def serialize(self):
|
|
112
111
|
return dict(
|
ansible/playbook/role_include.py
CHANGED
|
@@ -24,7 +24,7 @@ from ansible.playbook.role import Role
|
|
|
24
24
|
from ansible.playbook.role.include import RoleInclude
|
|
25
25
|
from ansible.utils.display import Display
|
|
26
26
|
from ansible.module_utils.six import string_types
|
|
27
|
-
from ansible.
|
|
27
|
+
from ansible._internal._templating._engine import TemplateEngine
|
|
28
28
|
|
|
29
29
|
__all__ = ['IncludeRole']
|
|
30
30
|
|
|
@@ -61,7 +61,7 @@ class IncludeRole(TaskInclude):
|
|
|
61
61
|
self._role_path = None
|
|
62
62
|
|
|
63
63
|
def get_name(self):
|
|
64
|
-
|
|
64
|
+
""" return the name of the task """
|
|
65
65
|
return self.name or "%s : %s" % (self.action, self._role_name)
|
|
66
66
|
|
|
67
67
|
def get_block_list(self, play=None, variable_manager=None, loader=None):
|
|
@@ -79,7 +79,7 @@ class IncludeRole(TaskInclude):
|
|
|
79
79
|
available_variables = variable_manager.get_vars(play=myplay, task=self)
|
|
80
80
|
else:
|
|
81
81
|
available_variables = {}
|
|
82
|
-
templar =
|
|
82
|
+
templar = TemplateEngine(loader=loader, variables=available_variables)
|
|
83
83
|
from_files = templar.template(self._from_files)
|
|
84
84
|
|
|
85
85
|
# build role
|
ansible/playbook/taggable.py
CHANGED
|
@@ -17,14 +17,17 @@
|
|
|
17
17
|
|
|
18
18
|
from __future__ import annotations
|
|
19
19
|
|
|
20
|
+
import typing as t
|
|
21
|
+
|
|
20
22
|
from ansible.errors import AnsibleError
|
|
21
23
|
from ansible.module_utils.six import string_types
|
|
24
|
+
from ansible.module_utils.common.sentinel import Sentinel
|
|
25
|
+
from ansible.module_utils._internal._datatag import AnsibleTagHelper
|
|
22
26
|
from ansible.playbook.attribute import FieldAttribute
|
|
23
|
-
from ansible.
|
|
24
|
-
from ansible.utils.sentinel import Sentinel
|
|
27
|
+
from ansible._internal._templating._engine import TemplateEngine
|
|
25
28
|
|
|
26
29
|
|
|
27
|
-
def _flatten_tags(tags: list) -> list:
|
|
30
|
+
def _flatten_tags(tags: list[str | int]) -> list[str | int]:
|
|
28
31
|
rv = set()
|
|
29
32
|
for tag in tags:
|
|
30
33
|
if isinstance(tag, list):
|
|
@@ -42,21 +45,34 @@ class Taggable:
|
|
|
42
45
|
def _load_tags(self, attr, ds):
|
|
43
46
|
if isinstance(ds, list):
|
|
44
47
|
return ds
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
48
|
+
|
|
49
|
+
if isinstance(ds, str):
|
|
50
|
+
return [AnsibleTagHelper.tag_copy(ds, item.strip()) for item in ds.split(',')]
|
|
51
|
+
|
|
52
|
+
raise AnsibleError('tags must be specified as a list', obj=ds)
|
|
53
|
+
|
|
54
|
+
def _get_all_taggable_objects(self) -> t.Iterable[Taggable]:
|
|
55
|
+
obj = self
|
|
56
|
+
while obj is not None:
|
|
57
|
+
yield obj
|
|
58
|
+
|
|
59
|
+
if (role := getattr(obj, "_role", Sentinel)) is not Sentinel:
|
|
60
|
+
yield role # type: ignore[misc]
|
|
61
|
+
|
|
62
|
+
obj = obj._parent
|
|
63
|
+
|
|
64
|
+
yield self.get_play()
|
|
49
65
|
|
|
50
66
|
def evaluate_tags(self, only_tags, skip_tags, all_vars):
|
|
51
|
-
|
|
67
|
+
"""Check if the current item should be executed depending on the specified tags.
|
|
52
68
|
|
|
69
|
+
NOTE this method is assumed to be called only on Task objects.
|
|
70
|
+
"""
|
|
53
71
|
if self.tags:
|
|
54
|
-
templar =
|
|
55
|
-
obj
|
|
56
|
-
while obj is not None:
|
|
72
|
+
templar = TemplateEngine(loader=self._loader, variables=all_vars)
|
|
73
|
+
for obj in self._get_all_taggable_objects():
|
|
57
74
|
if (_tags := getattr(obj, "_tags", Sentinel)) is not Sentinel:
|
|
58
75
|
obj._tags = _flatten_tags(templar.template(_tags))
|
|
59
|
-
obj = obj._parent
|
|
60
76
|
tags = set(self.tags)
|
|
61
77
|
else:
|
|
62
78
|
# this makes isdisjoint work for untagged
|