ansible-core 2.18.5rc1__py3-none-any.whl → 2.19.0b2__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/_collection_proxy.py +47 -0
- ansible/_internal/_datatag/__init__.py +0 -0
- ansible/_internal/_datatag/_tags.py +130 -0
- ansible/_internal/_datatag/_utils.py +19 -0
- ansible/_internal/_datatag/_wrappers.py +33 -0
- ansible/_internal/_errors/__init__.py +0 -0
- ansible/_internal/_errors/_captured.py +128 -0
- ansible/_internal/_errors/_handler.py +91 -0
- ansible/_internal/_errors/_utils.py +310 -0
- ansible/_internal/_json/__init__.py +203 -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 +197 -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 +345 -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 +159 -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 +62 -53
- 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 +166 -112
- 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 +161 -96
- ansible/executor/stats.py +5 -5
- ansible/executor/task_executor.py +268 -258
- ansible/executor/task_queue_manager.py +124 -90
- ansible/executor/task_result.py +183 -78
- 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 +78 -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 +152 -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/jsonify.py +5 -1
- 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 +43 -335
- 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 +31 -27
- 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 +284 -179
- ansible/plugins/callback/default.py +99 -92
- ansible/plugins/callback/junit.py +44 -39
- ansible/plugins/callback/minimal.py +28 -25
- ansible/plugins/callback/oneline.py +28 -21
- ansible/plugins/callback/tree.py +16 -11
- 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 +225 -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 +159 -184
- ansible/plugins/strategy/debug.py +2 -2
- ansible/plugins/strategy/free.py +16 -31
- ansible/plugins/strategy/host_pinned.py +2 -2
- ansible/plugins/strategy/linear.py +41 -41
- ansible/plugins/terminal/__init__.py +4 -4
- ansible/plugins/test/__init__.py +7 -2
- ansible/plugins/test/core.py +55 -21
- 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 +370 -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 +433 -63
- 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 +51 -8
- ansible/utils/version.py +2 -2
- ansible/vars/clean.py +5 -5
- ansible/vars/hostvars.py +60 -90
- ansible/vars/manager.py +206 -282
- ansible/vars/reserved.py +8 -9
- ansible_core-2.19.0b2.dist-info/BSD-3-Clause.txt +28 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/METADATA +5 -4
- ansible_core-2.19.0b2.dist-info/RECORD +1072 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.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/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.0b2.dist-info}/Apache-License.txt +0 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/COPYING +0 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/MIT-license.txt +0 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/PSF-license.txt +0 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/entry_points.txt +0 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/simplified_bsd.txt +0 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/top_level.txt +0 -0
ansible/modules/gather_facts.py
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
|
-
# Copyright
|
2
|
+
# Copyright: Contributors to the Ansible project
|
3
3
|
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
4
4
|
|
5
5
|
from __future__ import annotations
|
6
6
|
|
7
7
|
|
8
|
-
DOCUMENTATION =
|
8
|
+
DOCUMENTATION = """
|
9
9
|
---
|
10
10
|
module: gather_facts
|
11
11
|
version_added: 2.8
|
@@ -57,7 +57,7 @@ notes:
|
|
57
57
|
Order is not guaranteed, when doing parallel gathering on multiple modules.
|
58
58
|
author:
|
59
59
|
- "Ansible Core Team"
|
60
|
-
|
60
|
+
"""
|
61
61
|
|
62
62
|
RETURN = """
|
63
63
|
# depends on the fact module called
|
ansible/modules/get_url.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: get_url
|
12
12
|
short_description: Downloads files from HTTP, HTTPS, or FTP to node
|
@@ -219,9 +219,9 @@ seealso:
|
|
219
219
|
- module: ansible.windows.win_get_url
|
220
220
|
author:
|
221
221
|
- Jan-Piet Mens (@jpmens)
|
222
|
-
|
222
|
+
"""
|
223
223
|
|
224
|
-
EXAMPLES = r
|
224
|
+
EXAMPLES = r"""
|
225
225
|
- name: Download foo.conf
|
226
226
|
ansible.builtin.get_url:
|
227
227
|
url: http://example.com/path/file.conf
|
@@ -272,9 +272,9 @@ EXAMPLES = r'''
|
|
272
272
|
dest: /etc/foo.conf
|
273
273
|
username: bar
|
274
274
|
password: '{{ mysecret }}'
|
275
|
-
|
275
|
+
"""
|
276
276
|
|
277
|
-
RETURN = r
|
277
|
+
RETURN = r"""
|
278
278
|
backup_file:
|
279
279
|
description: name of backup file created after download
|
280
280
|
returned: changed and if backup=yes
|
@@ -365,17 +365,18 @@ url:
|
|
365
365
|
returned: always
|
366
366
|
type: str
|
367
367
|
sample: https://www.ansible.com/
|
368
|
-
|
368
|
+
"""
|
369
369
|
|
370
|
+
import email.message
|
370
371
|
import os
|
371
372
|
import re
|
372
373
|
import shutil
|
373
374
|
import tempfile
|
374
|
-
|
375
|
+
|
376
|
+
from datetime import datetime, timezone
|
375
377
|
|
376
378
|
from ansible.module_utils.basic import AnsibleModule
|
377
379
|
from ansible.module_utils.six.moves.urllib.parse import urlsplit
|
378
|
-
from ansible.module_utils.compat.datetime import utcnow, utcfromtimestamp
|
379
380
|
from ansible.module_utils.common.text.converters import to_native
|
380
381
|
from ansible.module_utils.urls import fetch_url, url_argument_spec
|
381
382
|
|
@@ -398,10 +399,10 @@ def url_get(module, url, dest, use_proxy, last_mod_time, force, timeout=10, head
|
|
398
399
|
Return (tempfile, info about the request)
|
399
400
|
"""
|
400
401
|
|
401
|
-
start =
|
402
|
+
start = datetime.now(timezone.utc)
|
402
403
|
rsp, info = fetch_url(module, url, use_proxy=use_proxy, force=force, last_mod_time=last_mod_time, timeout=timeout, headers=headers, method=method,
|
403
404
|
unredirected_headers=unredirected_headers, decompress=decompress, ciphers=ciphers, use_netrc=use_netrc)
|
404
|
-
elapsed = (
|
405
|
+
elapsed = (datetime.now(timezone.utc) - start).seconds
|
405
406
|
|
406
407
|
if info['status'] == 304:
|
407
408
|
module.exit_json(url=url, dest=dest, changed=False, msg=info.get('msg', ''), status_code=info['status'], elapsed=elapsed)
|
@@ -432,30 +433,23 @@ def url_get(module, url, dest, use_proxy, last_mod_time, force, timeout=10, head
|
|
432
433
|
shutil.copyfileobj(rsp, f)
|
433
434
|
except Exception as e:
|
434
435
|
os.remove(tempname)
|
435
|
-
module.fail_json(msg="failed to create temporary content file: %s" % to_native(e), elapsed=elapsed
|
436
|
+
module.fail_json(msg="failed to create temporary content file: %s" % to_native(e), elapsed=elapsed)
|
436
437
|
f.close()
|
437
438
|
rsp.close()
|
438
439
|
return tempname, info
|
439
440
|
|
440
441
|
|
441
442
|
def extract_filename_from_headers(headers):
|
442
|
-
"""
|
443
|
-
Extracts a filename from the given dict of HTTP headers.
|
443
|
+
"""Extracts a filename from the given dict of HTTP headers.
|
444
444
|
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
if match:
|
454
|
-
res = match.group(1)
|
455
|
-
# Try preventing any funny business.
|
456
|
-
res = os.path.basename(res)
|
457
|
-
|
458
|
-
return res
|
445
|
+
Returns the filename if successful, else None.
|
446
|
+
"""
|
447
|
+
msg = email.message.Message()
|
448
|
+
msg['content-disposition'] = headers.get('content-disposition', '')
|
449
|
+
if filename := msg.get_param('filename', header='content-disposition'):
|
450
|
+
# Avoid directory traversal
|
451
|
+
filename = os.path.basename(filename)
|
452
|
+
return filename
|
459
453
|
|
460
454
|
|
461
455
|
def is_url(checksum):
|
@@ -466,6 +460,37 @@ def is_url(checksum):
|
|
466
460
|
return urlsplit(checksum).scheme in supported_schemes
|
467
461
|
|
468
462
|
|
463
|
+
def parse_digest_lines(filename, lines):
|
464
|
+
"""Returns a list of tuple containing the filename and digest depending upon
|
465
|
+
the lines provided
|
466
|
+
|
467
|
+
Args:
|
468
|
+
filename (str): Name of the filename, used only when the digest is one-liner
|
469
|
+
lines (list): A list of lines containing filenames and checksums
|
470
|
+
"""
|
471
|
+
checksum_map = []
|
472
|
+
BSD_DIGEST_LINE = re.compile(r'^(\w+) ?\((?P<path>.+)\) ?= (?P<digest>[\w.]+)$')
|
473
|
+
GNU_DIGEST_LINE = re.compile(r'^(?P<digest>[\w.]+) ([ *])(?P<path>.+)$')
|
474
|
+
|
475
|
+
if len(lines) == 1 and len(lines[0].split()) == 1:
|
476
|
+
# Only a single line with a single string
|
477
|
+
# treat it as a checksum only file
|
478
|
+
checksum_map.append((lines[0], filename))
|
479
|
+
return checksum_map
|
480
|
+
# The assumption here is the file is in the format of
|
481
|
+
# checksum filename
|
482
|
+
for line in lines:
|
483
|
+
match = BSD_DIGEST_LINE.match(line)
|
484
|
+
if match:
|
485
|
+
checksum_map.append((match.group('digest'), match.group('path')))
|
486
|
+
else:
|
487
|
+
match = GNU_DIGEST_LINE.match(line)
|
488
|
+
if match:
|
489
|
+
checksum_map.append((match.group('digest'), match.group('path').lstrip("./")))
|
490
|
+
|
491
|
+
return checksum_map
|
492
|
+
|
493
|
+
|
469
494
|
# ==============================================================
|
470
495
|
# main
|
471
496
|
|
@@ -533,31 +558,13 @@ def main():
|
|
533
558
|
if is_url(checksum):
|
534
559
|
checksum_url = checksum
|
535
560
|
# download checksum file to checksum_tmpsrc
|
536
|
-
checksum_tmpsrc,
|
537
|
-
|
561
|
+
checksum_tmpsrc, _dummy = url_get(module, checksum_url, dest, use_proxy, last_mod_time, force, timeout, headers, tmp_dest,
|
562
|
+
unredirected_headers=unredirected_headers, ciphers=ciphers, use_netrc=use_netrc)
|
538
563
|
with open(checksum_tmpsrc) as f:
|
539
564
|
lines = [line.rstrip('\n') for line in f]
|
540
565
|
os.remove(checksum_tmpsrc)
|
541
|
-
checksum_map = []
|
542
566
|
filename = url_filename(url)
|
543
|
-
|
544
|
-
# Only a single line with a single string
|
545
|
-
# treat it as a checksum only file
|
546
|
-
checksum_map.append((lines[0], filename))
|
547
|
-
else:
|
548
|
-
# The assumption here is the file is in the format of
|
549
|
-
# checksum filename
|
550
|
-
for line in lines:
|
551
|
-
# Split by one whitespace to keep the leading type char ' ' (whitespace) for text and '*' for binary
|
552
|
-
parts = line.split(" ", 1)
|
553
|
-
if len(parts) == 2:
|
554
|
-
# Remove the leading type char, we expect
|
555
|
-
if parts[1].startswith((" ", "*",)):
|
556
|
-
parts[1] = parts[1][1:]
|
557
|
-
|
558
|
-
# Append checksum and path without potential leading './'
|
559
|
-
checksum_map.append((parts[0], parts[1].lstrip("./")))
|
560
|
-
|
567
|
+
checksum_map = parse_digest_lines(filename=filename, lines=lines)
|
561
568
|
# Look through each line in the checksum file for a hash corresponding to
|
562
569
|
# the filename in the url, returning the first hash that is found.
|
563
570
|
for cksum in (s for (s, f) in checksum_map if f == filename):
|
@@ -601,7 +608,7 @@ def main():
|
|
601
608
|
# If the file already exists, prepare the last modified time for the
|
602
609
|
# request.
|
603
610
|
mtime = os.path.getmtime(dest)
|
604
|
-
last_mod_time =
|
611
|
+
last_mod_time = datetime.fromtimestamp(mtime, timezone.utc)
|
605
612
|
|
606
613
|
# If the checksum does not match we have to force the download
|
607
614
|
# because last_mod_time may be newer than on remote
|
@@ -609,11 +616,11 @@ def main():
|
|
609
616
|
force = True
|
610
617
|
|
611
618
|
# download to tmpsrc
|
612
|
-
start =
|
619
|
+
start = datetime.now(timezone.utc)
|
613
620
|
method = 'HEAD' if module.check_mode else 'GET'
|
614
621
|
tmpsrc, info = url_get(module, url, dest, use_proxy, last_mod_time, force, timeout, headers, tmp_dest, method,
|
615
622
|
unredirected_headers=unredirected_headers, decompress=decompress, ciphers=ciphers, use_netrc=use_netrc)
|
616
|
-
result['elapsed'] = (
|
623
|
+
result['elapsed'] = (datetime.now(timezone.utc) - start).seconds
|
617
624
|
result['src'] = tmpsrc
|
618
625
|
|
619
626
|
# Now the request has completed, we can finally generate the final
|
@@ -683,8 +690,7 @@ def main():
|
|
683
690
|
except Exception as e:
|
684
691
|
if os.path.exists(tmpsrc):
|
685
692
|
os.remove(tmpsrc)
|
686
|
-
module.fail_json(msg="failed to copy %s to %s: %s" % (tmpsrc, dest, to_native(e)),
|
687
|
-
exception=traceback.format_exc(), **result)
|
693
|
+
module.fail_json(msg="failed to copy %s to %s: %s" % (tmpsrc, dest, to_native(e)), **result)
|
688
694
|
result['changed'] = True
|
689
695
|
else:
|
690
696
|
result['changed'] = False
|
ansible/modules/getent.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: getent
|
12
12
|
short_description: A wrapper to the unix getent utility
|
@@ -58,9 +58,9 @@ notes:
|
|
58
58
|
- Not all databases support enumeration, check system documentation for details.
|
59
59
|
author:
|
60
60
|
- Brian Coca (@bcoca)
|
61
|
-
|
61
|
+
"""
|
62
62
|
|
63
|
-
EXAMPLES =
|
63
|
+
EXAMPLES = """
|
64
64
|
- name: Get root user info
|
65
65
|
ansible.builtin.getent:
|
66
66
|
database: passwd
|
@@ -97,9 +97,9 @@ EXAMPLES = '''
|
|
97
97
|
- ansible.builtin.debug:
|
98
98
|
var: ansible_facts.getent_shadow
|
99
99
|
|
100
|
-
|
100
|
+
"""
|
101
101
|
|
102
|
-
RETURN =
|
102
|
+
RETURN = """
|
103
103
|
ansible_facts:
|
104
104
|
description: Facts to add to ansible_facts.
|
105
105
|
returned: always
|
@@ -112,9 +112,7 @@ ansible_facts:
|
|
112
112
|
- Starting at 2.11 it now returns multiple duplicate entries, previously it only returned the last one
|
113
113
|
returned: always
|
114
114
|
type: list
|
115
|
-
|
116
|
-
|
117
|
-
import traceback
|
115
|
+
"""
|
118
116
|
|
119
117
|
from ansible.module_utils.basic import AnsibleModule
|
120
118
|
from ansible.module_utils.common.text.converters import to_native
|
@@ -156,7 +154,7 @@ def main():
|
|
156
154
|
try:
|
157
155
|
rc, out, err = module.run_command(cmd)
|
158
156
|
except Exception as e:
|
159
|
-
module.fail_json(msg=to_native(e)
|
157
|
+
module.fail_json(msg=to_native(e))
|
160
158
|
|
161
159
|
msg = "Unexpected failure!"
|
162
160
|
dbtree = 'getent_%s' % database
|
ansible/modules/git.py
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
from __future__ import annotations
|
7
7
|
|
8
8
|
|
9
|
-
DOCUMENTATION =
|
9
|
+
DOCUMENTATION = """
|
10
10
|
---
|
11
11
|
module: git
|
12
12
|
author:
|
@@ -21,6 +21,10 @@ options:
|
|
21
21
|
repo:
|
22
22
|
description:
|
23
23
|
- git, SSH, or HTTP(S) protocol address of the git repository.
|
24
|
+
- Avoid embedding usernames and passwords within Git repository URLs.
|
25
|
+
This practice is insecure and can lead to unauthorized access to your repositories.
|
26
|
+
For secure authentication, configure SSH keys (recommended) or use a credential helper.
|
27
|
+
See Git documentation on SSH keys/credential helpers for instructions.
|
24
28
|
type: str
|
25
29
|
required: true
|
26
30
|
aliases: [ name ]
|
@@ -236,9 +240,9 @@ notes:
|
|
236
240
|
one solution is to use the option accept_hostkey. Another solution is to
|
237
241
|
add the remote host public key in C(/etc/ssh/ssh_known_hosts) before calling
|
238
242
|
the git module, with the following command: C(ssh-keyscan -H remote_host.com >> /etc/ssh/ssh_known_hosts)."
|
239
|
-
|
243
|
+
"""
|
240
244
|
|
241
|
-
EXAMPLES =
|
245
|
+
EXAMPLES = """
|
242
246
|
- name: Git checkout
|
243
247
|
ansible.builtin.git:
|
244
248
|
repo: 'https://github.com/ansible/ansible.git'
|
@@ -295,9 +299,9 @@ EXAMPLES = '''
|
|
295
299
|
environment:
|
296
300
|
GIT_TERMINAL_PROMPT: 0 # reports "terminal prompts disabled" on missing password
|
297
301
|
# or GIT_ASKPASS: /bin/true # for git before version 2.3.0, reports "Authentication failed" on missing password
|
298
|
-
|
302
|
+
"""
|
299
303
|
|
300
|
-
RETURN =
|
304
|
+
RETURN = """
|
301
305
|
after:
|
302
306
|
description: Last commit revision of the repository retrieved during the update.
|
303
307
|
returned: success
|
@@ -328,7 +332,7 @@ git_dir_before:
|
|
328
332
|
returned: success
|
329
333
|
type: str
|
330
334
|
sample: /path/to/old/git/dir
|
331
|
-
|
335
|
+
"""
|
332
336
|
|
333
337
|
import filecmp
|
334
338
|
import os
|
@@ -366,16 +370,15 @@ def relocate_repo(module, result, repo_dir, old_repo_dir, worktree_dir):
|
|
366
370
|
|
367
371
|
|
368
372
|
def head_splitter(headfile, remote, module=None, fail_on_error=False):
|
369
|
-
|
373
|
+
"""Extract the head reference"""
|
370
374
|
# https://github.com/ansible/ansible-modules-core/pull/907
|
371
375
|
|
372
376
|
res = None
|
373
377
|
if os.path.exists(headfile):
|
374
378
|
rawdata = None
|
375
379
|
try:
|
376
|
-
|
377
|
-
|
378
|
-
f.close()
|
380
|
+
with open(headfile, 'r') as f:
|
381
|
+
rawdata = f.readline()
|
379
382
|
except Exception:
|
380
383
|
if fail_on_error and module:
|
381
384
|
module.fail_json(msg="Unable to read %s" % headfile)
|
@@ -429,11 +432,11 @@ def get_submodule_update_params(module, git_path, cwd):
|
|
429
432
|
|
430
433
|
|
431
434
|
def write_ssh_wrapper(module):
|
432
|
-
|
435
|
+
"""
|
433
436
|
This writes an shell wrapper for ssh options to be used with git
|
434
437
|
this is only relevant for older versions of gitthat cannot
|
435
438
|
handle the options themselves. Returns path to the script
|
436
|
-
|
439
|
+
"""
|
437
440
|
try:
|
438
441
|
# make sure we have full permission to the module_dir, which
|
439
442
|
# may not be the case if we're sudo'ing to a non-root user
|
@@ -466,10 +469,10 @@ def write_ssh_wrapper(module):
|
|
466
469
|
|
467
470
|
|
468
471
|
def set_git_ssh_env(key_file, ssh_opts, git_version, module):
|
469
|
-
|
472
|
+
"""
|
470
473
|
use environment variables to configure git's ssh execution,
|
471
474
|
which varies by version but this function should handle all.
|
472
|
-
|
475
|
+
"""
|
473
476
|
|
474
477
|
# initialise to existing ssh opts and/or append user provided
|
475
478
|
if ssh_opts is None:
|
@@ -519,7 +522,7 @@ def set_git_ssh_env(key_file, ssh_opts, git_version, module):
|
|
519
522
|
|
520
523
|
|
521
524
|
def get_version(module, git_path, dest, ref="HEAD"):
|
522
|
-
|
525
|
+
""" samples the version of the git repo """
|
523
526
|
|
524
527
|
cmd = "%s rev-parse %s" % (git_path, ref)
|
525
528
|
rc, stdout, stderr = module.run_command(cmd, cwd=dest)
|
@@ -571,7 +574,7 @@ def get_submodule_versions(git_path, module, dest, version='HEAD'):
|
|
571
574
|
|
572
575
|
def clone(git_path, module, repo, dest, remote, depth, version, bare,
|
573
576
|
reference, refspec, git_version_used, verify_commit, separate_git_dir, result, gpg_allowlist, single_branch):
|
574
|
-
|
577
|
+
""" makes a new git repo if it does not already exist """
|
575
578
|
dest_dirname = os.path.dirname(dest)
|
576
579
|
try:
|
577
580
|
os.makedirs(dest_dirname)
|
@@ -653,17 +656,17 @@ def has_local_mods(module, git_path, dest, bare):
|
|
653
656
|
|
654
657
|
|
655
658
|
def reset(git_path, module, dest):
|
656
|
-
|
659
|
+
"""
|
657
660
|
Resets the index and working tree to HEAD.
|
658
661
|
Discards any changes to tracked files in working
|
659
662
|
tree since that commit.
|
660
|
-
|
663
|
+
"""
|
661
664
|
cmd = "%s reset --hard HEAD" % (git_path,)
|
662
665
|
return module.run_command(cmd, check_rc=True, cwd=dest)
|
663
666
|
|
664
667
|
|
665
668
|
def get_diff(module, git_path, dest, repo, remote, depth, bare, before, after):
|
666
|
-
|
669
|
+
""" Return the difference between 2 versions """
|
667
670
|
if before is None:
|
668
671
|
return {'prepared': '>> Newly checked out %s' % after}
|
669
672
|
elif before != after:
|
@@ -817,13 +820,13 @@ def get_repo_path(dest, bare):
|
|
817
820
|
|
818
821
|
|
819
822
|
def get_head_branch(git_path, module, dest, remote, bare=False):
|
820
|
-
|
823
|
+
"""
|
821
824
|
Determine what branch HEAD is associated with. This is partly
|
822
825
|
taken from lib/ansible/utils/__init__.py. It finds the correct
|
823
826
|
path to .git/HEAD and reads from that file the branch that HEAD is
|
824
827
|
associated with. In the case of a detached HEAD, this will look
|
825
828
|
up the branch in .git/refs/remotes/<remote>/HEAD.
|
826
|
-
|
829
|
+
"""
|
827
830
|
try:
|
828
831
|
repo_path = get_repo_path(dest, bare)
|
829
832
|
except (IOError, ValueError) as err:
|
@@ -845,7 +848,7 @@ def get_head_branch(git_path, module, dest, remote, bare=False):
|
|
845
848
|
|
846
849
|
|
847
850
|
def get_remote_url(git_path, module, dest, remote):
|
848
|
-
|
851
|
+
"""Return URL of remote source for repo."""
|
849
852
|
command = [git_path, 'ls-remote', '--get-url', remote]
|
850
853
|
(rc, out, err) = module.run_command(command, cwd=dest)
|
851
854
|
if rc != 0:
|
@@ -856,7 +859,7 @@ def get_remote_url(git_path, module, dest, remote):
|
|
856
859
|
|
857
860
|
|
858
861
|
def set_remote_url(git_path, module, repo, dest, remote):
|
859
|
-
|
862
|
+
""" updates repo from remote sources """
|
860
863
|
# Return if remote URL isn't changing.
|
861
864
|
remote_url = get_remote_url(git_path, module, dest, remote)
|
862
865
|
if remote_url == repo or unfrackgitpath(remote_url) == unfrackgitpath(repo):
|
@@ -874,7 +877,7 @@ def set_remote_url(git_path, module, repo, dest, remote):
|
|
874
877
|
|
875
878
|
|
876
879
|
def fetch(git_path, module, repo, dest, version, remote, depth, bare, refspec, git_version_used, force=False):
|
877
|
-
|
880
|
+
""" updates repo from remote sources """
|
878
881
|
set_remote_url(git_path, module, repo, dest, remote)
|
879
882
|
commands = []
|
880
883
|
|
@@ -981,7 +984,7 @@ def submodules_fetch(git_path, module, remote, track_submodules, dest):
|
|
981
984
|
|
982
985
|
|
983
986
|
def submodule_update(git_path, module, dest, track_submodules, force=False):
|
984
|
-
|
987
|
+
""" init and update any submodules """
|
985
988
|
|
986
989
|
# get the valid submodule params
|
987
990
|
params = get_submodule_update_params(module, git_path, dest)
|
ansible/modules/group.py
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
from __future__ import annotations
|
7
7
|
|
8
8
|
|
9
|
-
DOCUMENTATION =
|
9
|
+
DOCUMENTATION = """
|
10
10
|
---
|
11
11
|
module: group
|
12
12
|
version_added: "0.0.2"
|
@@ -91,9 +91,9 @@ seealso:
|
|
91
91
|
- module: ansible.windows.win_group
|
92
92
|
author:
|
93
93
|
- Stephen Fromm (@sfromm)
|
94
|
-
|
94
|
+
"""
|
95
95
|
|
96
|
-
EXAMPLES =
|
96
|
+
EXAMPLES = """
|
97
97
|
- name: Ensure group "somegroup" exists
|
98
98
|
ansible.builtin.group:
|
99
99
|
name: somegroup
|
@@ -104,9 +104,9 @@ EXAMPLES = '''
|
|
104
104
|
name: docker
|
105
105
|
state: present
|
106
106
|
gid: 1750
|
107
|
-
|
107
|
+
"""
|
108
108
|
|
109
|
-
RETURN = r
|
109
|
+
RETURN = r"""
|
110
110
|
gid:
|
111
111
|
description: Group ID of the group.
|
112
112
|
returned: When O(state) is C(present)
|
@@ -127,7 +127,7 @@ system:
|
|
127
127
|
returned: When O(state) is C(present)
|
128
128
|
type: bool
|
129
129
|
sample: False
|
130
|
-
|
130
|
+
"""
|
131
131
|
|
132
132
|
import grp
|
133
133
|
import os
|
ansible/modules/group_by.py
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
from __future__ import annotations
|
8
8
|
|
9
9
|
|
10
|
-
DOCUMENTATION = r
|
10
|
+
DOCUMENTATION = r"""
|
11
11
|
---
|
12
12
|
module: group_by
|
13
13
|
short_description: Create Ansible groups based on facts
|
@@ -65,9 +65,9 @@ seealso:
|
|
65
65
|
- module: ansible.builtin.add_host
|
66
66
|
author:
|
67
67
|
- Jeroen Hoekx (@jhoekx)
|
68
|
-
|
68
|
+
"""
|
69
69
|
|
70
|
-
EXAMPLES = r
|
70
|
+
EXAMPLES = r"""
|
71
71
|
- name: Create groups based on the machine architecture
|
72
72
|
ansible.builtin.group_by:
|
73
73
|
key: machine_{{ ansible_machine }}
|
@@ -85,4 +85,4 @@ EXAMPLES = r'''
|
|
85
85
|
- name: Add all active hosts to a static group
|
86
86
|
ansible.builtin.group_by:
|
87
87
|
key: done
|
88
|
-
|
88
|
+
"""
|
ansible/modules/hostname.py
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
from __future__ import annotations
|
8
8
|
|
9
9
|
|
10
|
-
DOCUMENTATION =
|
10
|
+
DOCUMENTATION = """
|
11
11
|
---
|
12
12
|
module: hostname
|
13
13
|
author:
|
@@ -52,9 +52,9 @@ attributes:
|
|
52
52
|
support: full
|
53
53
|
platform:
|
54
54
|
platforms: posix
|
55
|
-
|
55
|
+
"""
|
56
56
|
|
57
|
-
EXAMPLES =
|
57
|
+
EXAMPLES = """
|
58
58
|
- name: Set a hostname
|
59
59
|
ansible.builtin.hostname:
|
60
60
|
name: web01
|
@@ -63,14 +63,12 @@ EXAMPLES = '''
|
|
63
63
|
ansible.builtin.hostname:
|
64
64
|
name: web01
|
65
65
|
use: systemd
|
66
|
-
|
66
|
+
"""
|
67
67
|
|
68
68
|
import os
|
69
69
|
import platform
|
70
70
|
import socket
|
71
|
-
import
|
72
|
-
|
73
|
-
import ansible.module_utils.compat.typing as t
|
71
|
+
import typing as t
|
74
72
|
|
75
73
|
from ansible.module_utils.basic import (
|
76
74
|
AnsibleModule,
|
@@ -209,17 +207,14 @@ class FileStrategy(BaseStrategy):
|
|
209
207
|
return get_file_content(self.FILE, default='', strip=True)
|
210
208
|
except Exception as e:
|
211
209
|
self.module.fail_json(
|
212
|
-
msg="failed to read hostname: %s" % to_native(e)
|
213
|
-
exception=traceback.format_exc())
|
210
|
+
msg="failed to read hostname: %s" % to_native(e))
|
214
211
|
|
215
212
|
def set_permanent_hostname(self, name):
|
216
213
|
try:
|
217
214
|
with open(self.FILE, 'w+') as f:
|
218
215
|
f.write("%s\n" % name)
|
219
216
|
except Exception as e:
|
220
|
-
self.module.fail_json(
|
221
|
-
msg="failed to update hostname: %s" % to_native(e),
|
222
|
-
exception=traceback.format_exc())
|
217
|
+
self.module.fail_json(msg="failed to update hostname: %s" % to_native(e))
|
223
218
|
|
224
219
|
|
225
220
|
class SLESStrategy(FileStrategy):
|
@@ -249,8 +244,7 @@ class RedHatStrategy(BaseStrategy):
|
|
249
244
|
)
|
250
245
|
except Exception as e:
|
251
246
|
self.module.fail_json(
|
252
|
-
msg="failed to read hostname: %s" % to_native(e)
|
253
|
-
exception=traceback.format_exc())
|
247
|
+
msg="failed to read hostname: %s" % to_native(e))
|
254
248
|
|
255
249
|
def set_permanent_hostname(self, name):
|
256
250
|
try:
|
@@ -269,9 +263,7 @@ class RedHatStrategy(BaseStrategy):
|
|
269
263
|
with open(self.NETWORK_FILE, 'w+') as f:
|
270
264
|
f.writelines(lines)
|
271
265
|
except Exception as e:
|
272
|
-
self.module.fail_json(
|
273
|
-
msg="failed to update hostname: %s" % to_native(e),
|
274
|
-
exception=traceback.format_exc())
|
266
|
+
self.module.fail_json(msg="failed to update hostname: %s" % to_native(e))
|
275
267
|
|
276
268
|
|
277
269
|
class AlpineStrategy(FileStrategy):
|
@@ -361,9 +353,7 @@ class OpenRCStrategy(BaseStrategy):
|
|
361
353
|
if line.startswith('hostname='):
|
362
354
|
return line[10:].strip('"')
|
363
355
|
except Exception as e:
|
364
|
-
self.module.fail_json(
|
365
|
-
msg="failed to read hostname: %s" % to_native(e),
|
366
|
-
exception=traceback.format_exc())
|
356
|
+
self.module.fail_json(msg="failed to read hostname: %s" % to_native(e))
|
367
357
|
|
368
358
|
def set_permanent_hostname(self, name):
|
369
359
|
try:
|
@@ -377,9 +367,7 @@ class OpenRCStrategy(BaseStrategy):
|
|
377
367
|
with open(self.FILE, 'w') as f:
|
378
368
|
f.write('\n'.join(lines) + '\n')
|
379
369
|
except Exception as e:
|
380
|
-
self.module.fail_json(
|
381
|
-
msg="failed to update hostname: %s" % to_native(e),
|
382
|
-
exception=traceback.format_exc())
|
370
|
+
self.module.fail_json(msg="failed to update hostname: %s" % to_native(e))
|
383
371
|
|
384
372
|
|
385
373
|
class OpenBSDStrategy(FileStrategy):
|
@@ -481,9 +469,7 @@ class FreeBSDStrategy(BaseStrategy):
|
|
481
469
|
if line.startswith('hostname='):
|
482
470
|
return line[10:].strip('"')
|
483
471
|
except Exception as e:
|
484
|
-
self.module.fail_json(
|
485
|
-
msg="failed to read hostname: %s" % to_native(e),
|
486
|
-
exception=traceback.format_exc())
|
472
|
+
self.module.fail_json(msg="failed to read hostname: %s" % to_native(e))
|
487
473
|
|
488
474
|
def set_permanent_hostname(self, name):
|
489
475
|
try:
|
@@ -500,9 +486,7 @@ class FreeBSDStrategy(BaseStrategy):
|
|
500
486
|
with open(self.FILE, 'w') as f:
|
501
487
|
f.write('\n'.join(lines) + '\n')
|
502
488
|
except Exception as e:
|
503
|
-
self.module.fail_json(
|
504
|
-
msg="failed to update hostname: %s" % to_native(e),
|
505
|
-
exception=traceback.format_exc())
|
489
|
+
self.module.fail_json(msg="failed to update hostname: %s" % to_native(e))
|
506
490
|
|
507
491
|
|
508
492
|
class DarwinStrategy(BaseStrategy):
|