ansible-core 2.18.7rc1__py3-none-any.whl → 2.19.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of ansible-core might be problematic. Click here for more details.
- ansible/_internal/__init__.py +53 -0
- ansible/_internal/_ansiballz/__init__.py +0 -0
- ansible/_internal/_ansiballz/_builder.py +101 -0
- ansible/_internal/_ansiballz/_wrapper.py +262 -0
- ansible/_internal/_collection_proxy.py +47 -0
- ansible/_internal/_datatag/__init__.py +0 -0
- ansible/_internal/_datatag/_tags.py +130 -0
- ansible/_internal/_datatag/_utils.py +19 -0
- ansible/_internal/_datatag/_wrappers.py +33 -0
- ansible/_internal/_errors/__init__.py +0 -0
- ansible/_internal/_errors/_alarm_timeout.py +66 -0
- ansible/_internal/_errors/_captured.py +123 -0
- ansible/_internal/_errors/_error_factory.py +89 -0
- ansible/_internal/_errors/_error_utils.py +240 -0
- ansible/_internal/_errors/_handler.py +91 -0
- ansible/_internal/_errors/_task_timeout.py +28 -0
- ansible/_internal/_event_formatting.py +127 -0
- ansible/_internal/_json/__init__.py +214 -0
- ansible/_internal/_json/_legacy_encoder.py +34 -0
- ansible/_internal/_json/_profiles/__init__.py +0 -0
- ansible/_internal/_json/_profiles/_cache_persistence.py +57 -0
- ansible/_internal/_json/_profiles/_inventory_legacy.py +40 -0
- ansible/_internal/_json/_profiles/_legacy.py +189 -0
- ansible/_internal/_locking.py +21 -0
- ansible/_internal/_plugins/__init__.py +0 -0
- ansible/_internal/_plugins/_cache.py +57 -0
- ansible/_internal/_ssh/__init__.py +0 -0
- ansible/_internal/_ssh/_agent_launch.py +91 -0
- ansible/_internal/_ssh/_ssh_agent.py +619 -0
- ansible/_internal/_task.py +78 -0
- ansible/_internal/_templating/__init__.py +12 -0
- ansible/_internal/_templating/_access.py +86 -0
- ansible/_internal/_templating/_chain_templar.py +63 -0
- ansible/_internal/_templating/_datatag.py +95 -0
- ansible/_internal/_templating/_engine.py +592 -0
- ansible/_internal/_templating/_errors.py +28 -0
- ansible/_internal/_templating/_jinja_bits.py +1106 -0
- ansible/_internal/_templating/_jinja_common.py +323 -0
- ansible/_internal/_templating/_jinja_patches.py +44 -0
- ansible/_internal/_templating/_jinja_plugins.py +375 -0
- ansible/_internal/_templating/_lazy_containers.py +633 -0
- ansible/_internal/_templating/_marker_behaviors.py +103 -0
- ansible/_internal/_templating/_template_vars.py +72 -0
- ansible/_internal/_templating/_transform.py +70 -0
- ansible/_internal/_templating/_utils.py +108 -0
- ansible/_internal/_testing.py +26 -0
- ansible/_internal/_wrapt.py +1052 -0
- ansible/_internal/_yaml/__init__.py +0 -0
- ansible/_internal/_yaml/_constructor.py +240 -0
- ansible/_internal/_yaml/_dumper.py +70 -0
- ansible/_internal/_yaml/_errors.py +166 -0
- ansible/_internal/_yaml/_loader.py +66 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/README.md +11 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/action/debug.py +36 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/apply_trust.py +19 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/dump_object.py +27 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/finalize.py +16 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/origin.py +18 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.py +24 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.yml +33 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/tag_names.py +16 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/true_type.py +17 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/unmask.py +49 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.py +21 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.yml +2 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.py +15 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.yml +19 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.py +18 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.yml +19 -0
- ansible/cli/__init__.py +93 -104
- ansible/cli/_ssh_askpass.py +54 -0
- ansible/cli/adhoc.py +20 -10
- ansible/cli/arguments/option_helpers.py +163 -10
- ansible/cli/config.py +43 -68
- ansible/cli/console.py +13 -11
- ansible/cli/doc.py +134 -77
- ansible/cli/galaxy.py +27 -20
- ansible/cli/inventory.py +28 -28
- ansible/cli/playbook.py +4 -12
- ansible/cli/pull.py +6 -3
- ansible/cli/scripts/ansible_connection_cli_stub.py +7 -7
- ansible/cli/vault.py +12 -11
- ansible/compat/__init__.py +2 -2
- ansible/compat/importlib_resources.py +9 -12
- ansible/config/base.yml +218 -133
- ansible/config/manager.py +220 -159
- ansible/constants.py +2 -65
- ansible/errors/__init__.py +350 -256
- ansible/executor/interpreter_discovery.py +28 -149
- ansible/executor/module_common.py +480 -514
- ansible/executor/play_iterator.py +22 -27
- ansible/executor/playbook_executor.py +11 -11
- ansible/executor/powershell/async_watchdog.ps1 +97 -102
- ansible/executor/powershell/async_wrapper.ps1 +204 -153
- ansible/executor/powershell/become_wrapper.ps1 +107 -144
- ansible/executor/powershell/bootstrap_wrapper.ps1 +46 -9
- ansible/executor/powershell/coverage_wrapper.ps1 +91 -135
- ansible/executor/powershell/exec_wrapper.ps1 +675 -196
- ansible/executor/powershell/module_manifest.py +469 -265
- ansible/executor/powershell/module_wrapper.ps1 +195 -186
- ansible/executor/powershell/powershell_expand_user.ps1 +20 -0
- ansible/executor/powershell/powershell_mkdtemp.ps1 +17 -0
- ansible/executor/powershell/psrp_fetch_file.ps1 +41 -0
- ansible/executor/powershell/psrp_put_file.ps1 +122 -0
- ansible/executor/powershell/winrm_fetch_file.ps1 +46 -0
- ansible/executor/powershell/winrm_put_file.ps1 +36 -0
- ansible/executor/process/worker.py +139 -149
- ansible/executor/stats.py +5 -5
- ansible/executor/task_executor.py +270 -297
- ansible/executor/task_queue_manager.py +135 -137
- ansible/executor/task_result.py +182 -79
- ansible/galaxy/__init__.py +2 -2
- ansible/galaxy/api.py +26 -25
- ansible/galaxy/collection/__init__.py +6 -14
- ansible/galaxy/collection/concrete_artifact_manager.py +12 -21
- ansible/galaxy/dependency_resolution/dataclasses.py +14 -4
- ansible/galaxy/dependency_resolution/providers.py +4 -4
- ansible/galaxy/dependency_resolution/reporters.py +81 -0
- ansible/galaxy/role.py +6 -10
- ansible/galaxy/token.py +28 -21
- ansible/inventory/data.py +47 -57
- ansible/inventory/group.py +50 -73
- ansible/inventory/helpers.py +9 -0
- ansible/inventory/host.py +37 -54
- ansible/inventory/manager.py +79 -34
- ansible/keyword_desc.yml +1 -1
- ansible/module_utils/_internal/__init__.py +55 -0
- ansible/module_utils/_internal/_ambient_context.py +58 -0
- ansible/module_utils/_internal/_ansiballz/__init__.py +0 -0
- ansible/module_utils/_internal/_ansiballz/_extensions/__init__.py +0 -0
- ansible/module_utils/_internal/_ansiballz/_extensions/_coverage.py +45 -0
- ansible/module_utils/_internal/_ansiballz/_extensions/_pydevd.py +62 -0
- ansible/module_utils/_internal/_ansiballz/_loader.py +81 -0
- ansible/module_utils/_internal/_ansiballz/_respawn.py +32 -0
- ansible/module_utils/_internal/_ansiballz/_respawn_wrapper.py +23 -0
- ansible/module_utils/_internal/_concurrent/_daemon_threading.py +1 -0
- ansible/module_utils/_internal/_dataclass_validation.py +217 -0
- ansible/module_utils/_internal/_datatag/__init__.py +961 -0
- ansible/module_utils/_internal/_datatag/_tags.py +16 -0
- ansible/module_utils/_internal/_debugging.py +31 -0
- ansible/module_utils/_internal/_deprecator.py +157 -0
- ansible/module_utils/_internal/_errors.py +101 -0
- ansible/module_utils/_internal/_event_utils.py +61 -0
- ansible/module_utils/_internal/_json/__init__.py +63 -0
- ansible/module_utils/_internal/_json/_legacy_encoder.py +26 -0
- ansible/module_utils/_internal/_json/_profiles/__init__.py +428 -0
- ansible/module_utils/_internal/_json/_profiles/_fallback_to_str.py +73 -0
- ansible/module_utils/_internal/_json/_profiles/_module_legacy_c2m.py +33 -0
- ansible/module_utils/_internal/_json/_profiles/_module_legacy_m2c.py +37 -0
- ansible/module_utils/_internal/_json/_profiles/_module_modern_c2m.py +35 -0
- ansible/module_utils/_internal/_json/_profiles/_module_modern_m2c.py +33 -0
- ansible/module_utils/_internal/_json/_profiles/_tagless.py +52 -0
- ansible/module_utils/_internal/_messages.py +130 -0
- ansible/module_utils/_internal/_patches/__init__.py +66 -0
- ansible/module_utils/_internal/_patches/_dataclass_annotation_patch.py +53 -0
- ansible/module_utils/_internal/_patches/_socket_patch.py +34 -0
- ansible/module_utils/_internal/_patches/_sys_intern_patch.py +34 -0
- ansible/module_utils/_internal/_plugin_info.py +38 -0
- ansible/module_utils/_internal/_stack.py +22 -0
- ansible/module_utils/_internal/_testing.py +0 -0
- ansible/module_utils/_internal/_text_utils.py +6 -0
- ansible/module_utils/_internal/_traceback.py +92 -0
- ansible/module_utils/_internal/_validation.py +14 -0
- ansible/module_utils/ansible_release.py +2 -2
- ansible/module_utils/api.py +1 -2
- ansible/module_utils/basic.py +303 -202
- ansible/module_utils/common/_utils.py +24 -28
- ansible/module_utils/common/arg_spec.py +8 -3
- ansible/module_utils/common/collections.py +7 -2
- ansible/module_utils/common/dict_transformations.py +2 -2
- ansible/module_utils/common/file.py +2 -2
- ansible/module_utils/common/json.py +90 -84
- ansible/module_utils/common/locale.py +2 -2
- ansible/module_utils/common/parameters.py +27 -24
- ansible/module_utils/common/process.py +2 -3
- ansible/module_utils/common/respawn.py +11 -33
- ansible/module_utils/common/sentinel.py +66 -0
- ansible/module_utils/common/sys_info.py +8 -8
- ansible/module_utils/common/text/converters.py +16 -37
- ansible/module_utils/common/validation.py +35 -24
- ansible/module_utils/common/warnings.py +143 -25
- ansible/module_utils/common/yaml.py +29 -3
- ansible/module_utils/compat/datetime.py +33 -21
- ansible/module_utils/compat/paramiko.py +21 -10
- ansible/module_utils/compat/typing.py +6 -5
- ansible/module_utils/connection.py +10 -13
- ansible/module_utils/csharp/Ansible.Basic.cs +15 -12
- ansible/module_utils/csharp/Ansible.Become.cs +1 -0
- ansible/module_utils/csharp/Ansible.Privilege.cs +2 -2
- ansible/module_utils/csharp/Ansible._Async.cs +517 -0
- ansible/module_utils/datatag.py +49 -0
- ansible/module_utils/distro/__init__.py +2 -2
- ansible/module_utils/facts/ansible_collector.py +4 -5
- ansible/module_utils/facts/collector.py +13 -14
- ansible/module_utils/facts/compat.py +4 -4
- ansible/module_utils/facts/default_collectors.py +1 -1
- ansible/module_utils/facts/hardware/aix.py +34 -0
- ansible/module_utils/facts/hardware/base.py +2 -2
- ansible/module_utils/facts/hardware/darwin.py +1 -3
- ansible/module_utils/facts/hardware/freebsd.py +2 -2
- ansible/module_utils/facts/hardware/linux.py +5 -5
- ansible/module_utils/facts/namespace.py +1 -1
- ansible/module_utils/facts/network/base.py +1 -1
- ansible/module_utils/facts/network/fc_wwn.py +1 -2
- ansible/module_utils/facts/network/iscsi.py +1 -2
- ansible/module_utils/facts/network/nvme.py +1 -2
- ansible/module_utils/facts/other/facter.py +2 -3
- ansible/module_utils/facts/other/ohai.py +2 -3
- ansible/module_utils/facts/sysctl.py +4 -6
- ansible/module_utils/facts/system/apparmor.py +1 -2
- ansible/module_utils/facts/system/caps.py +3 -3
- ansible/module_utils/facts/system/chroot.py +1 -2
- ansible/module_utils/facts/system/cmdline.py +1 -2
- ansible/module_utils/facts/system/date_time.py +5 -3
- ansible/module_utils/facts/system/distribution.py +27 -13
- ansible/module_utils/facts/system/dns.py +1 -1
- ansible/module_utils/facts/system/env.py +1 -2
- ansible/module_utils/facts/system/fips.py +7 -20
- ansible/module_utils/facts/system/loadavg.py +1 -2
- ansible/module_utils/facts/system/local.py +2 -3
- ansible/module_utils/facts/system/lsb.py +1 -2
- ansible/module_utils/facts/system/pkg_mgr.py +1 -2
- ansible/module_utils/facts/system/platform.py +1 -2
- ansible/module_utils/facts/system/python.py +1 -2
- ansible/module_utils/facts/system/selinux.py +1 -1
- ansible/module_utils/facts/system/service_mgr.py +1 -2
- ansible/module_utils/facts/system/ssh_pub_keys.py +1 -1
- ansible/module_utils/facts/system/systemd.py +1 -1
- ansible/module_utils/facts/system/user.py +1 -2
- ansible/module_utils/facts/utils.py +3 -3
- ansible/module_utils/facts/virtual/base.py +1 -1
- ansible/module_utils/facts/virtual/linux.py +3 -3
- ansible/module_utils/facts/virtual/sunos.py +3 -15
- ansible/module_utils/facts/virtual/sysctl.py +3 -16
- ansible/module_utils/json_utils.py +2 -2
- ansible/module_utils/parsing/convert_bool.py +7 -1
- ansible/module_utils/powershell/Ansible.ModuleUtils.AddType.psm1 +1 -1
- ansible/module_utils/powershell/Ansible.ModuleUtils.CamelConversion.psm1 +1 -1
- ansible/module_utils/powershell/Ansible.ModuleUtils.CommandUtil.psm1 +1 -1
- ansible/module_utils/powershell/Ansible.ModuleUtils.WebRequest.psm1 +1 -1
- ansible/module_utils/service.py +21 -31
- ansible/module_utils/splitter.py +7 -7
- ansible/module_utils/testing.py +31 -0
- ansible/module_utils/urls.py +64 -35
- ansible/modules/add_host.py +4 -4
- ansible/modules/apt.py +69 -49
- ansible/modules/apt_key.py +19 -12
- ansible/modules/apt_repository.py +32 -51
- ansible/modules/assemble.py +16 -14
- ansible/modules/assert.py +4 -4
- ansible/modules/async_status.py +24 -24
- ansible/modules/async_wrapper.py +20 -25
- ansible/modules/blockinfile.py +6 -7
- ansible/modules/command.py +13 -20
- ansible/modules/copy.py +60 -147
- ansible/modules/cron.py +24 -21
- ansible/modules/deb822_repository.py +8 -9
- ansible/modules/debconf.py +5 -5
- ansible/modules/debug.py +4 -4
- ansible/modules/dnf.py +8 -8
- ansible/modules/dnf5.py +39 -13
- ansible/modules/dpkg_selections.py +4 -4
- ansible/modules/expect.py +13 -15
- ansible/modules/fail.py +4 -4
- ansible/modules/fetch.py +4 -4
- ansible/modules/file.py +184 -144
- ansible/modules/find.py +22 -20
- ansible/modules/gather_facts.py +3 -3
- ansible/modules/get_url.py +77 -54
- ansible/modules/getent.py +7 -9
- ansible/modules/git.py +38 -38
- ansible/modules/group.py +6 -6
- ansible/modules/group_by.py +4 -4
- ansible/modules/hostname.py +15 -32
- ansible/modules/import_playbook.py +6 -6
- ansible/modules/import_role.py +6 -6
- ansible/modules/import_tasks.py +6 -6
- ansible/modules/include_role.py +6 -6
- ansible/modules/include_tasks.py +6 -6
- ansible/modules/include_vars.py +6 -6
- ansible/modules/iptables.py +86 -73
- ansible/modules/known_hosts.py +22 -24
- ansible/modules/lineinfile.py +5 -5
- ansible/modules/meta.py +4 -4
- ansible/modules/mount_facts.py +2 -2
- ansible/modules/package.py +10 -4
- ansible/modules/package_facts.py +22 -10
- ansible/modules/pause.py +6 -6
- ansible/modules/ping.py +6 -6
- ansible/modules/pip.py +21 -26
- ansible/modules/raw.py +6 -6
- ansible/modules/reboot.py +6 -6
- ansible/modules/replace.py +10 -14
- ansible/modules/rpm_key.py +7 -8
- ansible/modules/script.py +4 -4
- ansible/modules/service.py +10 -17
- ansible/modules/service_facts.py +87 -10
- ansible/modules/set_fact.py +5 -5
- ansible/modules/set_stats.py +4 -4
- ansible/modules/setup.py +2 -2
- ansible/modules/shell.py +6 -6
- ansible/modules/slurp.py +16 -19
- ansible/modules/stat.py +15 -31
- ansible/modules/subversion.py +15 -15
- ansible/modules/systemd.py +7 -7
- ansible/modules/systemd_service.py +7 -7
- ansible/modules/sysvinit.py +9 -9
- ansible/modules/tempfile.py +5 -6
- ansible/modules/template.py +6 -6
- ansible/modules/unarchive.py +38 -17
- ansible/modules/uri.py +33 -26
- ansible/modules/user.py +45 -32
- ansible/modules/validate_argument_spec.py +10 -7
- ansible/modules/wait_for.py +70 -60
- ansible/modules/wait_for_connection.py +6 -6
- ansible/modules/yum_repository.py +10 -9
- ansible/parsing/ajson.py +17 -37
- ansible/parsing/dataloader.py +99 -54
- ansible/parsing/mod_args.py +62 -60
- ansible/parsing/plugin_docs.py +21 -86
- ansible/parsing/quoting.py +1 -1
- ansible/parsing/splitter.py +27 -12
- ansible/parsing/utils/addresses.py +24 -24
- ansible/parsing/utils/jsonify.py +5 -1
- ansible/parsing/utils/yaml.py +32 -61
- ansible/parsing/vault/__init__.py +327 -99
- ansible/parsing/yaml/__init__.py +0 -18
- ansible/parsing/yaml/dumper.py +6 -120
- ansible/parsing/yaml/loader.py +6 -39
- ansible/parsing/yaml/objects.py +43 -335
- ansible/playbook/__init__.py +1 -1
- ansible/playbook/attribute.py +8 -3
- ansible/playbook/base.py +187 -134
- ansible/playbook/block.py +26 -24
- ansible/playbook/collectionsearch.py +1 -15
- ansible/playbook/conditional.py +3 -77
- ansible/playbook/handler.py +8 -2
- ansible/playbook/helpers.py +41 -53
- ansible/playbook/included_file.py +32 -26
- ansible/playbook/loop_control.py +2 -2
- ansible/playbook/play.py +85 -44
- ansible/playbook/play_context.py +14 -17
- ansible/playbook/playbook_include.py +27 -62
- ansible/playbook/role/__init__.py +64 -49
- ansible/playbook/role/definition.py +15 -17
- ansible/playbook/role/include.py +2 -4
- ansible/playbook/role/metadata.py +10 -11
- ansible/playbook/role_include.py +3 -3
- ansible/playbook/taggable.py +28 -12
- ansible/playbook/task.py +192 -121
- ansible/playbook/task_include.py +5 -5
- ansible/plugins/__init__.py +58 -26
- ansible/plugins/action/__init__.py +188 -186
- ansible/plugins/action/add_host.py +2 -2
- ansible/plugins/action/assemble.py +11 -18
- ansible/plugins/action/assert.py +55 -67
- ansible/plugins/action/async_status.py +7 -2
- ansible/plugins/action/copy.py +14 -17
- ansible/plugins/action/debug.py +37 -31
- ansible/plugins/action/dnf.py +3 -4
- ansible/plugins/action/fail.py +1 -1
- ansible/plugins/action/fetch.py +7 -8
- ansible/plugins/action/gather_facts.py +13 -14
- ansible/plugins/action/group_by.py +1 -1
- ansible/plugins/action/include_vars.py +10 -11
- ansible/plugins/action/package.py +8 -14
- ansible/plugins/action/pause.py +2 -2
- ansible/plugins/action/script.py +27 -38
- ansible/plugins/action/service.py +9 -18
- ansible/plugins/action/set_fact.py +3 -12
- ansible/plugins/action/set_stats.py +3 -8
- ansible/plugins/action/template.py +47 -67
- ansible/plugins/action/unarchive.py +6 -16
- ansible/plugins/action/uri.py +9 -20
- ansible/plugins/action/validate_argument_spec.py +5 -5
- ansible/plugins/action/wait_for_connection.py +1 -1
- ansible/plugins/become/__init__.py +31 -8
- ansible/plugins/become/runas.py +71 -0
- ansible/plugins/become/su.py +13 -8
- ansible/plugins/become/sudo.py +19 -0
- ansible/plugins/cache/__init__.py +52 -63
- ansible/plugins/cache/base.py +8 -0
- ansible/plugins/cache/jsonfile.py +10 -16
- ansible/plugins/cache/memory.py +6 -12
- ansible/plugins/callback/__init__.py +294 -201
- ansible/plugins/callback/default.py +99 -95
- ansible/plugins/callback/junit.py +44 -43
- ansible/plugins/callback/minimal.py +28 -25
- ansible/plugins/callback/oneline.py +34 -21
- ansible/plugins/callback/tree.py +27 -16
- ansible/plugins/connection/__init__.py +47 -34
- ansible/plugins/connection/local.py +156 -60
- ansible/plugins/connection/paramiko_ssh.py +34 -24
- ansible/plugins/connection/psrp.py +76 -165
- ansible/plugins/connection/ssh.py +326 -86
- ansible/plugins/connection/winrm.py +62 -141
- ansible/plugins/doc_fragments/action_common_attributes.py +14 -14
- ansible/plugins/doc_fragments/action_core.py +6 -6
- ansible/plugins/doc_fragments/backup.py +2 -2
- ansible/plugins/doc_fragments/checksum_common.py +27 -0
- ansible/plugins/doc_fragments/constructed.py +8 -4
- ansible/plugins/doc_fragments/decrypt.py +2 -2
- ansible/plugins/doc_fragments/default_callback.py +2 -2
- ansible/plugins/doc_fragments/files.py +2 -2
- ansible/plugins/doc_fragments/inventory_cache.py +2 -2
- ansible/plugins/doc_fragments/result_format_callback.py +2 -2
- ansible/plugins/doc_fragments/return_common.py +2 -2
- ansible/plugins/doc_fragments/template_common.py +4 -4
- ansible/plugins/doc_fragments/url.py +17 -1
- ansible/plugins/doc_fragments/url_windows.py +2 -2
- ansible/plugins/doc_fragments/validate.py +2 -2
- ansible/plugins/doc_fragments/vars_plugin_staging.py +2 -2
- ansible/plugins/filter/__init__.py +6 -2
- ansible/plugins/filter/b64decode.yml +22 -0
- ansible/plugins/filter/b64encode.yml +22 -0
- ansible/plugins/filter/bool.yml +11 -4
- ansible/plugins/filter/core.py +245 -120
- ansible/plugins/filter/encryption.py +42 -34
- ansible/plugins/filter/flatten.yml +3 -2
- ansible/plugins/filter/human_to_bytes.yml +1 -1
- ansible/plugins/filter/mathstuff.py +30 -37
- ansible/plugins/filter/password_hash.yml +8 -0
- ansible/plugins/filter/pow.yml +1 -1
- ansible/plugins/filter/regex_search.yml +1 -4
- ansible/plugins/filter/root.yml +1 -1
- ansible/plugins/filter/split.yml +1 -1
- ansible/plugins/filter/strftime.yml +3 -3
- ansible/plugins/filter/to_nice_yaml.yml +0 -4
- ansible/plugins/filter/to_uuid.yml +1 -1
- ansible/plugins/filter/to_yaml.yml +0 -4
- ansible/plugins/filter/unvault.yml +1 -1
- ansible/plugins/filter/urls.py +1 -1
- ansible/plugins/filter/urlsplit.py +8 -9
- ansible/plugins/filter/vault.yml +14 -9
- ansible/plugins/filter/win_basename.yml +6 -1
- ansible/plugins/filter/win_dirname.yml +5 -0
- ansible/plugins/inventory/__init__.py +107 -86
- ansible/plugins/inventory/advanced_host_list.py +7 -5
- ansible/plugins/inventory/auto.py +11 -4
- ansible/plugins/inventory/constructed.py +21 -24
- ansible/plugins/inventory/generator.py +16 -11
- ansible/plugins/inventory/host_list.py +7 -5
- ansible/plugins/inventory/ini.py +78 -44
- ansible/plugins/inventory/script.py +190 -120
- ansible/plugins/inventory/toml.py +16 -126
- ansible/plugins/inventory/yaml.py +10 -8
- ansible/plugins/list.py +72 -19
- ansible/plugins/loader.py +383 -198
- ansible/plugins/lookup/__init__.py +21 -4
- ansible/plugins/lookup/config.py +21 -35
- ansible/plugins/lookup/csvfile.py +19 -73
- ansible/plugins/lookup/dict.py +1 -6
- ansible/plugins/lookup/env.py +12 -9
- ansible/plugins/lookup/file.py +5 -8
- ansible/plugins/lookup/first_found.py +87 -55
- ansible/plugins/lookup/indexed_items.py +1 -10
- ansible/plugins/lookup/ini.py +14 -13
- ansible/plugins/lookup/items.py +1 -1
- ansible/plugins/lookup/lines.py +8 -1
- ansible/plugins/lookup/list.py +1 -1
- ansible/plugins/lookup/nested.py +2 -18
- ansible/plugins/lookup/password.py +5 -5
- ansible/plugins/lookup/pipe.py +5 -7
- ansible/plugins/lookup/sequence.py +18 -8
- ansible/plugins/lookup/subelements.py +1 -4
- ansible/plugins/lookup/template.py +47 -36
- ansible/plugins/lookup/together.py +0 -12
- ansible/plugins/lookup/unvault.py +1 -5
- ansible/plugins/lookup/url.py +4 -10
- ansible/plugins/lookup/vars.py +16 -24
- ansible/plugins/shell/__init__.py +58 -4
- ansible/plugins/shell/cmd.py +2 -2
- ansible/plugins/shell/powershell.py +106 -31
- ansible/plugins/shell/sh.py +13 -7
- ansible/plugins/strategy/__init__.py +168 -193
- ansible/plugins/strategy/debug.py +2 -2
- ansible/plugins/strategy/free.py +16 -31
- ansible/plugins/strategy/host_pinned.py +2 -2
- ansible/plugins/strategy/linear.py +41 -41
- ansible/plugins/terminal/__init__.py +4 -4
- ansible/plugins/test/__init__.py +7 -2
- ansible/plugins/test/core.py +75 -35
- ansible/plugins/test/files.py +1 -1
- ansible/plugins/test/finished.yml +1 -1
- ansible/plugins/test/mathstuff.py +3 -3
- ansible/plugins/test/uri.py +5 -8
- ansible/plugins/vars/host_group_vars.py +7 -14
- ansible/release.py +2 -2
- ansible/template/__init__.py +353 -943
- ansible/utils/__init__.py +0 -18
- ansible/utils/collection_loader/__init__.py +54 -5
- ansible/utils/collection_loader/_collection_config.py +5 -6
- ansible/utils/collection_loader/_collection_finder.py +82 -96
- ansible/utils/collection_loader/_collection_meta.py +15 -8
- ansible/utils/display.py +485 -73
- ansible/utils/encrypt.py +27 -19
- ansible/utils/fqcn.py +2 -2
- ansible/utils/galaxy.py +2 -2
- ansible/utils/hashing.py +8 -10
- ansible/utils/helpers.py +2 -2
- ansible/utils/listify.py +10 -8
- ansible/utils/lock.py +2 -2
- ansible/utils/path.py +10 -12
- ansible/utils/plugin_docs.py +16 -14
- ansible/utils/py3compat.py +2 -7
- ansible/utils/sentinel.py +4 -62
- ansible/utils/singleton.py +2 -0
- ansible/utils/ssh_functions.py +6 -2
- ansible/utils/unsafe_proxy.py +23 -332
- ansible/utils/vars.py +55 -8
- ansible/utils/version.py +2 -2
- ansible/vars/clean.py +5 -5
- ansible/vars/hostvars.py +60 -90
- ansible/vars/manager.py +220 -285
- ansible/vars/plugins.py +4 -4
- ansible/vars/reserved.py +13 -12
- {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/METADATA +4 -3
- ansible_core-2.19.0.dist-info/RECORD +1097 -0
- ansible_core-2.19.0.dist-info/licenses/licenses/BSD-3-Clause.txt +28 -0
- ansible_test/_data/completion/docker.txt +7 -7
- ansible_test/_data/completion/remote.txt +6 -6
- ansible_test/_data/completion/windows.txt +1 -0
- ansible_test/_data/requirements/ansible.txt +2 -2
- ansible_test/_data/requirements/sanity.ansible-doc.txt +3 -3
- ansible_test/_data/requirements/sanity.changelog.txt +2 -2
- ansible_test/_data/requirements/sanity.import.plugin.txt +2 -2
- ansible_test/_data/requirements/sanity.pep8.txt +1 -1
- ansible_test/_data/requirements/sanity.pylint.txt +5 -5
- ansible_test/_data/requirements/sanity.validate-modules.txt +2 -2
- ansible_test/_data/requirements/sanity.yamllint.txt +1 -1
- ansible_test/_data/requirements/units.txt +1 -0
- ansible_test/_internal/__init__.py +6 -0
- ansible_test/_internal/ansible_util.py +3 -1
- ansible_test/_internal/become.py +1 -0
- ansible_test/_internal/bootstrap.py +1 -0
- ansible_test/_internal/cache.py +1 -0
- ansible_test/_internal/cgroup.py +1 -0
- ansible_test/_internal/ci/__init__.py +1 -0
- ansible_test/_internal/ci/azp.py +1 -0
- ansible_test/_internal/ci/local.py +1 -0
- ansible_test/_internal/classification/__init__.py +1 -0
- ansible_test/_internal/classification/common.py +1 -0
- ansible_test/_internal/classification/csharp.py +1 -0
- ansible_test/_internal/classification/powershell.py +1 -0
- ansible_test/_internal/classification/python.py +1 -0
- ansible_test/_internal/cli/__init__.py +1 -0
- ansible_test/_internal/cli/actions.py +1 -0
- ansible_test/_internal/cli/argparsing/__init__.py +1 -0
- ansible_test/_internal/cli/argparsing/actions.py +1 -0
- ansible_test/_internal/cli/argparsing/argcompletion.py +1 -0
- ansible_test/_internal/cli/argparsing/parsers.py +1 -0
- ansible_test/_internal/cli/commands/__init__.py +11 -5
- ansible_test/_internal/cli/commands/coverage/__init__.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/__init__.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/__init__.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/combine.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/expand.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/filter.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/generate.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/missing.py +1 -0
- ansible_test/_internal/cli/commands/coverage/combine.py +1 -0
- ansible_test/_internal/cli/commands/coverage/erase.py +1 -0
- ansible_test/_internal/cli/commands/coverage/html.py +1 -0
- ansible_test/_internal/cli/commands/coverage/report.py +1 -0
- ansible_test/_internal/cli/commands/coverage/xml.py +1 -0
- ansible_test/_internal/cli/commands/env.py +1 -0
- ansible_test/_internal/cli/commands/integration/__init__.py +1 -0
- ansible_test/_internal/cli/commands/integration/network.py +1 -0
- ansible_test/_internal/cli/commands/integration/posix.py +1 -0
- ansible_test/_internal/cli/commands/integration/windows.py +1 -0
- ansible_test/_internal/cli/commands/sanity.py +9 -0
- ansible_test/_internal/cli/commands/shell.py +1 -0
- ansible_test/_internal/cli/commands/units.py +1 -0
- ansible_test/_internal/cli/compat.py +1 -0
- ansible_test/_internal/cli/completers.py +1 -0
- ansible_test/_internal/cli/converters.py +1 -0
- ansible_test/_internal/cli/environments.py +52 -5
- ansible_test/_internal/cli/epilog.py +1 -0
- ansible_test/_internal/cli/parsers/__init__.py +1 -0
- ansible_test/_internal/cli/parsers/base_argument_parsers.py +1 -0
- ansible_test/_internal/cli/parsers/helpers.py +1 -0
- ansible_test/_internal/cli/parsers/host_config_parsers.py +1 -0
- ansible_test/_internal/cli/parsers/key_value_parsers.py +1 -0
- ansible_test/_internal/cli/parsers/value_parsers.py +1 -0
- ansible_test/_internal/commands/__init__.py +1 -0
- ansible_test/_internal/commands/coverage/__init__.py +3 -2
- ansible_test/_internal/commands/coverage/analyze/__init__.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/__init__.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/combine.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/expand.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/filter.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/generate.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/missing.py +1 -0
- ansible_test/_internal/commands/coverage/combine.py +2 -1
- ansible_test/_internal/commands/coverage/erase.py +1 -0
- ansible_test/_internal/commands/coverage/html.py +1 -0
- ansible_test/_internal/commands/coverage/report.py +1 -0
- ansible_test/_internal/commands/coverage/xml.py +1 -0
- ansible_test/_internal/commands/env/__init__.py +2 -0
- ansible_test/_internal/commands/integration/__init__.py +22 -5
- ansible_test/_internal/commands/integration/cloud/__init__.py +1 -0
- ansible_test/_internal/commands/integration/cloud/acme.py +2 -1
- ansible_test/_internal/commands/integration/cloud/aws.py +1 -0
- ansible_test/_internal/commands/integration/cloud/azure.py +1 -0
- ansible_test/_internal/commands/integration/cloud/cs.py +1 -0
- ansible_test/_internal/commands/integration/cloud/digitalocean.py +1 -0
- ansible_test/_internal/commands/integration/cloud/galaxy.py +3 -2
- ansible_test/_internal/commands/integration/cloud/hcloud.py +1 -0
- ansible_test/_internal/commands/integration/cloud/httptester.py +3 -2
- ansible_test/_internal/commands/integration/cloud/nios.py +2 -1
- ansible_test/_internal/commands/integration/cloud/opennebula.py +1 -0
- ansible_test/_internal/commands/integration/cloud/openshift.py +1 -0
- ansible_test/_internal/commands/integration/cloud/scaleway.py +1 -0
- ansible_test/_internal/commands/integration/cloud/vcenter.py +1 -0
- ansible_test/_internal/commands/integration/cloud/vultr.py +1 -0
- ansible_test/_internal/commands/integration/coverage.py +8 -2
- ansible_test/_internal/commands/integration/filters.py +1 -0
- ansible_test/_internal/commands/integration/network.py +1 -0
- ansible_test/_internal/commands/integration/posix.py +1 -0
- ansible_test/_internal/commands/integration/windows.py +1 -0
- ansible_test/_internal/commands/sanity/__init__.py +19 -2
- ansible_test/_internal/commands/sanity/ansible_doc.py +1 -0
- ansible_test/_internal/commands/sanity/bin_symlinks.py +1 -0
- ansible_test/_internal/commands/sanity/compile.py +1 -0
- ansible_test/_internal/commands/sanity/ignores.py +1 -0
- ansible_test/_internal/commands/sanity/import.py +1 -0
- ansible_test/_internal/commands/sanity/integration_aliases.py +12 -0
- ansible_test/_internal/commands/sanity/pep8.py +1 -0
- ansible_test/_internal/commands/sanity/pslint.py +1 -0
- ansible_test/_internal/commands/sanity/pylint.py +25 -26
- ansible_test/_internal/commands/sanity/shellcheck.py +1 -0
- ansible_test/_internal/commands/sanity/validate_modules.py +1 -0
- ansible_test/_internal/commands/sanity/yamllint.py +1 -0
- ansible_test/_internal/commands/shell/__init__.py +44 -4
- ansible_test/_internal/commands/units/__init__.py +5 -1
- ansible_test/_internal/compat/__init__.py +1 -0
- ansible_test/_internal/compat/packaging.py +1 -0
- ansible_test/_internal/compat/yaml.py +1 -0
- ansible_test/_internal/completion.py +1 -0
- ansible_test/_internal/config.py +23 -13
- ansible_test/_internal/connections.py +1 -0
- ansible_test/_internal/constants.py +1 -0
- ansible_test/_internal/containers.py +1 -0
- ansible_test/_internal/content_config.py +1 -0
- ansible_test/_internal/core_ci.py +1 -0
- ansible_test/_internal/coverage_util.py +11 -10
- ansible_test/_internal/data.py +1 -0
- ansible_test/_internal/debugging.py +166 -0
- ansible_test/_internal/delegation.py +22 -13
- ansible_test/_internal/dev/__init__.py +1 -0
- ansible_test/_internal/dev/container_probe.py +1 -0
- ansible_test/_internal/diff.py +3 -2
- ansible_test/_internal/docker_util.py +2 -1
- ansible_test/_internal/encoding.py +1 -0
- ansible_test/_internal/executor.py +1 -0
- ansible_test/_internal/git.py +1 -0
- ansible_test/_internal/host_configs.py +1 -0
- ansible_test/_internal/host_profiles.py +260 -16
- ansible_test/_internal/http.py +1 -0
- ansible_test/_internal/init.py +1 -0
- ansible_test/_internal/inventory.py +39 -3
- ansible_test/_internal/io.py +1 -0
- ansible_test/_internal/metadata.py +95 -4
- ansible_test/_internal/payload.py +1 -0
- ansible_test/_internal/processes.py +80 -0
- ansible_test/_internal/provider/__init__.py +1 -0
- ansible_test/_internal/provider/layout/__init__.py +1 -0
- ansible_test/_internal/provider/layout/ansible.py +1 -0
- ansible_test/_internal/provider/layout/collection.py +1 -0
- ansible_test/_internal/provider/layout/unsupported.py +1 -0
- ansible_test/_internal/provider/source/__init__.py +1 -0
- ansible_test/_internal/provider/source/git.py +1 -0
- ansible_test/_internal/provider/source/installed.py +1 -0
- ansible_test/_internal/provider/source/unsupported.py +1 -0
- ansible_test/_internal/provider/source/unversioned.py +1 -0
- ansible_test/_internal/provisioning.py +11 -4
- ansible_test/_internal/pypi_proxy.py +6 -5
- ansible_test/_internal/python_requirements.py +28 -0
- ansible_test/_internal/ssh.py +2 -5
- ansible_test/_internal/target.py +9 -0
- ansible_test/_internal/test.py +3 -2
- ansible_test/_internal/thread.py +3 -1
- ansible_test/_internal/timeout.py +2 -1
- ansible_test/_internal/util.py +41 -12
- ansible_test/_internal/util_common.py +18 -5
- ansible_test/_internal/venv.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/action-plugin-docs.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/changelog/sphinx.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/changelog.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/empty-init.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/line-endings.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/no-assert.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/no-get-exception.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/no-illegal-filenames.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/no-smart-quotes.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/replace-urlopen.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/runtime-metadata.py +28 -1
- ansible_test/_util/controller/sanity/code-smell/shebang.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/symlinks.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/use-argspec-type-path.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/use-compat-six.py +1 -0
- ansible_test/_util/controller/sanity/integration-aliases/yaml_to_json.py +2 -1
- ansible_test/_util/controller/sanity/pep8/current-ignore.txt +4 -0
- ansible_test/_util/controller/sanity/pylint/config/ansible-test-target.cfg +8 -5
- ansible_test/_util/controller/sanity/pylint/config/ansible-test.cfg +8 -5
- ansible_test/_util/controller/sanity/pylint/config/code-smell.cfg +8 -5
- ansible_test/_util/controller/sanity/pylint/config/collection.cfg +4 -5
- ansible_test/_util/controller/sanity/pylint/config/default.cfg +8 -7
- ansible_test/_util/controller/sanity/pylint/plugins/deprecated_calls.py +541 -0
- ansible_test/_util/controller/sanity/pylint/plugins/deprecated_comment.py +137 -0
- ansible_test/_util/controller/sanity/pylint/plugins/hide_unraisable.py +1 -0
- ansible_test/_util/controller/sanity/pylint/plugins/string_format.py +1 -8
- ansible_test/_util/controller/sanity/pylint/plugins/unwanted.py +1 -8
- ansible_test/_util/controller/sanity/validate-modules/validate_modules/main.py +55 -28
- ansible_test/_util/controller/sanity/validate-modules/validate_modules/module_args.py +12 -5
- ansible_test/_util/controller/sanity/validate-modules/validate_modules/schema.py +13 -2
- ansible_test/_util/controller/sanity/validate-modules/validate_modules/utils.py +1 -0
- ansible_test/_util/controller/sanity/yamllint/yamllinter.py +35 -17
- ansible_test/_util/controller/tools/collection_detail.py +1 -0
- ansible_test/_util/controller/tools/yaml_to_json.py +2 -1
- ansible_test/_util/target/injector/python.py +8 -0
- ansible_test/_util/target/pytest/plugins/ansible_forked.py +6 -1
- ansible_test/_util/target/pytest/plugins/ansible_pytest_collections.py +2 -1
- ansible_test/_util/target/pytest/plugins/ansible_pytest_coverage.py +1 -0
- ansible_test/_util/target/sanity/compile/compile.py +1 -0
- ansible_test/_util/target/sanity/import/importer.py +15 -16
- ansible_test/_util/target/setup/bootstrap.sh +9 -20
- ansible_test/_util/target/setup/probe_cgroups.py +1 -0
- ansible_test/_util/target/setup/quiet_pip.py +1 -0
- ansible_test/_util/target/setup/requirements.py +38 -36
- ansible_test/_util/target/tools/virtualenvcheck.py +2 -1
- ansible_test/_util/target/tools/yamlcheck.py +2 -1
- ansible/compat/selectors.py +0 -32
- ansible/errors/yaml_strings.py +0 -138
- ansible/executor/action_write_locks.py +0 -44
- ansible/executor/discovery/python_target.py +0 -47
- ansible/executor/powershell/module_powershell_wrapper.ps1 +0 -86
- ansible/executor/powershell/module_script_wrapper.ps1 +0 -22
- ansible/module_utils/compat/importlib.py +0 -26
- ansible/module_utils/compat/selectors.py +0 -32
- ansible/module_utils/pycompat24.py +0 -73
- ansible/parsing/yaml/constructor.py +0 -178
- ansible/template/native_helpers.py +0 -251
- ansible/template/template.py +0 -43
- ansible/template/vars.py +0 -77
- ansible/utils/native_jinja.py +0 -11
- ansible/vars/fact_cache.py +0 -71
- ansible_core-2.18.7rc1.dist-info/RECORD +0 -992
- ansible_test/_util/controller/sanity/pylint/plugins/deprecated.py +0 -411
- {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/WHEEL +0 -0
- {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/entry_points.txt +0 -0
- {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/licenses/COPYING +0 -0
- {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/Apache-License.txt +0 -0
- {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/MIT-license.txt +0 -0
- {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/PSF-license.txt +0 -0
- {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/simplified_bsd.txt +0 -0
- {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/top_level.txt +0 -0
ansible/modules/copy.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: copy
|
|
13
13
|
version_added: historical
|
|
@@ -109,7 +109,6 @@ options:
|
|
|
109
109
|
description:
|
|
110
110
|
- This flag indicates that filesystem links in the source tree, if they exist, should be followed.
|
|
111
111
|
type: bool
|
|
112
|
-
default: yes
|
|
113
112
|
version_added: '2.4'
|
|
114
113
|
checksum:
|
|
115
114
|
description:
|
|
@@ -155,9 +154,9 @@ attributes:
|
|
|
155
154
|
vault:
|
|
156
155
|
support: full
|
|
157
156
|
version_added: '2.2'
|
|
158
|
-
|
|
157
|
+
"""
|
|
159
158
|
|
|
160
|
-
EXAMPLES = r
|
|
159
|
+
EXAMPLES = r"""
|
|
161
160
|
- name: Copy file with owner and permissions
|
|
162
161
|
ansible.builtin.copy:
|
|
163
162
|
src: /srv/myfiles/foo.conf
|
|
@@ -220,9 +219,9 @@ EXAMPLES = r'''
|
|
|
220
219
|
src: /etc/foo.conf
|
|
221
220
|
dest: /path/to/link # link to /path/to/file
|
|
222
221
|
follow: no
|
|
223
|
-
|
|
222
|
+
"""
|
|
224
223
|
|
|
225
|
-
RETURN = r
|
|
224
|
+
RETURN = r"""
|
|
226
225
|
dest:
|
|
227
226
|
description: Destination file/path.
|
|
228
227
|
returned: success
|
|
@@ -283,18 +282,15 @@ state:
|
|
|
283
282
|
returned: success
|
|
284
283
|
type: str
|
|
285
284
|
sample: file
|
|
286
|
-
|
|
285
|
+
"""
|
|
287
286
|
|
|
288
287
|
import errno
|
|
289
288
|
import filecmp
|
|
290
|
-
import grp
|
|
291
289
|
import os
|
|
292
290
|
import os.path
|
|
293
|
-
import pwd
|
|
294
291
|
import shutil
|
|
295
292
|
import stat
|
|
296
293
|
import tempfile
|
|
297
|
-
import traceback
|
|
298
294
|
|
|
299
295
|
from ansible.module_utils.common.text.converters import to_bytes, to_native
|
|
300
296
|
from ansible.module_utils.basic import AnsibleModule
|
|
@@ -306,9 +302,9 @@ class AnsibleModuleError(Exception):
|
|
|
306
302
|
|
|
307
303
|
|
|
308
304
|
def split_pre_existing_dir(dirname):
|
|
309
|
-
|
|
305
|
+
"""
|
|
310
306
|
Return the first pre-existing directory and a list of the new directories that will be created.
|
|
311
|
-
|
|
307
|
+
"""
|
|
312
308
|
head, tail = os.path.split(dirname)
|
|
313
309
|
b_head = to_bytes(head, errors='surrogate_or_strict')
|
|
314
310
|
if head == '':
|
|
@@ -324,9 +320,9 @@ def split_pre_existing_dir(dirname):
|
|
|
324
320
|
|
|
325
321
|
|
|
326
322
|
def adjust_recursive_directory_permissions(pre_existing_dir, new_directory_list, module, directory_args, changed):
|
|
327
|
-
|
|
323
|
+
"""
|
|
328
324
|
Walk the new directories list and make sure that permissions are as we would expect
|
|
329
|
-
|
|
325
|
+
"""
|
|
330
326
|
|
|
331
327
|
if new_directory_list:
|
|
332
328
|
working_dir = os.path.join(pre_existing_dir, new_directory_list.pop(0))
|
|
@@ -336,67 +332,24 @@ def adjust_recursive_directory_permissions(pre_existing_dir, new_directory_list,
|
|
|
336
332
|
return changed
|
|
337
333
|
|
|
338
334
|
|
|
335
|
+
def chown_path(module, path, owner, group):
|
|
336
|
+
"""Update the owner/group if specified and different from the current owner/group."""
|
|
337
|
+
changed = module.set_owner_if_different(path, owner, False)
|
|
338
|
+
return module.set_group_if_different(path, group, changed)
|
|
339
|
+
|
|
340
|
+
|
|
339
341
|
def chown_recursive(path, module):
|
|
340
342
|
changed = False
|
|
341
343
|
owner = module.params['owner']
|
|
342
344
|
group = module.params['group']
|
|
343
345
|
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
owner_changed = module.set_owner_if_different(dir, owner, False)
|
|
352
|
-
if owner_changed is True:
|
|
353
|
-
changed = owner_changed
|
|
354
|
-
for file in [os.path.join(dirpath, f) for f in filenames]:
|
|
355
|
-
owner_changed = module.set_owner_if_different(file, owner, False)
|
|
356
|
-
if owner_changed is True:
|
|
357
|
-
changed = owner_changed
|
|
358
|
-
else:
|
|
359
|
-
uid = pwd.getpwnam(owner).pw_uid
|
|
360
|
-
for dirpath, dirnames, filenames in os.walk(path):
|
|
361
|
-
owner_changed = (os.stat(dirpath).st_uid != uid)
|
|
362
|
-
if owner_changed is True:
|
|
363
|
-
changed = owner_changed
|
|
364
|
-
for dir in [os.path.join(dirpath, d) for d in dirnames]:
|
|
365
|
-
owner_changed = (os.stat(dir).st_uid != uid)
|
|
366
|
-
if owner_changed is True:
|
|
367
|
-
changed = owner_changed
|
|
368
|
-
for file in [os.path.join(dirpath, f) for f in filenames]:
|
|
369
|
-
owner_changed = (os.stat(file).st_uid != uid)
|
|
370
|
-
if owner_changed is True:
|
|
371
|
-
changed = owner_changed
|
|
372
|
-
if group is not None:
|
|
373
|
-
if not module.check_mode:
|
|
374
|
-
for dirpath, dirnames, filenames in os.walk(path):
|
|
375
|
-
group_changed = module.set_group_if_different(dirpath, group, False)
|
|
376
|
-
if group_changed is True:
|
|
377
|
-
changed = group_changed
|
|
378
|
-
for dir in [os.path.join(dirpath, d) for d in dirnames]:
|
|
379
|
-
group_changed = module.set_group_if_different(dir, group, False)
|
|
380
|
-
if group_changed is True:
|
|
381
|
-
changed = group_changed
|
|
382
|
-
for file in [os.path.join(dirpath, f) for f in filenames]:
|
|
383
|
-
group_changed = module.set_group_if_different(file, group, False)
|
|
384
|
-
if group_changed is True:
|
|
385
|
-
changed = group_changed
|
|
386
|
-
else:
|
|
387
|
-
gid = grp.getgrnam(group).gr_gid
|
|
388
|
-
for dirpath, dirnames, filenames in os.walk(path):
|
|
389
|
-
group_changed = (os.stat(dirpath).st_gid != gid)
|
|
390
|
-
if group_changed is True:
|
|
391
|
-
changed = group_changed
|
|
392
|
-
for dir in [os.path.join(dirpath, d) for d in dirnames]:
|
|
393
|
-
group_changed = (os.stat(dir).st_gid != gid)
|
|
394
|
-
if group_changed is True:
|
|
395
|
-
changed = group_changed
|
|
396
|
-
for file in [os.path.join(dirpath, f) for f in filenames]:
|
|
397
|
-
group_changed = (os.stat(file).st_gid != gid)
|
|
398
|
-
if group_changed is True:
|
|
399
|
-
changed = group_changed
|
|
346
|
+
# TODO: Consolidate with the other methods calling set_*_if_different method, this is inefficient.
|
|
347
|
+
for dirpath, dirnames, filenames in os.walk(path):
|
|
348
|
+
changed |= chown_path(module, dirpath, owner, group)
|
|
349
|
+
for subdir in [os.path.join(dirpath, d) for d in dirnames]:
|
|
350
|
+
changed |= chown_path(module, subdir, owner, group)
|
|
351
|
+
for filepath in [os.path.join(dirpath, f) for f in filenames]:
|
|
352
|
+
changed |= chown_path(module, filepath, owner, group)
|
|
400
353
|
|
|
401
354
|
return changed
|
|
402
355
|
|
|
@@ -424,10 +377,7 @@ def copy_diff_files(src, dest, module):
|
|
|
424
377
|
shutil.copyfile(b_src_item_path, b_dest_item_path)
|
|
425
378
|
shutil.copymode(b_src_item_path, b_dest_item_path)
|
|
426
379
|
|
|
427
|
-
|
|
428
|
-
module.set_owner_if_different(b_dest_item_path, owner, False)
|
|
429
|
-
if group is not None:
|
|
430
|
-
module.set_group_if_different(b_dest_item_path, group, False)
|
|
380
|
+
chown_path(module, b_dest_item_path, owner, group)
|
|
431
381
|
changed = True
|
|
432
382
|
return changed
|
|
433
383
|
|
|
@@ -459,10 +409,7 @@ def copy_left_only(src, dest, module):
|
|
|
459
409
|
|
|
460
410
|
if os.path.islink(b_src_item_path) and os.path.isfile(b_src_item_path) and local_follow is True:
|
|
461
411
|
shutil.copyfile(b_src_item_path, b_dest_item_path)
|
|
462
|
-
|
|
463
|
-
module.set_owner_if_different(b_dest_item_path, owner, False)
|
|
464
|
-
if group is not None:
|
|
465
|
-
module.set_group_if_different(b_dest_item_path, group, False)
|
|
412
|
+
chown_path(module, b_dest_item_path, owner, group)
|
|
466
413
|
|
|
467
414
|
if os.path.islink(b_src_item_path) and os.path.isfile(b_src_item_path) and local_follow is False:
|
|
468
415
|
linkto = os.readlink(b_src_item_path)
|
|
@@ -471,11 +418,7 @@ def copy_left_only(src, dest, module):
|
|
|
471
418
|
if not os.path.islink(b_src_item_path) and os.path.isfile(b_src_item_path):
|
|
472
419
|
shutil.copyfile(b_src_item_path, b_dest_item_path)
|
|
473
420
|
shutil.copymode(b_src_item_path, b_dest_item_path)
|
|
474
|
-
|
|
475
|
-
if owner is not None:
|
|
476
|
-
module.set_owner_if_different(b_dest_item_path, owner, False)
|
|
477
|
-
if group is not None:
|
|
478
|
-
module.set_group_if_different(b_dest_item_path, group, False)
|
|
421
|
+
chown_path(module, b_dest_item_path, owner, group)
|
|
479
422
|
|
|
480
423
|
if not os.path.islink(b_src_item_path) and os.path.isdir(b_src_item_path):
|
|
481
424
|
shutil.copytree(b_src_item_path, b_dest_item_path, symlinks=not local_follow)
|
|
@@ -503,6 +446,21 @@ def copy_common_dirs(src, dest, module):
|
|
|
503
446
|
return changed
|
|
504
447
|
|
|
505
448
|
|
|
449
|
+
def copy_directory(src, dest, module):
|
|
450
|
+
if not os.path.exists(dest):
|
|
451
|
+
if not module.check_mode:
|
|
452
|
+
shutil.copytree(src, dest, symlinks=not module.params['local_follow'])
|
|
453
|
+
chown_recursive(dest, module)
|
|
454
|
+
changed = True
|
|
455
|
+
else:
|
|
456
|
+
diff_files_changed = copy_diff_files(src, dest, module)
|
|
457
|
+
left_only_changed = copy_left_only(src, dest, module)
|
|
458
|
+
common_dirs_changed = copy_common_dirs(src, dest, module)
|
|
459
|
+
owner_group_changed = chown_recursive(dest, module)
|
|
460
|
+
changed = any([diff_files_changed, left_only_changed, common_dirs_changed, owner_group_changed])
|
|
461
|
+
return changed
|
|
462
|
+
|
|
463
|
+
|
|
506
464
|
def main():
|
|
507
465
|
|
|
508
466
|
module = AnsibleModule(
|
|
@@ -516,7 +474,7 @@ def main():
|
|
|
516
474
|
force=dict(type='bool', default=True),
|
|
517
475
|
validate=dict(type='str'),
|
|
518
476
|
directory_mode=dict(type='raw'),
|
|
519
|
-
remote_src=dict(type='bool'),
|
|
477
|
+
remote_src=dict(type='bool', default=False),
|
|
520
478
|
local_follow=dict(type='bool'),
|
|
521
479
|
checksum=dict(type='str'),
|
|
522
480
|
follow=dict(type='bool', default=False),
|
|
@@ -564,8 +522,8 @@ def main():
|
|
|
564
522
|
if os.path.isfile(src):
|
|
565
523
|
try:
|
|
566
524
|
checksum_src = module.sha1(src)
|
|
567
|
-
except
|
|
568
|
-
module.
|
|
525
|
+
except OSError as ex:
|
|
526
|
+
module.error_as_warning("Unable to calculate src checksum, assuming change.", exception=ex)
|
|
569
527
|
try:
|
|
570
528
|
# Backwards compat only. This will be None in FIPS mode
|
|
571
529
|
md5sum_src = module.md5(src)
|
|
@@ -653,12 +611,8 @@ def main():
|
|
|
653
611
|
if validate:
|
|
654
612
|
# if we have a mode, make sure we set it on the temporary
|
|
655
613
|
# file source as some validations may require it
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
if owner is not None:
|
|
659
|
-
module.set_owner_if_different(src, owner, False)
|
|
660
|
-
if group is not None:
|
|
661
|
-
module.set_group_if_different(src, group, False)
|
|
614
|
+
module.set_mode_if_different(src, mode, False)
|
|
615
|
+
chown_path(module, src, owner, group)
|
|
662
616
|
if "%s" not in validate:
|
|
663
617
|
module.fail_json(msg="validate must contain %%s: %s" % (validate))
|
|
664
618
|
(rc, out, err) = module.run_command(validate % src)
|
|
@@ -682,64 +636,23 @@ def main():
|
|
|
682
636
|
# at this point we should always have tmp file
|
|
683
637
|
module.atomic_move(b_mysrc, dest, unsafe_writes=module.params['unsafe_writes'], keep_dest_attrs=not remote_src)
|
|
684
638
|
|
|
685
|
-
except
|
|
686
|
-
|
|
639
|
+
except OSError as ex:
|
|
640
|
+
raise Exception(f"Failed to copy {src!r} to {dest!r}.") from ex
|
|
687
641
|
changed = True
|
|
688
642
|
|
|
689
643
|
# If neither have checksums, both src and dest are directories.
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
if src.endswith(os.path.sep) and not os.path.exists(module.params['dest']):
|
|
704
|
-
b_basename = to_bytes(os.path.basename(src), errors='surrogate_or_strict')
|
|
705
|
-
b_dest = to_bytes(os.path.join(b_dest, b_basename), errors='surrogate_or_strict')
|
|
706
|
-
b_src = to_bytes(os.path.join(module.params['src'], ""), errors='surrogate_or_strict')
|
|
707
|
-
if not module.check_mode:
|
|
708
|
-
shutil.copytree(b_src, b_dest, symlinks=not local_follow)
|
|
709
|
-
chown_recursive(dest, module)
|
|
710
|
-
changed = True
|
|
711
|
-
|
|
712
|
-
if not src.endswith(os.path.sep) and os.path.isdir(module.params['dest']):
|
|
713
|
-
b_basename = to_bytes(os.path.basename(src), errors='surrogate_or_strict')
|
|
714
|
-
b_dest = to_bytes(os.path.join(b_dest, b_basename), errors='surrogate_or_strict')
|
|
715
|
-
b_src = to_bytes(os.path.join(module.params['src'], ""), errors='surrogate_or_strict')
|
|
716
|
-
if not module.check_mode and not os.path.exists(b_dest):
|
|
717
|
-
shutil.copytree(b_src, b_dest, symlinks=not local_follow)
|
|
718
|
-
changed = True
|
|
719
|
-
chown_recursive(dest, module)
|
|
720
|
-
if module.check_mode and not os.path.exists(b_dest):
|
|
721
|
-
changed = True
|
|
722
|
-
if os.path.exists(b_dest):
|
|
723
|
-
diff_files_changed = copy_diff_files(b_src, b_dest, module)
|
|
724
|
-
left_only_changed = copy_left_only(b_src, b_dest, module)
|
|
725
|
-
common_dirs_changed = copy_common_dirs(b_src, b_dest, module)
|
|
726
|
-
owner_group_changed = chown_recursive(b_dest, module)
|
|
727
|
-
if diff_files_changed or left_only_changed or common_dirs_changed or owner_group_changed:
|
|
728
|
-
changed = True
|
|
729
|
-
|
|
730
|
-
if not src.endswith(os.path.sep) and not os.path.exists(module.params['dest']):
|
|
731
|
-
b_basename = to_bytes(os.path.basename(module.params['src']), errors='surrogate_or_strict')
|
|
732
|
-
b_dest = to_bytes(os.path.join(b_dest, b_basename), errors='surrogate_or_strict')
|
|
733
|
-
if not module.check_mode and not os.path.exists(b_dest):
|
|
734
|
-
os.makedirs(b_dest)
|
|
735
|
-
changed = True
|
|
736
|
-
b_src = to_bytes(os.path.join(module.params['src'], ""), errors='surrogate_or_strict')
|
|
737
|
-
diff_files_changed = copy_diff_files(b_src, b_dest, module)
|
|
738
|
-
left_only_changed = copy_left_only(b_src, b_dest, module)
|
|
739
|
-
common_dirs_changed = copy_common_dirs(b_src, b_dest, module)
|
|
740
|
-
owner_group_changed = chown_recursive(b_dest, module)
|
|
741
|
-
if module.check_mode and not os.path.exists(b_dest):
|
|
742
|
-
changed = True
|
|
644
|
+
checksums_none = checksum_src is None and checksum_dest is None
|
|
645
|
+
both_directories = os.path.isdir(module.params['src']) and (os.path.isdir(module.params['dest']) or not os.path.exists(module.params['dest']))
|
|
646
|
+
if checksums_none and remote_src and both_directories:
|
|
647
|
+
b_src = to_bytes(module.params['src'], errors='surrogate_or_strict')
|
|
648
|
+
b_dest = to_bytes(module.params['dest'], errors='surrogate_or_strict')
|
|
649
|
+
|
|
650
|
+
if not b_src.endswith(to_bytes(os.path.sep)):
|
|
651
|
+
b_basename = os.path.basename(b_src)
|
|
652
|
+
b_dest = os.path.join(b_dest, b_basename)
|
|
653
|
+
b_src = os.path.join(b_src, b'')
|
|
654
|
+
|
|
655
|
+
changed |= copy_directory(b_src, b_dest, module)
|
|
743
656
|
|
|
744
657
|
res_args = dict(
|
|
745
658
|
dest=dest, src=src, md5sum=md5sum_src, checksum=checksum_src, changed=changed
|
ansible/modules/cron.py
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
from __future__ import annotations
|
|
11
11
|
|
|
12
12
|
|
|
13
|
-
DOCUMENTATION = r
|
|
13
|
+
DOCUMENTATION = r"""
|
|
14
14
|
---
|
|
15
15
|
module: cron
|
|
16
16
|
short_description: Manage cron.d and crontab entries
|
|
@@ -72,33 +72,39 @@ options:
|
|
|
72
72
|
minute:
|
|
73
73
|
description:
|
|
74
74
|
- Minute when the job should run (V(0-59), V(*), V(*/2), and so on).
|
|
75
|
+
- Cannot be combined with O(special_time).
|
|
75
76
|
type: str
|
|
76
77
|
default: "*"
|
|
77
78
|
hour:
|
|
78
79
|
description:
|
|
79
80
|
- Hour when the job should run (V(0-23), V(*), V(*/2), and so on).
|
|
81
|
+
- Cannot be combined with O(special_time).
|
|
80
82
|
type: str
|
|
81
83
|
default: "*"
|
|
82
84
|
day:
|
|
83
85
|
description:
|
|
84
86
|
- Day of the month the job should run (V(1-31), V(*), V(*/2), and so on).
|
|
87
|
+
- Cannot be combined with O(special_time).
|
|
85
88
|
type: str
|
|
86
89
|
default: "*"
|
|
87
90
|
aliases: [ dom ]
|
|
88
91
|
month:
|
|
89
92
|
description:
|
|
90
|
-
- Month of the year the job should run (V(1-12), V(*), V(*/2), and so on).
|
|
93
|
+
- Month of the year the job should run (V(JAN-DEC) or V(1-12), V(*), V(*/2), and so on).
|
|
94
|
+
- Cannot be combined with O(special_time).
|
|
91
95
|
type: str
|
|
92
96
|
default: "*"
|
|
93
97
|
weekday:
|
|
94
98
|
description:
|
|
95
|
-
- Day of the week that the job should run (V(
|
|
99
|
+
- Day of the week that the job should run (V(SUN-SAT) or V(0-6), V(*), and so on).
|
|
100
|
+
- Cannot be combined with O(special_time).
|
|
96
101
|
type: str
|
|
97
102
|
default: "*"
|
|
98
103
|
aliases: [ dow ]
|
|
99
104
|
special_time:
|
|
100
105
|
description:
|
|
101
106
|
- Special time specification nickname.
|
|
107
|
+
- Cannot be combined with O(minute), O(hour), O(day), O(month) or O(weekday).
|
|
102
108
|
type: str
|
|
103
109
|
choices: [ annually, daily, hourly, monthly, reboot, weekly, yearly ]
|
|
104
110
|
version_added: "1.3"
|
|
@@ -150,9 +156,9 @@ attributes:
|
|
|
150
156
|
platform:
|
|
151
157
|
support: full
|
|
152
158
|
platforms: posix
|
|
153
|
-
|
|
159
|
+
"""
|
|
154
160
|
|
|
155
|
-
EXAMPLES = r
|
|
161
|
+
EXAMPLES = r"""
|
|
156
162
|
- name: Ensure a job that runs at 2 and 5 exists. Creates an entry like "0 5,2 * * ls -alh > /dev/null"
|
|
157
163
|
ansible.builtin.cron:
|
|
158
164
|
name: "check dirs"
|
|
@@ -205,9 +211,9 @@ EXAMPLES = r'''
|
|
|
205
211
|
name: APP_HOME
|
|
206
212
|
env: yes
|
|
207
213
|
state: absent
|
|
208
|
-
|
|
214
|
+
"""
|
|
209
215
|
|
|
210
|
-
RETURN = r
|
|
216
|
+
RETURN = r"""#"""
|
|
211
217
|
|
|
212
218
|
import os
|
|
213
219
|
import platform
|
|
@@ -262,17 +268,16 @@ class CronTab(object):
|
|
|
262
268
|
if self.cron_file:
|
|
263
269
|
# read the cronfile
|
|
264
270
|
try:
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
except IOError:
|
|
271
|
+
with open(self.b_cron_file, 'rb') as f:
|
|
272
|
+
self.n_existing = to_native(f.read(), errors='surrogate_or_strict')
|
|
273
|
+
self.lines = self.n_existing.splitlines()
|
|
274
|
+
except OSError:
|
|
270
275
|
# cron file does not exist
|
|
271
276
|
return
|
|
272
277
|
except Exception:
|
|
273
278
|
raise CronTabError("Unexpected error:", sys.exc_info()[0])
|
|
274
279
|
else:
|
|
275
|
-
# using safely quoted shell for now, but this really should be two non-shell calls instead.
|
|
280
|
+
# FIXME: using safely quoted shell for now, but this really should be two non-shell calls instead.
|
|
276
281
|
(rc, out, err) = self.module.run_command(self._read_user_execute(), use_unsafe_shell=True)
|
|
277
282
|
|
|
278
283
|
if rc != 0 and rc != 1: # 1 can mean that there are no jobs.
|
|
@@ -323,12 +328,12 @@ class CronTab(object):
|
|
|
323
328
|
|
|
324
329
|
# Add the entire crontab back to the user crontab
|
|
325
330
|
if not self.cron_file:
|
|
326
|
-
# quoting shell args for now but really this should be two non-shell calls.
|
|
331
|
+
# FIXME: quoting shell args for now but really this should be two non-shell calls.
|
|
327
332
|
(rc, out, err) = self.module.run_command(self._write_execute(path), use_unsafe_shell=True)
|
|
328
333
|
os.unlink(path)
|
|
329
334
|
|
|
330
335
|
if rc != 0:
|
|
331
|
-
self.module.fail_json(msg=err)
|
|
336
|
+
self.module.fail_json(msg=f"Failed to install new cronfile: {path}", stderr=err, stdout=out, rc=rc)
|
|
332
337
|
|
|
333
338
|
# set SELinux permissions
|
|
334
339
|
if self.module.selinux_enabled() and self.cron_file:
|
|
@@ -613,7 +618,6 @@ def main():
|
|
|
613
618
|
|
|
614
619
|
changed = False
|
|
615
620
|
res_args = dict()
|
|
616
|
-
warnings = list()
|
|
617
621
|
|
|
618
622
|
if cron_file:
|
|
619
623
|
|
|
@@ -622,8 +626,8 @@ def main():
|
|
|
622
626
|
|
|
623
627
|
cron_file_basename = os.path.basename(cron_file)
|
|
624
628
|
if not re.search(r'^[A-Z0-9_-]+$', cron_file_basename, re.I):
|
|
625
|
-
|
|
626
|
-
|
|
629
|
+
module.warn('Filename portion of cron_file ("%s") should consist' % cron_file_basename +
|
|
630
|
+
' solely of upper- and lower-case letters, digits, underscores, and hyphens')
|
|
627
631
|
|
|
628
632
|
# Ensure all files generated are only writable by the owning user. Primarily relevant for the cron_file option.
|
|
629
633
|
os.umask(int('022', 8))
|
|
@@ -646,7 +650,7 @@ def main():
|
|
|
646
650
|
|
|
647
651
|
if special_time and \
|
|
648
652
|
(True in [(x != '*') for x in [minute, hour, day, month, weekday]]):
|
|
649
|
-
module.fail_json(msg="You
|
|
653
|
+
module.fail_json(msg="You cannot combine special_time with any of the time or day/date parameters.")
|
|
650
654
|
|
|
651
655
|
# cannot support special_time on solaris
|
|
652
656
|
if special_time and platform.system() == 'SunOS':
|
|
@@ -688,7 +692,7 @@ def main():
|
|
|
688
692
|
if do_install:
|
|
689
693
|
for char in ['\r', '\n']:
|
|
690
694
|
if char in job.strip('\r\n'):
|
|
691
|
-
|
|
695
|
+
module.warn('Job should not contain line breaks')
|
|
692
696
|
break
|
|
693
697
|
|
|
694
698
|
job = crontab.get_cron_job(minute, hour, day, month, weekday, job, special_time, disabled)
|
|
@@ -729,7 +733,6 @@ def main():
|
|
|
729
733
|
res_args = dict(
|
|
730
734
|
jobs=crontab.get_jobnames(),
|
|
731
735
|
envs=crontab.get_envnames(),
|
|
732
|
-
warnings=warnings,
|
|
733
736
|
changed=changed
|
|
734
737
|
)
|
|
735
738
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
7
|
-
DOCUMENTATION =
|
|
7
|
+
DOCUMENTATION = """
|
|
8
8
|
author: 'Ansible Core Team (@ansible)'
|
|
9
9
|
short_description: 'Add and remove deb822 formatted repositories'
|
|
10
10
|
description:
|
|
@@ -145,9 +145,9 @@ options:
|
|
|
145
145
|
requirements:
|
|
146
146
|
- python3-debian / python-debian
|
|
147
147
|
version_added: '2.15'
|
|
148
|
-
|
|
148
|
+
"""
|
|
149
149
|
|
|
150
|
-
EXAMPLES =
|
|
150
|
+
EXAMPLES = """
|
|
151
151
|
- name: Add debian repo
|
|
152
152
|
deb822_repository:
|
|
153
153
|
name: debian
|
|
@@ -189,9 +189,9 @@ EXAMPLES = '''
|
|
|
189
189
|
components: stable
|
|
190
190
|
architectures: amd64
|
|
191
191
|
signed_by: https://download.example.com/linux/ubuntu/gpg
|
|
192
|
-
|
|
192
|
+
"""
|
|
193
193
|
|
|
194
|
-
RETURN =
|
|
194
|
+
RETURN = """
|
|
195
195
|
repo:
|
|
196
196
|
description: A source string for the repository
|
|
197
197
|
returned: always
|
|
@@ -224,13 +224,12 @@ key_filename:
|
|
|
224
224
|
returned: always
|
|
225
225
|
type: str
|
|
226
226
|
sample: /etc/apt/keyrings/debian.gpg
|
|
227
|
-
|
|
227
|
+
"""
|
|
228
228
|
|
|
229
229
|
import os
|
|
230
230
|
import re
|
|
231
231
|
import tempfile
|
|
232
232
|
import textwrap
|
|
233
|
-
import traceback
|
|
234
233
|
|
|
235
234
|
from ansible.module_utils.basic import AnsibleModule
|
|
236
235
|
from ansible.module_utils.basic import missing_required_lib
|
|
@@ -248,9 +247,9 @@ HAS_DEBIAN = True
|
|
|
248
247
|
DEBIAN_IMP_ERR = None
|
|
249
248
|
try:
|
|
250
249
|
from debian.deb822 import Deb822 # type: ignore[import]
|
|
251
|
-
except ImportError:
|
|
250
|
+
except ImportError as ex:
|
|
252
251
|
HAS_DEBIAN = False
|
|
253
|
-
DEBIAN_IMP_ERR =
|
|
252
|
+
DEBIAN_IMP_ERR = ex
|
|
254
253
|
|
|
255
254
|
KEYRINGS_DIR = '/etc/apt/keyrings'
|
|
256
255
|
|
ansible/modules/debconf.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: debconf
|
|
12
12
|
short_description: Configure a .deb package
|
|
@@ -86,9 +86,9 @@ options:
|
|
|
86
86
|
default: false
|
|
87
87
|
author:
|
|
88
88
|
- Brian Coca (@bcoca)
|
|
89
|
-
|
|
89
|
+
"""
|
|
90
90
|
|
|
91
|
-
EXAMPLES = r
|
|
91
|
+
EXAMPLES = r"""
|
|
92
92
|
- name: Set default locale to fr_FR.UTF-8
|
|
93
93
|
ansible.builtin.debconf:
|
|
94
94
|
name: locales
|
|
@@ -121,9 +121,9 @@ EXAMPLES = r'''
|
|
|
121
121
|
value: "{{ site_passphrase }}"
|
|
122
122
|
vtype: password
|
|
123
123
|
no_log: True
|
|
124
|
-
|
|
124
|
+
"""
|
|
125
125
|
|
|
126
|
-
RETURN = r
|
|
126
|
+
RETURN = r"""#"""
|
|
127
127
|
|
|
128
128
|
from ansible.module_utils.common.text.converters import to_text, to_native
|
|
129
129
|
from ansible.module_utils.basic import AnsibleModule
|
ansible/modules/debug.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: debug
|
|
12
12
|
short_description: Print statements during execution
|
|
@@ -68,9 +68,9 @@ seealso:
|
|
|
68
68
|
author:
|
|
69
69
|
- Dag Wieers (@dagwieers)
|
|
70
70
|
- Michael DeHaan
|
|
71
|
-
|
|
71
|
+
"""
|
|
72
72
|
|
|
73
|
-
EXAMPLES = r
|
|
73
|
+
EXAMPLES = r"""
|
|
74
74
|
- name: Print the gateway for each host when defined
|
|
75
75
|
ansible.builtin.debug:
|
|
76
76
|
msg: System {{ inventory_hostname }} has gateway {{ ansible_default_ipv4.gateway }}
|
|
@@ -95,4 +95,4 @@ EXAMPLES = r'''
|
|
|
95
95
|
msg:
|
|
96
96
|
- "Provisioning based on YOUR_KEY which is: {{ lookup('ansible.builtin.env', 'YOUR_KEY') }}"
|
|
97
97
|
- "These servers were built using the password of '{{ password_used }}'. Please retain this for later use."
|
|
98
|
-
|
|
98
|
+
"""
|
ansible/modules/dnf.py
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
from __future__ import annotations
|
|
10
10
|
|
|
11
11
|
|
|
12
|
-
DOCUMENTATION =
|
|
12
|
+
DOCUMENTATION = """
|
|
13
13
|
---
|
|
14
14
|
module: dnf
|
|
15
15
|
version_added: 1.9
|
|
@@ -306,9 +306,9 @@ author:
|
|
|
306
306
|
- Cristian van Ee (@DJMuggs) <cristian at cvee.org>
|
|
307
307
|
- Berend De Schouwer (@berenddeschouwer)
|
|
308
308
|
- Adam Miller (@maxamillion) <admiller@redhat.com>
|
|
309
|
-
|
|
309
|
+
"""
|
|
310
310
|
|
|
311
|
-
EXAMPLES =
|
|
311
|
+
EXAMPLES = """
|
|
312
312
|
- name: Install the latest version of Apache
|
|
313
313
|
ansible.builtin.dnf:
|
|
314
314
|
name: httpd
|
|
@@ -394,7 +394,7 @@ EXAMPLES = '''
|
|
|
394
394
|
ansible.builtin.dnf:
|
|
395
395
|
name: '@postgresql/client'
|
|
396
396
|
state: present
|
|
397
|
-
|
|
397
|
+
"""
|
|
398
398
|
|
|
399
399
|
import os
|
|
400
400
|
import sys
|
|
@@ -408,10 +408,10 @@ from ansible.module_utils.common.respawn import has_respawned, probe_interpreter
|
|
|
408
408
|
from ansible.module_utils.yumdnf import YumDnf, yumdnf_argument_spec
|
|
409
409
|
|
|
410
410
|
|
|
411
|
-
# NOTE dnf Python bindings import is postponed, see DnfModule._ensure_dnf(),
|
|
412
|
-
#
|
|
413
|
-
#
|
|
414
|
-
#
|
|
411
|
+
# FIXME: NOTE dnf Python bindings import is postponed, see DnfModule._ensure_dnf(),
|
|
412
|
+
# because we need AnsibleModule object to use get_best_parsable_locale()
|
|
413
|
+
# to set proper locale before importing dnf to be able to scrape
|
|
414
|
+
# the output in some cases.
|
|
415
415
|
dnf = None
|
|
416
416
|
|
|
417
417
|
|