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
|
@@ -31,7 +31,7 @@ display = Display()
|
|
|
31
31
|
|
|
32
32
|
|
|
33
33
|
class ActionModule(ActionBase):
|
|
34
|
-
|
|
34
|
+
""" Create inventory hosts and groups in the memory inventory"""
|
|
35
35
|
|
|
36
36
|
# We need to be able to modify the inventory
|
|
37
37
|
BYPASS_HOST_LOOP = True
|
|
@@ -77,7 +77,7 @@ class ActionModule(ActionBase):
|
|
|
77
77
|
elif isinstance(groups, string_types):
|
|
78
78
|
group_list = groups.split(",")
|
|
79
79
|
else:
|
|
80
|
-
raise AnsibleActionFail("Groups must be specified as a list.", obj=
|
|
80
|
+
raise AnsibleActionFail("Groups must be specified as a list.", obj=groups)
|
|
81
81
|
|
|
82
82
|
for group_name in group_list:
|
|
83
83
|
if group_name not in new_groups:
|
|
@@ -25,8 +25,8 @@ import re
|
|
|
25
25
|
import tempfile
|
|
26
26
|
|
|
27
27
|
from ansible import constants as C
|
|
28
|
-
from ansible.errors import
|
|
29
|
-
from ansible.module_utils.common.text.converters import
|
|
28
|
+
from ansible.errors import AnsibleActionFail
|
|
29
|
+
from ansible.module_utils.common.text.converters import to_text
|
|
30
30
|
from ansible.module_utils.parsing.convert_bool import boolean
|
|
31
31
|
from ansible.plugins.action import ActionBase
|
|
32
32
|
from ansible.utils.hashing import checksum_s
|
|
@@ -37,7 +37,7 @@ class ActionModule(ActionBase):
|
|
|
37
37
|
TRANSFERS_FILES = True
|
|
38
38
|
|
|
39
39
|
def _assemble_from_fragments(self, src_path, delimiter=None, compiled_regexp=None, ignore_hidden=False, decrypt=True):
|
|
40
|
-
|
|
40
|
+
""" assemble a file from a directory of fragments """
|
|
41
41
|
|
|
42
42
|
tmpfd, temp_path = tempfile.mkstemp(dir=C.DEFAULT_LOCAL_TMP)
|
|
43
43
|
tmp = os.fdopen(tmpfd, 'wb')
|
|
@@ -81,9 +81,10 @@ class ActionModule(ActionBase):
|
|
|
81
81
|
|
|
82
82
|
def run(self, tmp=None, task_vars=None):
|
|
83
83
|
|
|
84
|
-
self._supports_check_mode =
|
|
84
|
+
self._supports_check_mode = True
|
|
85
|
+
|
|
86
|
+
super(ActionModule, self).run(tmp, task_vars)
|
|
85
87
|
|
|
86
|
-
result = super(ActionModule, self).run(tmp, task_vars)
|
|
87
88
|
del tmp # tmp no longer has any effect
|
|
88
89
|
|
|
89
90
|
if task_vars is None:
|
|
@@ -104,13 +105,9 @@ class ActionModule(ActionBase):
|
|
|
104
105
|
|
|
105
106
|
if boolean(remote_src, strict=False):
|
|
106
107
|
# call assemble via ansible.legacy to allow library/ overrides of the module without collection search
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
try:
|
|
111
|
-
src = self._find_needle('files', src)
|
|
112
|
-
except AnsibleError as e:
|
|
113
|
-
raise AnsibleActionFail(to_native(e))
|
|
108
|
+
return self._execute_module(module_name='ansible.legacy.assemble', task_vars=task_vars)
|
|
109
|
+
|
|
110
|
+
src = self._find_needle('files', src)
|
|
114
111
|
|
|
115
112
|
if not os.path.isdir(src):
|
|
116
113
|
raise AnsibleActionFail(u"Source (%s) is not a directory" % src)
|
|
@@ -153,13 +150,9 @@ class ActionModule(ActionBase):
|
|
|
153
150
|
res = self._execute_module(module_name='ansible.legacy.copy', module_args=new_module_args, task_vars=task_vars)
|
|
154
151
|
if diff:
|
|
155
152
|
res['diff'] = diff
|
|
156
|
-
|
|
153
|
+
return res
|
|
157
154
|
else:
|
|
158
|
-
|
|
155
|
+
return self._execute_module(module_name='ansible.legacy.file', module_args=new_module_args, task_vars=task_vars)
|
|
159
156
|
|
|
160
|
-
except AnsibleAction as e:
|
|
161
|
-
result.update(e.result)
|
|
162
157
|
finally:
|
|
163
158
|
self._remove_tmp_path(self._connection._shell.tmpdir)
|
|
164
|
-
|
|
165
|
-
return result
|
ansible/plugins/action/assert.py
CHANGED
|
@@ -16,19 +16,41 @@
|
|
|
16
16
|
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
from __future__ import annotations
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
import typing as t
|
|
20
|
+
|
|
21
|
+
from ansible._internal._templating import _jinja_bits
|
|
22
|
+
from ansible.errors import AnsibleTemplateError
|
|
23
|
+
from ansible.module_utils.common.validation import _check_type_list_strict
|
|
21
24
|
from ansible.plugins.action import ActionBase
|
|
22
|
-
from ansible.
|
|
23
|
-
from ansible.module_utils.parsing.convert_bool import boolean
|
|
25
|
+
from ansible._internal._templating._engine import TemplateEngine
|
|
24
26
|
|
|
25
27
|
|
|
26
28
|
class ActionModule(ActionBase):
|
|
27
|
-
|
|
29
|
+
"""Assert that one or more conditional expressions evaluate to true."""
|
|
28
30
|
|
|
29
31
|
_requires_connection = False
|
|
30
32
|
|
|
31
|
-
|
|
33
|
+
@classmethod
|
|
34
|
+
def finalize_task_arg(cls, name: str, value: t.Any, templar: TemplateEngine, context: t.Any) -> t.Any:
|
|
35
|
+
if name != 'that':
|
|
36
|
+
# `that` is the only key requiring special handling; delegate to base handling otherwise
|
|
37
|
+
return super().finalize_task_arg(name, value, templar, context)
|
|
38
|
+
|
|
39
|
+
if not isinstance(value, str):
|
|
40
|
+
# if `that` is not a string, we don't need to attempt to resolve it as a template before validation (which will also listify it)
|
|
41
|
+
return value
|
|
42
|
+
|
|
43
|
+
# if `that` is entirely a string template, we only want to resolve to the container and avoid templating the container contents
|
|
44
|
+
if _jinja_bits.is_possibly_all_template(value):
|
|
45
|
+
try:
|
|
46
|
+
templated_that = templar.resolve_to_container(value)
|
|
47
|
+
except AnsibleTemplateError:
|
|
48
|
+
pass
|
|
49
|
+
else:
|
|
50
|
+
if isinstance(templated_that, list): # only use `templated_that` if it is a list
|
|
51
|
+
return templated_that
|
|
52
|
+
|
|
53
|
+
return value
|
|
32
54
|
|
|
33
55
|
def run(self, tmp=None, task_vars=None):
|
|
34
56
|
if task_vars is None:
|
|
@@ -37,70 +59,26 @@ class ActionModule(ActionBase):
|
|
|
37
59
|
result = super(ActionModule, self).run(tmp, task_vars)
|
|
38
60
|
del tmp # tmp no longer has any effect
|
|
39
61
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
success_msg = self._task.args.get('success_msg')
|
|
56
|
-
if success_msg is None:
|
|
57
|
-
success_msg = 'All assertions passed'
|
|
58
|
-
elif isinstance(success_msg, list):
|
|
59
|
-
if not all(isinstance(x, string_types) for x in success_msg):
|
|
60
|
-
raise AnsibleError('Type of one of the elements in success_msg list is not string type')
|
|
61
|
-
elif not isinstance(success_msg, (string_types, list)):
|
|
62
|
-
raise AnsibleError('Incorrect type for success_msg, expected a string or list and got %s' % type(success_msg))
|
|
63
|
-
|
|
64
|
-
quiet = boolean(self._task.args.get('quiet', False), strict=False)
|
|
65
|
-
|
|
66
|
-
# directly access 'that' via untemplated args from the task so we can intelligently trust embedded
|
|
67
|
-
# templates and preserve the original inputs/locations for better messaging on assert failures and
|
|
68
|
-
# errors.
|
|
69
|
-
# FIXME: even in devel, things like `that: item` don't always work properly (truthy string value
|
|
70
|
-
# is not really an embedded expression)
|
|
71
|
-
# we could fix that by doing direct var lookups on the inputs
|
|
72
|
-
# FIXME: some form of this code should probably be shared between debug, assert, and
|
|
73
|
-
# Task.post_validate, since they
|
|
74
|
-
# have a lot of overlapping needs
|
|
75
|
-
try:
|
|
76
|
-
thats = self._task.untemplated_args['that']
|
|
77
|
-
except KeyError:
|
|
78
|
-
# in the case of "we got our entire args dict from a template", we can just consult the
|
|
79
|
-
# post-templated dict (the damage has likely already been done for embedded templates anyway)
|
|
80
|
-
thats = self._task.args['that']
|
|
81
|
-
|
|
82
|
-
# FIXME: this is a case where we only want to resolve indirections, NOT recurse containers
|
|
83
|
-
# (and even then, the leaf-most expression being wrapped is at least suboptimal
|
|
84
|
-
# (since its expression will be "eaten").
|
|
85
|
-
if isinstance(thats, str):
|
|
86
|
-
thats = self._templar.template(thats)
|
|
87
|
-
|
|
88
|
-
# make sure the 'that' items are a list
|
|
89
|
-
if not isinstance(thats, list):
|
|
90
|
-
thats = [thats]
|
|
91
|
-
|
|
92
|
-
# Now we iterate over the that items, temporarily assigning them
|
|
93
|
-
# to the task's when value so we can evaluate the conditional using
|
|
94
|
-
# the built in evaluate function. The when has already been evaluated
|
|
95
|
-
# by this point, and is not used again, so we don't care about mangling
|
|
96
|
-
# that value now
|
|
97
|
-
cond = Conditional(loader=self._loader)
|
|
62
|
+
validation_result, new_module_args = self.validate_argument_spec(
|
|
63
|
+
argument_spec=dict(
|
|
64
|
+
fail_msg=dict(type=str_or_list_of_str, aliases=['msg'], default='Assertion failed'),
|
|
65
|
+
success_msg=dict(type=str_or_list_of_str, default='All assertions passed'),
|
|
66
|
+
quiet=dict(type='bool', default=False),
|
|
67
|
+
# explicitly not validating types `elements` here to let type rules for conditionals apply
|
|
68
|
+
that=dict(type=_check_type_list_strict, required=True),
|
|
69
|
+
),
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
fail_msg = new_module_args['fail_msg']
|
|
73
|
+
success_msg = new_module_args['success_msg']
|
|
74
|
+
quiet = new_module_args['quiet']
|
|
75
|
+
that_list = new_module_args['that']
|
|
76
|
+
|
|
98
77
|
if not quiet:
|
|
99
78
|
result['_ansible_verbose_always'] = True
|
|
100
79
|
|
|
101
|
-
for that in
|
|
102
|
-
|
|
103
|
-
test_result = cond.evaluate_conditional(templar=self._templar, all_vars=task_vars)
|
|
80
|
+
for that in that_list:
|
|
81
|
+
test_result = self._templar.evaluate_conditional(conditional=that)
|
|
104
82
|
if not test_result:
|
|
105
83
|
result['failed'] = True
|
|
106
84
|
result['evaluated_to'] = test_result
|
|
@@ -113,3 +91,13 @@ class ActionModule(ActionBase):
|
|
|
113
91
|
result['changed'] = False
|
|
114
92
|
result['msg'] = success_msg
|
|
115
93
|
return result
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def str_or_list_of_str(value: t.Any) -> str | list[str]:
|
|
97
|
+
if isinstance(value, str):
|
|
98
|
+
return value
|
|
99
|
+
|
|
100
|
+
if not isinstance(value, list) or any(not isinstance(item, str) for item in value):
|
|
101
|
+
raise TypeError("a string or list of strings is required")
|
|
102
|
+
|
|
103
|
+
return value
|
|
@@ -28,7 +28,7 @@ class ActionModule(ActionBase):
|
|
|
28
28
|
)
|
|
29
29
|
|
|
30
30
|
# initialize response
|
|
31
|
-
results['started'] = results['finished'] =
|
|
31
|
+
results['started'] = results['finished'] = False
|
|
32
32
|
results['stdout'] = results['stderr'] = ''
|
|
33
33
|
results['stdout_lines'] = results['stderr_lines'] = []
|
|
34
34
|
|
|
@@ -43,9 +43,14 @@ class ActionModule(ActionBase):
|
|
|
43
43
|
results['erased'] = log_path
|
|
44
44
|
else:
|
|
45
45
|
results['results_file'] = log_path
|
|
46
|
-
results['started'] =
|
|
46
|
+
results['started'] = True
|
|
47
47
|
|
|
48
48
|
new_module_args['_async_dir'] = async_dir
|
|
49
49
|
results = merge_hash(results, self._execute_module(module_name='ansible.legacy.async_status', task_vars=task_vars, module_args=new_module_args))
|
|
50
50
|
|
|
51
|
+
# Backwards compat shim for when started/finished were ints,
|
|
52
|
+
# mostly to work with ansible.windows.async_status
|
|
53
|
+
for convert in ('started', 'finished'):
|
|
54
|
+
results[convert] = bool(results[convert])
|
|
55
|
+
|
|
51
56
|
return results
|
ansible/plugins/action/copy.py
CHANGED
|
@@ -23,12 +23,11 @@ import os
|
|
|
23
23
|
import os.path
|
|
24
24
|
import stat
|
|
25
25
|
import tempfile
|
|
26
|
-
import traceback
|
|
27
26
|
|
|
28
27
|
from ansible import constants as C
|
|
29
28
|
from ansible.errors import AnsibleError, AnsibleActionFail, AnsibleFileNotFound
|
|
30
29
|
from ansible.module_utils.basic import FILE_COMMON_ARGUMENTS
|
|
31
|
-
from ansible.module_utils.common.text.converters import to_bytes,
|
|
30
|
+
from ansible.module_utils.common.text.converters import to_bytes, to_text
|
|
32
31
|
from ansible.module_utils.parsing.convert_bool import boolean
|
|
33
32
|
from ansible.plugins.action import ActionBase
|
|
34
33
|
from ansible.utils.hashing import checksum
|
|
@@ -389,17 +388,15 @@ class ActionModule(ActionBase):
|
|
|
389
388
|
return result
|
|
390
389
|
|
|
391
390
|
def _create_content_tempfile(self, content):
|
|
392
|
-
|
|
391
|
+
""" Create a tempfile containing defined content """
|
|
393
392
|
fd, content_tempfile = tempfile.mkstemp(dir=C.DEFAULT_LOCAL_TMP, prefix='.')
|
|
394
|
-
f = os.fdopen(fd, 'wb')
|
|
395
393
|
content = to_bytes(content)
|
|
396
394
|
try:
|
|
397
|
-
|
|
395
|
+
with os.fdopen(fd, 'wb') as f:
|
|
396
|
+
f.write(content)
|
|
398
397
|
except Exception as err:
|
|
399
398
|
os.remove(content_tempfile)
|
|
400
399
|
raise Exception(err)
|
|
401
|
-
finally:
|
|
402
|
-
f.close()
|
|
403
400
|
return content_tempfile
|
|
404
401
|
|
|
405
402
|
def _remove_tempfile_if_content_defined(self, content, content_tempfile):
|
|
@@ -407,11 +404,12 @@ class ActionModule(ActionBase):
|
|
|
407
404
|
os.remove(content_tempfile)
|
|
408
405
|
|
|
409
406
|
def run(self, tmp=None, task_vars=None):
|
|
410
|
-
|
|
407
|
+
""" handler for file transfer operations """
|
|
411
408
|
if task_vars is None:
|
|
412
409
|
task_vars = dict()
|
|
413
410
|
|
|
414
411
|
result = super(ActionModule, self).run(tmp, task_vars)
|
|
412
|
+
|
|
415
413
|
del tmp # tmp no longer has any effect
|
|
416
414
|
|
|
417
415
|
# ensure user is not setting internal parameters
|
|
@@ -453,10 +451,10 @@ class ActionModule(ActionBase):
|
|
|
453
451
|
else:
|
|
454
452
|
content_tempfile = self._create_content_tempfile(content)
|
|
455
453
|
source = content_tempfile
|
|
456
|
-
except Exception as
|
|
457
|
-
result
|
|
458
|
-
|
|
459
|
-
|
|
454
|
+
except Exception as ex:
|
|
455
|
+
self._ensure_invocation(result)
|
|
456
|
+
|
|
457
|
+
raise AnsibleActionFail(message="could not write content temp file", result=result) from ex
|
|
460
458
|
|
|
461
459
|
# if we have first_available_file in our vars
|
|
462
460
|
# look up the files and use the first one we find as src
|
|
@@ -472,11 +470,10 @@ class ActionModule(ActionBase):
|
|
|
472
470
|
try:
|
|
473
471
|
# find in expected paths
|
|
474
472
|
source = self._find_needle('files', source)
|
|
475
|
-
except AnsibleError as
|
|
476
|
-
result
|
|
477
|
-
|
|
478
|
-
result
|
|
479
|
-
return self._ensure_invocation(result)
|
|
473
|
+
except AnsibleError as ex:
|
|
474
|
+
self._ensure_invocation(result)
|
|
475
|
+
|
|
476
|
+
raise AnsibleActionFail(result=result) from ex
|
|
480
477
|
|
|
481
478
|
if trailing_slash != source.endswith(os.path.sep):
|
|
482
479
|
if source[-1] == os.path.sep:
|
ansible/plugins/action/debug.py
CHANGED
|
@@ -17,29 +17,32 @@
|
|
|
17
17
|
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
|
|
18
18
|
from __future__ import annotations
|
|
19
19
|
|
|
20
|
-
from ansible.errors import
|
|
21
|
-
from ansible.module_utils.
|
|
22
|
-
from ansible.module_utils.common.text.converters import to_text
|
|
20
|
+
from ansible.errors import AnsibleValueOmittedError, AnsibleError
|
|
21
|
+
from ansible.module_utils.common.validation import _check_type_str_no_conversion
|
|
23
22
|
from ansible.plugins.action import ActionBase
|
|
23
|
+
from ansible._internal._templating._jinja_common import UndefinedMarker, TruncationMarker
|
|
24
|
+
from ansible._internal._templating._utils import Omit
|
|
25
|
+
from ansible._internal._templating._marker_behaviors import ReplacingMarkerBehavior, RoutingMarkerBehavior
|
|
26
|
+
from ansible.utils.display import Display
|
|
27
|
+
|
|
28
|
+
display = Display()
|
|
24
29
|
|
|
25
30
|
|
|
26
31
|
class ActionModule(ActionBase):
|
|
27
|
-
|
|
32
|
+
"""
|
|
33
|
+
Emits informational messages, with special diagnostic handling of some templating failures.
|
|
34
|
+
"""
|
|
28
35
|
|
|
29
36
|
TRANSFERS_FILES = False
|
|
30
|
-
_VALID_ARGS = frozenset(('msg', 'var', 'verbosity'))
|
|
31
37
|
_requires_connection = False
|
|
32
38
|
|
|
33
39
|
def run(self, tmp=None, task_vars=None):
|
|
34
|
-
if task_vars is None:
|
|
35
|
-
task_vars = dict()
|
|
36
|
-
|
|
37
40
|
validation_result, new_module_args = self.validate_argument_spec(
|
|
38
|
-
argument_spec=
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
41
|
+
argument_spec=dict(
|
|
42
|
+
msg=dict(type='raw', default='Hello world!'),
|
|
43
|
+
var=dict(type=_check_type_str_no_conversion),
|
|
44
|
+
verbosity=dict(type='int', default=0),
|
|
45
|
+
),
|
|
43
46
|
mutually_exclusive=(
|
|
44
47
|
('msg', 'var'),
|
|
45
48
|
),
|
|
@@ -51,31 +54,34 @@ class ActionModule(ActionBase):
|
|
|
51
54
|
# get task verbosity
|
|
52
55
|
verbosity = new_module_args['verbosity']
|
|
53
56
|
|
|
57
|
+
replacing_behavior = ReplacingMarkerBehavior()
|
|
58
|
+
|
|
59
|
+
var_behavior = RoutingMarkerBehavior({
|
|
60
|
+
UndefinedMarker: replacing_behavior,
|
|
61
|
+
TruncationMarker: replacing_behavior,
|
|
62
|
+
})
|
|
63
|
+
|
|
54
64
|
if verbosity <= self._display.verbosity:
|
|
55
|
-
if new_module_args['var']:
|
|
65
|
+
if raw_var_arg := new_module_args['var']:
|
|
66
|
+
# If var name is same as result, try to template it
|
|
56
67
|
try:
|
|
57
|
-
results = self._templar.
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
results = u"VARIABLE IS NOT DEFINED!"
|
|
66
|
-
if self._display.verbosity > 0:
|
|
67
|
-
results += u": %s" % to_text(e)
|
|
68
|
-
|
|
69
|
-
if isinstance(new_module_args['var'], (list, dict)):
|
|
70
|
-
# If var is a list or dict, use the type as key to display
|
|
71
|
-
result[to_text(type(new_module_args['var']))] = results
|
|
72
|
-
else:
|
|
73
|
-
result[new_module_args['var']] = results
|
|
68
|
+
results = self._templar._engine.extend(marker_behavior=var_behavior).evaluate_expression(raw_var_arg)
|
|
69
|
+
except AnsibleValueOmittedError as ex:
|
|
70
|
+
results = repr(Omit)
|
|
71
|
+
display.warning("The result of the `var` expression could not be omitted; a placeholder was used instead.", obj=ex.obj)
|
|
72
|
+
except Exception as ex:
|
|
73
|
+
raise AnsibleError('Error while resolving `var` expression.', obj=raw_var_arg) from ex
|
|
74
|
+
|
|
75
|
+
result[raw_var_arg] = results
|
|
74
76
|
else:
|
|
75
77
|
result['msg'] = new_module_args['msg']
|
|
76
78
|
|
|
77
79
|
# force flag to make debug output module always verbose
|
|
78
80
|
result['_ansible_verbose_always'] = True
|
|
81
|
+
|
|
82
|
+
# propagate any warnings in the task result unless we're skipping the task
|
|
83
|
+
replacing_behavior.emit_warnings()
|
|
84
|
+
|
|
79
85
|
else:
|
|
80
86
|
result['skipped_reason'] = "Verbosity threshold not met."
|
|
81
87
|
result['skipped'] = True
|
ansible/plugins/action/dnf.py
CHANGED
|
@@ -30,10 +30,9 @@ class ActionModule(ActionBase):
|
|
|
30
30
|
|
|
31
31
|
if module in {'yum', 'auto'}:
|
|
32
32
|
try:
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
module = self._templar.template("{{ansible_facts.pkg_mgr}}")
|
|
33
|
+
# if we delegate, we should use delegated host's facts
|
|
34
|
+
expr = "hostvars[delegate_to].ansible_facts.pkg_mgr" if self._task.delegate_to else "ansible_facts.pkg_mgr"
|
|
35
|
+
module = self._templar.resolve_variable_expression(expr, local_variables=dict(delegate_to=self._task.delegate_to))
|
|
37
36
|
except Exception:
|
|
38
37
|
pass # could not get it from template!
|
|
39
38
|
|
ansible/plugins/action/fail.py
CHANGED
ansible/plugins/action/fetch.py
CHANGED
|
@@ -33,7 +33,7 @@ display = Display()
|
|
|
33
33
|
class ActionModule(ActionBase):
|
|
34
34
|
|
|
35
35
|
def run(self, tmp=None, task_vars=None):
|
|
36
|
-
|
|
36
|
+
""" handler for fetch operations """
|
|
37
37
|
if task_vars is None:
|
|
38
38
|
task_vars = dict()
|
|
39
39
|
|
|
@@ -51,7 +51,7 @@ class ActionModule(ActionBase):
|
|
|
51
51
|
validate_checksum = boolean(self._task.args.get('validate_checksum', True), strict=False)
|
|
52
52
|
|
|
53
53
|
msg = ''
|
|
54
|
-
# validate source and dest are strings
|
|
54
|
+
# FIXME: validate source and dest are strings; use basic.py and module specs
|
|
55
55
|
if not isinstance(source, string_types):
|
|
56
56
|
msg = "Invalid type supplied for source option, it must be a string"
|
|
57
57
|
|
|
@@ -119,7 +119,7 @@ class ActionModule(ActionBase):
|
|
|
119
119
|
|
|
120
120
|
if 'not found' in slurpres.get('msg', ''):
|
|
121
121
|
result['msg'] = "the remote file does not exist, not transferring, ignored"
|
|
122
|
-
elif slurpres.get('msg', '').startswith('source is a directory'):
|
|
122
|
+
elif slurpres.get('msg', '').lower().startswith('source is a directory'):
|
|
123
123
|
result['msg'] = "remote file is a directory, fetch cannot work on directories"
|
|
124
124
|
|
|
125
125
|
return result
|
|
@@ -178,11 +178,10 @@ class ActionModule(ActionBase):
|
|
|
178
178
|
self._connection.fetch_file(source, dest)
|
|
179
179
|
else:
|
|
180
180
|
try:
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
raise AnsibleActionFail("Failed to fetch the file: %s" % e)
|
|
181
|
+
with open(to_bytes(dest, errors='surrogate_or_strict'), 'wb') as f:
|
|
182
|
+
f.write(remote_data)
|
|
183
|
+
except OSError as ex:
|
|
184
|
+
raise AnsibleActionFail("Failed to fetch the file.") from ex
|
|
186
185
|
new_checksum = secure_hash(dest)
|
|
187
186
|
# For backwards compatibility. We'll return None on FIPS enabled systems
|
|
188
187
|
try:
|
|
@@ -9,10 +9,11 @@ import typing as t
|
|
|
9
9
|
|
|
10
10
|
from ansible import constants as C
|
|
11
11
|
from ansible.errors import AnsibleActionFail
|
|
12
|
-
from ansible.executor.module_common import
|
|
12
|
+
from ansible.executor.module_common import _apply_action_arg_defaults
|
|
13
13
|
from ansible.module_utils.parsing.convert_bool import boolean
|
|
14
14
|
from ansible.plugins.action import ActionBase
|
|
15
15
|
from ansible.utils.vars import merge_hash
|
|
16
|
+
from ansible._internal._errors import _error_utils
|
|
16
17
|
|
|
17
18
|
|
|
18
19
|
class ActionModule(ActionBase):
|
|
@@ -28,10 +29,8 @@ class ActionModule(ActionBase):
|
|
|
28
29
|
|
|
29
30
|
# TODO: remove in favor of controller side argspec detecting valid arguments
|
|
30
31
|
# network facts modules must support gather_subset
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
except AttributeError:
|
|
34
|
-
name = self._connection._load_name.split('.')[-1]
|
|
32
|
+
name = self._connection.ansible_name.removeprefix('ansible.netcommon.')
|
|
33
|
+
|
|
35
34
|
if name not in ('network_cli', 'httpapi', 'netconf'):
|
|
36
35
|
subset = mod_args.pop('gather_subset', None)
|
|
37
36
|
if subset not in ('all', ['all'], None):
|
|
@@ -54,10 +53,7 @@ class ActionModule(ActionBase):
|
|
|
54
53
|
fact_module, collection_list=self._task.collections
|
|
55
54
|
).resolved_fqcn
|
|
56
55
|
|
|
57
|
-
mod_args =
|
|
58
|
-
resolved_fact_module, mod_args, self._task.module_defaults, self._templar,
|
|
59
|
-
action_groups=self._task._parent._play._action_groups
|
|
60
|
-
)
|
|
56
|
+
mod_args = _apply_action_arg_defaults(resolved_fact_module, self._task, mod_args, self._templar)
|
|
61
57
|
|
|
62
58
|
return mod_args
|
|
63
59
|
|
|
@@ -93,7 +89,7 @@ class ActionModule(ActionBase):
|
|
|
93
89
|
if set(modules).intersection(set(C._ACTION_SETUP)):
|
|
94
90
|
# most don't realize how setup works with networking connection plugins (forced_local)
|
|
95
91
|
self._display.warning("Detected 'setup' module and a network OS is set, the output when running it will reflect 'localhost'"
|
|
96
|
-
" and not the target when a
|
|
92
|
+
" and not the target when a networking connection plugin is used.")
|
|
97
93
|
|
|
98
94
|
elif not set(modules).intersection(set(C._ACTION_SETUP)):
|
|
99
95
|
# no network OS and setup not in list, add setup by default since 'smart'
|
|
@@ -162,7 +158,7 @@ class ActionModule(ActionBase):
|
|
|
162
158
|
for module in jobs:
|
|
163
159
|
poll_args = {'jid': jobs[module]['ansible_job_id'], '_async_dir': os.path.dirname(jobs[module]['results_file'])}
|
|
164
160
|
res = self._execute_module(module_name='ansible.legacy.async_status', module_args=poll_args, task_vars=task_vars, wrap_async=False)
|
|
165
|
-
if res.get('finished',
|
|
161
|
+
if res.get('finished', False):
|
|
166
162
|
if res.get('failed', False):
|
|
167
163
|
failed[module] = res
|
|
168
164
|
elif res.get('skipped', False):
|
|
@@ -181,16 +177,19 @@ class ActionModule(ActionBase):
|
|
|
181
177
|
self._task.async_val = async_val
|
|
182
178
|
|
|
183
179
|
if skipped:
|
|
184
|
-
result['msg'] = "The following modules were skipped:
|
|
180
|
+
result['msg'] = f"The following modules were skipped: {', '.join(skipped.keys())}."
|
|
185
181
|
result['skipped_modules'] = skipped
|
|
186
182
|
if len(skipped) == len(modules):
|
|
187
183
|
result['skipped'] = True
|
|
188
184
|
|
|
189
185
|
if failed:
|
|
190
|
-
result['failed'] = True
|
|
191
|
-
result['msg'] = "The following modules failed to execute: %s\n" % (', '.join(failed.keys()))
|
|
192
186
|
result['failed_modules'] = failed
|
|
193
187
|
|
|
188
|
+
result.update(_error_utils.result_dict_from_captured_errors(
|
|
189
|
+
msg=f"The following modules failed to execute: {', '.join(failed.keys())}.",
|
|
190
|
+
errors=[r['exception'] for r in failed.values()],
|
|
191
|
+
))
|
|
192
|
+
|
|
194
193
|
# tell executor facts were gathered
|
|
195
194
|
result['ansible_facts']['_ansible_facts_gathered'] = True
|
|
196
195
|
|
|
@@ -21,7 +21,7 @@ from ansible.module_utils.six import string_types
|
|
|
21
21
|
|
|
22
22
|
|
|
23
23
|
class ActionModule(ActionBase):
|
|
24
|
-
|
|
24
|
+
""" Create inventory groups based on variables """
|
|
25
25
|
|
|
26
26
|
# We need to be able to modify the inventory
|
|
27
27
|
TRANSFERS_FILES = False
|
|
@@ -9,8 +9,9 @@ import pathlib
|
|
|
9
9
|
|
|
10
10
|
import ansible.constants as C
|
|
11
11
|
from ansible.errors import AnsibleError
|
|
12
|
+
from ansible._internal._datatag._tags import SourceWasEncrypted
|
|
12
13
|
from ansible.module_utils.six import string_types
|
|
13
|
-
from ansible.module_utils.common.text.converters import to_native
|
|
14
|
+
from ansible.module_utils.common.text.converters import to_native
|
|
14
15
|
from ansible.plugins.action import ActionBase
|
|
15
16
|
from ansible.utils.vars import combine_vars
|
|
16
17
|
|
|
@@ -142,9 +143,8 @@ class ActionModule(ActionBase):
|
|
|
142
143
|
result['message'] = err_msg
|
|
143
144
|
elif self.hash_behaviour is not None and self.hash_behaviour != C.DEFAULT_HASH_BEHAVIOUR:
|
|
144
145
|
merge_hashes = self.hash_behaviour == 'merge'
|
|
145
|
-
for
|
|
146
|
-
|
|
147
|
-
results[key] = combine_vars(old_value, value, merge=merge_hashes)
|
|
146
|
+
existing_variables = {k: v for k, v in task_vars.items() if k in results}
|
|
147
|
+
results = combine_vars(existing_variables, results, merge=merge_hashes)
|
|
148
148
|
|
|
149
149
|
result['ansible_included_var_files'] = self.included_files
|
|
150
150
|
result['ansible_facts'] = results
|
|
@@ -168,9 +168,9 @@ class ActionModule(ActionBase):
|
|
|
168
168
|
)
|
|
169
169
|
self.source_dir = path_to_use
|
|
170
170
|
else:
|
|
171
|
-
if
|
|
171
|
+
if (origin := self._task._origin) and origin.path: # origin.path is not present for ad-hoc tasks
|
|
172
172
|
current_dir = (
|
|
173
|
-
"/".join(
|
|
173
|
+
"/".join(origin.path.split('/')[:-1])
|
|
174
174
|
)
|
|
175
175
|
self.source_dir = path.join(current_dir, self.source_dir)
|
|
176
176
|
|
|
@@ -234,14 +234,13 @@ class ActionModule(ActionBase):
|
|
|
234
234
|
failed = True
|
|
235
235
|
err_msg = ('{0} does not have a valid extension: {1}'.format(to_native(filename), ', '.join(self.valid_extensions)))
|
|
236
236
|
else:
|
|
237
|
-
|
|
238
|
-
data = to_text(b_data, errors='surrogate_or_strict')
|
|
237
|
+
data = self._loader.load_from_file(filename, cache='none', trusted_as_template=True)
|
|
239
238
|
|
|
240
|
-
self.show_content &=
|
|
239
|
+
self.show_content &= not SourceWasEncrypted.is_tagged_on(data)
|
|
241
240
|
|
|
242
|
-
data
|
|
243
|
-
if not data:
|
|
241
|
+
if data is None: # support empty files, but not falsey values
|
|
244
242
|
data = dict()
|
|
243
|
+
|
|
245
244
|
if not isinstance(data, dict):
|
|
246
245
|
failed = True
|
|
247
246
|
err_msg = ('{0} must be stored as a dictionary/hash'.format(to_native(filename)))
|