ansible-core 2.18.4rc1__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 +52 -17
- 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 +20 -18
- 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 +7 -7
- 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 +35 -49
- ansible/modules/user.py +53 -34
- ansible/modules/validate_argument_spec.py +10 -7
- ansible/modules/wait_for.py +39 -32
- 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 +8 -7
- 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 +2 -2
- 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.4rc1.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.4rc1.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.4rc1.dist-info/RECORD +0 -992
- {ansible_core-2.18.4rc1.dist-info → ansible_core-2.19.0b1.dist-info}/Apache-License.txt +0 -0
- {ansible_core-2.18.4rc1.dist-info → ansible_core-2.19.0b1.dist-info}/COPYING +0 -0
- {ansible_core-2.18.4rc1.dist-info → ansible_core-2.19.0b1.dist-info}/MIT-license.txt +0 -0
- {ansible_core-2.18.4rc1.dist-info → ansible_core-2.19.0b1.dist-info}/PSF-license.txt +0 -0
- {ansible_core-2.18.4rc1.dist-info → ansible_core-2.19.0b1.dist-info}/entry_points.txt +0 -0
- {ansible_core-2.18.4rc1.dist-info → ansible_core-2.19.0b1.dist-info}/simplified_bsd.txt +0 -0
- {ansible_core-2.18.4rc1.dist-info → ansible_core-2.19.0b1.dist-info}/top_level.txt +0 -0
@@ -117,10 +117,6 @@ DOCUMENTATION = """
|
|
117
117
|
- kerberos usage mode.
|
118
118
|
- The managed option means Ansible will obtain kerberos ticket.
|
119
119
|
- While the manual one means a ticket must already have been obtained by the user.
|
120
|
-
- If having issues with Ansible freezing when trying to obtain the
|
121
|
-
Kerberos ticket, you can either set this to V(manual) and obtain
|
122
|
-
it outside Ansible or install C(pexpect) through pip and try
|
123
|
-
again.
|
124
120
|
choices: [managed, manual]
|
125
121
|
vars:
|
126
122
|
- name: ansible_winrm_kinit_mode
|
@@ -186,6 +182,7 @@ except ImportError:
|
|
186
182
|
from ansible import constants as C
|
187
183
|
from ansible.errors import AnsibleError, AnsibleConnectionFailure
|
188
184
|
from ansible.errors import AnsibleFileNotFound
|
185
|
+
from ansible.executor.powershell.module_manifest import _bootstrap_powershell_script
|
189
186
|
from ansible.module_utils.json_utils import _filter_non_json_lines
|
190
187
|
from ansible.module_utils.parsing.convert_bool import boolean
|
191
188
|
from ansible.module_utils.common.text.converters import to_bytes, to_native, to_text
|
@@ -223,19 +220,6 @@ except ImportError as e:
|
|
223
220
|
HAS_XMLTODICT = False
|
224
221
|
XMLTODICT_IMPORT_ERR = e
|
225
222
|
|
226
|
-
HAS_PEXPECT = False
|
227
|
-
try:
|
228
|
-
import pexpect
|
229
|
-
# echo was added in pexpect 3.3+ which is newer than the RHEL package
|
230
|
-
# we can only use pexpect for kerb auth if echo is a valid kwarg
|
231
|
-
# https://github.com/ansible/ansible/issues/43462
|
232
|
-
if hasattr(pexpect, 'spawn'):
|
233
|
-
argspec = getfullargspec(pexpect.spawn.__init__)
|
234
|
-
if 'echo' in argspec.args:
|
235
|
-
HAS_PEXPECT = True
|
236
|
-
except ImportError as e:
|
237
|
-
pass
|
238
|
-
|
239
223
|
# used to try and parse the hostname and detect if IPv6 is being used
|
240
224
|
try:
|
241
225
|
import ipaddress
|
@@ -247,7 +231,7 @@ display = Display()
|
|
247
231
|
|
248
232
|
|
249
233
|
class Connection(ConnectionBase):
|
250
|
-
|
234
|
+
"""WinRM connections over HTTP/HTTPS."""
|
251
235
|
|
252
236
|
transport = 'winrm'
|
253
237
|
module_implementation_preferences = ('.ps1', '.exe', '')
|
@@ -350,6 +334,7 @@ class Connection(ConnectionBase):
|
|
350
334
|
def _kerb_auth(self, principal: str, password: str) -> None:
|
351
335
|
if password is None:
|
352
336
|
password = ""
|
337
|
+
b_password = to_bytes(password, encoding='utf-8', errors='surrogate_or_strict')
|
353
338
|
|
354
339
|
self._kerb_ccache = tempfile.NamedTemporaryFile()
|
355
340
|
display.vvvvv("creating Kerberos CC at %s" % self._kerb_ccache.name)
|
@@ -376,60 +361,28 @@ class Connection(ConnectionBase):
|
|
376
361
|
|
377
362
|
kinit_cmdline.append(principal)
|
378
363
|
|
379
|
-
|
380
|
-
# the password as input even on MacOS which blocks subprocess from
|
381
|
-
# doing so. Unfortunately it is not available on the built in Python
|
382
|
-
# so we can only use it if someone has installed it
|
383
|
-
if HAS_PEXPECT:
|
384
|
-
proc_mechanism = "pexpect"
|
385
|
-
command = kinit_cmdline.pop(0)
|
386
|
-
password = to_text(password, encoding='utf-8',
|
387
|
-
errors='surrogate_or_strict')
|
388
|
-
|
389
|
-
display.vvvv("calling kinit with pexpect for principal %s"
|
390
|
-
% principal)
|
391
|
-
try:
|
392
|
-
child = pexpect.spawn(command, kinit_cmdline, timeout=60,
|
393
|
-
env=krb5env, echo=False)
|
394
|
-
except pexpect.ExceptionPexpect as err:
|
395
|
-
err_msg = "Kerberos auth failure when calling kinit cmd " \
|
396
|
-
"'%s': %s" % (command, to_native(err))
|
397
|
-
raise AnsibleConnectionFailure(err_msg)
|
398
|
-
|
399
|
-
try:
|
400
|
-
child.expect(".*:")
|
401
|
-
child.sendline(password)
|
402
|
-
except OSError as err:
|
403
|
-
# child exited before the pass was sent, Ansible will raise
|
404
|
-
# error based on the rc below, just display the error here
|
405
|
-
display.vvvv("kinit with pexpect raised OSError: %s"
|
406
|
-
% to_native(err))
|
407
|
-
|
408
|
-
# technically this is the stdout + stderr but to match the
|
409
|
-
# subprocess error checking behaviour, we will call it stderr
|
410
|
-
stderr = child.read()
|
411
|
-
child.wait()
|
412
|
-
rc = child.exitstatus
|
413
|
-
else:
|
414
|
-
proc_mechanism = "subprocess"
|
415
|
-
b_password = to_bytes(password, encoding='utf-8',
|
416
|
-
errors='surrogate_or_strict')
|
364
|
+
display.vvvv(f"calling kinit for principal {principal}")
|
417
365
|
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
366
|
+
# It is important to use start_new_session which spawns the process
|
367
|
+
# with setsid() to avoid it inheriting the current tty. On macOS it
|
368
|
+
# will force it to read from stdin rather than the tty.
|
369
|
+
try:
|
370
|
+
p = subprocess.Popen(
|
371
|
+
kinit_cmdline,
|
372
|
+
start_new_session=True,
|
373
|
+
stdin=subprocess.PIPE,
|
374
|
+
stdout=subprocess.PIPE,
|
375
|
+
stderr=subprocess.PIPE,
|
376
|
+
env=krb5env,
|
377
|
+
)
|
425
378
|
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
379
|
+
except OSError as err:
|
380
|
+
err_msg = "Kerberos auth failure when calling kinit cmd " \
|
381
|
+
"'%s': %s" % (self._kinit_cmd, to_native(err))
|
382
|
+
raise AnsibleConnectionFailure(err_msg)
|
430
383
|
|
431
|
-
|
432
|
-
|
384
|
+
stdout, stderr = p.communicate(b_password + b'\n')
|
385
|
+
rc = p.returncode
|
433
386
|
|
434
387
|
if rc != 0:
|
435
388
|
# one last attempt at making sure the password does not exist
|
@@ -437,16 +390,15 @@ class Connection(ConnectionBase):
|
|
437
390
|
exp_msg = to_native(stderr.strip())
|
438
391
|
exp_msg = exp_msg.replace(to_native(password), "<redacted>")
|
439
392
|
|
440
|
-
err_msg = "Kerberos auth failure for principal
|
441
|
-
% (principal, proc_mechanism, exp_msg)
|
393
|
+
err_msg = f"Kerberos auth failure for principal {principal}: {exp_msg}"
|
442
394
|
raise AnsibleConnectionFailure(err_msg)
|
443
395
|
|
444
396
|
display.vvvvv("kinit succeeded for principal %s" % principal)
|
445
397
|
|
446
398
|
def _winrm_connect(self) -> winrm.Protocol:
|
447
|
-
|
399
|
+
"""
|
448
400
|
Establish a WinRM connection over HTTP/HTTPS.
|
449
|
-
|
401
|
+
"""
|
450
402
|
display.vvv("ESTABLISH WINRM CONNECTION FOR USER: %s on PORT %s TO %s" %
|
451
403
|
(self._winrm_user, self._winrm_port, self._winrm_host), host=self._winrm_host)
|
452
404
|
|
@@ -627,7 +579,7 @@ class Connection(ConnectionBase):
|
|
627
579
|
def _winrm_exec(
|
628
580
|
self,
|
629
581
|
command: str,
|
630
|
-
args: t.Iterable[bytes] = (),
|
582
|
+
args: t.Iterable[bytes | str] = (),
|
631
583
|
from_exec: bool = False,
|
632
584
|
stdin_iterator: t.Iterable[tuple[bytes, bool]] = None,
|
633
585
|
) -> tuple[int, bytes, bytes]:
|
@@ -652,9 +604,7 @@ class Connection(ConnectionBase):
|
|
652
604
|
self._winrm_write_stdin(command_id, stdin_iterator)
|
653
605
|
|
654
606
|
except Exception as ex:
|
655
|
-
display.
|
656
|
-
% (type(ex).__name__, to_text(ex)))
|
657
|
-
display.debug(traceback.format_exc())
|
607
|
+
display.error_as_warning("ERROR DURING WINRM SEND INPUT. Attempting to recover.", ex)
|
658
608
|
stdin_push_failed = True
|
659
609
|
|
660
610
|
# Even on a failure above we try at least once to get the output
|
@@ -771,7 +721,13 @@ class Connection(ConnectionBase):
|
|
771
721
|
|
772
722
|
def exec_command(self, cmd: str, in_data: bytes | None = None, sudoable: bool = True) -> tuple[int, bytes, bytes]:
|
773
723
|
super(Connection, self).exec_command(cmd, in_data=in_data, sudoable=sudoable)
|
774
|
-
|
724
|
+
|
725
|
+
encoded_prefix = self._shell._encode_script('', as_list=False, strict_mode=False, preserve_rc=False)
|
726
|
+
if cmd.startswith(encoded_prefix):
|
727
|
+
# Avoid double encoding the script
|
728
|
+
cmd_parts = cmd.split(" ")
|
729
|
+
else:
|
730
|
+
cmd_parts = self._shell._encode_script(cmd, as_list=True, strict_mode=False, preserve_rc=False)
|
775
731
|
|
776
732
|
# TODO: display something meaningful here
|
777
733
|
display.vvv("EXEC (via pipeline wrapper)")
|
@@ -784,7 +740,15 @@ class Connection(ConnectionBase):
|
|
784
740
|
return self._winrm_exec(cmd_parts[0], cmd_parts[1:], from_exec=True, stdin_iterator=stdin_iterator)
|
785
741
|
|
786
742
|
# FUTURE: determine buffer size at runtime via remote winrm config?
|
787
|
-
def _put_file_stdin_iterator(
|
743
|
+
def _put_file_stdin_iterator(
|
744
|
+
self,
|
745
|
+
initial_stdin: bytes,
|
746
|
+
in_path: str,
|
747
|
+
out_path: str,
|
748
|
+
buffer_size: int = 250000,
|
749
|
+
) -> t.Iterable[tuple[bytes, bool]]:
|
750
|
+
yield initial_stdin, False
|
751
|
+
|
788
752
|
in_size = os.path.getsize(to_bytes(in_path, errors='surrogate_or_strict'))
|
789
753
|
offset = 0
|
790
754
|
with open(to_bytes(in_path, errors='surrogate_or_strict'), 'rb') as in_file:
|
@@ -806,40 +770,16 @@ class Connection(ConnectionBase):
|
|
806
770
|
if not os.path.exists(to_bytes(in_path, errors='surrogate_or_strict')):
|
807
771
|
raise AnsibleFileNotFound('file or module does not exist: "%s"' % to_native(in_path))
|
808
772
|
|
809
|
-
|
810
|
-
|
811
|
-
|
812
|
-
|
813
|
-
$DebugPreference = "Continue"
|
814
|
-
$ErrorActionPreference = "Stop"
|
815
|
-
Set-StrictMode -Version 2
|
816
|
-
|
817
|
-
$fd = [System.IO.File]::Create($path)
|
818
|
-
|
819
|
-
$sha1 = [System.Security.Cryptography.SHA1CryptoServiceProvider]::Create()
|
820
|
-
|
821
|
-
$bytes = @() #initialize for empty file case
|
822
|
-
}}
|
823
|
-
process {{
|
824
|
-
$bytes = [System.Convert]::FromBase64String($input)
|
825
|
-
$sha1.TransformBlock($bytes, 0, $bytes.Length, $bytes, 0) | Out-Null
|
826
|
-
$fd.Write($bytes, 0, $bytes.Length)
|
827
|
-
}}
|
828
|
-
end {{
|
829
|
-
$sha1.TransformFinalBlock($bytes, 0, 0) | Out-Null
|
830
|
-
|
831
|
-
$hash = [System.BitConverter]::ToString($sha1.Hash).Replace("-", "").ToLowerInvariant()
|
832
|
-
|
833
|
-
$fd.Close()
|
834
|
-
|
835
|
-
Write-Output "{{""sha1"":""$hash""}}"
|
836
|
-
}}
|
837
|
-
'''
|
838
|
-
|
839
|
-
script = script_template.format(self._shell._escape(out_path))
|
840
|
-
cmd_parts = self._shell._encode_script(script, as_list=True, strict_mode=False, preserve_rc=False)
|
773
|
+
copy_script, copy_script_stdin = _bootstrap_powershell_script('winrm_put_file.ps1', {
|
774
|
+
'Path': out_path,
|
775
|
+
}, has_input=True)
|
776
|
+
cmd_parts = self._shell._encode_script(copy_script, as_list=True, strict_mode=False, preserve_rc=False)
|
841
777
|
|
842
|
-
status_code, b_stdout, b_stderr = self._winrm_exec(
|
778
|
+
status_code, b_stdout, b_stderr = self._winrm_exec(
|
779
|
+
cmd_parts[0],
|
780
|
+
cmd_parts[1:],
|
781
|
+
stdin_iterator=self._put_file_stdin_iterator(copy_script_stdin, in_path, out_path),
|
782
|
+
)
|
843
783
|
stdout = to_text(b_stdout)
|
844
784
|
stderr = to_text(b_stderr)
|
845
785
|
|
@@ -873,36 +813,14 @@ class Connection(ConnectionBase):
|
|
873
813
|
offset = 0
|
874
814
|
while True:
|
875
815
|
try:
|
876
|
-
script = ''
|
877
|
-
|
878
|
-
|
879
|
-
|
880
|
-
|
881
|
-
$offset = %(offset)d
|
882
|
-
|
883
|
-
$stream = New-Object -TypeName IO.FileStream($path, [IO.FileMode]::Open, [IO.FileAccess]::Read, [IO.FileShare]::ReadWrite)
|
884
|
-
$stream.Seek($offset, [System.IO.SeekOrigin]::Begin) > $null
|
885
|
-
$buffer = New-Object -TypeName byte[] $buffer_size
|
886
|
-
$bytes_read = $stream.Read($buffer, 0, $buffer_size)
|
887
|
-
if ($bytes_read -gt 0) {
|
888
|
-
$bytes = $buffer[0..($bytes_read - 1)]
|
889
|
-
[System.Convert]::ToBase64String($bytes)
|
890
|
-
}
|
891
|
-
$stream.Close() > $null
|
892
|
-
}
|
893
|
-
ElseIf (Test-Path -LiteralPath $path -PathType Container)
|
894
|
-
{
|
895
|
-
Write-Host "[DIR]";
|
896
|
-
}
|
897
|
-
Else
|
898
|
-
{
|
899
|
-
Write-Error "$path does not exist";
|
900
|
-
Exit 1;
|
901
|
-
}
|
902
|
-
''' % dict(buffer_size=buffer_size, path=self._shell._escape(in_path), offset=offset)
|
816
|
+
script, in_data = _bootstrap_powershell_script('winrm_fetch_file.ps1', {
|
817
|
+
'Path': in_path,
|
818
|
+
'BufferSize': buffer_size,
|
819
|
+
'Offset': offset,
|
820
|
+
})
|
903
821
|
display.vvvvv('WINRM FETCH "%s" to "%s" (offset=%d)' % (in_path, out_path, offset), host=self._winrm_host)
|
904
822
|
cmd_parts = self._shell._encode_script(script, as_list=True, preserve_rc=False)
|
905
|
-
status_code, b_stdout, b_stderr = self._winrm_exec(cmd_parts[0], cmd_parts[1:])
|
823
|
+
status_code, b_stdout, b_stderr = self._winrm_exec(cmd_parts[0], cmd_parts[1:], stdin_iterator=self._wrapper_payload_stream(in_data))
|
906
824
|
stdout = to_text(b_stdout)
|
907
825
|
stderr = to_text(b_stderr)
|
908
826
|
|
@@ -7,7 +7,7 @@ from __future__ import annotations
|
|
7
7
|
class ModuleDocFragment(object):
|
8
8
|
|
9
9
|
# Standard documentation fragment
|
10
|
-
DOCUMENTATION = r
|
10
|
+
DOCUMENTATION = r"""
|
11
11
|
attributes:
|
12
12
|
check_mode:
|
13
13
|
description: Can run in check_mode and return changed status prediction without modifying target, if not supported the action will be skipped.
|
@@ -16,17 +16,17 @@ attributes:
|
|
16
16
|
platform:
|
17
17
|
description: Target OS/families that can be operated against
|
18
18
|
support: N/A
|
19
|
-
|
19
|
+
"""
|
20
20
|
|
21
|
-
ACTIONGROUPS = r
|
21
|
+
ACTIONGROUPS = r"""
|
22
22
|
attributes:
|
23
23
|
action_group:
|
24
24
|
description: Action is part of action_group(s), for convenient setting of module_defaults.
|
25
25
|
support: N/A
|
26
26
|
membership: []
|
27
|
-
|
27
|
+
"""
|
28
28
|
|
29
|
-
CONN = r
|
29
|
+
CONN = r"""
|
30
30
|
attributes:
|
31
31
|
become:
|
32
32
|
description: Is usable alongside become keywords
|
@@ -34,23 +34,23 @@ attributes:
|
|
34
34
|
description: Uses the target's configured connection information to execute code on it
|
35
35
|
delegation:
|
36
36
|
description: Can be used in conjunction with delegate_to and related keywords
|
37
|
-
|
37
|
+
"""
|
38
38
|
|
39
|
-
FACTS = r
|
39
|
+
FACTS = r"""
|
40
40
|
attributes:
|
41
41
|
facts:
|
42
42
|
description: Action returns an C(ansible_facts) dictionary that will update existing host facts
|
43
|
-
|
43
|
+
"""
|
44
44
|
|
45
|
-
FILES = r
|
45
|
+
FILES = r"""
|
46
46
|
attributes:
|
47
47
|
safe_file_operations:
|
48
48
|
description: Uses Ansible's strict file operation functions to ensure proper permissions and avoid data corruption
|
49
49
|
vault:
|
50
50
|
description: Can automatically decrypt Ansible vaulted files
|
51
|
-
|
51
|
+
"""
|
52
52
|
|
53
|
-
FLOW = r
|
53
|
+
FLOW = r"""
|
54
54
|
attributes:
|
55
55
|
action:
|
56
56
|
description: Indicates this has a corresponding action plugin so some parts of the options can be executed on the controller
|
@@ -62,9 +62,9 @@ attributes:
|
|
62
62
|
throttle and other loop considerations
|
63
63
|
- Conditionals will work as if C(run_once) is being used, variables used will be from the first available host
|
64
64
|
- This action will not work normally outside of lockstep strategies
|
65
|
-
|
66
|
-
RAW = r
|
65
|
+
"""
|
66
|
+
RAW = r"""
|
67
67
|
attributes:
|
68
68
|
raw:
|
69
69
|
description: Indicates if an action takes a 'raw' or 'free form' string as an option and has it's own special parsing of it
|
70
|
-
|
70
|
+
"""
|
@@ -8,7 +8,7 @@ from __future__ import annotations
|
|
8
8
|
class ModuleDocFragment(object):
|
9
9
|
|
10
10
|
# requires action_common
|
11
|
-
DOCUMENTATION = r
|
11
|
+
DOCUMENTATION = r"""
|
12
12
|
attributes:
|
13
13
|
async:
|
14
14
|
support: none
|
@@ -33,10 +33,10 @@ attributes:
|
|
33
33
|
tags:
|
34
34
|
description: Allows for the 'tags' keyword to control the selection of this action for execution
|
35
35
|
support: full
|
36
|
-
|
36
|
+
"""
|
37
37
|
|
38
38
|
# also requires core above
|
39
|
-
IMPORT = r
|
39
|
+
IMPORT = r"""
|
40
40
|
attributes:
|
41
41
|
action:
|
42
42
|
details: While this action executes locally on the controller it is not governed by an action plugin
|
@@ -59,9 +59,9 @@ attributes:
|
|
59
59
|
support: none
|
60
60
|
until:
|
61
61
|
support: none
|
62
|
-
|
62
|
+
"""
|
63
63
|
# also requires core above
|
64
|
-
INCLUDE = r
|
64
|
+
INCLUDE = r"""
|
65
65
|
attributes:
|
66
66
|
action:
|
67
67
|
details: While this action executes locally on the controller it is not governed by an action plugin
|
@@ -76,4 +76,4 @@ attributes:
|
|
76
76
|
tags:
|
77
77
|
details: Tags are interpreted by this action but are not automatically inherited by the include tasks, see C(apply)
|
78
78
|
support: partial
|
79
|
-
|
79
|
+
"""
|
@@ -8,7 +8,7 @@ from __future__ import annotations
|
|
8
8
|
class ModuleDocFragment(object):
|
9
9
|
|
10
10
|
# Standard documentation fragment
|
11
|
-
DOCUMENTATION = r
|
11
|
+
DOCUMENTATION = r"""
|
12
12
|
options:
|
13
13
|
backup:
|
14
14
|
description:
|
@@ -16,4 +16,4 @@ options:
|
|
16
16
|
the original file back if you somehow clobbered it incorrectly.
|
17
17
|
type: bool
|
18
18
|
default: no
|
19
|
-
|
19
|
+
"""
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# Copyright (c) 2024 ShIRann Chen <shirannx@gmail.com>
|
2
|
+
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
3
|
+
from __future__ import annotations
|
4
|
+
|
5
|
+
|
6
|
+
class ModuleDocFragment(object):
|
7
|
+
|
8
|
+
DOCUMENTATION = r"""
|
9
|
+
options:
|
10
|
+
checksum_algorithm:
|
11
|
+
description:
|
12
|
+
- Algorithm to determine checksum of file.
|
13
|
+
- Will throw an error if the host is unable to use specified algorithm.
|
14
|
+
- The remote host has to support the hashing method specified, V(md5)
|
15
|
+
can be unavailable if the host is FIPS-140 compliant.
|
16
|
+
- Availability might be restricted by the target system, for example FIPS systems won't allow md5 use
|
17
|
+
type: str
|
18
|
+
choices: [ md5, sha1, sha224, sha256, sha384, sha512 ]
|
19
|
+
default: sha1
|
20
|
+
aliases: [ checksum, checksum_algo ]
|
21
|
+
version_added: "2.0"
|
22
|
+
get_checksum:
|
23
|
+
description:
|
24
|
+
- Whether to return a checksum of the file.
|
25
|
+
type: bool
|
26
|
+
default: yes
|
27
|
+
"""
|
@@ -7,7 +7,7 @@ from __future__ import annotations
|
|
7
7
|
|
8
8
|
class ModuleDocFragment(object):
|
9
9
|
|
10
|
-
DOCUMENTATION = r
|
10
|
+
DOCUMENTATION = r"""
|
11
11
|
options:
|
12
12
|
strict:
|
13
13
|
description:
|
@@ -79,4 +79,8 @@ options:
|
|
79
79
|
type: boolean
|
80
80
|
default: True
|
81
81
|
version_added: '2.11'
|
82
|
-
|
82
|
+
notes:
|
83
|
+
- Inventories are not finalized at this stage, so the auto populated C(all) and C(ungrouped) groups will
|
84
|
+
only reflect what previous inventory sources explicitly added to them.
|
85
|
+
- Runtime 'magic variables' are not available during inventory construction. For example, C(groups) and C(hostvars) do not exist yet.
|
86
|
+
"""
|
@@ -8,7 +8,7 @@ from __future__ import annotations
|
|
8
8
|
class ModuleDocFragment(object):
|
9
9
|
|
10
10
|
# Standard files documentation fragment
|
11
|
-
DOCUMENTATION = r
|
11
|
+
DOCUMENTATION = r"""
|
12
12
|
options:
|
13
13
|
decrypt:
|
14
14
|
description:
|
@@ -16,4 +16,4 @@ options:
|
|
16
16
|
type: bool
|
17
17
|
default: yes
|
18
18
|
version_added: '2.4'
|
19
|
-
|
19
|
+
"""
|
@@ -7,7 +7,7 @@ from __future__ import annotations
|
|
7
7
|
|
8
8
|
class ModuleDocFragment(object):
|
9
9
|
|
10
|
-
DOCUMENTATION = r
|
10
|
+
DOCUMENTATION = r"""
|
11
11
|
options:
|
12
12
|
display_skipped_hosts:
|
13
13
|
name: Show skipped hosts
|
@@ -89,4 +89,4 @@ class ModuleDocFragment(object):
|
|
89
89
|
- key: show_task_path_on_failure
|
90
90
|
section: defaults
|
91
91
|
version_added: '2.11'
|
92
|
-
|
92
|
+
"""
|
@@ -11,7 +11,7 @@ class ModuleDocFragment(object):
|
|
11
11
|
|
12
12
|
# Note: mode is overridden by the copy and template modules so if you change the description
|
13
13
|
# here, you should also change it there.
|
14
|
-
DOCUMENTATION = r
|
14
|
+
DOCUMENTATION = r"""
|
15
15
|
options:
|
16
16
|
mode:
|
17
17
|
description:
|
@@ -88,4 +88,4 @@ options:
|
|
88
88
|
type: str
|
89
89
|
aliases: [ attr ]
|
90
90
|
version_added: '2.3'
|
91
|
-
|
91
|
+
"""
|
@@ -8,7 +8,7 @@ from __future__ import annotations
|
|
8
8
|
class ModuleDocFragment(object):
|
9
9
|
|
10
10
|
# inventory cache
|
11
|
-
DOCUMENTATION = r
|
11
|
+
DOCUMENTATION = r"""
|
12
12
|
options:
|
13
13
|
cache:
|
14
14
|
description:
|
@@ -70,4 +70,4 @@ options:
|
|
70
70
|
key: fact_caching_prefix
|
71
71
|
- section: inventory
|
72
72
|
key: cache_prefix
|
73
|
-
|
73
|
+
"""
|
@@ -7,7 +7,7 @@ from __future__ import annotations
|
|
7
7
|
|
8
8
|
class ModuleDocFragment(object):
|
9
9
|
|
10
|
-
DOCUMENTATION = r
|
10
|
+
DOCUMENTATION = r"""
|
11
11
|
options:
|
12
12
|
result_format:
|
13
13
|
name: Format of the task result
|
@@ -46,4 +46,4 @@ class ModuleDocFragment(object):
|
|
46
46
|
- key: callback_format_pretty
|
47
47
|
section: defaults
|
48
48
|
version_added: '2.13'
|
49
|
-
|
49
|
+
"""
|
@@ -7,7 +7,7 @@ from __future__ import annotations
|
|
7
7
|
|
8
8
|
class ModuleDocFragment(object):
|
9
9
|
# Standard documentation fragment
|
10
|
-
RETURN = r
|
10
|
+
RETURN = r"""
|
11
11
|
changed:
|
12
12
|
description: Whether the module affected changes on the target.
|
13
13
|
returned: always
|
@@ -38,4 +38,4 @@ exception:
|
|
38
38
|
returned: on some errors
|
39
39
|
type: str
|
40
40
|
sample: Unknown error
|
41
|
-
|
41
|
+
"""
|
@@ -9,11 +9,11 @@ from __future__ import annotations
|
|
9
9
|
class ModuleDocFragment(object):
|
10
10
|
|
11
11
|
# Standard template documentation fragment, use by template and win_template.
|
12
|
-
DOCUMENTATION = r
|
12
|
+
DOCUMENTATION = r"""
|
13
13
|
description:
|
14
|
-
- Templates are processed by the L(Jinja2 templating language,
|
14
|
+
- Templates are processed by the L(Jinja2 templating language,https://jinja.palletsprojects.com/en/stable/).
|
15
15
|
- Documentation on the template formatting can be found in the
|
16
|
-
L(Template Designer Documentation,
|
16
|
+
L(Template Designer Documentation,https://jinja.palletsprojects.com/en/stable/templates/).
|
17
17
|
- Additional variables listed below can be used in templates.
|
18
18
|
- C(ansible_managed) (configurable via the C(defaults) section of C(ansible.cfg)) contains a string which can be used to
|
19
19
|
describe the template name, host, modification time of the template file and the owner uid.
|
@@ -117,4 +117,4 @@ notes:
|
|
117
117
|
This is the best way to prevent evaluation of things that look like, but should not be Jinja2.
|
118
118
|
- To find Byte Order Marks in files, use C(Format-Hex <file> -Count 16) on Windows, and use C(od -a -t x1 -N 16 <file>)
|
119
119
|
on Linux.
|
120
|
-
|
120
|
+
"""
|
@@ -8,7 +8,7 @@ from __future__ import annotations
|
|
8
8
|
class ModuleDocFragment(object):
|
9
9
|
|
10
10
|
# Standard files documentation fragment
|
11
|
-
DOCUMENTATION = r
|
11
|
+
DOCUMENTATION = r"""
|
12
12
|
options:
|
13
13
|
url:
|
14
14
|
description:
|
@@ -71,4 +71,20 @@ options:
|
|
71
71
|
type: bool
|
72
72
|
default: no
|
73
73
|
version_added: '2.11'
|
74
|
+
"""
|
75
|
+
|
76
|
+
URL_REDIRECT = r'''
|
77
|
+
options:
|
78
|
+
follow_redirects:
|
79
|
+
description:
|
80
|
+
- Whether or not the URI module should follow redirects.
|
81
|
+
type: str
|
82
|
+
default: safe
|
83
|
+
choices:
|
84
|
+
all: Will follow all redirects.
|
85
|
+
none: Will not follow any redirects.
|
86
|
+
safe: Only redirects doing GET or HEAD requests will be followed.
|
87
|
+
urllib2: Defer to urllib2 behavior (As of writing this follows HTTP redirects).
|
88
|
+
'no': (DEPRECATED, removed in 2.22) alias of V(none).
|
89
|
+
'yes': (DEPRECATED, removed in 2.22) alias of V(all).
|
74
90
|
'''
|
@@ -9,7 +9,7 @@ from __future__ import annotations
|
|
9
9
|
class ModuleDocFragment:
|
10
10
|
|
11
11
|
# Common options for Ansible.ModuleUtils.WebRequest
|
12
|
-
DOCUMENTATION = r
|
12
|
+
DOCUMENTATION = r"""
|
13
13
|
options:
|
14
14
|
method:
|
15
15
|
description:
|
@@ -145,4 +145,4 @@ options:
|
|
145
145
|
type: bool
|
146
146
|
seealso:
|
147
147
|
- module: community.windows.win_inet_proxy
|
148
|
-
|
148
|
+
"""
|
@@ -7,7 +7,7 @@ from __future__ import annotations
|
|
7
7
|
|
8
8
|
class ModuleDocFragment(object):
|
9
9
|
# Standard documentation fragment
|
10
|
-
DOCUMENTATION = r
|
10
|
+
DOCUMENTATION = r"""
|
11
11
|
options:
|
12
12
|
validate:
|
13
13
|
description:
|
@@ -17,4 +17,4 @@ options:
|
|
17
17
|
- For an example on how to handle more complex validation than what this
|
18
18
|
option provides, see R(handling complex validation,complex_configuration_validation).
|
19
19
|
type: str
|
20
|
-
|
20
|
+
"""
|
@@ -8,7 +8,7 @@ from __future__ import annotations
|
|
8
8
|
|
9
9
|
class ModuleDocFragment(object):
|
10
10
|
|
11
|
-
DOCUMENTATION = r
|
11
|
+
DOCUMENTATION = r"""
|
12
12
|
options:
|
13
13
|
stage:
|
14
14
|
description:
|
@@ -20,4 +20,4 @@ options:
|
|
20
20
|
choices: ['all', 'task', 'inventory']
|
21
21
|
version_added: "2.10"
|
22
22
|
type: str
|
23
|
-
|
23
|
+
"""
|