ansible-core 2.18.7__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.7.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.7.dist-info/RECORD +0 -992
- ansible_test/_util/controller/sanity/pylint/plugins/deprecated.py +0 -411
- {ansible_core-2.18.7.dist-info → ansible_core-2.19.0.dist-info}/WHEEL +0 -0
- {ansible_core-2.18.7.dist-info → ansible_core-2.19.0.dist-info}/entry_points.txt +0 -0
- {ansible_core-2.18.7.dist-info → ansible_core-2.19.0.dist-info}/licenses/COPYING +0 -0
- {ansible_core-2.18.7.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/Apache-License.txt +0 -0
- {ansible_core-2.18.7.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/MIT-license.txt +0 -0
- {ansible_core-2.18.7.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/PSF-license.txt +0 -0
- {ansible_core-2.18.7.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/simplified_bsd.txt +0 -0
- {ansible_core-2.18.7.dist-info → ansible_core-2.19.0.dist-info}/top_level.txt +0 -0
|
@@ -26,13 +26,13 @@ install_ssh_keys()
|
|
|
26
26
|
echo "${ssh_private_key}" > "${ssh_private_key_path}"
|
|
27
27
|
|
|
28
28
|
# add public key to authorized_keys
|
|
29
|
-
|
|
29
|
+
authorized_keys_path="${HOME}/.ssh/authorized_keys"
|
|
30
30
|
|
|
31
31
|
# the existing file is overwritten to avoid conflicts (ex: RHEL on EC2 blocks root login)
|
|
32
|
-
cat "${public_key_path}" > "${
|
|
33
|
-
chmod 0600 "${
|
|
32
|
+
cat "${public_key_path}" > "${authorized_keys_path}"
|
|
33
|
+
chmod 0600 "${authorized_keys_path}"
|
|
34
34
|
|
|
35
|
-
# add localhost
|
|
35
|
+
# add localhost server keys to known_hosts
|
|
36
36
|
known_hosts_path="${HOME}/.ssh/known_hosts"
|
|
37
37
|
|
|
38
38
|
for key in /etc/ssh/ssh_host_*_key.pub; do
|
|
@@ -154,6 +154,7 @@ bootstrap_remote_freebsd()
|
|
|
154
154
|
py${python_package_version}-sqlite3
|
|
155
155
|
py${python_package_version}-setuptools
|
|
156
156
|
bash
|
|
157
|
+
ca_root_nss
|
|
157
158
|
curl
|
|
158
159
|
gtar
|
|
159
160
|
sudo
|
|
@@ -162,27 +163,14 @@ bootstrap_remote_freebsd()
|
|
|
162
163
|
if [ "${controller}" ]; then
|
|
163
164
|
jinja2_pkg="py${python_package_version}-jinja2"
|
|
164
165
|
cryptography_pkg="py${python_package_version}-cryptography"
|
|
165
|
-
pyyaml_pkg="py${python_package_version}-
|
|
166
|
+
pyyaml_pkg="py${python_package_version}-pyyaml"
|
|
166
167
|
packaging_pkg="py${python_package_version}-packaging"
|
|
167
168
|
|
|
168
169
|
# Declare platform/python version combinations which do not have supporting OS packages available.
|
|
169
170
|
# For these combinations ansible-test will use pip to install the requirements instead.
|
|
170
171
|
case "${platform_version}/${python_version}" in
|
|
171
|
-
|
|
172
|
-
# defaults
|
|
173
|
-
;;
|
|
174
|
-
13.3/3.11)
|
|
175
|
-
jinja2_pkg="" # not available
|
|
176
|
-
cryptography_pkg="" # not available
|
|
177
|
-
pyyaml_pkg="" # not available
|
|
178
|
-
;;
|
|
179
|
-
14.1/3.9)
|
|
180
|
-
# defaults above 'just work'TM
|
|
181
|
-
;;
|
|
182
|
-
14.1/3.11)
|
|
183
|
-
cryptography_pkg="" # not available
|
|
184
|
-
jinja2_pkg="" # not available
|
|
185
|
-
pyyaml_pkg="" # not available
|
|
172
|
+
14.2/3.11)
|
|
173
|
+
# defaults available
|
|
186
174
|
;;
|
|
187
175
|
*)
|
|
188
176
|
# just assume nothing is available
|
|
@@ -238,6 +226,7 @@ prefer-binary = yes
|
|
|
238
226
|
|
|
239
227
|
# enable sudo without a password for the wheel group, allowing ansible to use the sudo become plugin
|
|
240
228
|
echo '%wheel ALL=(ALL:ALL) NOPASSWD: ALL' > /usr/local/etc/sudoers.d/ansible-test
|
|
229
|
+
chmod 440 /usr/local/etc/sudoers.d/ansible-test
|
|
241
230
|
}
|
|
242
231
|
|
|
243
232
|
bootstrap_remote_macos()
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
"""A tool for installing test requirements on the controller and target host."""
|
|
2
|
+
|
|
2
3
|
from __future__ import annotations
|
|
3
4
|
|
|
4
5
|
# pylint: disable=wrong-import-position
|
|
@@ -18,7 +19,6 @@ if DESIRED_RLIMIT_NOFILE < CURRENT_RLIMIT_NOFILE:
|
|
|
18
19
|
|
|
19
20
|
import base64
|
|
20
21
|
import contextlib
|
|
21
|
-
import errno
|
|
22
22
|
import io
|
|
23
23
|
import json
|
|
24
24
|
import os
|
|
@@ -62,13 +62,15 @@ def main(): # type: () -> None
|
|
|
62
62
|
|
|
63
63
|
|
|
64
64
|
# noinspection PyUnusedLocal
|
|
65
|
-
def bootstrap(pip, options
|
|
65
|
+
def bootstrap(pip: str, options: dict[str, t.Any]) -> None:
|
|
66
66
|
"""Bootstrap pip and related packages in an empty virtual environment."""
|
|
67
67
|
pip_version = options['pip_version']
|
|
68
68
|
packages = options['packages']
|
|
69
69
|
setuptools = options['setuptools']
|
|
70
70
|
wheel = options['wheel']
|
|
71
71
|
|
|
72
|
+
del options
|
|
73
|
+
|
|
72
74
|
url = 'https://ci-files.testing.ansible.com/ansible-test/get-pip-%s.py' % pip_version
|
|
73
75
|
cache_path = os.path.expanduser('~/.ansible/test/cache/get_pip_%s.py' % pip_version.replace(".", "_"))
|
|
74
76
|
temp_path = cache_path + '.download'
|
|
@@ -83,7 +85,7 @@ def bootstrap(pip, options): # type: (str, t.Dict[str, t.Any]) -> None
|
|
|
83
85
|
try:
|
|
84
86
|
download_file(url, temp_path)
|
|
85
87
|
except Exception as ex:
|
|
86
|
-
raise ApplicationError((
|
|
88
|
+
raise ApplicationError(("""
|
|
87
89
|
Download failed: %s
|
|
88
90
|
|
|
89
91
|
The bootstrap script can be manually downloaded and saved to: %s
|
|
@@ -91,7 +93,7 @@ The bootstrap script can be manually downloaded and saved to: %s
|
|
|
91
93
|
If you're behind a proxy, consider commenting on the following GitHub issue:
|
|
92
94
|
|
|
93
95
|
https://github.com/ansible/ansible/issues/77304
|
|
94
|
-
|
|
96
|
+
""" % (ex, cache_path)).strip())
|
|
95
97
|
|
|
96
98
|
shutil.move(temp_path, cache_path)
|
|
97
99
|
|
|
@@ -100,31 +102,33 @@ https://github.com/ansible/ansible/issues/77304
|
|
|
100
102
|
env = common_pip_environment()
|
|
101
103
|
env.update(GET_PIP=cache_path)
|
|
102
104
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
+
pip_options = common_pip_options()
|
|
106
|
+
pip_options.extend(packages)
|
|
105
107
|
|
|
106
108
|
if not setuptools:
|
|
107
|
-
|
|
109
|
+
pip_options.append('--no-setuptools')
|
|
108
110
|
|
|
109
111
|
if not wheel:
|
|
110
|
-
|
|
112
|
+
pip_options.append('--no-wheel')
|
|
111
113
|
|
|
112
|
-
command = [sys.executable, pip] +
|
|
114
|
+
command = [sys.executable, pip] + pip_options
|
|
113
115
|
|
|
114
116
|
execute_command(command, env=env)
|
|
115
117
|
|
|
116
118
|
|
|
117
|
-
def install(pip, options
|
|
119
|
+
def install(pip: str, options: dict[str, t.Any]) -> None:
|
|
118
120
|
"""Perform a pip install."""
|
|
119
121
|
requirements = options['requirements']
|
|
120
122
|
constraints = options['constraints']
|
|
121
123
|
packages = options['packages']
|
|
122
124
|
|
|
125
|
+
del options
|
|
126
|
+
|
|
123
127
|
tempdir = tempfile.mkdtemp(prefix='ansible-test-', suffix='-requirements')
|
|
124
128
|
|
|
125
129
|
try:
|
|
126
|
-
|
|
127
|
-
|
|
130
|
+
pip_options = common_pip_options()
|
|
131
|
+
pip_options.extend(packages)
|
|
128
132
|
|
|
129
133
|
for path, content in requirements:
|
|
130
134
|
if path.split(os.sep)[0] in ('test', 'requirements'):
|
|
@@ -136,13 +140,13 @@ def install(pip, options): # type: (str, t.Dict[str, t.Any]) -> None
|
|
|
136
140
|
pre_build.execute(pip)
|
|
137
141
|
|
|
138
142
|
write_text_file(os.path.join(tempdir, path), content, True)
|
|
139
|
-
|
|
143
|
+
pip_options.extend(['-r', path])
|
|
140
144
|
|
|
141
145
|
for path, content in constraints:
|
|
142
146
|
write_text_file(os.path.join(tempdir, path), content, True)
|
|
143
|
-
|
|
147
|
+
pip_options.extend(['-c', path])
|
|
144
148
|
|
|
145
|
-
command = [sys.executable, pip, 'install'] +
|
|
149
|
+
command = [sys.executable, pip, 'install'] + pip_options
|
|
146
150
|
|
|
147
151
|
env = common_pip_environment()
|
|
148
152
|
|
|
@@ -163,8 +167,8 @@ class PreBuild:
|
|
|
163
167
|
tempdir = tempfile.mkdtemp(prefix='ansible-test-', suffix='-pre-build')
|
|
164
168
|
|
|
165
169
|
try:
|
|
166
|
-
|
|
167
|
-
|
|
170
|
+
pip_options = common_pip_options()
|
|
171
|
+
pip_options.append(self.requirement)
|
|
168
172
|
|
|
169
173
|
constraints = '\n'.join(self.constraints) + '\n'
|
|
170
174
|
constraints_path = os.path.join(tempdir, 'constraints.txt')
|
|
@@ -174,7 +178,7 @@ class PreBuild:
|
|
|
174
178
|
env = common_pip_environment()
|
|
175
179
|
env.update(PIP_CONSTRAINT=constraints_path)
|
|
176
180
|
|
|
177
|
-
command = [sys.executable, pip, 'wheel'] +
|
|
181
|
+
command = [sys.executable, pip, 'wheel'] + pip_options
|
|
178
182
|
|
|
179
183
|
execute_command(command, env=env, cwd=tempdir)
|
|
180
184
|
finally:
|
|
@@ -206,15 +210,17 @@ def parse_pre_build_instructions(requirements): # type: (str) -> list[PreBuild]
|
|
|
206
210
|
return instructions
|
|
207
211
|
|
|
208
212
|
|
|
209
|
-
def uninstall(pip, options
|
|
213
|
+
def uninstall(pip: str, options: dict[str, t.Any]) -> None:
|
|
210
214
|
"""Perform a pip uninstall."""
|
|
211
215
|
packages = options['packages']
|
|
212
216
|
ignore_errors = options['ignore_errors']
|
|
213
217
|
|
|
214
|
-
options
|
|
215
|
-
options.extend(packages)
|
|
218
|
+
del options
|
|
216
219
|
|
|
217
|
-
|
|
220
|
+
pip_options = common_pip_options()
|
|
221
|
+
pip_options.extend(packages)
|
|
222
|
+
|
|
223
|
+
command = [sys.executable, pip, 'uninstall', '-y'] + pip_options
|
|
218
224
|
|
|
219
225
|
env = common_pip_environment()
|
|
220
226
|
|
|
@@ -226,13 +232,13 @@ def uninstall(pip, options): # type: (str, t.Dict[str, t.Any]) -> None
|
|
|
226
232
|
|
|
227
233
|
|
|
228
234
|
# noinspection PyUnusedLocal
|
|
229
|
-
def version(pip, options
|
|
235
|
+
def version(pip: str, options: dict[str, t.Any]) -> None:
|
|
230
236
|
"""Report the pip version."""
|
|
231
237
|
del options
|
|
232
238
|
|
|
233
|
-
|
|
239
|
+
pip_options = common_pip_options()
|
|
234
240
|
|
|
235
|
-
command = [sys.executable, pip, '-V'] +
|
|
241
|
+
command = [sys.executable, pip, '-V'] + pip_options
|
|
236
242
|
|
|
237
243
|
env = common_pip_environment()
|
|
238
244
|
|
|
@@ -264,11 +270,11 @@ def common_pip_options(): # type: () -> t.List[str]
|
|
|
264
270
|
def devnull(): # type: () -> t.IO[bytes]
|
|
265
271
|
"""Return a file object that references devnull."""
|
|
266
272
|
try:
|
|
267
|
-
return devnull.file
|
|
273
|
+
return devnull.file # type: ignore[attr-defined]
|
|
268
274
|
except AttributeError:
|
|
269
|
-
devnull.file = open(os.devnull, 'w+b') # pylint: disable=consider-using-with
|
|
275
|
+
devnull.file = open(os.devnull, 'w+b') # type: ignore[attr-defined] # pylint: disable=consider-using-with
|
|
270
276
|
|
|
271
|
-
return devnull.file
|
|
277
|
+
return devnull.file # type: ignore[attr-defined]
|
|
272
278
|
|
|
273
279
|
|
|
274
280
|
def download_file(url, path): # type: (str, str) -> None
|
|
@@ -284,6 +290,7 @@ class ApplicationError(Exception):
|
|
|
284
290
|
|
|
285
291
|
class SubprocessError(ApplicationError):
|
|
286
292
|
"""A command returned a non-zero status."""
|
|
293
|
+
|
|
287
294
|
def __init__(self, cmd, status, stdout, stderr): # type: (t.List[str], int, str, str) -> None
|
|
288
295
|
message = 'A command failed with status %d: %s' % (status, shlex.join(cmd))
|
|
289
296
|
|
|
@@ -341,18 +348,13 @@ def remove_tree(path): # type: (str) -> None
|
|
|
341
348
|
"""Remove the specified directory tree."""
|
|
342
349
|
try:
|
|
343
350
|
shutil.rmtree(to_bytes(path))
|
|
344
|
-
except
|
|
345
|
-
|
|
346
|
-
raise
|
|
351
|
+
except FileNotFoundError:
|
|
352
|
+
pass
|
|
347
353
|
|
|
348
354
|
|
|
349
355
|
def make_dirs(path): # type: (str) -> None
|
|
350
356
|
"""Create a directory at path, including any necessary parent directories."""
|
|
351
|
-
|
|
352
|
-
os.makedirs(to_bytes(path))
|
|
353
|
-
except OSError as ex:
|
|
354
|
-
if ex.errno != errno.EEXIST:
|
|
355
|
-
raise
|
|
357
|
+
os.makedirs(to_bytes(path), exist_ok=True)
|
|
356
358
|
|
|
357
359
|
|
|
358
360
|
def open_binary_file(path, mode='rb'): # type: (str, str) -> t.IO[bytes]
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
"""Detect the real python interpreter when running in a virtual environment created by the 'virtualenv' module."""
|
|
2
|
+
|
|
2
3
|
from __future__ import annotations
|
|
3
4
|
|
|
4
5
|
import json
|
|
5
6
|
|
|
6
7
|
try:
|
|
7
8
|
# virtualenv <20
|
|
8
|
-
from sys import real_prefix
|
|
9
|
+
from sys import real_prefix # type: ignore[attr-defined]
|
|
9
10
|
except ImportError:
|
|
10
11
|
real_prefix = None
|
|
11
12
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
"""Show availability of PyYAML and libyaml support."""
|
|
2
|
+
|
|
2
3
|
from __future__ import annotations
|
|
3
4
|
|
|
4
5
|
import json
|
|
@@ -11,7 +12,7 @@ except ImportError:
|
|
|
11
12
|
try:
|
|
12
13
|
from yaml import CLoader
|
|
13
14
|
except ImportError:
|
|
14
|
-
CLoader = None
|
|
15
|
+
CLoader = None # type: ignore[misc]
|
|
15
16
|
|
|
16
17
|
print(json.dumps(dict(
|
|
17
18
|
yaml=bool(yaml),
|
ansible/compat/selectors.py
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
# (c) 2014, 2017 Toshio Kuratomi <tkuratomi@ansible.com>
|
|
2
|
-
#
|
|
3
|
-
# This file is part of Ansible
|
|
4
|
-
#
|
|
5
|
-
# Ansible is free software: you can redistribute it and/or modify
|
|
6
|
-
# it under the terms of the GNU General Public License as published by
|
|
7
|
-
# the Free Software Foundation, either version 3 of the License, or
|
|
8
|
-
# (at your option) any later version.
|
|
9
|
-
#
|
|
10
|
-
# Ansible is distributed in the hope that it will be useful,
|
|
11
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13
|
-
# GNU General Public License for more details.
|
|
14
|
-
#
|
|
15
|
-
# You should have received a copy of the GNU General Public License
|
|
16
|
-
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
|
|
17
|
-
|
|
18
|
-
from __future__ import annotations
|
|
19
|
-
|
|
20
|
-
import sys
|
|
21
|
-
import selectors
|
|
22
|
-
|
|
23
|
-
from ansible.module_utils.common.warnings import deprecate
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
sys.modules['ansible.compat.selectors'] = selectors
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
deprecate(
|
|
30
|
-
msg='The `ansible.module_utils.compat.selectors` module is deprecated.',
|
|
31
|
-
version='2.19',
|
|
32
|
-
)
|
ansible/errors/yaml_strings.py
DELETED
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
# (c) 2012-2014, Michael DeHaan <michael.dehaan@gmail.com>
|
|
2
|
-
#
|
|
3
|
-
# This file is part of Ansible
|
|
4
|
-
#
|
|
5
|
-
# Ansible is free software: you can redistribute it and/or modify
|
|
6
|
-
# it under the terms of the GNU General Public License as published by
|
|
7
|
-
# the Free Software Foundation, either version 3 of the License, or
|
|
8
|
-
# (at your option) any later version.
|
|
9
|
-
#
|
|
10
|
-
# Ansible is distributed in the hope that it will be useful,
|
|
11
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13
|
-
# GNU General Public License for more details.
|
|
14
|
-
#
|
|
15
|
-
# You should have received a copy of the GNU General Public License
|
|
16
|
-
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
|
|
17
|
-
|
|
18
|
-
from __future__ import annotations
|
|
19
|
-
|
|
20
|
-
__all__ = [
|
|
21
|
-
'YAML_SYNTAX_ERROR',
|
|
22
|
-
'YAML_POSITION_DETAILS',
|
|
23
|
-
'YAML_COMMON_DICT_ERROR',
|
|
24
|
-
'YAML_COMMON_UNQUOTED_VARIABLE_ERROR',
|
|
25
|
-
'YAML_COMMON_UNQUOTED_COLON_ERROR',
|
|
26
|
-
'YAML_COMMON_PARTIALLY_QUOTED_LINE_ERROR',
|
|
27
|
-
'YAML_COMMON_UNBALANCED_QUOTES_ERROR',
|
|
28
|
-
]
|
|
29
|
-
|
|
30
|
-
YAML_SYNTAX_ERROR = """\
|
|
31
|
-
Syntax Error while loading YAML.
|
|
32
|
-
%s"""
|
|
33
|
-
|
|
34
|
-
YAML_POSITION_DETAILS = """\
|
|
35
|
-
The error appears to be in '%s': line %s, column %s, but may
|
|
36
|
-
be elsewhere in the file depending on the exact syntax problem.
|
|
37
|
-
"""
|
|
38
|
-
|
|
39
|
-
YAML_COMMON_DICT_ERROR = """\
|
|
40
|
-
This one looks easy to fix. YAML thought it was looking for the start of a
|
|
41
|
-
hash/dictionary and was confused to see a second "{". Most likely this was
|
|
42
|
-
meant to be an ansible template evaluation instead, so we have to give the
|
|
43
|
-
parser a small hint that we wanted a string instead. The solution here is to
|
|
44
|
-
just quote the entire value.
|
|
45
|
-
|
|
46
|
-
For instance, if the original line was:
|
|
47
|
-
|
|
48
|
-
app_path: {{ base_path }}/foo
|
|
49
|
-
|
|
50
|
-
It should be written as:
|
|
51
|
-
|
|
52
|
-
app_path: "{{ base_path }}/foo"
|
|
53
|
-
"""
|
|
54
|
-
|
|
55
|
-
YAML_COMMON_UNQUOTED_VARIABLE_ERROR = """\
|
|
56
|
-
We could be wrong, but this one looks like it might be an issue with
|
|
57
|
-
missing quotes. Always quote template expression brackets when they
|
|
58
|
-
start a value. For instance:
|
|
59
|
-
|
|
60
|
-
with_items:
|
|
61
|
-
- {{ foo }}
|
|
62
|
-
|
|
63
|
-
Should be written as:
|
|
64
|
-
|
|
65
|
-
with_items:
|
|
66
|
-
- "{{ foo }}"
|
|
67
|
-
"""
|
|
68
|
-
|
|
69
|
-
YAML_COMMON_UNQUOTED_COLON_ERROR = """\
|
|
70
|
-
This one looks easy to fix. There seems to be an extra unquoted colon in the line
|
|
71
|
-
and this is confusing the parser. It was only expecting to find one free
|
|
72
|
-
colon. The solution is just add some quotes around the colon, or quote the
|
|
73
|
-
entire line after the first colon.
|
|
74
|
-
|
|
75
|
-
For instance, if the original line was:
|
|
76
|
-
|
|
77
|
-
copy: src=file.txt dest=/path/filename:with_colon.txt
|
|
78
|
-
|
|
79
|
-
It can be written as:
|
|
80
|
-
|
|
81
|
-
copy: src=file.txt dest='/path/filename:with_colon.txt'
|
|
82
|
-
|
|
83
|
-
Or:
|
|
84
|
-
|
|
85
|
-
copy: 'src=file.txt dest=/path/filename:with_colon.txt'
|
|
86
|
-
"""
|
|
87
|
-
|
|
88
|
-
YAML_COMMON_PARTIALLY_QUOTED_LINE_ERROR = """\
|
|
89
|
-
This one looks easy to fix. It seems that there is a value started
|
|
90
|
-
with a quote, and the YAML parser is expecting to see the line ended
|
|
91
|
-
with the same kind of quote. For instance:
|
|
92
|
-
|
|
93
|
-
when: "ok" in result.stdout
|
|
94
|
-
|
|
95
|
-
Could be written as:
|
|
96
|
-
|
|
97
|
-
when: '"ok" in result.stdout'
|
|
98
|
-
|
|
99
|
-
Or equivalently:
|
|
100
|
-
|
|
101
|
-
when: "'ok' in result.stdout"
|
|
102
|
-
"""
|
|
103
|
-
|
|
104
|
-
YAML_COMMON_UNBALANCED_QUOTES_ERROR = """\
|
|
105
|
-
We could be wrong, but this one looks like it might be an issue with
|
|
106
|
-
unbalanced quotes. If starting a value with a quote, make sure the
|
|
107
|
-
line ends with the same set of quotes. For instance this arbitrary
|
|
108
|
-
example:
|
|
109
|
-
|
|
110
|
-
foo: "bad" "wolf"
|
|
111
|
-
|
|
112
|
-
Could be written as:
|
|
113
|
-
|
|
114
|
-
foo: '"bad" "wolf"'
|
|
115
|
-
"""
|
|
116
|
-
|
|
117
|
-
YAML_COMMON_LEADING_TAB_ERROR = """\
|
|
118
|
-
There appears to be a tab character at the start of the line.
|
|
119
|
-
|
|
120
|
-
YAML does not use tabs for formatting. Tabs should be replaced with spaces.
|
|
121
|
-
|
|
122
|
-
For example:
|
|
123
|
-
- name: update tooling
|
|
124
|
-
vars:
|
|
125
|
-
version: 1.2.3
|
|
126
|
-
# ^--- there is a tab there.
|
|
127
|
-
|
|
128
|
-
Should be written as:
|
|
129
|
-
- name: update tooling
|
|
130
|
-
vars:
|
|
131
|
-
version: 1.2.3
|
|
132
|
-
# ^--- all spaces here.
|
|
133
|
-
"""
|
|
134
|
-
|
|
135
|
-
YAML_AND_SHORTHAND_ERROR = """\
|
|
136
|
-
There appears to be both 'k=v' shorthand syntax and YAML in this task. \
|
|
137
|
-
Only one syntax may be used.
|
|
138
|
-
"""
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
# (c) 2016 - Red Hat, Inc. <info@ansible.com>
|
|
2
|
-
#
|
|
3
|
-
# This file is part of Ansible
|
|
4
|
-
#
|
|
5
|
-
# Ansible is free software: you can redistribute it and/or modify
|
|
6
|
-
# it under the terms of the GNU General Public License as published by
|
|
7
|
-
# the Free Software Foundation, either version 3 of the License, or
|
|
8
|
-
# (at your option) any later version.
|
|
9
|
-
#
|
|
10
|
-
# Ansible is distributed in the hope that it will be useful,
|
|
11
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13
|
-
# GNU General Public License for more details.
|
|
14
|
-
#
|
|
15
|
-
# You should have received a copy of the GNU General Public License
|
|
16
|
-
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
|
|
17
|
-
|
|
18
|
-
from __future__ import annotations
|
|
19
|
-
|
|
20
|
-
import multiprocessing.synchronize
|
|
21
|
-
|
|
22
|
-
from ansible.utils.multiprocessing import context as multiprocessing_context
|
|
23
|
-
|
|
24
|
-
from ansible.module_utils.facts.system.pkg_mgr import PKG_MGRS
|
|
25
|
-
|
|
26
|
-
if 'action_write_locks' not in globals():
|
|
27
|
-
# Do not initialize this more than once because it seems to bash
|
|
28
|
-
# the existing one. multiprocessing must be reloading the module
|
|
29
|
-
# when it forks?
|
|
30
|
-
action_write_locks: dict[str | None, multiprocessing.synchronize.Lock] = dict()
|
|
31
|
-
|
|
32
|
-
# Below is a Lock for use when we weren't expecting a named module. It gets used when an action
|
|
33
|
-
# plugin invokes a module whose name does not match with the action's name. Slightly less
|
|
34
|
-
# efficient as all processes with unexpected module names will wait on this lock
|
|
35
|
-
action_write_locks[None] = multiprocessing_context.Lock()
|
|
36
|
-
|
|
37
|
-
# These plugins are known to be called directly by action plugins with names differing from the
|
|
38
|
-
# action plugin name. We precreate them here as an optimization.
|
|
39
|
-
# If a list of service managers is created in the future we can do the same for them.
|
|
40
|
-
mods = set(p['name'] for p in PKG_MGRS)
|
|
41
|
-
|
|
42
|
-
mods.update(('copy', 'file', 'setup', 'slurp', 'stat'))
|
|
43
|
-
for mod_name in mods:
|
|
44
|
-
action_write_locks[mod_name] = multiprocessing_context.Lock()
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
# Copyright: (c) 2018 Ansible Project
|
|
2
|
-
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
|
3
|
-
|
|
4
|
-
# FUTURE: this could be swapped out for our bundled version of distro to move more complete platform
|
|
5
|
-
# logic to the targets, so long as we maintain Py2.6 compat and don't need to do any kind of script assembly
|
|
6
|
-
|
|
7
|
-
from __future__ import annotations
|
|
8
|
-
|
|
9
|
-
import json
|
|
10
|
-
import platform
|
|
11
|
-
import io
|
|
12
|
-
import os
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
def read_utf8_file(path, encoding='utf-8'):
|
|
16
|
-
if not os.access(path, os.R_OK):
|
|
17
|
-
return None
|
|
18
|
-
with io.open(path, 'r', encoding=encoding) as fd:
|
|
19
|
-
content = fd.read()
|
|
20
|
-
|
|
21
|
-
return content
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
def get_platform_info():
|
|
25
|
-
result = dict(platform_dist_result=[])
|
|
26
|
-
|
|
27
|
-
if hasattr(platform, 'dist'):
|
|
28
|
-
result['platform_dist_result'] = platform.dist()
|
|
29
|
-
|
|
30
|
-
osrelease_content = read_utf8_file('/etc/os-release')
|
|
31
|
-
# try to fall back to /usr/lib/os-release
|
|
32
|
-
if not osrelease_content:
|
|
33
|
-
osrelease_content = read_utf8_file('/usr/lib/os-release')
|
|
34
|
-
|
|
35
|
-
result['osrelease_content'] = osrelease_content
|
|
36
|
-
|
|
37
|
-
return result
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
def main():
|
|
41
|
-
info = get_platform_info()
|
|
42
|
-
|
|
43
|
-
print(json.dumps(info))
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
if __name__ == '__main__':
|
|
47
|
-
main()
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
# (c) 2018 Ansible Project
|
|
2
|
-
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
|
3
|
-
|
|
4
|
-
param(
|
|
5
|
-
[Parameter(Mandatory = $true)][System.Collections.IDictionary]$Payload
|
|
6
|
-
)
|
|
7
|
-
|
|
8
|
-
#AnsibleRequires -Wrapper module_wrapper
|
|
9
|
-
|
|
10
|
-
$ErrorActionPreference = "Stop"
|
|
11
|
-
|
|
12
|
-
Write-AnsibleLog "INFO - starting module_powershell_wrapper" "module_powershell_wrapper"
|
|
13
|
-
|
|
14
|
-
$module_name = $Payload.module_args["_ansible_module_name"]
|
|
15
|
-
Write-AnsibleLog "INFO - building module payload for '$module_name'" "module_powershell_wrapper"
|
|
16
|
-
|
|
17
|
-
# compile any C# module utils passed in from the controller, Add-CSharpType is
|
|
18
|
-
# automatically added to the payload manifest if any csharp util is set
|
|
19
|
-
$csharp_utils = [System.Collections.ArrayList]@()
|
|
20
|
-
foreach ($csharp_util in $Payload.csharp_utils_module) {
|
|
21
|
-
Write-AnsibleLog "INFO - adding $csharp_util to list of C# references to compile" "module_powershell_wrapper"
|
|
22
|
-
$util_code = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($Payload.csharp_utils[$csharp_util]))
|
|
23
|
-
$csharp_utils.Add($util_code) > $null
|
|
24
|
-
}
|
|
25
|
-
if ($csharp_utils.Count -gt 0) {
|
|
26
|
-
$add_type_b64 = $Payload.powershell_modules["Ansible.ModuleUtils.AddType"]
|
|
27
|
-
$add_type = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($add_type_b64))
|
|
28
|
-
New-Module -Name Ansible.ModuleUtils.AddType -ScriptBlock ([ScriptBlock]::Create($add_type)) | Import-Module > $null
|
|
29
|
-
|
|
30
|
-
# add any C# references so the module does not have to do so
|
|
31
|
-
$new_tmp = [System.Environment]::ExpandEnvironmentVariables($Payload.module_args["_ansible_remote_tmp"])
|
|
32
|
-
|
|
33
|
-
# We use a fake module object to capture warnings
|
|
34
|
-
$fake_module = [PSCustomObject]@{
|
|
35
|
-
Tmpdir = $new_tmp
|
|
36
|
-
Verbosity = 3
|
|
37
|
-
}
|
|
38
|
-
$warning_func = New-Object -TypeName System.Management.Automation.PSScriptMethod -ArgumentList Warn, {
|
|
39
|
-
param($message)
|
|
40
|
-
$Payload.module_args._ansible_exec_wrapper_warnings.Add($message)
|
|
41
|
-
}
|
|
42
|
-
$fake_module.PSObject.Members.Add($warning_func)
|
|
43
|
-
Add-CSharpType -References $csharp_utils -AnsibleModule $fake_module
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
if ($Payload.ContainsKey("coverage") -and $null -ne $host.Runspace -and $null -ne $host.Runspace.Debugger) {
|
|
47
|
-
$entrypoint = $payload.coverage_wrapper
|
|
48
|
-
|
|
49
|
-
$params = @{
|
|
50
|
-
Payload = $Payload
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
else {
|
|
54
|
-
# get the common module_wrapper code and invoke that to run the module
|
|
55
|
-
$module = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($Payload.module_entry))
|
|
56
|
-
$variables = [System.Collections.ArrayList]@(@{ Name = "complex_args"; Value = $Payload.module_args; Scope = "Global" })
|
|
57
|
-
$entrypoint = $Payload.module_wrapper
|
|
58
|
-
|
|
59
|
-
$params = @{
|
|
60
|
-
Scripts = @($script:common_functions, $module)
|
|
61
|
-
Variables = $variables
|
|
62
|
-
Environment = $Payload.environment
|
|
63
|
-
Modules = $Payload.powershell_modules
|
|
64
|
-
ModuleName = $module_name
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
$entrypoint = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($entrypoint))
|
|
69
|
-
$entrypoint = [ScriptBlock]::Create($entrypoint)
|
|
70
|
-
|
|
71
|
-
try {
|
|
72
|
-
&$entrypoint @params
|
|
73
|
-
}
|
|
74
|
-
catch {
|
|
75
|
-
# failed to invoke the PowerShell module, capture the exception and
|
|
76
|
-
# output a pretty error for Ansible to parse
|
|
77
|
-
$result = @{
|
|
78
|
-
msg = "Failed to invoke PowerShell module: $($_.Exception.Message)"
|
|
79
|
-
failed = $true
|
|
80
|
-
exception = (Format-AnsibleException -ErrorRecord $_)
|
|
81
|
-
}
|
|
82
|
-
Write-Output -InputObject (ConvertTo-Json -InputObject $result -Depth 99 -Compress)
|
|
83
|
-
$host.SetShouldExit(1)
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
Write-AnsibleLog "INFO - ending module_powershell_wrapper" "module_powershell_wrapper"
|