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
ansible/modules/uri.py
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
from __future__ import annotations
|
7
7
|
|
8
8
|
|
9
|
-
DOCUMENTATION = r
|
9
|
+
DOCUMENTATION = r"""
|
10
10
|
---
|
11
11
|
module: uri
|
12
12
|
short_description: Interacts with webservices
|
@@ -61,6 +61,7 @@ options:
|
|
61
61
|
or list of tuples into an C(application/x-www-form-urlencoded) string. (Added in v2.7)
|
62
62
|
- If O(body_format) is set to V(form-multipart) it will convert a dictionary
|
63
63
|
into C(multipart/form-multipart) body. (Added in v2.10)
|
64
|
+
- If C(body_format) is set to V(form-multipart) the option 'multipart_encoding' allows to change multipart file encoding. (Added in v2.19)
|
64
65
|
type: raw
|
65
66
|
body_format:
|
66
67
|
description:
|
@@ -105,18 +106,6 @@ options:
|
|
105
106
|
- The webservice bans or rate-limits clients that cause any HTTP 401 errors.
|
106
107
|
type: bool
|
107
108
|
default: no
|
108
|
-
follow_redirects:
|
109
|
-
description:
|
110
|
-
- Whether or not the URI module should follow redirects.
|
111
|
-
type: str
|
112
|
-
default: safe
|
113
|
-
choices:
|
114
|
-
all: Will follow all redirects.
|
115
|
-
none: Will not follow any redirects.
|
116
|
-
safe: Only redirects doing GET or HEAD requests will be followed.
|
117
|
-
urllib2: Defer to urllib2 behavior (As of writing this follows HTTP redirects).
|
118
|
-
'no': (DEPRECATED, removed in 2.22) alias of V(none).
|
119
|
-
'yes': (DEPRECATED, removed in 2.22) alias of V(all).
|
120
109
|
creates:
|
121
110
|
description:
|
122
111
|
- A filename, when it already exists, this step will not be run.
|
@@ -234,6 +223,7 @@ options:
|
|
234
223
|
extends_documentation_fragment:
|
235
224
|
- action_common_attributes
|
236
225
|
- files
|
226
|
+
- url.url_redirect
|
237
227
|
attributes:
|
238
228
|
check_mode:
|
239
229
|
support: none
|
@@ -250,9 +240,9 @@ seealso:
|
|
250
240
|
- module: ansible.windows.win_uri
|
251
241
|
author:
|
252
242
|
- Romeo Theriault (@romeotheriault)
|
253
|
-
|
243
|
+
"""
|
254
244
|
|
255
|
-
EXAMPLES = r
|
245
|
+
EXAMPLES = r"""
|
256
246
|
- name: Check that you can connect (GET) to a page and it returns a status 200
|
257
247
|
ansible.builtin.uri:
|
258
248
|
url: http://www.example.com
|
@@ -262,7 +252,7 @@ EXAMPLES = r'''
|
|
262
252
|
url: http://www.example.com
|
263
253
|
return_content: true
|
264
254
|
register: this
|
265
|
-
failed_when: this is failed or
|
255
|
+
failed_when: "this is failed or 'AWESOME' not in this.content"
|
266
256
|
|
267
257
|
- name: Create a JIRA issue
|
268
258
|
ansible.builtin.uri:
|
@@ -308,10 +298,12 @@ EXAMPLES = r'''
|
|
308
298
|
file1:
|
309
299
|
filename: /bin/true
|
310
300
|
mime_type: application/octet-stream
|
301
|
+
multipart_encoding: base64
|
311
302
|
file2:
|
312
303
|
content: text based file content
|
313
304
|
filename: fake.txt
|
314
305
|
mime_type: text/plain
|
306
|
+
multipart_encoding: 7or8bit
|
315
307
|
text_form_field: value
|
316
308
|
|
317
309
|
- name: Connect to website using a previously stored cookie
|
@@ -387,9 +379,9 @@ EXAMPLES = r'''
|
|
387
379
|
uri:
|
388
380
|
url: https://example.org
|
389
381
|
ciphers: '@SECLEVEL=2:ECDH+AESGCM:ECDH+CHACHA20:ECDH+AES:DHE+AES:!aNULL:!eNULL:!aDSS:!SHA1:!AESCCM'
|
390
|
-
|
382
|
+
"""
|
391
383
|
|
392
|
-
RETURN = r
|
384
|
+
RETURN = r"""
|
393
385
|
# The return information includes all the HTTP headers in lower-case.
|
394
386
|
content:
|
395
387
|
description: The response body content.
|
@@ -438,21 +430,29 @@ url:
|
|
438
430
|
returned: always
|
439
431
|
type: str
|
440
432
|
sample: https://www.ansible.com/
|
441
|
-
|
433
|
+
"""
|
442
434
|
|
435
|
+
import http
|
443
436
|
import json
|
444
437
|
import os
|
445
438
|
import re
|
446
439
|
import shutil
|
447
440
|
import tempfile
|
441
|
+
from datetime import datetime, timezone
|
448
442
|
|
449
443
|
from ansible.module_utils.basic import AnsibleModule, sanitize_keys
|
450
444
|
from ansible.module_utils.six import binary_type, iteritems, string_types
|
451
445
|
from ansible.module_utils.six.moves.urllib.parse import urlencode, urljoin
|
452
446
|
from ansible.module_utils.common.text.converters import to_native, to_text
|
453
|
-
from ansible.module_utils.compat.datetime import utcnow, utcfromtimestamp
|
454
447
|
from ansible.module_utils.six.moves.collections_abc import Mapping, Sequence
|
455
|
-
from ansible.module_utils.urls import
|
448
|
+
from ansible.module_utils.urls import (
|
449
|
+
fetch_url,
|
450
|
+
get_response_filename,
|
451
|
+
parse_content_type,
|
452
|
+
prepare_multipart,
|
453
|
+
url_argument_spec,
|
454
|
+
url_redirect_argument_spec,
|
455
|
+
)
|
456
456
|
|
457
457
|
JSON_CANDIDATES = {'json', 'javascript'}
|
458
458
|
|
@@ -506,7 +506,7 @@ def write_file(module, dest, content, resp):
|
|
506
506
|
|
507
507
|
|
508
508
|
def kv_list(data):
|
509
|
-
|
509
|
+
""" Convert data into a list of key-value tuples """
|
510
510
|
if data is None:
|
511
511
|
return None
|
512
512
|
|
@@ -520,7 +520,7 @@ def kv_list(data):
|
|
520
520
|
|
521
521
|
|
522
522
|
def form_urlencoded(body):
|
523
|
-
|
523
|
+
""" Convert data into a form-urlencoded string """
|
524
524
|
if isinstance(body, string_types):
|
525
525
|
return body
|
526
526
|
|
@@ -558,7 +558,10 @@ def uri(module, url, dest, body, body_format, method, headers, socket_timeout, c
|
|
558
558
|
kwargs = {}
|
559
559
|
if dest is not None and os.path.isfile(dest):
|
560
560
|
# if destination file already exist, only download if file newer
|
561
|
-
kwargs['last_mod_time'] =
|
561
|
+
kwargs['last_mod_time'] = datetime.fromtimestamp(
|
562
|
+
os.path.getmtime(dest),
|
563
|
+
tz=timezone.utc,
|
564
|
+
)
|
562
565
|
|
563
566
|
if module.params.get('follow_redirects') in ('no', 'yes'):
|
564
567
|
module.deprecate(
|
@@ -584,6 +587,8 @@ def uri(module, url, dest, body, body_format, method, headers, socket_timeout, c
|
|
584
587
|
|
585
588
|
def main():
|
586
589
|
argument_spec = url_argument_spec()
|
590
|
+
argument_spec['url']['required'] = True
|
591
|
+
argument_spec.update(url_redirect_argument_spec())
|
587
592
|
argument_spec.update(
|
588
593
|
dest=dict(type='path'),
|
589
594
|
url_username=dict(type='str', aliases=['user']),
|
@@ -670,12 +675,12 @@ def main():
|
|
670
675
|
module.exit_json(stdout="skipped, since '%s' does not exist" % removes, changed=False)
|
671
676
|
|
672
677
|
# Make the request
|
673
|
-
start =
|
678
|
+
start = datetime.now(timezone.utc)
|
674
679
|
r, info = uri(module, url, dest, body, body_format, method,
|
675
680
|
dict_headers, socket_timeout, ca_path, unredirected_headers,
|
676
681
|
decompress, ciphers, use_netrc)
|
677
682
|
|
678
|
-
elapsed = (
|
683
|
+
elapsed = (datetime.now(timezone.utc) - start).seconds
|
679
684
|
|
680
685
|
if r and dest is not None and os.path.isdir(dest):
|
681
686
|
filename = get_response_filename(r) or 'index.html'
|
@@ -711,6 +716,8 @@ def main():
|
|
711
716
|
# there was no content, but the error read()
|
712
717
|
# may have been stored in the info as 'body'
|
713
718
|
content = info.pop('body', b'')
|
719
|
+
except http.client.HTTPException as http_err:
|
720
|
+
module.fail_json(msg=f"HTTP Error while fetching {url}: {to_native(http_err)}")
|
714
721
|
elif r:
|
715
722
|
content = r
|
716
723
|
else:
|
ansible/modules/user.py
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
from __future__ import annotations
|
7
7
|
|
8
8
|
|
9
|
-
DOCUMENTATION = r
|
9
|
+
DOCUMENTATION = r"""
|
10
10
|
module: user
|
11
11
|
version_added: "0.2"
|
12
12
|
short_description: Manage user accounts
|
@@ -319,9 +319,9 @@ seealso:
|
|
319
319
|
- module: ansible.windows.win_user
|
320
320
|
author:
|
321
321
|
- Stephen Fromm (@sfromm)
|
322
|
-
|
322
|
+
"""
|
323
323
|
|
324
|
-
EXAMPLES = r
|
324
|
+
EXAMPLES = r"""
|
325
325
|
- name: Add the user 'johnd' with a specific uid and a primary group of 'admin'
|
326
326
|
ansible.builtin.user:
|
327
327
|
name: johnd
|
@@ -385,9 +385,9 @@ EXAMPLES = r'''
|
|
385
385
|
ansible.builtin.user:
|
386
386
|
name: jimholden2016
|
387
387
|
password_expire_account_disable: 15
|
388
|
-
|
388
|
+
"""
|
389
389
|
|
390
|
-
RETURN = r
|
390
|
+
RETURN = r"""
|
391
391
|
append:
|
392
392
|
description: Whether or not to append the user to groups.
|
393
393
|
returned: When O(state) is V(present) and the user exists
|
@@ -486,10 +486,11 @@ uid:
|
|
486
486
|
returned: When O(uid) is passed to the module
|
487
487
|
type: int
|
488
488
|
sample: 1044
|
489
|
-
|
489
|
+
"""
|
490
490
|
|
491
491
|
|
492
492
|
import ctypes.util
|
493
|
+
from datetime import datetime
|
493
494
|
import grp
|
494
495
|
import calendar
|
495
496
|
import os
|
@@ -502,13 +503,13 @@ import socket
|
|
502
503
|
import subprocess
|
503
504
|
import time
|
504
505
|
import math
|
506
|
+
import typing as t
|
505
507
|
|
506
508
|
from ansible.module_utils import distro
|
507
509
|
from ansible.module_utils.common.text.converters import to_bytes, to_native, to_text
|
508
510
|
from ansible.module_utils.basic import AnsibleModule
|
509
511
|
from ansible.module_utils.common.locale import get_best_parsable_locale
|
510
512
|
from ansible.module_utils.common.sys_info import get_platform_subclass
|
511
|
-
import ansible.module_utils.compat.typing as t
|
512
513
|
|
513
514
|
|
514
515
|
class StructSpwdType(ctypes.Structure):
|
@@ -1091,7 +1092,7 @@ class User(object):
|
|
1091
1092
|
return groups
|
1092
1093
|
|
1093
1094
|
def user_group_membership(self, exclude_primary=True):
|
1094
|
-
|
1095
|
+
""" Return a list of groups the user belongs to """
|
1095
1096
|
groups = []
|
1096
1097
|
info = self.get_pwd_info()
|
1097
1098
|
for group in grp.getgrall():
|
@@ -1279,11 +1280,16 @@ class User(object):
|
|
1279
1280
|
env=env)
|
1280
1281
|
out_buffer = b''
|
1281
1282
|
err_buffer = b''
|
1283
|
+
first_prompt = b'Enter passphrase'
|
1284
|
+
second_prompt = b'Enter same passphrase again'
|
1285
|
+
prompt = first_prompt
|
1286
|
+
start = datetime.now()
|
1287
|
+
timeout = 900
|
1282
1288
|
while p.poll() is None:
|
1283
1289
|
r_list = select.select([master_out_fd, master_err_fd], [], [], 1)[0]
|
1284
|
-
|
1285
|
-
|
1286
|
-
|
1290
|
+
now = datetime.now()
|
1291
|
+
if (now - start).seconds > timeout:
|
1292
|
+
return (1, '', f'Timeout after {timeout} while reading passphrase for SSH key')
|
1287
1293
|
for fd in r_list:
|
1288
1294
|
if fd == master_out_fd:
|
1289
1295
|
chunk = os.read(master_out_fd, 10240)
|
@@ -1370,16 +1376,24 @@ class User(object):
|
|
1370
1376
|
self.module.exit_json(failed=True, msg="%s" % to_native(e))
|
1371
1377
|
# get umask from /etc/login.defs and set correct home mode
|
1372
1378
|
if os.path.exists(self.LOGIN_DEFS):
|
1373
|
-
|
1374
|
-
|
1375
|
-
|
1376
|
-
|
1377
|
-
|
1379
|
+
# fallback if neither HOME_MODE nor UMASK are set;
|
1380
|
+
# follow behaviour of useradd initializing UMASK = 022
|
1381
|
+
mode = 0o755
|
1382
|
+
with open(self.LOGIN_DEFS, 'r') as fh:
|
1383
|
+
for line in fh:
|
1384
|
+
# HOME_MODE has higher precedence as UMASK
|
1385
|
+
match = re.match(r'^HOME_MODE\s+(\d+)$', line)
|
1386
|
+
if match:
|
1387
|
+
mode = int(match.group(1), 8)
|
1388
|
+
break # higher precedence
|
1389
|
+
match = re.match(r'^UMASK\s+(\d+)$', line)
|
1390
|
+
if match:
|
1391
|
+
umask = int(match.group(1), 8)
|
1378
1392
|
mode = 0o777 & ~umask
|
1379
|
-
|
1380
|
-
|
1381
|
-
|
1382
|
-
|
1393
|
+
try:
|
1394
|
+
os.chmod(path, mode)
|
1395
|
+
except OSError as e:
|
1396
|
+
self.module.exit_json(failed=True, msg=to_native(e))
|
1383
1397
|
|
1384
1398
|
def chown_homedir(self, uid, gid, path):
|
1385
1399
|
try:
|
@@ -2436,7 +2450,7 @@ class DarwinUser(User):
|
|
2436
2450
|
return groups
|
2437
2451
|
|
2438
2452
|
def _get_user_property(self, property):
|
2439
|
-
|
2453
|
+
"""Return user PROPERTY as given my dscl(1) read or None if not found."""
|
2440
2454
|
cmd = self._get_dscl()
|
2441
2455
|
cmd += ['-read', '/Users/%s' % self.name, property]
|
2442
2456
|
(rc, out, err) = self.execute_command(cmd, obey_checkmode=False)
|
@@ -2456,10 +2470,10 @@ class DarwinUser(User):
|
|
2456
2470
|
return None
|
2457
2471
|
|
2458
2472
|
def _get_next_uid(self, system=None):
|
2459
|
-
|
2473
|
+
"""
|
2460
2474
|
Return the next available uid. If system=True, then
|
2461
2475
|
uid should be below of 500, if possible.
|
2462
|
-
|
2476
|
+
"""
|
2463
2477
|
cmd = self._get_dscl()
|
2464
2478
|
cmd += ['-list', '/Users', 'UniqueID']
|
2465
2479
|
(rc, out, err) = self.execute_command(cmd, obey_checkmode=False)
|
@@ -2485,10 +2499,10 @@ class DarwinUser(User):
|
|
2485
2499
|
return max_uid + 1
|
2486
2500
|
|
2487
2501
|
def _change_user_password(self):
|
2488
|
-
|
2502
|
+
"""Change password for SELF.NAME against SELF.PASSWORD.
|
2489
2503
|
|
2490
2504
|
Please note that password must be cleartext.
|
2491
|
-
|
2505
|
+
"""
|
2492
2506
|
# some documentation on how is stored passwords on OSX:
|
2493
2507
|
# http://blog.lostpassword.com/2012/07/cracking-mac-os-x-lion-accounts-passwords/
|
2494
2508
|
# http://null-byte.wonderhowto.com/how-to/hack-mac-os-x-lion-passwords-0130036/
|
@@ -2507,7 +2521,7 @@ class DarwinUser(User):
|
|
2507
2521
|
return (rc, out, err)
|
2508
2522
|
|
2509
2523
|
def _make_group_numerical(self):
|
2510
|
-
|
2524
|
+
"""Convert SELF.GROUP to is stringed numerical value suitable for dscl."""
|
2511
2525
|
if self.group is None:
|
2512
2526
|
self.group = 'nogroup'
|
2513
2527
|
try:
|
@@ -2518,8 +2532,8 @@ class DarwinUser(User):
|
|
2518
2532
|
self.group = str(self.group)
|
2519
2533
|
|
2520
2534
|
def __modify_group(self, group, action):
|
2521
|
-
|
2522
|
-
ACTION can be 'add' or 'remove' otherwise 'remove' is assumed.
|
2535
|
+
"""Add or remove SELF.NAME to or from GROUP depending on ACTION.
|
2536
|
+
ACTION can be 'add' or 'remove' otherwise 'remove' is assumed. """
|
2523
2537
|
if action == 'add':
|
2524
2538
|
option = '-a'
|
2525
2539
|
else:
|
@@ -2532,8 +2546,8 @@ class DarwinUser(User):
|
|
2532
2546
|
return (rc, out, err)
|
2533
2547
|
|
2534
2548
|
def _modify_group(self):
|
2535
|
-
|
2536
|
-
ACTION can be 'add' or 'remove' otherwise 'remove' is assumed.
|
2549
|
+
"""Add or remove SELF.NAME to or from GROUP depending on ACTION.
|
2550
|
+
ACTION can be 'add' or 'remove' otherwise 'remove' is assumed. """
|
2537
2551
|
|
2538
2552
|
rc = 0
|
2539
2553
|
out = ''
|
@@ -2564,9 +2578,9 @@ class DarwinUser(User):
|
|
2564
2578
|
return (rc, out, err, changed)
|
2565
2579
|
|
2566
2580
|
def _update_system_user(self):
|
2567
|
-
|
2581
|
+
"""Hide or show user on login window according SELF.SYSTEM.
|
2568
2582
|
|
2569
|
-
Returns 0 if a change has been made, None otherwise.
|
2583
|
+
Returns 0 if a change has been made, None otherwise."""
|
2570
2584
|
|
2571
2585
|
plist_file = '/Library/Preferences/com.apple.loginwindow.plist'
|
2572
2586
|
|
@@ -2605,14 +2619,14 @@ class DarwinUser(User):
|
|
2605
2619
|
return 0
|
2606
2620
|
|
2607
2621
|
def user_exists(self):
|
2608
|
-
|
2622
|
+
"""Check is SELF.NAME is a known user on the system."""
|
2609
2623
|
cmd = self._get_dscl()
|
2610
2624
|
cmd += ['-read', '/Users/%s' % self.name, 'UniqueID']
|
2611
2625
|
(rc, out, err) = self.execute_command(cmd, obey_checkmode=False)
|
2612
2626
|
return rc == 0
|
2613
2627
|
|
2614
2628
|
def remove_user(self):
|
2615
|
-
|
2629
|
+
"""Delete SELF.NAME. If SELF.FORCE is true, remove its home directory."""
|
2616
2630
|
info = self.user_info()
|
2617
2631
|
|
2618
2632
|
cmd = self._get_dscl()
|
@@ -3243,6 +3257,11 @@ class Alpine(BusyBox):
|
|
3243
3257
|
distribution = 'Alpine'
|
3244
3258
|
|
3245
3259
|
|
3260
|
+
class Buildroot(BusyBox):
|
3261
|
+
platform = 'Linux'
|
3262
|
+
distribution = 'Buildroot'
|
3263
|
+
|
3264
|
+
|
3246
3265
|
def main():
|
3247
3266
|
ssh_defaults = dict(
|
3248
3267
|
bits=0,
|
@@ -6,7 +6,7 @@
|
|
6
6
|
from __future__ import annotations
|
7
7
|
|
8
8
|
|
9
|
-
DOCUMENTATION = r
|
9
|
+
DOCUMENTATION = r"""
|
10
10
|
---
|
11
11
|
module: validate_argument_spec
|
12
12
|
short_description: Validate role argument specs.
|
@@ -16,7 +16,8 @@ version_added: "2.11"
|
|
16
16
|
options:
|
17
17
|
argument_spec:
|
18
18
|
description:
|
19
|
-
- A dictionary like AnsibleModule argument_spec.
|
19
|
+
- A dictionary like AnsibleModule argument_spec.
|
20
|
+
- See the C(options) parameter for the R(specification format,role_argument_spec).
|
20
21
|
required: true
|
21
22
|
provided_arguments:
|
22
23
|
description:
|
@@ -46,9 +47,11 @@ attributes:
|
|
46
47
|
support: none
|
47
48
|
platform:
|
48
49
|
platforms: all
|
49
|
-
|
50
|
+
notes:
|
51
|
+
- It is unnecessary to call this module explicitly if the role contains an R(argument spec,role_argument_spec).
|
52
|
+
"""
|
50
53
|
|
51
|
-
EXAMPLES = r
|
54
|
+
EXAMPLES = r"""
|
52
55
|
- name: verify vars needed for this task file are present when included
|
53
56
|
ansible.builtin.validate_argument_spec:
|
54
57
|
argument_spec: '{{ required_data }}'
|
@@ -82,9 +85,9 @@ EXAMPLES = r'''
|
|
82
85
|
vars:
|
83
86
|
stuff: knows
|
84
87
|
but: nobuts!
|
85
|
-
|
88
|
+
"""
|
86
89
|
|
87
|
-
RETURN = r
|
90
|
+
RETURN = r"""
|
88
91
|
argument_errors:
|
89
92
|
description: A list of arg validation errors.
|
90
93
|
returned: failure
|
@@ -114,4 +117,4 @@ validate_args_context:
|
|
114
117
|
type: role
|
115
118
|
path: /home/user/roles/my_role/
|
116
119
|
argument_spec_name: main
|
117
|
-
|
120
|
+
"""
|
ansible/modules/wait_for.py
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
from __future__ import annotations
|
7
7
|
|
8
8
|
|
9
|
-
DOCUMENTATION = r
|
9
|
+
DOCUMENTATION = r"""
|
10
10
|
---
|
11
11
|
module: wait_for
|
12
12
|
short_description: Waits for a condition before continuing
|
@@ -120,9 +120,9 @@ author:
|
|
120
120
|
- Jeroen Hoekx (@jhoekx)
|
121
121
|
- John Jarvis (@jarv)
|
122
122
|
- Andrii Radyk (@AnderEnder)
|
123
|
-
|
123
|
+
"""
|
124
124
|
|
125
|
-
EXAMPLES = r
|
125
|
+
EXAMPLES = r"""
|
126
126
|
- name: Sleep for 300 seconds and continue with play
|
127
127
|
ansible.builtin.wait_for:
|
128
128
|
timeout: 300
|
@@ -200,9 +200,9 @@ EXAMPLES = r'''
|
|
200
200
|
delay: 10
|
201
201
|
timeout: 300
|
202
202
|
delegate_to: localhost
|
203
|
-
|
203
|
+
"""
|
204
204
|
|
205
|
-
RETURN = r
|
205
|
+
RETURN = r"""
|
206
206
|
elapsed:
|
207
207
|
description: The number of seconds that elapsed while waiting
|
208
208
|
returned: always
|
@@ -222,11 +222,10 @@ match_groupdict:
|
|
222
222
|
{
|
223
223
|
'group': 'match'
|
224
224
|
}
|
225
|
-
|
225
|
+
"""
|
226
226
|
|
227
227
|
import binascii
|
228
228
|
import contextlib
|
229
|
-
import datetime
|
230
229
|
import errno
|
231
230
|
import math
|
232
231
|
import mmap
|
@@ -235,12 +234,12 @@ import re
|
|
235
234
|
import select
|
236
235
|
import socket
|
237
236
|
import time
|
238
|
-
|
237
|
+
|
238
|
+
from datetime import datetime, timedelta, timezone
|
239
239
|
|
240
240
|
from ansible.module_utils.basic import AnsibleModule, missing_required_lib
|
241
241
|
from ansible.module_utils.common.sys_info import get_platform_subclass
|
242
242
|
from ansible.module_utils.common.text.converters import to_bytes, to_native
|
243
|
-
from ansible.module_utils.compat.datetime import utcnow
|
244
243
|
|
245
244
|
|
246
245
|
HAS_PSUTIL = False
|
@@ -249,8 +248,8 @@ try:
|
|
249
248
|
import psutil
|
250
249
|
HAS_PSUTIL = True
|
251
250
|
# just because we can import it on Linux doesn't mean we will use it
|
252
|
-
except ImportError:
|
253
|
-
PSUTIL_IMP_ERR =
|
251
|
+
except ImportError as ex:
|
252
|
+
PSUTIL_IMP_ERR = ex
|
254
253
|
|
255
254
|
|
256
255
|
class TCPConnectionInfo(object):
|
@@ -534,7 +533,7 @@ def main():
|
|
534
533
|
except Exception:
|
535
534
|
module.fail_json(msg="unknown active_connection_state (%s) defined" % _connection_state, elapsed=0)
|
536
535
|
|
537
|
-
start =
|
536
|
+
start = datetime.now(timezone.utc)
|
538
537
|
|
539
538
|
if delay:
|
540
539
|
time.sleep(delay)
|
@@ -543,9 +542,9 @@ def main():
|
|
543
542
|
time.sleep(timeout)
|
544
543
|
elif state in ['absent', 'stopped']:
|
545
544
|
# first wait for the stop condition
|
546
|
-
end = start +
|
545
|
+
end = start + timedelta(seconds=timeout)
|
547
546
|
|
548
|
-
while
|
547
|
+
while datetime.now(timezone.utc) < end:
|
549
548
|
if path:
|
550
549
|
try:
|
551
550
|
if not os.access(b_path, os.F_OK):
|
@@ -562,7 +561,7 @@ def main():
|
|
562
561
|
# Conditions not yet met, wait and try again
|
563
562
|
time.sleep(module.params['sleep'])
|
564
563
|
else:
|
565
|
-
elapsed =
|
564
|
+
elapsed = datetime.now(timezone.utc) - start
|
566
565
|
if port:
|
567
566
|
module.fail_json(msg=msg or "Timeout when waiting for %s:%s to stop." % (host, port), elapsed=elapsed.seconds)
|
568
567
|
elif path:
|
@@ -570,15 +569,15 @@ def main():
|
|
570
569
|
|
571
570
|
elif state in ['started', 'present']:
|
572
571
|
# wait for start condition
|
573
|
-
end = start +
|
574
|
-
while
|
572
|
+
end = start + timedelta(seconds=timeout)
|
573
|
+
while datetime.now(timezone.utc) < end:
|
575
574
|
if path:
|
576
575
|
try:
|
577
576
|
os.stat(b_path)
|
578
577
|
except OSError as e:
|
579
578
|
# If anything except file not present, throw an error
|
580
579
|
if e.errno != 2:
|
581
|
-
elapsed =
|
580
|
+
elapsed = datetime.now(timezone.utc) - start
|
582
581
|
module.fail_json(msg=msg or "Failed to stat %s, %s" % (path, e.strerror), elapsed=elapsed.seconds)
|
583
582
|
# file doesn't exist yet, so continue
|
584
583
|
else:
|
@@ -613,9 +612,11 @@ def main():
|
|
613
612
|
except IOError:
|
614
613
|
pass
|
615
614
|
elif port:
|
616
|
-
alt_connect_timeout = math.ceil(
|
615
|
+
alt_connect_timeout = math.ceil(
|
616
|
+
_timedelta_total_seconds(end - datetime.now(timezone.utc)),
|
617
|
+
)
|
617
618
|
try:
|
618
|
-
s = socket.create_connection((host, port), min(connect_timeout, alt_connect_timeout))
|
619
|
+
s = socket.create_connection((host, int(port)), min(connect_timeout, alt_connect_timeout))
|
619
620
|
except Exception:
|
620
621
|
# Failed to connect by connect_timeout. wait and try again
|
621
622
|
pass
|
@@ -624,8 +625,12 @@ def main():
|
|
624
625
|
if b_compiled_search_re:
|
625
626
|
b_data = b''
|
626
627
|
matched = False
|
627
|
-
while
|
628
|
-
max_timeout = math.ceil(
|
628
|
+
while datetime.now(timezone.utc) < end:
|
629
|
+
max_timeout = math.ceil(
|
630
|
+
_timedelta_total_seconds(
|
631
|
+
end - datetime.now(timezone.utc),
|
632
|
+
),
|
633
|
+
)
|
629
634
|
readable = select.select([s], [], [], max_timeout)[0]
|
630
635
|
if not readable:
|
631
636
|
# No new data. Probably means our timeout
|
@@ -669,7 +674,7 @@ def main():
|
|
669
674
|
|
670
675
|
else: # while-else
|
671
676
|
# Timeout expired
|
672
|
-
elapsed =
|
677
|
+
elapsed = datetime.now(timezone.utc) - start
|
673
678
|
if port:
|
674
679
|
if search_regex:
|
675
680
|
module.fail_json(msg=msg or "Timeout when waiting for search string %s in %s:%s" % (search_regex, host, port), elapsed=elapsed.seconds)
|
@@ -683,19 +688,19 @@ def main():
|
|
683
688
|
|
684
689
|
elif state == 'drained':
|
685
690
|
# wait until all active connections are gone
|
686
|
-
end = start +
|
691
|
+
end = start + timedelta(seconds=timeout)
|
687
692
|
tcpconns = TCPConnectionInfo(module)
|
688
|
-
while
|
693
|
+
while datetime.now(timezone.utc) < end:
|
689
694
|
if tcpconns.get_active_connections_count() == 0:
|
690
695
|
break
|
691
696
|
|
692
697
|
# Conditions not yet met, wait and try again
|
693
698
|
time.sleep(module.params['sleep'])
|
694
699
|
else:
|
695
|
-
elapsed =
|
700
|
+
elapsed = datetime.now(timezone.utc) - start
|
696
701
|
module.fail_json(msg=msg or "Timeout when waiting for %s:%s to drain" % (host, port), elapsed=elapsed.seconds)
|
697
702
|
|
698
|
-
elapsed =
|
703
|
+
elapsed = datetime.now(timezone.utc) - start
|
699
704
|
module.exit_json(state=state, port=port, search_regex=search_regex, match_groups=match_groups, match_groupdict=match_groupdict, path=path,
|
700
705
|
elapsed=elapsed.seconds)
|
701
706
|
|
@@ -6,7 +6,7 @@
|
|
6
6
|
from __future__ import annotations
|
7
7
|
|
8
8
|
|
9
|
-
DOCUMENTATION = r
|
9
|
+
DOCUMENTATION = r"""
|
10
10
|
---
|
11
11
|
module: wait_for_connection
|
12
12
|
short_description: Waits until remote system is reachable/usable
|
@@ -62,9 +62,9 @@ seealso:
|
|
62
62
|
- module: community.windows.win_wait_for_process
|
63
63
|
author:
|
64
64
|
- Dag Wieers (@dagwieers)
|
65
|
-
|
65
|
+
"""
|
66
66
|
|
67
|
-
EXAMPLES = r
|
67
|
+
EXAMPLES = r"""
|
68
68
|
- name: Wait 600 seconds for target connection to become reachable/usable
|
69
69
|
ansible.builtin.wait_for_connection:
|
70
70
|
|
@@ -110,12 +110,12 @@ EXAMPLES = r'''
|
|
110
110
|
|
111
111
|
- name: Gather facts for first time
|
112
112
|
ansible.builtin.setup:
|
113
|
-
|
113
|
+
"""
|
114
114
|
|
115
|
-
RETURN = r
|
115
|
+
RETURN = r"""
|
116
116
|
elapsed:
|
117
117
|
description: The number of seconds that elapsed waiting for the connection to appear.
|
118
118
|
returned: always
|
119
119
|
type: float
|
120
120
|
sample: 23.1
|
121
|
-
|
121
|
+
"""
|