ansible-core 2.18.5rc1__py3-none-any.whl → 2.19.0b1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ansible/_internal/__init__.py +53 -0
- ansible/_internal/_ansiballz.py +265 -0
- ansible/_internal/_datatag/__init__.py +0 -0
- ansible/_internal/_datatag/_tags.py +130 -0
- ansible/_internal/_datatag/_utils.py +19 -0
- ansible/_internal/_datatag/_wrappers.py +33 -0
- ansible/_internal/_errors/__init__.py +0 -0
- ansible/_internal/_errors/_captured.py +128 -0
- ansible/_internal/_errors/_handler.py +91 -0
- ansible/_internal/_errors/_utils.py +310 -0
- ansible/_internal/_json/__init__.py +160 -0
- ansible/_internal/_json/_legacy_encoder.py +34 -0
- ansible/_internal/_json/_profiles/__init__.py +0 -0
- ansible/_internal/_json/_profiles/_cache_persistence.py +55 -0
- ansible/_internal/_json/_profiles/_inventory_legacy.py +40 -0
- ansible/_internal/_json/_profiles/_legacy.py +198 -0
- ansible/_internal/_locking.py +21 -0
- ansible/_internal/_plugins/__init__.py +0 -0
- ansible/_internal/_plugins/_cache.py +57 -0
- ansible/_internal/_task.py +78 -0
- ansible/_internal/_templating/__init__.py +10 -0
- ansible/_internal/_templating/_access.py +86 -0
- ansible/_internal/_templating/_chain_templar.py +63 -0
- ansible/_internal/_templating/_datatag.py +95 -0
- ansible/_internal/_templating/_engine.py +588 -0
- ansible/_internal/_templating/_errors.py +28 -0
- ansible/_internal/_templating/_jinja_bits.py +1066 -0
- ansible/_internal/_templating/_jinja_common.py +332 -0
- ansible/_internal/_templating/_jinja_patches.py +44 -0
- ansible/_internal/_templating/_jinja_plugins.py +351 -0
- ansible/_internal/_templating/_lazy_containers.py +633 -0
- ansible/_internal/_templating/_marker_behaviors.py +103 -0
- ansible/_internal/_templating/_transform.py +63 -0
- ansible/_internal/_templating/_utils.py +107 -0
- ansible/_internal/_wrapt.py +1052 -0
- ansible/_internal/_yaml/__init__.py +0 -0
- ansible/_internal/_yaml/_constructor.py +240 -0
- ansible/_internal/_yaml/_dumper.py +62 -0
- ansible/_internal/_yaml/_errors.py +166 -0
- ansible/_internal/_yaml/_loader.py +66 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/README.md +11 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/action/debug.py +36 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/apply_trust.py +19 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/dump_object.py +18 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/finalize.py +16 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/origin.py +18 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.py +24 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.yml +33 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/tag_names.py +16 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/true_type.py +17 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/unmask.py +49 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.py +21 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.yml +2 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.py +15 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.yml +19 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.py +18 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.yml +19 -0
- ansible/cli/__init__.py +153 -89
- ansible/cli/_ssh_askpass.py +47 -0
- ansible/cli/adhoc.py +14 -7
- ansible/cli/arguments/option_helpers.py +154 -7
- ansible/cli/config.py +43 -68
- ansible/cli/console.py +10 -8
- ansible/cli/doc.py +48 -46
- ansible/cli/galaxy.py +27 -20
- ansible/cli/inventory.py +28 -26
- ansible/cli/playbook.py +4 -12
- ansible/cli/pull.py +51 -11
- ansible/cli/scripts/ansible_connection_cli_stub.py +7 -7
- ansible/cli/vault.py +12 -11
- ansible/compat/__init__.py +2 -2
- ansible/config/base.yml +165 -108
- ansible/config/manager.py +52 -49
- ansible/constants.py +3 -4
- ansible/errors/__init__.py +277 -235
- ansible/executor/interpreter_discovery.py +28 -149
- ansible/executor/module_common.py +426 -493
- ansible/executor/play_iterator.py +22 -27
- ansible/executor/playbook_executor.py +11 -11
- ansible/executor/powershell/async_watchdog.ps1 +97 -102
- ansible/executor/powershell/async_wrapper.ps1 +202 -151
- ansible/executor/powershell/become_wrapper.ps1 +89 -144
- ansible/executor/powershell/bootstrap_wrapper.ps1 +24 -9
- ansible/executor/powershell/coverage_wrapper.ps1 +82 -135
- ansible/executor/powershell/exec_wrapper.ps1 +462 -196
- ansible/executor/powershell/module_manifest.py +417 -265
- ansible/executor/powershell/module_wrapper.ps1 +169 -186
- ansible/executor/powershell/psrp_fetch_file.ps1 +41 -0
- ansible/executor/powershell/psrp_put_file.ps1 +122 -0
- ansible/executor/powershell/winrm_fetch_file.ps1 +46 -0
- ansible/executor/powershell/winrm_put_file.ps1 +36 -0
- ansible/executor/process/worker.py +136 -76
- ansible/executor/stats.py +5 -5
- ansible/executor/task_executor.py +237 -236
- ansible/executor/task_queue_manager.py +62 -38
- ansible/executor/task_result.py +21 -12
- ansible/galaxy/__init__.py +2 -2
- ansible/galaxy/api.py +22 -18
- ansible/galaxy/collection/__init__.py +1 -1
- ansible/galaxy/collection/concrete_artifact_manager.py +8 -11
- ansible/galaxy/dependency_resolution/dataclasses.py +14 -4
- ansible/galaxy/dependency_resolution/providers.py +1 -1
- ansible/galaxy/dependency_resolution/reporters.py +81 -0
- ansible/galaxy/role.py +4 -8
- ansible/galaxy/token.py +28 -21
- ansible/inventory/data.py +47 -57
- ansible/inventory/group.py +44 -72
- ansible/inventory/helpers.py +9 -0
- ansible/inventory/host.py +32 -54
- ansible/inventory/manager.py +77 -34
- ansible/keyword_desc.yml +1 -1
- ansible/module_utils/_internal/__init__.py +55 -0
- ansible/module_utils/_internal/_ambient_context.py +58 -0
- ansible/module_utils/_internal/_ansiballz.py +133 -0
- ansible/module_utils/_internal/_concurrent/_daemon_threading.py +1 -0
- ansible/module_utils/_internal/_dataclass_annotation_patch.py +64 -0
- ansible/module_utils/_internal/_dataclass_validation.py +217 -0
- ansible/module_utils/_internal/_datatag/__init__.py +928 -0
- ansible/module_utils/_internal/_datatag/_tags.py +38 -0
- ansible/module_utils/_internal/_debugging.py +31 -0
- ansible/module_utils/_internal/_errors.py +30 -0
- ansible/module_utils/_internal/_json/__init__.py +63 -0
- ansible/module_utils/_internal/_json/_legacy_encoder.py +26 -0
- ansible/module_utils/_internal/_json/_profiles/__init__.py +410 -0
- ansible/module_utils/_internal/_json/_profiles/_fallback_to_str.py +73 -0
- ansible/module_utils/_internal/_json/_profiles/_module_legacy_c2m.py +31 -0
- ansible/module_utils/_internal/_json/_profiles/_module_legacy_m2c.py +35 -0
- ansible/module_utils/_internal/_json/_profiles/_module_modern_c2m.py +35 -0
- ansible/module_utils/_internal/_json/_profiles/_module_modern_m2c.py +33 -0
- ansible/module_utils/_internal/_json/_profiles/_tagless.py +50 -0
- ansible/module_utils/_internal/_patches/__init__.py +66 -0
- ansible/module_utils/_internal/_patches/_dataclass_annotation_patch.py +55 -0
- ansible/module_utils/_internal/_patches/_socket_patch.py +34 -0
- ansible/module_utils/_internal/_patches/_sys_intern_patch.py +34 -0
- ansible/module_utils/_internal/_plugin_exec_context.py +49 -0
- ansible/module_utils/_internal/_testing.py +0 -0
- ansible/module_utils/_internal/_traceback.py +89 -0
- ansible/module_utils/ansible_release.py +2 -2
- ansible/module_utils/api.py +1 -2
- ansible/module_utils/basic.py +154 -120
- ansible/module_utils/common/_utils.py +24 -28
- ansible/module_utils/common/collections.py +1 -2
- ansible/module_utils/common/dict_transformations.py +2 -2
- ansible/module_utils/common/file.py +2 -2
- ansible/module_utils/common/json.py +90 -84
- ansible/module_utils/common/locale.py +2 -2
- ansible/module_utils/common/messages.py +108 -0
- ansible/module_utils/common/parameters.py +27 -24
- ansible/module_utils/common/process.py +2 -2
- ansible/module_utils/common/respawn.py +41 -19
- ansible/module_utils/common/sentinel.py +66 -0
- ansible/module_utils/common/sys_info.py +8 -8
- ansible/module_utils/common/text/converters.py +16 -37
- ansible/module_utils/common/validation.py +35 -24
- ansible/module_utils/common/warnings.py +86 -25
- ansible/module_utils/common/yaml.py +29 -3
- ansible/module_utils/compat/datetime.py +33 -21
- ansible/module_utils/compat/paramiko.py +21 -10
- ansible/module_utils/compat/typing.py +6 -5
- ansible/module_utils/connection.py +2 -2
- ansible/module_utils/csharp/Ansible.Basic.cs +14 -11
- ansible/module_utils/csharp/Ansible.Become.cs +1 -0
- ansible/module_utils/csharp/Ansible._Async.cs +517 -0
- ansible/module_utils/datatag.py +46 -0
- ansible/module_utils/distro/__init__.py +2 -2
- ansible/module_utils/facts/ansible_collector.py +4 -5
- ansible/module_utils/facts/collector.py +13 -14
- ansible/module_utils/facts/compat.py +4 -4
- ansible/module_utils/facts/default_collectors.py +1 -1
- ansible/module_utils/facts/hardware/aix.py +34 -0
- ansible/module_utils/facts/hardware/base.py +1 -1
- ansible/module_utils/facts/hardware/darwin.py +1 -3
- ansible/module_utils/facts/hardware/freebsd.py +2 -2
- ansible/module_utils/facts/hardware/linux.py +4 -4
- ansible/module_utils/facts/namespace.py +1 -1
- ansible/module_utils/facts/network/base.py +1 -1
- ansible/module_utils/facts/network/fc_wwn.py +1 -2
- ansible/module_utils/facts/network/iscsi.py +1 -2
- ansible/module_utils/facts/network/nvme.py +1 -2
- ansible/module_utils/facts/other/facter.py +1 -2
- ansible/module_utils/facts/other/ohai.py +2 -3
- ansible/module_utils/facts/system/apparmor.py +1 -2
- ansible/module_utils/facts/system/caps.py +1 -1
- ansible/module_utils/facts/system/chroot.py +1 -2
- ansible/module_utils/facts/system/cmdline.py +1 -2
- ansible/module_utils/facts/system/date_time.py +5 -3
- ansible/module_utils/facts/system/distribution.py +9 -8
- ansible/module_utils/facts/system/dns.py +1 -1
- ansible/module_utils/facts/system/env.py +1 -2
- ansible/module_utils/facts/system/fips.py +7 -20
- ansible/module_utils/facts/system/loadavg.py +1 -2
- ansible/module_utils/facts/system/local.py +1 -2
- ansible/module_utils/facts/system/lsb.py +1 -2
- ansible/module_utils/facts/system/pkg_mgr.py +1 -2
- ansible/module_utils/facts/system/platform.py +1 -2
- ansible/module_utils/facts/system/python.py +1 -2
- ansible/module_utils/facts/system/selinux.py +1 -1
- ansible/module_utils/facts/system/service_mgr.py +1 -2
- ansible/module_utils/facts/system/ssh_pub_keys.py +1 -1
- ansible/module_utils/facts/system/systemd.py +1 -1
- ansible/module_utils/facts/system/user.py +1 -2
- ansible/module_utils/facts/utils.py +3 -3
- ansible/module_utils/facts/virtual/base.py +1 -1
- ansible/module_utils/facts/virtual/sunos.py +3 -15
- ansible/module_utils/facts/virtual/sysctl.py +3 -16
- ansible/module_utils/json_utils.py +2 -2
- ansible/module_utils/parsing/convert_bool.py +1 -1
- ansible/module_utils/service.py +18 -21
- ansible/module_utils/splitter.py +7 -7
- ansible/module_utils/testing.py +31 -0
- ansible/module_utils/urls.py +60 -31
- ansible/modules/add_host.py +4 -4
- ansible/modules/apt.py +60 -46
- ansible/modules/apt_key.py +19 -12
- ansible/modules/apt_repository.py +19 -16
- ansible/modules/assemble.py +6 -6
- ansible/modules/assert.py +4 -4
- ansible/modules/async_status.py +10 -12
- ansible/modules/async_wrapper.py +8 -3
- ansible/modules/blockinfile.py +6 -7
- ansible/modules/command.py +10 -17
- ansible/modules/copy.py +57 -144
- ansible/modules/cron.py +20 -15
- ansible/modules/deb822_repository.py +8 -9
- ansible/modules/debconf.py +5 -5
- ansible/modules/debug.py +4 -4
- ansible/modules/dnf.py +8 -8
- ansible/modules/dnf5.py +39 -13
- ansible/modules/dpkg_selections.py +4 -4
- ansible/modules/expect.py +8 -10
- ansible/modules/fail.py +4 -4
- ansible/modules/fetch.py +4 -4
- ansible/modules/file.py +174 -133
- ansible/modules/find.py +19 -17
- ansible/modules/gather_facts.py +3 -3
- ansible/modules/get_url.py +59 -53
- ansible/modules/getent.py +7 -9
- ansible/modules/git.py +28 -25
- ansible/modules/group.py +6 -6
- ansible/modules/group_by.py +4 -4
- ansible/modules/hostname.py +13 -29
- ansible/modules/import_playbook.py +6 -6
- ansible/modules/import_role.py +6 -6
- ansible/modules/import_tasks.py +6 -6
- ansible/modules/include_role.py +6 -6
- ansible/modules/include_tasks.py +6 -6
- ansible/modules/include_vars.py +6 -6
- ansible/modules/iptables.py +86 -73
- ansible/modules/known_hosts.py +10 -10
- ansible/modules/lineinfile.py +5 -5
- ansible/modules/meta.py +4 -4
- ansible/modules/mount_facts.py +2 -2
- ansible/modules/package.py +4 -4
- ansible/modules/package_facts.py +22 -10
- ansible/modules/pause.py +6 -6
- ansible/modules/ping.py +6 -6
- ansible/modules/pip.py +10 -11
- ansible/modules/raw.py +4 -4
- ansible/modules/reboot.py +6 -6
- ansible/modules/replace.py +9 -13
- ansible/modules/rpm_key.py +7 -8
- ansible/modules/script.py +4 -4
- ansible/modules/service.py +7 -8
- ansible/modules/service_facts.py +87 -10
- ansible/modules/set_fact.py +5 -5
- ansible/modules/set_stats.py +4 -4
- ansible/modules/setup.py +2 -2
- ansible/modules/shell.py +6 -6
- ansible/modules/slurp.py +6 -6
- ansible/modules/stat.py +9 -23
- ansible/modules/subversion.py +15 -15
- ansible/modules/systemd.py +6 -6
- ansible/modules/systemd_service.py +6 -6
- ansible/modules/sysvinit.py +6 -6
- ansible/modules/tempfile.py +5 -6
- ansible/modules/template.py +6 -6
- ansible/modules/unarchive.py +32 -11
- ansible/modules/uri.py +33 -26
- ansible/modules/user.py +53 -34
- ansible/modules/validate_argument_spec.py +10 -7
- ansible/modules/wait_for.py +32 -27
- ansible/modules/wait_for_connection.py +6 -6
- ansible/modules/yum_repository.py +6 -6
- ansible/parsing/ajson.py +14 -32
- ansible/parsing/dataloader.py +99 -54
- ansible/parsing/mod_args.py +28 -44
- ansible/parsing/plugin_docs.py +21 -86
- ansible/parsing/quoting.py +1 -1
- ansible/parsing/splitter.py +27 -12
- ansible/parsing/utils/addresses.py +24 -24
- ansible/parsing/utils/yaml.py +32 -61
- ansible/parsing/vault/__init__.py +319 -87
- ansible/parsing/yaml/__init__.py +0 -18
- ansible/parsing/yaml/dumper.py +6 -120
- ansible/parsing/yaml/loader.py +6 -39
- ansible/parsing/yaml/objects.py +36 -339
- ansible/playbook/__init__.py +1 -1
- ansible/playbook/attribute.py +8 -3
- ansible/playbook/base.py +182 -132
- ansible/playbook/block.py +26 -24
- ansible/playbook/collectionsearch.py +1 -15
- ansible/playbook/conditional.py +3 -77
- ansible/playbook/handler.py +8 -2
- ansible/playbook/helpers.py +41 -53
- ansible/playbook/included_file.py +6 -15
- ansible/playbook/loop_control.py +2 -2
- ansible/playbook/play.py +85 -44
- ansible/playbook/play_context.py +12 -17
- ansible/playbook/playbook_include.py +14 -15
- ansible/playbook/role/__init__.py +24 -26
- ansible/playbook/role/definition.py +15 -17
- ansible/playbook/role/include.py +2 -4
- ansible/playbook/role/metadata.py +10 -11
- ansible/playbook/role_include.py +3 -3
- ansible/playbook/taggable.py +13 -8
- ansible/playbook/task.py +188 -118
- ansible/playbook/task_include.py +5 -5
- ansible/plugins/__init__.py +68 -21
- ansible/plugins/action/__init__.py +209 -176
- ansible/plugins/action/add_host.py +1 -1
- ansible/plugins/action/assemble.py +1 -1
- ansible/plugins/action/assert.py +54 -66
- ansible/plugins/action/copy.py +7 -11
- ansible/plugins/action/debug.py +37 -31
- ansible/plugins/action/dnf.py +3 -4
- ansible/plugins/action/fail.py +1 -1
- ansible/plugins/action/fetch.py +4 -5
- ansible/plugins/action/gather_facts.py +7 -6
- ansible/plugins/action/group_by.py +1 -1
- ansible/plugins/action/include_vars.py +10 -11
- ansible/plugins/action/package.py +3 -6
- ansible/plugins/action/pause.py +2 -2
- ansible/plugins/action/script.py +15 -8
- ansible/plugins/action/service.py +6 -11
- ansible/plugins/action/set_fact.py +3 -12
- ansible/plugins/action/set_stats.py +3 -8
- ansible/plugins/action/template.py +35 -59
- ansible/plugins/action/unarchive.py +1 -1
- ansible/plugins/action/validate_argument_spec.py +5 -5
- ansible/plugins/action/wait_for_connection.py +1 -1
- ansible/plugins/become/__init__.py +31 -8
- ansible/plugins/become/runas.py +71 -0
- ansible/plugins/become/su.py +13 -8
- ansible/plugins/become/sudo.py +19 -0
- ansible/plugins/cache/__init__.py +35 -44
- ansible/plugins/cache/base.py +8 -0
- ansible/plugins/cache/jsonfile.py +10 -16
- ansible/plugins/cache/memory.py +6 -12
- ansible/plugins/callback/__init__.py +141 -123
- ansible/plugins/callback/default.py +30 -23
- ansible/plugins/callback/junit.py +28 -24
- ansible/plugins/callback/minimal.py +17 -14
- ansible/plugins/callback/oneline.py +13 -7
- ansible/plugins/callback/tree.py +10 -6
- ansible/plugins/connection/__init__.py +47 -34
- ansible/plugins/connection/local.py +150 -54
- ansible/plugins/connection/paramiko_ssh.py +21 -18
- ansible/plugins/connection/psrp.py +76 -165
- ansible/plugins/connection/ssh.py +301 -78
- ansible/plugins/connection/winrm.py +58 -140
- ansible/plugins/doc_fragments/action_common_attributes.py +14 -14
- ansible/plugins/doc_fragments/action_core.py +6 -6
- ansible/plugins/doc_fragments/backup.py +2 -2
- ansible/plugins/doc_fragments/checksum_common.py +27 -0
- ansible/plugins/doc_fragments/constructed.py +6 -2
- ansible/plugins/doc_fragments/decrypt.py +2 -2
- ansible/plugins/doc_fragments/default_callback.py +2 -2
- ansible/plugins/doc_fragments/files.py +2 -2
- ansible/plugins/doc_fragments/inventory_cache.py +2 -2
- ansible/plugins/doc_fragments/result_format_callback.py +2 -2
- ansible/plugins/doc_fragments/return_common.py +2 -2
- ansible/plugins/doc_fragments/template_common.py +4 -4
- ansible/plugins/doc_fragments/url.py +17 -1
- ansible/plugins/doc_fragments/url_windows.py +2 -2
- ansible/plugins/doc_fragments/validate.py +2 -2
- ansible/plugins/doc_fragments/vars_plugin_staging.py +2 -2
- ansible/plugins/filter/__init__.py +6 -2
- ansible/plugins/filter/b64decode.yml +22 -0
- ansible/plugins/filter/b64encode.yml +22 -0
- ansible/plugins/filter/bool.yml +11 -4
- ansible/plugins/filter/core.py +218 -108
- ansible/plugins/filter/encryption.py +32 -32
- ansible/plugins/filter/flatten.yml +3 -2
- ansible/plugins/filter/human_to_bytes.yml +1 -1
- ansible/plugins/filter/mathstuff.py +30 -37
- ansible/plugins/filter/password_hash.yml +8 -0
- ansible/plugins/filter/regex_search.yml +1 -4
- ansible/plugins/filter/split.yml +1 -1
- ansible/plugins/filter/to_nice_yaml.yml +0 -4
- ansible/plugins/filter/to_yaml.yml +0 -4
- ansible/plugins/filter/unvault.yml +1 -1
- ansible/plugins/filter/urls.py +1 -1
- ansible/plugins/filter/urlsplit.py +8 -9
- ansible/plugins/filter/vault.yml +14 -9
- ansible/plugins/filter/win_basename.yml +6 -1
- ansible/plugins/filter/win_dirname.yml +5 -0
- ansible/plugins/inventory/__init__.py +97 -77
- ansible/plugins/inventory/advanced_host_list.py +7 -5
- ansible/plugins/inventory/auto.py +11 -4
- ansible/plugins/inventory/constructed.py +21 -24
- ansible/plugins/inventory/generator.py +16 -11
- ansible/plugins/inventory/host_list.py +7 -5
- ansible/plugins/inventory/ini.py +78 -44
- ansible/plugins/inventory/script.py +189 -119
- ansible/plugins/inventory/toml.py +16 -126
- ansible/plugins/inventory/yaml.py +10 -8
- ansible/plugins/list.py +3 -3
- ansible/plugins/loader.py +197 -82
- ansible/plugins/lookup/__init__.py +21 -4
- ansible/plugins/lookup/config.py +21 -35
- ansible/plugins/lookup/csvfile.py +3 -2
- ansible/plugins/lookup/dict.py +1 -6
- ansible/plugins/lookup/env.py +12 -9
- ansible/plugins/lookup/file.py +5 -8
- ansible/plugins/lookup/first_found.py +86 -55
- ansible/plugins/lookup/indexed_items.py +1 -10
- ansible/plugins/lookup/ini.py +14 -13
- ansible/plugins/lookup/items.py +1 -1
- ansible/plugins/lookup/lines.py +8 -1
- ansible/plugins/lookup/list.py +1 -1
- ansible/plugins/lookup/nested.py +2 -18
- ansible/plugins/lookup/password.py +5 -5
- ansible/plugins/lookup/pipe.py +5 -7
- ansible/plugins/lookup/sequence.py +18 -8
- ansible/plugins/lookup/subelements.py +1 -4
- ansible/plugins/lookup/template.py +42 -36
- ansible/plugins/lookup/together.py +0 -12
- ansible/plugins/lookup/unvault.py +1 -5
- ansible/plugins/lookup/url.py +2 -8
- ansible/plugins/lookup/vars.py +16 -24
- ansible/plugins/shell/__init__.py +2 -2
- ansible/plugins/shell/cmd.py +2 -2
- ansible/plugins/shell/powershell.py +39 -22
- ansible/plugins/shell/sh.py +3 -2
- ansible/plugins/strategy/__init__.py +94 -113
- ansible/plugins/strategy/debug.py +2 -2
- ansible/plugins/strategy/free.py +13 -28
- ansible/plugins/strategy/host_pinned.py +2 -2
- ansible/plugins/strategy/linear.py +31 -33
- ansible/plugins/terminal/__init__.py +4 -4
- ansible/plugins/test/__init__.py +7 -2
- ansible/plugins/test/core.py +54 -20
- ansible/plugins/test/files.py +1 -1
- ansible/plugins/test/mathstuff.py +3 -3
- ansible/plugins/test/uri.py +3 -3
- ansible/plugins/vars/host_group_vars.py +7 -14
- ansible/release.py +2 -2
- ansible/template/__init__.py +368 -944
- ansible/utils/__init__.py +0 -18
- ansible/utils/_ssh_agent.py +657 -0
- ansible/utils/collection_loader/__init__.py +52 -5
- ansible/utils/collection_loader/_collection_config.py +5 -6
- ansible/utils/collection_loader/_collection_finder.py +79 -93
- ansible/utils/collection_loader/_collection_meta.py +13 -8
- ansible/utils/display.py +428 -58
- ansible/utils/encrypt.py +27 -19
- ansible/utils/fqcn.py +2 -2
- ansible/utils/hashing.py +2 -2
- ansible/utils/helpers.py +2 -2
- ansible/utils/listify.py +8 -8
- ansible/utils/lock.py +2 -2
- ansible/utils/path.py +4 -4
- ansible/utils/plugin_docs.py +14 -13
- ansible/utils/sentinel.py +4 -62
- ansible/utils/singleton.py +2 -0
- ansible/utils/ssh_functions.py +1 -1
- ansible/utils/unsafe_proxy.py +23 -332
- ansible/utils/vars.py +28 -8
- ansible/utils/version.py +2 -2
- ansible/vars/clean.py +4 -4
- ansible/vars/hostvars.py +60 -90
- ansible/vars/manager.py +205 -264
- ansible/vars/reserved.py +8 -9
- ansible_core-2.19.0b1.dist-info/BSD-3-Clause.txt +28 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b1.dist-info}/METADATA +5 -4
- ansible_core-2.19.0b1.dist-info/RECORD +1070 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b1.dist-info}/WHEEL +1 -1
- ansible_test/_data/completion/docker.txt +7 -7
- ansible_test/_data/completion/remote.txt +6 -6
- ansible_test/_data/completion/windows.txt +1 -0
- ansible_test/_data/requirements/ansible.txt +2 -2
- ansible_test/_data/requirements/sanity.ansible-doc.txt +3 -3
- ansible_test/_data/requirements/sanity.changelog.txt +1 -1
- ansible_test/_data/requirements/sanity.import.plugin.txt +2 -2
- ansible_test/_data/requirements/sanity.pylint.txt +4 -4
- ansible_test/_data/requirements/sanity.validate-modules.txt +2 -2
- ansible_test/_data/requirements/sanity.yamllint.txt +1 -1
- ansible_test/_data/requirements/units.txt +1 -0
- ansible_test/_internal/__init__.py +1 -0
- ansible_test/_internal/ansible_util.py +2 -0
- ansible_test/_internal/become.py +1 -0
- ansible_test/_internal/bootstrap.py +1 -0
- ansible_test/_internal/cache.py +1 -0
- ansible_test/_internal/cgroup.py +1 -0
- ansible_test/_internal/ci/__init__.py +1 -0
- ansible_test/_internal/ci/azp.py +1 -0
- ansible_test/_internal/ci/local.py +1 -0
- ansible_test/_internal/classification/__init__.py +1 -0
- ansible_test/_internal/classification/common.py +1 -0
- ansible_test/_internal/classification/csharp.py +1 -0
- ansible_test/_internal/classification/powershell.py +1 -0
- ansible_test/_internal/classification/python.py +1 -0
- ansible_test/_internal/cli/__init__.py +1 -0
- ansible_test/_internal/cli/actions.py +1 -0
- ansible_test/_internal/cli/argparsing/__init__.py +1 -0
- ansible_test/_internal/cli/argparsing/actions.py +1 -0
- ansible_test/_internal/cli/argparsing/argcompletion.py +1 -0
- ansible_test/_internal/cli/argparsing/parsers.py +1 -0
- ansible_test/_internal/cli/commands/__init__.py +11 -0
- ansible_test/_internal/cli/commands/coverage/__init__.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/__init__.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/__init__.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/combine.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/expand.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/filter.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/generate.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/missing.py +1 -0
- ansible_test/_internal/cli/commands/coverage/combine.py +1 -0
- ansible_test/_internal/cli/commands/coverage/erase.py +1 -0
- ansible_test/_internal/cli/commands/coverage/html.py +1 -0
- ansible_test/_internal/cli/commands/coverage/report.py +1 -0
- ansible_test/_internal/cli/commands/coverage/xml.py +1 -0
- ansible_test/_internal/cli/commands/env.py +1 -0
- ansible_test/_internal/cli/commands/integration/__init__.py +1 -0
- ansible_test/_internal/cli/commands/integration/network.py +1 -0
- ansible_test/_internal/cli/commands/integration/posix.py +1 -0
- ansible_test/_internal/cli/commands/integration/windows.py +1 -0
- ansible_test/_internal/cli/commands/sanity.py +9 -0
- ansible_test/_internal/cli/commands/shell.py +1 -0
- ansible_test/_internal/cli/commands/units.py +1 -0
- ansible_test/_internal/cli/compat.py +1 -0
- ansible_test/_internal/cli/completers.py +1 -0
- ansible_test/_internal/cli/converters.py +1 -0
- ansible_test/_internal/cli/environments.py +1 -0
- ansible_test/_internal/cli/epilog.py +1 -0
- ansible_test/_internal/cli/parsers/__init__.py +1 -0
- ansible_test/_internal/cli/parsers/base_argument_parsers.py +1 -0
- ansible_test/_internal/cli/parsers/helpers.py +1 -0
- ansible_test/_internal/cli/parsers/host_config_parsers.py +1 -0
- ansible_test/_internal/cli/parsers/key_value_parsers.py +1 -0
- ansible_test/_internal/cli/parsers/value_parsers.py +1 -0
- ansible_test/_internal/commands/__init__.py +1 -0
- ansible_test/_internal/commands/coverage/__init__.py +2 -1
- ansible_test/_internal/commands/coverage/analyze/__init__.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/__init__.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/combine.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/expand.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/filter.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/generate.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/missing.py +1 -0
- ansible_test/_internal/commands/coverage/combine.py +2 -1
- ansible_test/_internal/commands/coverage/erase.py +1 -0
- ansible_test/_internal/commands/coverage/html.py +1 -0
- ansible_test/_internal/commands/coverage/report.py +1 -0
- ansible_test/_internal/commands/coverage/xml.py +1 -0
- ansible_test/_internal/commands/env/__init__.py +2 -0
- ansible_test/_internal/commands/integration/__init__.py +4 -0
- ansible_test/_internal/commands/integration/cloud/__init__.py +1 -0
- ansible_test/_internal/commands/integration/cloud/acme.py +2 -1
- ansible_test/_internal/commands/integration/cloud/aws.py +1 -0
- ansible_test/_internal/commands/integration/cloud/azure.py +1 -0
- ansible_test/_internal/commands/integration/cloud/cs.py +1 -0
- ansible_test/_internal/commands/integration/cloud/digitalocean.py +1 -0
- ansible_test/_internal/commands/integration/cloud/galaxy.py +3 -2
- ansible_test/_internal/commands/integration/cloud/hcloud.py +1 -0
- ansible_test/_internal/commands/integration/cloud/httptester.py +2 -1
- ansible_test/_internal/commands/integration/cloud/nios.py +2 -1
- ansible_test/_internal/commands/integration/cloud/opennebula.py +1 -0
- ansible_test/_internal/commands/integration/cloud/openshift.py +1 -0
- ansible_test/_internal/commands/integration/cloud/scaleway.py +1 -0
- ansible_test/_internal/commands/integration/cloud/vcenter.py +1 -0
- ansible_test/_internal/commands/integration/cloud/vultr.py +1 -0
- ansible_test/_internal/commands/integration/coverage.py +1 -0
- ansible_test/_internal/commands/integration/filters.py +1 -0
- ansible_test/_internal/commands/integration/network.py +1 -0
- ansible_test/_internal/commands/integration/posix.py +1 -0
- ansible_test/_internal/commands/integration/windows.py +1 -0
- ansible_test/_internal/commands/sanity/__init__.py +16 -1
- ansible_test/_internal/commands/sanity/ansible_doc.py +1 -0
- ansible_test/_internal/commands/sanity/bin_symlinks.py +1 -0
- ansible_test/_internal/commands/sanity/compile.py +1 -0
- ansible_test/_internal/commands/sanity/ignores.py +1 -0
- ansible_test/_internal/commands/sanity/import.py +1 -0
- ansible_test/_internal/commands/sanity/integration_aliases.py +1 -0
- ansible_test/_internal/commands/sanity/pep8.py +1 -0
- ansible_test/_internal/commands/sanity/pslint.py +1 -0
- ansible_test/_internal/commands/sanity/pylint.py +24 -26
- ansible_test/_internal/commands/sanity/shellcheck.py +1 -0
- ansible_test/_internal/commands/sanity/validate_modules.py +1 -0
- ansible_test/_internal/commands/sanity/yamllint.py +1 -0
- ansible_test/_internal/commands/shell/__init__.py +1 -0
- ansible_test/_internal/commands/units/__init__.py +1 -0
- ansible_test/_internal/compat/__init__.py +1 -0
- ansible_test/_internal/compat/packaging.py +1 -0
- ansible_test/_internal/compat/yaml.py +1 -0
- ansible_test/_internal/completion.py +1 -0
- ansible_test/_internal/config.py +2 -0
- ansible_test/_internal/connections.py +1 -0
- ansible_test/_internal/constants.py +1 -0
- ansible_test/_internal/containers.py +1 -0
- ansible_test/_internal/content_config.py +1 -0
- ansible_test/_internal/core_ci.py +1 -0
- ansible_test/_internal/coverage_util.py +11 -10
- ansible_test/_internal/data.py +1 -0
- ansible_test/_internal/delegation.py +1 -0
- ansible_test/_internal/dev/__init__.py +1 -0
- ansible_test/_internal/dev/container_probe.py +1 -0
- ansible_test/_internal/diff.py +3 -2
- ansible_test/_internal/docker_util.py +2 -1
- ansible_test/_internal/encoding.py +1 -0
- ansible_test/_internal/executor.py +1 -0
- ansible_test/_internal/git.py +1 -0
- ansible_test/_internal/host_configs.py +1 -0
- ansible_test/_internal/host_profiles.py +1 -0
- ansible_test/_internal/http.py +1 -0
- ansible_test/_internal/init.py +1 -0
- ansible_test/_internal/inventory.py +35 -3
- ansible_test/_internal/io.py +1 -0
- ansible_test/_internal/metadata.py +1 -0
- ansible_test/_internal/payload.py +1 -0
- ansible_test/_internal/provider/__init__.py +1 -0
- ansible_test/_internal/provider/layout/__init__.py +1 -0
- ansible_test/_internal/provider/layout/ansible.py +1 -0
- ansible_test/_internal/provider/layout/collection.py +1 -0
- ansible_test/_internal/provider/layout/unsupported.py +1 -0
- ansible_test/_internal/provider/source/__init__.py +1 -0
- ansible_test/_internal/provider/source/git.py +1 -0
- ansible_test/_internal/provider/source/installed.py +1 -0
- ansible_test/_internal/provider/source/unsupported.py +1 -0
- ansible_test/_internal/provider/source/unversioned.py +1 -0
- ansible_test/_internal/provisioning.py +1 -0
- ansible_test/_internal/pypi_proxy.py +6 -5
- ansible_test/_internal/python_requirements.py +1 -0
- ansible_test/_internal/ssh.py +1 -0
- ansible_test/_internal/target.py +1 -0
- ansible_test/_internal/test.py +3 -2
- ansible_test/_internal/thread.py +1 -0
- ansible_test/_internal/timeout.py +1 -0
- ansible_test/_internal/util.py +1 -0
- ansible_test/_internal/util_common.py +5 -2
- ansible_test/_internal/venv.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/action-plugin-docs.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/changelog/sphinx.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/changelog.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/empty-init.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/line-endings.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/no-assert.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/no-get-exception.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/no-illegal-filenames.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/no-smart-quotes.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/replace-urlopen.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/runtime-metadata.py +28 -1
- ansible_test/_util/controller/sanity/code-smell/shebang.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/symlinks.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/use-argspec-type-path.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/use-compat-six.py +1 -0
- ansible_test/_util/controller/sanity/integration-aliases/yaml_to_json.py +2 -1
- ansible_test/_util/controller/sanity/pep8/current-ignore.txt +4 -0
- ansible_test/_util/controller/sanity/pylint/config/ansible-test-target.cfg +7 -5
- ansible_test/_util/controller/sanity/pylint/config/ansible-test.cfg +7 -5
- ansible_test/_util/controller/sanity/pylint/config/code-smell.cfg +7 -5
- ansible_test/_util/controller/sanity/pylint/config/collection.cfg +3 -5
- ansible_test/_util/controller/sanity/pylint/config/default.cfg +7 -7
- ansible_test/_util/controller/sanity/pylint/plugins/deprecated.py +1 -13
- ansible_test/_util/controller/sanity/pylint/plugins/hide_unraisable.py +1 -0
- ansible_test/_util/controller/sanity/pylint/plugins/string_format.py +1 -8
- ansible_test/_util/controller/sanity/pylint/plugins/unwanted.py +1 -8
- ansible_test/_util/controller/sanity/validate-modules/validate_modules/main.py +55 -28
- ansible_test/_util/controller/sanity/validate-modules/validate_modules/module_args.py +12 -5
- ansible_test/_util/controller/sanity/validate-modules/validate_modules/schema.py +13 -2
- ansible_test/_util/controller/sanity/validate-modules/validate_modules/utils.py +1 -0
- ansible_test/_util/controller/sanity/yamllint/yamllinter.py +35 -17
- ansible_test/_util/controller/tools/collection_detail.py +1 -0
- ansible_test/_util/controller/tools/yaml_to_json.py +2 -1
- ansible_test/_util/target/pytest/plugins/ansible_forked.py +6 -1
- ansible_test/_util/target/pytest/plugins/ansible_pytest_collections.py +2 -1
- ansible_test/_util/target/pytest/plugins/ansible_pytest_coverage.py +1 -0
- ansible_test/_util/target/sanity/compile/compile.py +1 -0
- ansible_test/_util/target/sanity/import/importer.py +15 -16
- ansible_test/_util/target/setup/bootstrap.sh +9 -20
- ansible_test/_util/target/setup/probe_cgroups.py +1 -0
- ansible_test/_util/target/setup/quiet_pip.py +1 -0
- ansible_test/_util/target/setup/requirements.py +35 -27
- ansible_test/_util/target/tools/virtualenvcheck.py +2 -1
- ansible_test/_util/target/tools/yamlcheck.py +2 -1
- ansible/compat/selectors.py +0 -32
- ansible/errors/yaml_strings.py +0 -138
- ansible/executor/action_write_locks.py +0 -44
- ansible/executor/discovery/python_target.py +0 -47
- ansible/executor/powershell/module_powershell_wrapper.ps1 +0 -86
- ansible/executor/powershell/module_script_wrapper.ps1 +0 -22
- ansible/module_utils/compat/importlib.py +0 -26
- ansible/module_utils/compat/selectors.py +0 -32
- ansible/module_utils/pycompat24.py +0 -73
- ansible/parsing/utils/jsonify.py +0 -36
- ansible/parsing/yaml/constructor.py +0 -178
- ansible/template/native_helpers.py +0 -251
- ansible/template/template.py +0 -43
- ansible/template/vars.py +0 -77
- ansible/utils/native_jinja.py +0 -11
- ansible/vars/fact_cache.py +0 -71
- ansible_core-2.18.5rc1.dist-info/RECORD +0 -992
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b1.dist-info}/Apache-License.txt +0 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b1.dist-info}/COPYING +0 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b1.dist-info}/MIT-license.txt +0 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b1.dist-info}/PSF-license.txt +0 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b1.dist-info}/entry_points.txt +0 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b1.dist-info}/simplified_bsd.txt +0 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b1.dist-info}/top_level.txt +0 -0
@@ -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
|
@@ -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')
|
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
|
+
thats = new_module_args['that']
|
76
|
+
|
98
77
|
if not quiet:
|
99
78
|
result['_ansible_verbose_always'] = True
|
100
79
|
|
101
80
|
for that in thats:
|
102
|
-
|
103
|
-
test_result = cond.evaluate_conditional(templar=self._templar, all_vars=task_vars)
|
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
|
ansible/plugins/action/copy.py
CHANGED
@@ -23,7 +23,6 @@ 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
|
@@ -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,7 +404,7 @@ 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
|
|
@@ -472,10 +469,9 @@ class ActionModule(ActionBase):
|
|
472
469
|
try:
|
473
470
|
# find in expected paths
|
474
471
|
source = self._find_needle('files', source)
|
475
|
-
except AnsibleError as
|
476
|
-
result
|
477
|
-
|
478
|
-
result['exception'] = traceback.format_exc()
|
472
|
+
except AnsibleError as ex:
|
473
|
+
result.update(self.result_dict_from_exception(ex))
|
474
|
+
|
479
475
|
return self._ensure_invocation(result)
|
480
476
|
|
481
477
|
if trailing_slash != source.endswith(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
|
|
@@ -178,9 +178,8 @@ class ActionModule(ActionBase):
|
|
178
178
|
self._connection.fetch_file(source, dest)
|
179
179
|
else:
|
180
180
|
try:
|
181
|
-
|
182
|
-
|
183
|
-
f.close()
|
181
|
+
with open(to_bytes(dest, errors='surrogate_or_strict'), 'wb') as f:
|
182
|
+
f.write(remote_data)
|
184
183
|
except (IOError, OSError) as e:
|
185
184
|
raise AnsibleActionFail("Failed to fetch the file: %s" % e)
|
186
185
|
new_checksum = secure_hash(dest)
|
@@ -9,7 +9,7 @@ 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
|
@@ -54,10 +54,7 @@ class ActionModule(ActionBase):
|
|
54
54
|
fact_module, collection_list=self._task.collections
|
55
55
|
).resolved_fqcn
|
56
56
|
|
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
|
-
)
|
57
|
+
mod_args = _apply_action_arg_defaults(resolved_fact_module, self._task, mod_args, self._templar)
|
61
58
|
|
62
59
|
return mod_args
|
63
60
|
|
@@ -93,7 +90,7 @@ class ActionModule(ActionBase):
|
|
93
90
|
if set(modules).intersection(set(C._ACTION_SETUP)):
|
94
91
|
# most don't realize how setup works with networking connection plugins (forced_local)
|
95
92
|
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
|
93
|
+
" and not the target when a networking connection plugin is used.")
|
97
94
|
|
98
95
|
elif not set(modules).intersection(set(C._ACTION_SETUP)):
|
99
96
|
# no network OS and setup not in list, add setup by default since 'smart'
|
@@ -132,6 +129,8 @@ class ActionModule(ActionBase):
|
|
132
129
|
# TODO: use gather_timeout to cut module execution if module itself does not support gather_timeout
|
133
130
|
res = self._execute_module(module_name=fact_module, module_args=mod_args, task_vars=task_vars, wrap_async=False)
|
134
131
|
if res.get('failed', False):
|
132
|
+
# DTFIX-RELEASE: this trashes the individual failure details and does not work with the new error handling; need to do something to
|
133
|
+
# invoke per-item error handling- perhaps returning this as a synthetic loop result?
|
135
134
|
failed[fact_module] = res
|
136
135
|
elif res.get('skipped', False):
|
137
136
|
skipped[fact_module] = res
|
@@ -164,6 +163,8 @@ class ActionModule(ActionBase):
|
|
164
163
|
res = self._execute_module(module_name='ansible.legacy.async_status', module_args=poll_args, task_vars=task_vars, wrap_async=False)
|
165
164
|
if res.get('finished', 0) == 1:
|
166
165
|
if res.get('failed', False):
|
166
|
+
# DTFIX-RELEASE: this trashes the individual failure details and does not work with the new error handling; need to do something to
|
167
|
+
# invoke per-item error handling- perhaps returning this as a synthetic loop result?
|
167
168
|
failed[module] = res
|
168
169
|
elif res.get('skipped', False):
|
169
170
|
skipped[module] = res
|
@@ -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)))
|
@@ -17,7 +17,7 @@
|
|
17
17
|
from __future__ import annotations
|
18
18
|
|
19
19
|
from ansible.errors import AnsibleAction, AnsibleActionFail
|
20
|
-
from ansible.executor.module_common import
|
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,7 +33,7 @@ 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
|
@@ -92,10 +92,7 @@ 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
|
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,6 +17,7 @@
|
|
17
17
|
from __future__ import annotations
|
18
18
|
|
19
19
|
import os
|
20
|
+
import pathlib
|
20
21
|
import re
|
21
22
|
import shlex
|
22
23
|
|
@@ -35,7 +36,7 @@ class ActionModule(ActionBase):
|
|
35
36
|
windows_absolute_path_detection = re.compile(r'^(?:[a-zA-Z]\:)?(\\|\/)')
|
36
37
|
|
37
38
|
def run(self, tmp=None, task_vars=None):
|
38
|
-
|
39
|
+
""" handler for file transfer operations """
|
39
40
|
if task_vars is None:
|
40
41
|
task_vars = dict()
|
41
42
|
|
@@ -48,9 +49,8 @@ class ActionModule(ActionBase):
|
|
48
49
|
'chdir': {'type': 'str'},
|
49
50
|
'executable': {'type': 'str'},
|
50
51
|
},
|
51
|
-
required_one_of=[
|
52
|
-
|
53
|
-
]
|
52
|
+
required_one_of=[['_raw_params', 'cmd']],
|
53
|
+
mutually_exclusive=[['_raw_params', 'cmd']],
|
54
54
|
)
|
55
55
|
|
56
56
|
result = super(ActionModule, self).run(tmp, task_vars)
|
@@ -88,7 +88,7 @@ class ActionModule(ActionBase):
|
|
88
88
|
# Split out the script as the first item in raw_params using
|
89
89
|
# shlex.split() in order to support paths and files with spaces in the name.
|
90
90
|
# Any arguments passed to the script will be added back later.
|
91
|
-
raw_params =
|
91
|
+
raw_params = new_module_args['_raw_params'] or new_module_args['cmd']
|
92
92
|
parts = [to_text(s, errors='surrogate_or_strict') for s in shlex.split(raw_params.strip())]
|
93
93
|
source = parts[0]
|
94
94
|
|
@@ -152,9 +152,16 @@ class ActionModule(ActionBase):
|
|
152
152
|
# FUTURE: use a more public method to get the exec payload
|
153
153
|
pc = self._task
|
154
154
|
exec_data = ps_manifest._create_powershell_wrapper(
|
155
|
-
|
156
|
-
|
157
|
-
|
155
|
+
name=f"ansible.builtin.script.{pathlib.Path(source).stem}",
|
156
|
+
module_data=to_bytes(script_cmd),
|
157
|
+
module_path=source,
|
158
|
+
module_args={},
|
159
|
+
environment=env_dict,
|
160
|
+
async_timeout=self._task.async_val,
|
161
|
+
become_plugin=self._connection.become,
|
162
|
+
substyle="script",
|
163
|
+
task_vars=task_vars,
|
164
|
+
profile='legacy', # the profile doesn't really matter since the module args dict is empty
|
158
165
|
)
|
159
166
|
# build the necessary exec wrapper command
|
160
167
|
# FUTURE: this still doesn't let script work on Windows with non-pipelined connections or
|
@@ -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
19
|
from ansible.errors import AnsibleAction, AnsibleActionFail
|
21
|
-
from ansible.executor.module_common import
|
20
|
+
from ansible.executor.module_common import _apply_action_arg_defaults
|
22
21
|
from ansible.plugins.action import ActionBase
|
23
22
|
|
24
23
|
|
@@ -35,7 +34,7 @@ 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
|
@@ -47,10 +46,9 @@ class ActionModule(ActionBase):
|
|
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,10 +77,7 @@ 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:
|