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
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
|
|
18
18
|
from __future__ import annotations
|
|
19
19
|
|
|
20
|
+
import dataclasses
|
|
20
21
|
import os
|
|
21
22
|
import sys
|
|
22
23
|
import tempfile
|
|
@@ -27,34 +28,43 @@ import multiprocessing.queues
|
|
|
27
28
|
|
|
28
29
|
from ansible import constants as C
|
|
29
30
|
from ansible import context
|
|
30
|
-
from ansible.errors import AnsibleError
|
|
31
|
+
from ansible.errors import AnsibleError, ExitCode, AnsibleCallbackError
|
|
32
|
+
from ansible._internal._errors._handler import ErrorHandler
|
|
31
33
|
from ansible.executor.play_iterator import PlayIterator
|
|
32
34
|
from ansible.executor.stats import AggregateStats
|
|
33
|
-
from ansible.executor.task_result import
|
|
34
|
-
from ansible.
|
|
35
|
-
from ansible.module_utils.common.text.converters import
|
|
35
|
+
from ansible.executor.task_result import _RawTaskResult, _WireTaskResult
|
|
36
|
+
from ansible.inventory.data import InventoryData
|
|
37
|
+
from ansible.module_utils.common.text.converters import to_native
|
|
38
|
+
from ansible.parsing.dataloader import DataLoader
|
|
36
39
|
from ansible.playbook.play_context import PlayContext
|
|
37
40
|
from ansible.playbook.task import Task
|
|
38
41
|
from ansible.plugins.loader import callback_loader, strategy_loader, module_loader
|
|
39
42
|
from ansible.plugins.callback import CallbackBase
|
|
40
|
-
from ansible.
|
|
43
|
+
from ansible._internal._templating._engine import TemplateEngine
|
|
41
44
|
from ansible.vars.hostvars import HostVars
|
|
45
|
+
from ansible.vars.manager import VariableManager
|
|
42
46
|
from ansible.utils.display import Display
|
|
43
47
|
from ansible.utils.lock import lock_decorator
|
|
44
48
|
from ansible.utils.multiprocessing import context as multiprocessing_context
|
|
45
49
|
|
|
46
|
-
|
|
50
|
+
if t.TYPE_CHECKING:
|
|
51
|
+
from ansible.executor.process.worker import WorkerProcess
|
|
47
52
|
|
|
48
53
|
__all__ = ['TaskQueueManager']
|
|
49
54
|
|
|
55
|
+
STDIN_FILENO = 0
|
|
56
|
+
STDOUT_FILENO = 1
|
|
57
|
+
STDERR_FILENO = 2
|
|
58
|
+
|
|
50
59
|
display = Display()
|
|
51
60
|
|
|
61
|
+
_T = t.TypeVar('_T')
|
|
62
|
+
|
|
52
63
|
|
|
64
|
+
@dataclasses.dataclass(frozen=True, kw_only=True, slots=True)
|
|
53
65
|
class CallbackSend:
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
self.args = args
|
|
57
|
-
self.kwargs = kwargs
|
|
66
|
+
method_name: str
|
|
67
|
+
wire_task_result: _WireTaskResult
|
|
58
68
|
|
|
59
69
|
|
|
60
70
|
class DisplaySend:
|
|
@@ -64,7 +74,7 @@ class DisplaySend:
|
|
|
64
74
|
self.kwargs = kwargs
|
|
65
75
|
|
|
66
76
|
|
|
67
|
-
@dataclass
|
|
77
|
+
@dataclasses.dataclass
|
|
68
78
|
class PromptSend:
|
|
69
79
|
worker_id: int
|
|
70
80
|
prompt: str
|
|
@@ -79,19 +89,11 @@ class FinalQueue(multiprocessing.queues.SimpleQueue):
|
|
|
79
89
|
kwargs['ctx'] = multiprocessing_context
|
|
80
90
|
super().__init__(*args, **kwargs)
|
|
81
91
|
|
|
82
|
-
def send_callback(self, method_name
|
|
83
|
-
self.put(
|
|
84
|
-
CallbackSend(method_name, *args, **kwargs),
|
|
85
|
-
)
|
|
92
|
+
def send_callback(self, method_name: str, task_result: _RawTaskResult) -> None:
|
|
93
|
+
self.put(CallbackSend(method_name=method_name, wire_task_result=task_result.as_wire_task_result()))
|
|
86
94
|
|
|
87
|
-
def send_task_result(self,
|
|
88
|
-
|
|
89
|
-
tr = args[0]
|
|
90
|
-
else:
|
|
91
|
-
tr = TaskResult(*args, **kwargs)
|
|
92
|
-
self.put(
|
|
93
|
-
tr,
|
|
94
|
-
)
|
|
95
|
+
def send_task_result(self, task_result: _RawTaskResult) -> None:
|
|
96
|
+
self.put(task_result.as_wire_task_result())
|
|
95
97
|
|
|
96
98
|
def send_display(self, method, *args, **kwargs):
|
|
97
99
|
self.put(
|
|
@@ -111,7 +113,7 @@ class AnsibleEndPlay(Exception):
|
|
|
111
113
|
|
|
112
114
|
class TaskQueueManager:
|
|
113
115
|
|
|
114
|
-
|
|
116
|
+
"""
|
|
115
117
|
This class handles the multiprocessing requirements of Ansible by
|
|
116
118
|
creating a pool of worker forks, a result handler fork, and a
|
|
117
119
|
manager object with shared datastructures/queues for coordinating
|
|
@@ -119,29 +121,39 @@ class TaskQueueManager:
|
|
|
119
121
|
|
|
120
122
|
The queue manager is responsible for loading the play strategy plugin,
|
|
121
123
|
which dispatches the Play's tasks to hosts.
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
RUN_OK =
|
|
125
|
-
RUN_ERROR =
|
|
126
|
-
RUN_FAILED_HOSTS =
|
|
127
|
-
RUN_UNREACHABLE_HOSTS =
|
|
128
|
-
RUN_FAILED_BREAK_PLAY = 8
|
|
129
|
-
RUN_UNKNOWN_ERROR = 255
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
124
|
+
"""
|
|
125
|
+
|
|
126
|
+
RUN_OK = ExitCode.SUCCESS
|
|
127
|
+
RUN_ERROR = ExitCode.GENERIC_ERROR
|
|
128
|
+
RUN_FAILED_HOSTS = ExitCode.HOST_FAILED
|
|
129
|
+
RUN_UNREACHABLE_HOSTS = ExitCode.HOST_UNREACHABLE
|
|
130
|
+
RUN_FAILED_BREAK_PLAY = 8 # never leaves PlaybookExecutor.run
|
|
131
|
+
RUN_UNKNOWN_ERROR = 255 # never leaves PlaybookExecutor.run, intentionally includes the bit value for 8
|
|
132
|
+
|
|
133
|
+
_callback_dispatch_error_handler = ErrorHandler.from_config('_CALLBACK_DISPATCH_ERROR_BEHAVIOR')
|
|
134
|
+
|
|
135
|
+
def __init__(
|
|
136
|
+
self,
|
|
137
|
+
inventory: InventoryData,
|
|
138
|
+
variable_manager: VariableManager,
|
|
139
|
+
loader: DataLoader,
|
|
140
|
+
passwords: dict[str, str | None],
|
|
141
|
+
stdout_callback_name: str | None = None,
|
|
142
|
+
run_additional_callbacks: bool = True,
|
|
143
|
+
run_tree: bool = False,
|
|
144
|
+
forks: int | None = None,
|
|
145
|
+
) -> None:
|
|
133
146
|
self._inventory = inventory
|
|
134
147
|
self._variable_manager = variable_manager
|
|
135
148
|
self._loader = loader
|
|
136
149
|
self._stats = AggregateStats()
|
|
137
150
|
self.passwords = passwords
|
|
138
|
-
self.
|
|
151
|
+
self._stdout_callback_name: str | None = stdout_callback_name or C.DEFAULT_STDOUT_CALLBACK
|
|
139
152
|
self._run_additional_callbacks = run_additional_callbacks
|
|
140
153
|
self._run_tree = run_tree
|
|
141
154
|
self._forks = forks or 5
|
|
142
155
|
|
|
143
|
-
self.
|
|
144
|
-
self._callback_plugins = []
|
|
156
|
+
self._callback_plugins: list[CallbackBase] = []
|
|
145
157
|
self._start_at_done = False
|
|
146
158
|
|
|
147
159
|
# make sure any module paths (if specified) are added to the module_loader
|
|
@@ -154,71 +166,71 @@ class TaskQueueManager:
|
|
|
154
166
|
self._terminated = False
|
|
155
167
|
|
|
156
168
|
# dictionaries to keep track of failed/unreachable hosts
|
|
157
|
-
self._failed_hosts = dict()
|
|
158
|
-
self._unreachable_hosts = dict()
|
|
169
|
+
self._failed_hosts: dict[str, t.Literal[True]] = dict()
|
|
170
|
+
self._unreachable_hosts: dict[str, t.Literal[True]] = dict()
|
|
159
171
|
|
|
160
172
|
try:
|
|
161
173
|
self._final_q = FinalQueue()
|
|
162
174
|
except OSError as e:
|
|
163
175
|
raise AnsibleError("Unable to use multiprocessing, this is normally caused by lack of access to /dev/shm: %s" % to_native(e))
|
|
164
176
|
|
|
177
|
+
try:
|
|
178
|
+
# Done in tqm, and not display, because this is only needed for commands that execute tasks
|
|
179
|
+
for fd in (STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO):
|
|
180
|
+
os.set_inheritable(fd, False)
|
|
181
|
+
except Exception as ex:
|
|
182
|
+
self.warning(f"failed to set stdio as non inheritable: {ex}")
|
|
183
|
+
|
|
165
184
|
self._callback_lock = threading.Lock()
|
|
166
185
|
|
|
167
186
|
# A temporary file (opened pre-fork) used by connection
|
|
168
187
|
# plugins for inter-process locking.
|
|
169
188
|
self._connection_lockfile = tempfile.TemporaryFile()
|
|
170
189
|
|
|
171
|
-
def _initialize_processes(self, num):
|
|
172
|
-
self._workers = []
|
|
173
|
-
|
|
174
|
-
for i in range(num):
|
|
175
|
-
self._workers.append(None)
|
|
190
|
+
def _initialize_processes(self, num: int) -> None:
|
|
191
|
+
self._workers: list[WorkerProcess | None] = [None] * num
|
|
176
192
|
|
|
177
193
|
def load_callbacks(self):
|
|
178
|
-
|
|
194
|
+
"""
|
|
179
195
|
Loads all available callbacks, with the exception of those which
|
|
180
196
|
utilize the CALLBACK_TYPE option. When CALLBACK_TYPE is set to 'stdout',
|
|
181
197
|
only one such callback plugin will be loaded.
|
|
182
|
-
|
|
198
|
+
"""
|
|
183
199
|
|
|
184
|
-
if self.
|
|
200
|
+
if self._callback_plugins:
|
|
185
201
|
return
|
|
186
202
|
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
self._stdout_callback = C.DEFAULT_STDOUT_CALLBACK
|
|
203
|
+
if not self._stdout_callback_name:
|
|
204
|
+
raise AnsibleError("No stdout callback name provided.")
|
|
190
205
|
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
else:
|
|
201
|
-
raise AnsibleError("callback must be an instance of CallbackBase or the name of a callback plugin")
|
|
206
|
+
stdout_callback = callback_loader.get(self._stdout_callback_name)
|
|
207
|
+
|
|
208
|
+
if not stdout_callback:
|
|
209
|
+
raise AnsibleError(f"Could not load {self._stdout_callback_name!r} callback plugin.")
|
|
210
|
+
|
|
211
|
+
stdout_callback._init_callback_methods()
|
|
212
|
+
stdout_callback.set_options()
|
|
213
|
+
|
|
214
|
+
self._callback_plugins.append(stdout_callback)
|
|
202
215
|
|
|
203
216
|
# get all configured loadable callbacks (adjacent, builtin)
|
|
204
|
-
|
|
217
|
+
plugin_types = {plugin_type.ansible_name: plugin_type for plugin_type in callback_loader.all(class_only=True)}
|
|
205
218
|
|
|
206
219
|
# add enabled callbacks that refer to collections, which might not appear in normal listing
|
|
207
220
|
for c in C.CALLBACKS_ENABLED:
|
|
208
221
|
# load all, as collection ones might be using short/redirected names and not a fqcn
|
|
209
222
|
plugin = callback_loader.get(c, class_only=True)
|
|
210
223
|
|
|
211
|
-
# TODO: check if this skip is redundant, loader should handle bad file/plugin cases already
|
|
212
224
|
if plugin:
|
|
213
225
|
# avoids incorrect and dupes possible due to collections
|
|
214
|
-
|
|
215
|
-
callback_list.append(plugin)
|
|
226
|
+
plugin_types.setdefault(plugin.ansible_name, plugin)
|
|
216
227
|
else:
|
|
217
228
|
display.warning("Skipping callback plugin '%s', unable to load" % c)
|
|
218
229
|
|
|
219
|
-
|
|
220
|
-
for callback_plugin in callback_list:
|
|
230
|
+
plugin_types.pop(stdout_callback.ansible_name, None)
|
|
221
231
|
|
|
232
|
+
# for each callback in the list see if we should add it to 'active callbacks' used in the play
|
|
233
|
+
for callback_plugin in plugin_types.values():
|
|
222
234
|
callback_type = getattr(callback_plugin, 'CALLBACK_TYPE', '')
|
|
223
235
|
callback_needs_enabled = getattr(callback_plugin, 'CALLBACK_NEEDS_ENABLED', getattr(callback_plugin, 'CALLBACK_NEEDS_WHITELIST', False))
|
|
224
236
|
|
|
@@ -234,10 +246,8 @@ class TaskQueueManager:
|
|
|
234
246
|
display.vvvvv("Attempting to use '%s' callback." % (callback_name))
|
|
235
247
|
if callback_type == 'stdout':
|
|
236
248
|
# we only allow one callback of type 'stdout' to be loaded,
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
continue
|
|
240
|
-
stdout_callback_loaded = True
|
|
249
|
+
display.vv("Skipping callback '%s', as we already have a stdout callback." % (callback_name))
|
|
250
|
+
continue
|
|
241
251
|
elif callback_name == 'tree' and self._run_tree:
|
|
242
252
|
# TODO: remove special case for tree, which is an adhoc cli option --tree
|
|
243
253
|
pass
|
|
@@ -252,35 +262,29 @@ class TaskQueueManager:
|
|
|
252
262
|
# avoid bad plugin not returning an object, only needed cause we do class_only load and bypass loader checks,
|
|
253
263
|
# really a bug in the plugin itself which we ignore as callback errors are not supposed to be fatal.
|
|
254
264
|
if callback_obj:
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
self._callback_plugins.append(callback_obj)
|
|
259
|
-
else:
|
|
260
|
-
display.vv("Skipping callback '%s', already loaded as '%s'." % (callback_plugin, callback_name))
|
|
265
|
+
callback_obj._init_callback_methods()
|
|
266
|
+
callback_obj.set_options()
|
|
267
|
+
self._callback_plugins.append(callback_obj)
|
|
261
268
|
else:
|
|
262
269
|
display.warning("Skipping callback '%s', as it does not create a valid plugin instance." % callback_name)
|
|
263
270
|
continue
|
|
264
|
-
except Exception as
|
|
265
|
-
display.
|
|
271
|
+
except Exception as ex:
|
|
272
|
+
display.warning_as_error(f"Failed to load callback plugin {callback_name!r}.", exception=ex)
|
|
266
273
|
continue
|
|
267
274
|
|
|
268
|
-
self._callbacks_loaded = True
|
|
269
|
-
|
|
270
275
|
def run(self, play):
|
|
271
|
-
|
|
276
|
+
"""
|
|
272
277
|
Iterates over the roles/tasks in a play, using the given (or default)
|
|
273
278
|
strategy for queueing tasks. The default is the linear strategy, which
|
|
274
279
|
operates like classic Ansible by keeping all hosts in lock-step with
|
|
275
280
|
a given task (meaning no hosts move on to the next task until all hosts
|
|
276
281
|
are done with the current task).
|
|
277
|
-
|
|
282
|
+
"""
|
|
278
283
|
|
|
279
|
-
|
|
280
|
-
self.load_callbacks()
|
|
284
|
+
self.load_callbacks()
|
|
281
285
|
|
|
282
286
|
all_vars = self._variable_manager.get_vars(play=play)
|
|
283
|
-
templar =
|
|
287
|
+
templar = TemplateEngine(loader=self._loader, variables=all_vars)
|
|
284
288
|
|
|
285
289
|
new_play = play.copy()
|
|
286
290
|
new_play.post_validate(templar)
|
|
@@ -293,13 +297,9 @@ class TaskQueueManager:
|
|
|
293
297
|
)
|
|
294
298
|
|
|
295
299
|
play_context = PlayContext(new_play, self.passwords, self._connection_lockfile.fileno())
|
|
296
|
-
if (self._stdout_callback and
|
|
297
|
-
hasattr(self._stdout_callback, 'set_play_context')):
|
|
298
|
-
self._stdout_callback.set_play_context(play_context)
|
|
299
300
|
|
|
300
301
|
for callback_plugin in self._callback_plugins:
|
|
301
|
-
|
|
302
|
-
callback_plugin.set_play_context(play_context)
|
|
302
|
+
callback_plugin.set_play_context(play_context)
|
|
303
303
|
|
|
304
304
|
self.send_callback('v2_playbook_on_play_start', new_play)
|
|
305
305
|
|
|
@@ -383,25 +383,25 @@ class TaskQueueManager:
|
|
|
383
383
|
except AttributeError:
|
|
384
384
|
pass
|
|
385
385
|
|
|
386
|
-
def clear_failed_hosts(self):
|
|
386
|
+
def clear_failed_hosts(self) -> None:
|
|
387
387
|
self._failed_hosts = dict()
|
|
388
388
|
|
|
389
|
-
def get_inventory(self):
|
|
389
|
+
def get_inventory(self) -> InventoryData:
|
|
390
390
|
return self._inventory
|
|
391
391
|
|
|
392
|
-
def get_variable_manager(self):
|
|
392
|
+
def get_variable_manager(self) -> VariableManager:
|
|
393
393
|
return self._variable_manager
|
|
394
394
|
|
|
395
|
-
def get_loader(self):
|
|
395
|
+
def get_loader(self) -> DataLoader:
|
|
396
396
|
return self._loader
|
|
397
397
|
|
|
398
398
|
def get_workers(self):
|
|
399
399
|
return self._workers[:]
|
|
400
400
|
|
|
401
|
-
def terminate(self):
|
|
401
|
+
def terminate(self) -> None:
|
|
402
402
|
self._terminated = True
|
|
403
403
|
|
|
404
|
-
def has_dead_workers(self):
|
|
404
|
+
def has_dead_workers(self) -> bool:
|
|
405
405
|
|
|
406
406
|
# [<WorkerProcess(WorkerProcess-2, stopped[SIGKILL])>,
|
|
407
407
|
# <WorkerProcess(WorkerProcess-2, stopped[SIGTERM])>
|
|
@@ -412,56 +412,54 @@ class TaskQueueManager:
|
|
|
412
412
|
defunct = True
|
|
413
413
|
return defunct
|
|
414
414
|
|
|
415
|
+
@staticmethod
|
|
416
|
+
def _first_arg_of_type(value_type: t.Type[_T], args: t.Sequence) -> _T | None:
|
|
417
|
+
return next((arg for arg in args if isinstance(arg, value_type)), None)
|
|
418
|
+
|
|
415
419
|
@lock_decorator(attr='_callback_lock')
|
|
416
420
|
def send_callback(self, method_name, *args, **kwargs):
|
|
417
|
-
|
|
421
|
+
# We always send events to stdout callback first, rest should follow config order
|
|
422
|
+
for callback_plugin in self._callback_plugins:
|
|
418
423
|
# a plugin that set self.disabled to True will not be called
|
|
419
424
|
# see osx_say.py example for such a plugin
|
|
420
|
-
if
|
|
425
|
+
if callback_plugin.disabled:
|
|
421
426
|
continue
|
|
422
427
|
|
|
423
428
|
# a plugin can opt in to implicit tasks (such as meta). It does this
|
|
424
429
|
# by declaring self.wants_implicit_tasks = True.
|
|
425
|
-
wants_implicit_tasks
|
|
430
|
+
if not callback_plugin.wants_implicit_tasks and (task_arg := self._first_arg_of_type(Task, args)) and task_arg.implicit:
|
|
431
|
+
continue
|
|
426
432
|
|
|
427
|
-
# try to find v2 method, fallback to v1 method, ignore callback if no method found
|
|
428
433
|
methods = []
|
|
429
|
-
for possible in [method_name, 'v2_on_any']:
|
|
430
|
-
gotit = getattr(callback_plugin, possible, None)
|
|
431
|
-
if gotit is None:
|
|
432
|
-
gotit = getattr(callback_plugin, possible.removeprefix('v2_'), None)
|
|
433
|
-
if gotit is not None:
|
|
434
|
-
methods.append(gotit)
|
|
435
|
-
|
|
436
|
-
# send clean copies
|
|
437
|
-
new_args = []
|
|
438
|
-
|
|
439
|
-
# If we end up being given an implicit task, we'll set this flag in
|
|
440
|
-
# the loop below. If the plugin doesn't care about those, then we
|
|
441
|
-
# check and continue to the next iteration of the outer loop.
|
|
442
|
-
is_implicit_task = False
|
|
443
|
-
|
|
444
|
-
for arg in args:
|
|
445
|
-
# FIXME: add play/task cleaners
|
|
446
|
-
if isinstance(arg, TaskResult):
|
|
447
|
-
new_args.append(arg.clean_copy())
|
|
448
|
-
# elif isinstance(arg, Play):
|
|
449
|
-
# elif isinstance(arg, Task):
|
|
450
|
-
else:
|
|
451
|
-
new_args.append(arg)
|
|
452
434
|
|
|
453
|
-
|
|
454
|
-
|
|
435
|
+
if method_name in callback_plugin._implemented_callback_methods:
|
|
436
|
+
methods.append(getattr(callback_plugin, method_name))
|
|
455
437
|
|
|
456
|
-
if
|
|
457
|
-
|
|
438
|
+
if 'v2_on_any' in callback_plugin._implemented_callback_methods:
|
|
439
|
+
methods.append(getattr(callback_plugin, 'v2_on_any'))
|
|
458
440
|
|
|
459
441
|
for method in methods:
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
442
|
+
# send clean copies
|
|
443
|
+
new_args = []
|
|
444
|
+
|
|
445
|
+
for arg in args:
|
|
446
|
+
# FIXME: add play/task cleaners
|
|
447
|
+
if isinstance(arg, _RawTaskResult):
|
|
448
|
+
copied_tr = arg.as_callback_task_result()
|
|
449
|
+
new_args.append(copied_tr)
|
|
450
|
+
# this state hack requires that no callback ever accepts > 1 TaskResult object
|
|
451
|
+
callback_plugin._current_task_result = copied_tr
|
|
452
|
+
else:
|
|
453
|
+
new_args.append(arg)
|
|
454
|
+
|
|
455
|
+
with self._callback_dispatch_error_handler.handle(AnsibleCallbackError):
|
|
456
|
+
try:
|
|
457
|
+
method(*new_args, **kwargs)
|
|
458
|
+
except AssertionError:
|
|
459
|
+
# Using an `assert` in integration tests is useful.
|
|
460
|
+
# Production code should never use `assert` or raise `AssertionError`.
|
|
461
|
+
raise
|
|
462
|
+
except Exception as ex:
|
|
463
|
+
raise AnsibleCallbackError(f"Callback dispatch {method_name!r} failed for plugin {callback_plugin._load_name!r}.") from ex
|
|
464
|
+
|
|
465
|
+
callback_plugin._current_task_result = None # clear temporary instance storage hack
|