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
|
@@ -16,8 +16,8 @@
|
|
|
16
16
|
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
from __future__ import annotations
|
|
18
18
|
|
|
19
|
-
from ansible.errors import
|
|
20
|
-
from ansible.executor.module_common import
|
|
19
|
+
from ansible.errors import AnsibleActionFail
|
|
20
|
+
from ansible.executor.module_common import _apply_action_arg_defaults
|
|
21
21
|
from ansible.module_utils.facts.system.pkg_mgr import PKG_MGRS
|
|
22
22
|
from ansible.plugins.action import ActionBase
|
|
23
23
|
from ansible.utils.display import Display
|
|
@@ -33,12 +33,12 @@ class ActionModule(ActionBase):
|
|
|
33
33
|
BUILTIN_PKG_MGR_MODULES = {manager['name'] for manager in PKG_MGRS}
|
|
34
34
|
|
|
35
35
|
def run(self, tmp=None, task_vars=None):
|
|
36
|
-
|
|
36
|
+
""" handler for package operations """
|
|
37
37
|
|
|
38
38
|
self._supports_check_mode = True
|
|
39
39
|
self._supports_async = True
|
|
40
40
|
|
|
41
|
-
|
|
41
|
+
super(ActionModule, self).run(tmp, task_vars)
|
|
42
42
|
|
|
43
43
|
module = self._task.args.get('use', 'auto')
|
|
44
44
|
|
|
@@ -92,21 +92,15 @@ class ActionModule(ActionBase):
|
|
|
92
92
|
|
|
93
93
|
# get defaults for specific module
|
|
94
94
|
context = self._shared_loader_obj.module_loader.find_plugin_with_context(module, collection_list=self._task.collections)
|
|
95
|
-
new_module_args =
|
|
96
|
-
context.resolved_fqcn, new_module_args, self._task.module_defaults, self._templar,
|
|
97
|
-
action_groups=self._task._parent._play._action_groups
|
|
98
|
-
)
|
|
95
|
+
new_module_args = _apply_action_arg_defaults(context.resolved_fqcn, self._task, new_module_args, self._templar)
|
|
99
96
|
|
|
100
97
|
if module in self.BUILTIN_PKG_MGR_MODULES:
|
|
101
98
|
# prefix with ansible.legacy to eliminate external collisions while still allowing library/ override
|
|
102
99
|
module = 'ansible.legacy.' + module
|
|
103
100
|
|
|
104
101
|
display.vvvv("Running %s" % module)
|
|
105
|
-
|
|
102
|
+
return self._execute_module(module_name=module, module_args=new_module_args, task_vars=task_vars, wrap_async=self._task.async_val)
|
|
106
103
|
else:
|
|
107
104
|
raise AnsibleActionFail('Could not detect which package manager to use. Try gathering facts or setting the "use" option.')
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
result.update(e.result)
|
|
111
|
-
|
|
112
|
-
return result
|
|
105
|
+
finally:
|
|
106
|
+
pass # avoid de-dent all on refactor
|
ansible/plugins/action/pause.py
CHANGED
|
@@ -28,12 +28,12 @@ display = Display()
|
|
|
28
28
|
|
|
29
29
|
|
|
30
30
|
class ActionModule(ActionBase):
|
|
31
|
-
|
|
31
|
+
""" pauses execution for a length or time, or until input is received """
|
|
32
32
|
|
|
33
33
|
BYPASS_HOST_LOOP = True
|
|
34
34
|
|
|
35
35
|
def run(self, tmp=None, task_vars=None):
|
|
36
|
-
|
|
36
|
+
""" run the pause action module """
|
|
37
37
|
if task_vars is None:
|
|
38
38
|
task_vars = dict()
|
|
39
39
|
|
ansible/plugins/action/script.py
CHANGED
|
@@ -17,10 +17,12 @@
|
|
|
17
17
|
from __future__ import annotations
|
|
18
18
|
|
|
19
19
|
import os
|
|
20
|
+
import pathlib
|
|
20
21
|
import re
|
|
21
22
|
import shlex
|
|
23
|
+
import typing as _t
|
|
22
24
|
|
|
23
|
-
from ansible.errors import AnsibleError,
|
|
25
|
+
from ansible.errors import AnsibleError, AnsibleActionFail, AnsibleActionSkip
|
|
24
26
|
from ansible.executor.powershell import module_manifest as ps_manifest
|
|
25
27
|
from ansible.module_utils.common.text.converters import to_bytes, to_native, to_text
|
|
26
28
|
from ansible.plugins.action import ActionBase
|
|
@@ -34,8 +36,8 @@ class ActionModule(ActionBase):
|
|
|
34
36
|
# after chopping off a potential drive letter.
|
|
35
37
|
windows_absolute_path_detection = re.compile(r'^(?:[a-zA-Z]\:)?(\\|\/)')
|
|
36
38
|
|
|
37
|
-
def run(self, tmp=None, task_vars=None):
|
|
38
|
-
|
|
39
|
+
def run(self, tmp: str | None = None, task_vars: dict[str, _t.Any] | None = None) -> dict[str, _t.Any]:
|
|
40
|
+
""" handler for file transfer operations """
|
|
39
41
|
if task_vars is None:
|
|
40
42
|
task_vars = dict()
|
|
41
43
|
|
|
@@ -48,12 +50,11 @@ class ActionModule(ActionBase):
|
|
|
48
50
|
'chdir': {'type': 'str'},
|
|
49
51
|
'executable': {'type': 'str'},
|
|
50
52
|
},
|
|
51
|
-
required_one_of=[
|
|
52
|
-
|
|
53
|
-
]
|
|
53
|
+
required_one_of=[['_raw_params', 'cmd']],
|
|
54
|
+
mutually_exclusive=[['_raw_params', 'cmd']],
|
|
54
55
|
)
|
|
55
56
|
|
|
56
|
-
|
|
57
|
+
super(ActionModule, self).run(tmp, task_vars)
|
|
57
58
|
del tmp # tmp no longer has any effect
|
|
58
59
|
|
|
59
60
|
try:
|
|
@@ -88,7 +89,7 @@ class ActionModule(ActionBase):
|
|
|
88
89
|
# Split out the script as the first item in raw_params using
|
|
89
90
|
# shlex.split() in order to support paths and files with spaces in the name.
|
|
90
91
|
# Any arguments passed to the script will be added back later.
|
|
91
|
-
raw_params =
|
|
92
|
+
raw_params = new_module_args['_raw_params'] or new_module_args['cmd']
|
|
92
93
|
parts = [to_text(s, errors='surrogate_or_strict') for s in shlex.split(raw_params.strip())]
|
|
93
94
|
source = parts[0]
|
|
94
95
|
|
|
@@ -105,16 +106,11 @@ class ActionModule(ActionBase):
|
|
|
105
106
|
# check mode is supported if 'creates' or 'removes' are provided
|
|
106
107
|
# the task has already been skipped if a change would not occur
|
|
107
108
|
if new_module_args['creates'] or new_module_args['removes']:
|
|
108
|
-
|
|
109
|
-
raise _AnsibleActionDone(result=result)
|
|
109
|
+
return dict(changed=True)
|
|
110
110
|
# If the script doesn't return changed in the result, it defaults to True,
|
|
111
111
|
# but since the script may override 'changed', just skip instead of guessing.
|
|
112
112
|
else:
|
|
113
|
-
|
|
114
|
-
raise AnsibleActionSkip('Check mode is not supported for this task.', result=result)
|
|
115
|
-
|
|
116
|
-
# now we execute script, always assume changed.
|
|
117
|
-
result['changed'] = True
|
|
113
|
+
raise AnsibleActionSkip('Check mode is not supported for this task.', result=dict(changed=False))
|
|
118
114
|
|
|
119
115
|
# transfer the file to a remote tmp location
|
|
120
116
|
tmp_src = self._connection._shell.join_path(self._connection._shell.tmpdir,
|
|
@@ -135,7 +131,7 @@ class ActionModule(ActionBase):
|
|
|
135
131
|
self._fixup_perms2((self._connection._shell.tmpdir, tmp_src), execute=True)
|
|
136
132
|
|
|
137
133
|
# add preparation steps to one ssh roundtrip executing the script
|
|
138
|
-
env_dict =
|
|
134
|
+
env_dict: dict[str, _t.Any] = {}
|
|
139
135
|
env_string = self._compute_environment_string(env_dict)
|
|
140
136
|
|
|
141
137
|
if executable:
|
|
@@ -150,37 +146,30 @@ class ActionModule(ActionBase):
|
|
|
150
146
|
# like become and environment args
|
|
151
147
|
if getattr(self._connection._shell, "_IS_WINDOWS", False):
|
|
152
148
|
# FUTURE: use a more public method to get the exec payload
|
|
153
|
-
|
|
154
|
-
become_method = None
|
|
155
|
-
become_user = None
|
|
156
|
-
become_pass = None
|
|
157
|
-
become_flags = None
|
|
158
|
-
if self._connection.become:
|
|
159
|
-
become_plugin = self._connection.become
|
|
160
|
-
become = True
|
|
161
|
-
become_method = become_plugin.name
|
|
162
|
-
become_user = become_plugin.get_option('become_user', playcontext=self._play_context)
|
|
163
|
-
become_pass = become_plugin.get_option('become_pass', playcontext=self._play_context)
|
|
164
|
-
become_flags = become_plugin.get_option('become_flags', playcontext=self._play_context)
|
|
165
|
-
|
|
149
|
+
pc = self._task
|
|
166
150
|
exec_data = ps_manifest._create_powershell_wrapper(
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
151
|
+
name=f"ansible.builtin.script.{pathlib.Path(source).stem}",
|
|
152
|
+
module_data=to_bytes(script_cmd),
|
|
153
|
+
module_path=source,
|
|
154
|
+
module_args={},
|
|
155
|
+
environment=env_dict,
|
|
156
|
+
async_timeout=self._task.async_val,
|
|
157
|
+
become_plugin=self._connection.become,
|
|
158
|
+
substyle="script",
|
|
159
|
+
task_vars=task_vars,
|
|
160
|
+
profile='legacy', # the profile doesn't really matter since the module args dict is empty
|
|
170
161
|
)
|
|
171
162
|
# build the necessary exec wrapper command
|
|
172
163
|
# FUTURE: this still doesn't let script work on Windows with non-pipelined connections or
|
|
173
164
|
# full manual exec of KEEP_REMOTE_FILES
|
|
174
165
|
script_cmd = self._connection._shell.build_module_command(env_string='', shebang='#!powershell', cmd='')
|
|
175
166
|
|
|
176
|
-
|
|
167
|
+
# now we execute script, always assume changed.
|
|
168
|
+
result: dict[str, object] = dict(self._low_level_execute_command(cmd=script_cmd, in_data=exec_data, sudoable=True, chdir=chdir), changed=True)
|
|
177
169
|
|
|
178
170
|
if 'rc' in result and result['rc'] != 0:
|
|
179
|
-
|
|
171
|
+
result.update(msg='non-zero return code', failed=True)
|
|
180
172
|
|
|
181
|
-
|
|
182
|
-
result.update(e.result)
|
|
173
|
+
return result
|
|
183
174
|
finally:
|
|
184
175
|
self._remove_tmp_path(self._connection._shell.tmpdir)
|
|
185
|
-
|
|
186
|
-
return result
|
|
@@ -16,9 +16,8 @@
|
|
|
16
16
|
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
from __future__ import annotations
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
from ansible.
|
|
21
|
-
from ansible.executor.module_common import get_action_args_with_defaults
|
|
19
|
+
from ansible.errors import AnsibleActionFail
|
|
20
|
+
from ansible.executor.module_common import _apply_action_arg_defaults
|
|
22
21
|
from ansible.plugins.action import ActionBase
|
|
23
22
|
|
|
24
23
|
|
|
@@ -35,22 +34,21 @@ class ActionModule(ActionBase):
|
|
|
35
34
|
BUILTIN_SVC_MGR_MODULES = set(['openwrt_init', 'service', 'systemd', 'sysvinit'])
|
|
36
35
|
|
|
37
36
|
def run(self, tmp=None, task_vars=None):
|
|
38
|
-
|
|
37
|
+
""" handler for package operations """
|
|
39
38
|
|
|
40
39
|
self._supports_check_mode = True
|
|
41
40
|
self._supports_async = True
|
|
42
41
|
|
|
43
|
-
|
|
42
|
+
super(ActionModule, self).run(tmp, task_vars)
|
|
44
43
|
del tmp # tmp no longer has any effect
|
|
45
44
|
|
|
46
45
|
module = self._task.args.get('use', 'auto').lower()
|
|
47
46
|
|
|
48
47
|
if module == 'auto':
|
|
49
48
|
try:
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
module = self._templar.template('{{ansible_facts.service_mgr}}')
|
|
49
|
+
# if we delegate, we should use delegated host's facts
|
|
50
|
+
expr = "hostvars[delegate_to].ansible_facts.service_mgr" if self._task.delegate_to else "ansible_facts.service_mgr"
|
|
51
|
+
module = self._templar.resolve_variable_expression(expr, local_variables=dict(delegate_to=self._task.delegate_to))
|
|
54
52
|
except Exception:
|
|
55
53
|
pass # could not get it from template!
|
|
56
54
|
|
|
@@ -79,24 +77,17 @@ class ActionModule(ActionBase):
|
|
|
79
77
|
|
|
80
78
|
# get defaults for specific module
|
|
81
79
|
context = self._shared_loader_obj.module_loader.find_plugin_with_context(module, collection_list=self._task.collections)
|
|
82
|
-
new_module_args =
|
|
83
|
-
context.resolved_fqcn, new_module_args, self._task.module_defaults, self._templar,
|
|
84
|
-
action_groups=self._task._parent._play._action_groups
|
|
85
|
-
)
|
|
80
|
+
new_module_args = _apply_action_arg_defaults(context.resolved_fqcn, self._task, new_module_args, self._templar)
|
|
86
81
|
|
|
87
82
|
# collection prefix known internal modules to avoid collisions from collections search, while still allowing library/ overrides
|
|
88
83
|
if module in self.BUILTIN_SVC_MGR_MODULES:
|
|
89
84
|
module = 'ansible.legacy.' + module
|
|
90
85
|
|
|
91
86
|
self._display.vvvv("Running %s" % module)
|
|
92
|
-
|
|
87
|
+
return self._execute_module(module_name=module, module_args=new_module_args, task_vars=task_vars, wrap_async=self._task.async_val)
|
|
93
88
|
else:
|
|
94
89
|
raise AnsibleActionFail('Could not detect which service manager to use. Try gathering facts or setting the "use" option.')
|
|
95
90
|
|
|
96
|
-
except AnsibleAction as e:
|
|
97
|
-
result.update(e.result)
|
|
98
91
|
finally:
|
|
99
92
|
if not self._task.async_val:
|
|
100
93
|
self._remove_tmp_path(self._connection._shell.tmpdir)
|
|
101
|
-
|
|
102
|
-
return result
|
|
@@ -18,12 +18,9 @@
|
|
|
18
18
|
from __future__ import annotations
|
|
19
19
|
|
|
20
20
|
from ansible.errors import AnsibleActionFail
|
|
21
|
-
from ansible.module_utils.six import string_types
|
|
22
21
|
from ansible.module_utils.parsing.convert_bool import boolean
|
|
23
22
|
from ansible.plugins.action import ActionBase
|
|
24
|
-
from ansible.utils.vars import
|
|
25
|
-
|
|
26
|
-
import ansible.constants as C
|
|
23
|
+
from ansible.utils.vars import validate_variable_name
|
|
27
24
|
|
|
28
25
|
|
|
29
26
|
class ActionModule(ActionBase):
|
|
@@ -43,16 +40,10 @@ class ActionModule(ActionBase):
|
|
|
43
40
|
|
|
44
41
|
if self._task.args:
|
|
45
42
|
for (k, v) in self._task.args.items():
|
|
46
|
-
k = self._templar.template(k)
|
|
43
|
+
k = self._templar.template(k) # a rare case where key templating is allowed; backward-compatibility for dynamic storage
|
|
47
44
|
|
|
48
|
-
|
|
49
|
-
raise AnsibleActionFail("The variable name '%s' is not valid. Variables must start with a letter or underscore character, "
|
|
50
|
-
"and contain only letters, numbers and underscores." % k)
|
|
45
|
+
validate_variable_name(k)
|
|
51
46
|
|
|
52
|
-
# NOTE: this should really use BOOLEANS from convert_bool, but only in the k=v case,
|
|
53
|
-
# right now it converts matching explicit YAML strings also when 'jinja2_native' is disabled.
|
|
54
|
-
if not C.DEFAULT_JINJA2_NATIVE and isinstance(v, string_types) and v.lower() in ('true', 'false', 'yes', 'no'):
|
|
55
|
-
v = boolean(v, strict=False)
|
|
56
47
|
facts[k] = v
|
|
57
48
|
else:
|
|
58
49
|
raise AnsibleActionFail('No key/value pairs provided, at least one is required for this action to succeed')
|
|
@@ -19,7 +19,7 @@ from __future__ import annotations
|
|
|
19
19
|
|
|
20
20
|
from ansible.module_utils.parsing.convert_bool import boolean
|
|
21
21
|
from ansible.plugins.action import ActionBase
|
|
22
|
-
from ansible.utils.vars import
|
|
22
|
+
from ansible.utils.vars import validate_variable_name
|
|
23
23
|
|
|
24
24
|
|
|
25
25
|
class ActionModule(ActionBase):
|
|
@@ -42,7 +42,7 @@ class ActionModule(ActionBase):
|
|
|
42
42
|
data = self._task.args.get('data', {})
|
|
43
43
|
|
|
44
44
|
if not isinstance(data, dict):
|
|
45
|
-
data = self._templar.template(data
|
|
45
|
+
data = self._templar.template(data)
|
|
46
46
|
|
|
47
47
|
if not isinstance(data, dict):
|
|
48
48
|
result['failed'] = True
|
|
@@ -59,14 +59,9 @@ class ActionModule(ActionBase):
|
|
|
59
59
|
stats[opt] = val
|
|
60
60
|
|
|
61
61
|
for (k, v) in data.items():
|
|
62
|
-
|
|
63
62
|
k = self._templar.template(k)
|
|
64
63
|
|
|
65
|
-
|
|
66
|
-
result['failed'] = True
|
|
67
|
-
result['msg'] = ("The variable name '%s' is not valid. Variables must start with a letter or underscore character, and contain only "
|
|
68
|
-
"letters, numbers and underscores." % k)
|
|
69
|
-
return result
|
|
64
|
+
validate_variable_name(k)
|
|
70
65
|
|
|
71
66
|
stats['data'][k] = self._templar.template(v)
|
|
72
67
|
|
|
@@ -20,12 +20,13 @@ from jinja2.defaults import (
|
|
|
20
20
|
|
|
21
21
|
from ansible import constants as C
|
|
22
22
|
from ansible.config.manager import ensure_type
|
|
23
|
-
from ansible.errors import AnsibleError,
|
|
23
|
+
from ansible.errors import AnsibleError, AnsibleActionFail
|
|
24
24
|
from ansible.module_utils.common.text.converters import to_bytes, to_text, to_native
|
|
25
25
|
from ansible.module_utils.parsing.convert_bool import boolean
|
|
26
26
|
from ansible.module_utils.six import string_types
|
|
27
27
|
from ansible.plugins.action import ActionBase
|
|
28
|
-
from ansible.template import
|
|
28
|
+
from ansible.template import trust_as_template
|
|
29
|
+
from ansible._internal._templating import _template_vars
|
|
29
30
|
|
|
30
31
|
|
|
31
32
|
class ActionModule(ActionBase):
|
|
@@ -34,16 +35,16 @@ class ActionModule(ActionBase):
|
|
|
34
35
|
DEFAULT_NEWLINE_SEQUENCE = "\n"
|
|
35
36
|
|
|
36
37
|
def run(self, tmp=None, task_vars=None):
|
|
37
|
-
|
|
38
|
+
""" handler for template operations """
|
|
38
39
|
|
|
39
40
|
if task_vars is None:
|
|
40
41
|
task_vars = dict()
|
|
41
42
|
|
|
42
|
-
|
|
43
|
+
super(ActionModule, self).run(tmp, task_vars)
|
|
43
44
|
del tmp # tmp no longer has any effect
|
|
44
45
|
|
|
45
46
|
# Options type validation
|
|
46
|
-
#
|
|
47
|
+
# strings
|
|
47
48
|
for s_type in ('src', 'dest', 'state', 'newline_sequence', 'variable_start_string', 'variable_end_string', 'block_start_string',
|
|
48
49
|
'block_end_string', 'comment_start_string', 'comment_end_string'):
|
|
49
50
|
if s_type in self._task.args:
|
|
@@ -98,63 +99,47 @@ class ActionModule(ActionBase):
|
|
|
98
99
|
if mode == 'preserve':
|
|
99
100
|
mode = '0%03o' % stat.S_IMODE(os.stat(source).st_mode)
|
|
100
101
|
|
|
101
|
-
# Get vault decrypted tmp file
|
|
102
|
-
try:
|
|
103
|
-
tmp_source = self._loader.get_real_file(source)
|
|
104
|
-
except AnsibleFileNotFound as e:
|
|
105
|
-
raise AnsibleActionFail("could not find src=%s, %s" % (source, to_text(e)))
|
|
106
|
-
b_tmp_source = to_bytes(tmp_source, errors='surrogate_or_strict')
|
|
107
|
-
|
|
108
102
|
# template the source data locally & get ready to transfer
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
temp_vars
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
lstrip_blocks=lstrip_blocks
|
|
150
|
-
)
|
|
151
|
-
resultant = templar.do_template(template_data, preserve_trailing_newlines=True, escape_backslashes=False, overrides=overrides)
|
|
152
|
-
except AnsibleAction:
|
|
153
|
-
raise
|
|
154
|
-
except Exception as e:
|
|
155
|
-
raise AnsibleActionFail("%s: %s" % (type(e).__name__, to_text(e)))
|
|
156
|
-
finally:
|
|
157
|
-
self._loader.cleanup_tmp_file(b_tmp_source)
|
|
103
|
+
template_data = trust_as_template(self._loader.get_text_file_contents(source))
|
|
104
|
+
|
|
105
|
+
# set jinja2 internal search path for includes
|
|
106
|
+
searchpath = task_vars.get('ansible_search_path', [])
|
|
107
|
+
searchpath.extend([self._loader._basedir, os.path.dirname(source)])
|
|
108
|
+
|
|
109
|
+
# We want to search into the 'templates' subdir of each search path in
|
|
110
|
+
# addition to our original search paths.
|
|
111
|
+
newsearchpath = []
|
|
112
|
+
for p in searchpath:
|
|
113
|
+
newsearchpath.append(os.path.join(p, 'templates'))
|
|
114
|
+
newsearchpath.append(p)
|
|
115
|
+
searchpath = newsearchpath
|
|
116
|
+
|
|
117
|
+
# add ansible 'template' vars
|
|
118
|
+
temp_vars = task_vars.copy()
|
|
119
|
+
temp_vars.update(_template_vars.generate_ansible_template_vars(
|
|
120
|
+
path=self._task.args.get('src', None),
|
|
121
|
+
fullpath=source,
|
|
122
|
+
dest_path=dest,
|
|
123
|
+
include_ansible_managed='ansible_managed' not in temp_vars, # do not clobber ansible_managed when set by the user
|
|
124
|
+
))
|
|
125
|
+
|
|
126
|
+
overrides = dict(
|
|
127
|
+
block_start_string=block_start_string,
|
|
128
|
+
block_end_string=block_end_string,
|
|
129
|
+
variable_start_string=variable_start_string,
|
|
130
|
+
variable_end_string=variable_end_string,
|
|
131
|
+
comment_start_string=comment_start_string,
|
|
132
|
+
comment_end_string=comment_end_string,
|
|
133
|
+
trim_blocks=trim_blocks,
|
|
134
|
+
lstrip_blocks=lstrip_blocks,
|
|
135
|
+
newline_sequence=newline_sequence,
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
data_templar = self._templar.copy_with_new_env(searchpath=searchpath, available_variables=temp_vars)
|
|
139
|
+
resultant = data_templar.template(template_data, escape_backslashes=False, overrides=overrides)
|
|
140
|
+
|
|
141
|
+
if resultant is None:
|
|
142
|
+
resultant = ''
|
|
158
143
|
|
|
159
144
|
new_task = self._task.copy()
|
|
160
145
|
# mode is either the mode from task.args or the mode of the source file if the task.args
|
|
@@ -188,13 +173,8 @@ class ActionModule(ActionBase):
|
|
|
188
173
|
loader=self._loader,
|
|
189
174
|
templar=self._templar,
|
|
190
175
|
shared_loader_obj=self._shared_loader_obj)
|
|
191
|
-
|
|
176
|
+
return copy_action.run(task_vars=task_vars)
|
|
192
177
|
finally:
|
|
193
178
|
shutil.rmtree(to_bytes(local_tempdir, errors='surrogate_or_strict'))
|
|
194
|
-
|
|
195
|
-
except AnsibleAction as e:
|
|
196
|
-
result.update(e.result)
|
|
197
179
|
finally:
|
|
198
180
|
self._remove_tmp_path(self._connection._shell.tmpdir)
|
|
199
|
-
|
|
200
|
-
return result
|
|
@@ -19,8 +19,7 @@ from __future__ import annotations
|
|
|
19
19
|
|
|
20
20
|
import os
|
|
21
21
|
|
|
22
|
-
from ansible.errors import
|
|
23
|
-
from ansible.module_utils.common.text.converters import to_text
|
|
22
|
+
from ansible.errors import AnsibleActionFail, AnsibleActionSkip
|
|
24
23
|
from ansible.module_utils.parsing.convert_bool import boolean
|
|
25
24
|
from ansible.plugins.action import ActionBase
|
|
26
25
|
|
|
@@ -30,11 +29,11 @@ class ActionModule(ActionBase):
|
|
|
30
29
|
TRANSFERS_FILES = True
|
|
31
30
|
|
|
32
31
|
def run(self, tmp=None, task_vars=None):
|
|
33
|
-
|
|
32
|
+
""" handler for unarchive operations """
|
|
34
33
|
if task_vars is None:
|
|
35
34
|
task_vars = dict()
|
|
36
35
|
|
|
37
|
-
|
|
36
|
+
super(ActionModule, self).run(tmp, task_vars)
|
|
38
37
|
del tmp # tmp no longer has any effect
|
|
39
38
|
|
|
40
39
|
source = self._task.args.get('src', None)
|
|
@@ -68,15 +67,9 @@ class ActionModule(ActionBase):
|
|
|
68
67
|
source = os.path.expanduser(source)
|
|
69
68
|
|
|
70
69
|
if not remote_src:
|
|
71
|
-
|
|
72
|
-
source = self._loader.get_real_file(self._find_needle('files', source), decrypt=decrypt)
|
|
73
|
-
except AnsibleError as e:
|
|
74
|
-
raise AnsibleActionFail(to_text(e))
|
|
70
|
+
source = self._loader.get_real_file(self._find_needle('files', source), decrypt=decrypt)
|
|
75
71
|
|
|
76
|
-
|
|
77
|
-
remote_stat = self._execute_remote_stat(dest, all_vars=task_vars, follow=True)
|
|
78
|
-
except AnsibleError as e:
|
|
79
|
-
raise AnsibleActionFail(to_text(e))
|
|
72
|
+
remote_stat = self._execute_remote_stat(dest, all_vars=task_vars, follow=True)
|
|
80
73
|
|
|
81
74
|
if not remote_stat['exists'] or not remote_stat['isdir']:
|
|
82
75
|
raise AnsibleActionFail("dest '%s' must be an existing dir" % dest)
|
|
@@ -102,9 +95,6 @@ class ActionModule(ActionBase):
|
|
|
102
95
|
|
|
103
96
|
# execute the unarchive module now, with the updated args (using ansible.legacy prefix to eliminate collections
|
|
104
97
|
# collisions with local override
|
|
105
|
-
|
|
106
|
-
except AnsibleAction as e:
|
|
107
|
-
result.update(e.result)
|
|
98
|
+
return self._execute_module(module_name='ansible.legacy.unarchive', module_args=new_module_args, task_vars=task_vars)
|
|
108
99
|
finally:
|
|
109
100
|
self._remove_tmp_path(self._connection._shell.tmpdir)
|
|
110
|
-
return result
|
ansible/plugins/action/uri.py
CHANGED
|
@@ -5,11 +5,10 @@
|
|
|
5
5
|
|
|
6
6
|
from __future__ import annotations
|
|
7
7
|
|
|
8
|
+
import collections.abc as _c
|
|
8
9
|
import os
|
|
9
10
|
|
|
10
|
-
from ansible.errors import
|
|
11
|
-
from ansible.module_utils.common.text.converters import to_native
|
|
12
|
-
from ansible.module_utils.common.collections import Mapping, MutableMapping
|
|
11
|
+
from ansible.errors import AnsibleActionFail
|
|
13
12
|
from ansible.module_utils.parsing.convert_bool import boolean
|
|
14
13
|
from ansible.plugins.action import ActionBase
|
|
15
14
|
|
|
@@ -25,7 +24,7 @@ class ActionModule(ActionBase):
|
|
|
25
24
|
if task_vars is None:
|
|
26
25
|
task_vars = dict()
|
|
27
26
|
|
|
28
|
-
|
|
27
|
+
super(ActionModule, self).run(tmp, task_vars)
|
|
29
28
|
del tmp # tmp no longer has any effect
|
|
30
29
|
|
|
31
30
|
body_format = self._task.args.get('body_format', 'raw')
|
|
@@ -38,38 +37,31 @@ class ActionModule(ActionBase):
|
|
|
38
37
|
# everything is remote, so we just execute the module
|
|
39
38
|
# without changing any of the module arguments
|
|
40
39
|
# call with ansible.legacy prefix to prevent collections collisions while allowing local override
|
|
41
|
-
|
|
42
|
-
task_vars=task_vars, wrap_async=self._task.async_val))
|
|
40
|
+
return self._execute_module(module_name='ansible.legacy.uri', task_vars=task_vars, wrap_async=self._task.async_val)
|
|
43
41
|
|
|
44
42
|
kwargs = {}
|
|
45
43
|
|
|
46
44
|
if src:
|
|
47
|
-
|
|
48
|
-
src = self._find_needle('files', src)
|
|
49
|
-
except AnsibleError as e:
|
|
50
|
-
raise AnsibleActionFail(to_native(e))
|
|
45
|
+
src = self._find_needle('files', src)
|
|
51
46
|
|
|
52
47
|
tmp_src = self._connection._shell.join_path(self._connection._shell.tmpdir, os.path.basename(src))
|
|
53
48
|
kwargs['src'] = tmp_src
|
|
54
49
|
self._transfer_file(src, tmp_src)
|
|
55
50
|
self._fixup_perms2((self._connection._shell.tmpdir, tmp_src))
|
|
56
51
|
elif body_format == 'form-multipart':
|
|
57
|
-
if not isinstance(body, Mapping):
|
|
52
|
+
if not isinstance(body, _c.Mapping):
|
|
58
53
|
raise AnsibleActionFail(
|
|
59
54
|
'body must be mapping, cannot be type %s' % body.__class__.__name__
|
|
60
55
|
)
|
|
61
56
|
for field, value in body.items():
|
|
62
|
-
if not isinstance(value, MutableMapping):
|
|
57
|
+
if not isinstance(value, _c.MutableMapping):
|
|
63
58
|
continue
|
|
64
59
|
content = value.get('content')
|
|
65
60
|
filename = value.get('filename')
|
|
66
61
|
if not filename or content:
|
|
67
62
|
continue
|
|
68
63
|
|
|
69
|
-
|
|
70
|
-
filename = self._find_needle('files', filename)
|
|
71
|
-
except AnsibleError as e:
|
|
72
|
-
raise AnsibleActionFail(to_native(e))
|
|
64
|
+
filename = self._find_needle('files', filename)
|
|
73
65
|
|
|
74
66
|
tmp_src = self._connection._shell.join_path(
|
|
75
67
|
self._connection._shell.tmpdir,
|
|
@@ -83,10 +75,7 @@ class ActionModule(ActionBase):
|
|
|
83
75
|
new_module_args = self._task.args | kwargs
|
|
84
76
|
|
|
85
77
|
# call with ansible.legacy prefix to prevent collections collisions while allowing local override
|
|
86
|
-
|
|
87
|
-
except AnsibleAction as e:
|
|
88
|
-
result.update(e.result)
|
|
78
|
+
return self._execute_module('ansible.legacy.uri', module_args=new_module_args, task_vars=task_vars, wrap_async=self._task.async_val)
|
|
89
79
|
finally:
|
|
90
80
|
if not self._task.async_val:
|
|
91
81
|
self._remove_tmp_path(self._connection._shell.tmpdir)
|
|
92
|
-
return result
|