ansible-core 2.18.4rc1__py3-none-any.whl → 2.19.0b1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ansible/_internal/__init__.py +53 -0
- ansible/_internal/_ansiballz.py +265 -0
- ansible/_internal/_datatag/__init__.py +0 -0
- ansible/_internal/_datatag/_tags.py +130 -0
- ansible/_internal/_datatag/_utils.py +19 -0
- ansible/_internal/_datatag/_wrappers.py +33 -0
- ansible/_internal/_errors/__init__.py +0 -0
- ansible/_internal/_errors/_captured.py +128 -0
- ansible/_internal/_errors/_handler.py +91 -0
- ansible/_internal/_errors/_utils.py +310 -0
- ansible/_internal/_json/__init__.py +160 -0
- ansible/_internal/_json/_legacy_encoder.py +34 -0
- ansible/_internal/_json/_profiles/__init__.py +0 -0
- ansible/_internal/_json/_profiles/_cache_persistence.py +55 -0
- ansible/_internal/_json/_profiles/_inventory_legacy.py +40 -0
- ansible/_internal/_json/_profiles/_legacy.py +198 -0
- ansible/_internal/_locking.py +21 -0
- ansible/_internal/_plugins/__init__.py +0 -0
- ansible/_internal/_plugins/_cache.py +57 -0
- ansible/_internal/_task.py +78 -0
- ansible/_internal/_templating/__init__.py +10 -0
- ansible/_internal/_templating/_access.py +86 -0
- ansible/_internal/_templating/_chain_templar.py +63 -0
- ansible/_internal/_templating/_datatag.py +95 -0
- ansible/_internal/_templating/_engine.py +588 -0
- ansible/_internal/_templating/_errors.py +28 -0
- ansible/_internal/_templating/_jinja_bits.py +1066 -0
- ansible/_internal/_templating/_jinja_common.py +332 -0
- ansible/_internal/_templating/_jinja_patches.py +44 -0
- ansible/_internal/_templating/_jinja_plugins.py +351 -0
- ansible/_internal/_templating/_lazy_containers.py +633 -0
- ansible/_internal/_templating/_marker_behaviors.py +103 -0
- ansible/_internal/_templating/_transform.py +63 -0
- ansible/_internal/_templating/_utils.py +107 -0
- ansible/_internal/_wrapt.py +1052 -0
- ansible/_internal/_yaml/__init__.py +0 -0
- ansible/_internal/_yaml/_constructor.py +240 -0
- ansible/_internal/_yaml/_dumper.py +62 -0
- ansible/_internal/_yaml/_errors.py +166 -0
- ansible/_internal/_yaml/_loader.py +66 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/README.md +11 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/action/debug.py +36 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/apply_trust.py +19 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/dump_object.py +18 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/finalize.py +16 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/origin.py +18 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.py +24 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.yml +33 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/tag_names.py +16 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/true_type.py +17 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/unmask.py +49 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.py +21 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.yml +2 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.py +15 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.yml +19 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.py +18 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.yml +19 -0
- ansible/cli/__init__.py +153 -89
- ansible/cli/_ssh_askpass.py +47 -0
- ansible/cli/adhoc.py +14 -7
- ansible/cli/arguments/option_helpers.py +154 -7
- ansible/cli/config.py +43 -68
- ansible/cli/console.py +10 -8
- ansible/cli/doc.py +48 -46
- ansible/cli/galaxy.py +27 -20
- ansible/cli/inventory.py +28 -26
- ansible/cli/playbook.py +4 -12
- ansible/cli/pull.py +51 -11
- ansible/cli/scripts/ansible_connection_cli_stub.py +7 -7
- ansible/cli/vault.py +12 -11
- ansible/compat/__init__.py +2 -2
- ansible/config/base.yml +165 -108
- ansible/config/manager.py +52 -49
- ansible/constants.py +3 -4
- ansible/errors/__init__.py +277 -235
- ansible/executor/interpreter_discovery.py +28 -149
- ansible/executor/module_common.py +426 -493
- ansible/executor/play_iterator.py +22 -27
- ansible/executor/playbook_executor.py +11 -11
- ansible/executor/powershell/async_watchdog.ps1 +97 -102
- ansible/executor/powershell/async_wrapper.ps1 +202 -151
- ansible/executor/powershell/become_wrapper.ps1 +89 -144
- ansible/executor/powershell/bootstrap_wrapper.ps1 +24 -9
- ansible/executor/powershell/coverage_wrapper.ps1 +82 -135
- ansible/executor/powershell/exec_wrapper.ps1 +462 -196
- ansible/executor/powershell/module_manifest.py +417 -265
- ansible/executor/powershell/module_wrapper.ps1 +169 -186
- ansible/executor/powershell/psrp_fetch_file.ps1 +41 -0
- ansible/executor/powershell/psrp_put_file.ps1 +122 -0
- ansible/executor/powershell/winrm_fetch_file.ps1 +46 -0
- ansible/executor/powershell/winrm_put_file.ps1 +36 -0
- ansible/executor/process/worker.py +136 -76
- ansible/executor/stats.py +5 -5
- ansible/executor/task_executor.py +237 -236
- ansible/executor/task_queue_manager.py +62 -38
- ansible/executor/task_result.py +21 -12
- ansible/galaxy/__init__.py +2 -2
- ansible/galaxy/api.py +22 -18
- ansible/galaxy/collection/__init__.py +1 -1
- ansible/galaxy/collection/concrete_artifact_manager.py +8 -11
- ansible/galaxy/dependency_resolution/dataclasses.py +14 -4
- ansible/galaxy/dependency_resolution/providers.py +1 -1
- ansible/galaxy/dependency_resolution/reporters.py +81 -0
- ansible/galaxy/role.py +4 -8
- ansible/galaxy/token.py +28 -21
- ansible/inventory/data.py +47 -57
- ansible/inventory/group.py +44 -72
- ansible/inventory/helpers.py +9 -0
- ansible/inventory/host.py +32 -54
- ansible/inventory/manager.py +77 -34
- ansible/keyword_desc.yml +1 -1
- ansible/module_utils/_internal/__init__.py +55 -0
- ansible/module_utils/_internal/_ambient_context.py +58 -0
- ansible/module_utils/_internal/_ansiballz.py +133 -0
- ansible/module_utils/_internal/_concurrent/_daemon_threading.py +1 -0
- ansible/module_utils/_internal/_dataclass_annotation_patch.py +64 -0
- ansible/module_utils/_internal/_dataclass_validation.py +217 -0
- ansible/module_utils/_internal/_datatag/__init__.py +928 -0
- ansible/module_utils/_internal/_datatag/_tags.py +38 -0
- ansible/module_utils/_internal/_debugging.py +31 -0
- ansible/module_utils/_internal/_errors.py +30 -0
- ansible/module_utils/_internal/_json/__init__.py +63 -0
- ansible/module_utils/_internal/_json/_legacy_encoder.py +26 -0
- ansible/module_utils/_internal/_json/_profiles/__init__.py +410 -0
- ansible/module_utils/_internal/_json/_profiles/_fallback_to_str.py +73 -0
- ansible/module_utils/_internal/_json/_profiles/_module_legacy_c2m.py +31 -0
- ansible/module_utils/_internal/_json/_profiles/_module_legacy_m2c.py +35 -0
- ansible/module_utils/_internal/_json/_profiles/_module_modern_c2m.py +35 -0
- ansible/module_utils/_internal/_json/_profiles/_module_modern_m2c.py +33 -0
- ansible/module_utils/_internal/_json/_profiles/_tagless.py +50 -0
- ansible/module_utils/_internal/_patches/__init__.py +66 -0
- ansible/module_utils/_internal/_patches/_dataclass_annotation_patch.py +55 -0
- ansible/module_utils/_internal/_patches/_socket_patch.py +34 -0
- ansible/module_utils/_internal/_patches/_sys_intern_patch.py +34 -0
- ansible/module_utils/_internal/_plugin_exec_context.py +49 -0
- ansible/module_utils/_internal/_testing.py +0 -0
- ansible/module_utils/_internal/_traceback.py +89 -0
- ansible/module_utils/ansible_release.py +2 -2
- ansible/module_utils/api.py +1 -2
- ansible/module_utils/basic.py +154 -120
- ansible/module_utils/common/_utils.py +24 -28
- ansible/module_utils/common/collections.py +1 -2
- ansible/module_utils/common/dict_transformations.py +2 -2
- ansible/module_utils/common/file.py +2 -2
- ansible/module_utils/common/json.py +90 -84
- ansible/module_utils/common/locale.py +2 -2
- ansible/module_utils/common/messages.py +108 -0
- ansible/module_utils/common/parameters.py +27 -24
- ansible/module_utils/common/process.py +2 -2
- ansible/module_utils/common/respawn.py +41 -19
- ansible/module_utils/common/sentinel.py +66 -0
- ansible/module_utils/common/sys_info.py +8 -8
- ansible/module_utils/common/text/converters.py +16 -37
- ansible/module_utils/common/validation.py +35 -24
- ansible/module_utils/common/warnings.py +86 -25
- ansible/module_utils/common/yaml.py +29 -3
- ansible/module_utils/compat/datetime.py +33 -21
- ansible/module_utils/compat/paramiko.py +21 -10
- ansible/module_utils/compat/typing.py +6 -5
- ansible/module_utils/connection.py +2 -2
- ansible/module_utils/csharp/Ansible.Basic.cs +14 -11
- ansible/module_utils/csharp/Ansible.Become.cs +1 -0
- ansible/module_utils/csharp/Ansible._Async.cs +517 -0
- ansible/module_utils/datatag.py +46 -0
- ansible/module_utils/distro/__init__.py +2 -2
- ansible/module_utils/facts/ansible_collector.py +4 -5
- ansible/module_utils/facts/collector.py +13 -14
- ansible/module_utils/facts/compat.py +4 -4
- ansible/module_utils/facts/default_collectors.py +1 -1
- ansible/module_utils/facts/hardware/aix.py +34 -0
- ansible/module_utils/facts/hardware/base.py +1 -1
- ansible/module_utils/facts/hardware/darwin.py +1 -3
- ansible/module_utils/facts/hardware/freebsd.py +2 -2
- ansible/module_utils/facts/hardware/linux.py +4 -4
- ansible/module_utils/facts/namespace.py +1 -1
- ansible/module_utils/facts/network/base.py +1 -1
- ansible/module_utils/facts/network/fc_wwn.py +1 -2
- ansible/module_utils/facts/network/iscsi.py +1 -2
- ansible/module_utils/facts/network/nvme.py +1 -2
- ansible/module_utils/facts/other/facter.py +1 -2
- ansible/module_utils/facts/other/ohai.py +2 -3
- ansible/module_utils/facts/system/apparmor.py +1 -2
- ansible/module_utils/facts/system/caps.py +1 -1
- ansible/module_utils/facts/system/chroot.py +1 -2
- ansible/module_utils/facts/system/cmdline.py +1 -2
- ansible/module_utils/facts/system/date_time.py +5 -3
- ansible/module_utils/facts/system/distribution.py +9 -8
- ansible/module_utils/facts/system/dns.py +1 -1
- ansible/module_utils/facts/system/env.py +1 -2
- ansible/module_utils/facts/system/fips.py +7 -20
- ansible/module_utils/facts/system/loadavg.py +1 -2
- ansible/module_utils/facts/system/local.py +1 -2
- ansible/module_utils/facts/system/lsb.py +1 -2
- ansible/module_utils/facts/system/pkg_mgr.py +1 -2
- ansible/module_utils/facts/system/platform.py +1 -2
- ansible/module_utils/facts/system/python.py +1 -2
- ansible/module_utils/facts/system/selinux.py +1 -1
- ansible/module_utils/facts/system/service_mgr.py +1 -2
- ansible/module_utils/facts/system/ssh_pub_keys.py +1 -1
- ansible/module_utils/facts/system/systemd.py +1 -1
- ansible/module_utils/facts/system/user.py +1 -2
- ansible/module_utils/facts/utils.py +3 -3
- ansible/module_utils/facts/virtual/base.py +1 -1
- ansible/module_utils/facts/virtual/sunos.py +3 -15
- ansible/module_utils/facts/virtual/sysctl.py +3 -16
- ansible/module_utils/json_utils.py +2 -2
- ansible/module_utils/parsing/convert_bool.py +1 -1
- ansible/module_utils/service.py +18 -21
- ansible/module_utils/splitter.py +7 -7
- ansible/module_utils/testing.py +31 -0
- ansible/module_utils/urls.py +60 -31
- ansible/modules/add_host.py +4 -4
- ansible/modules/apt.py +60 -46
- ansible/modules/apt_key.py +19 -12
- ansible/modules/apt_repository.py +19 -16
- ansible/modules/assemble.py +6 -6
- ansible/modules/assert.py +4 -4
- ansible/modules/async_status.py +10 -12
- ansible/modules/async_wrapper.py +8 -3
- ansible/modules/blockinfile.py +6 -7
- ansible/modules/command.py +10 -17
- ansible/modules/copy.py +57 -144
- ansible/modules/cron.py +20 -15
- ansible/modules/deb822_repository.py +8 -9
- ansible/modules/debconf.py +5 -5
- ansible/modules/debug.py +4 -4
- ansible/modules/dnf.py +8 -8
- ansible/modules/dnf5.py +52 -17
- ansible/modules/dpkg_selections.py +4 -4
- ansible/modules/expect.py +8 -10
- ansible/modules/fail.py +4 -4
- ansible/modules/fetch.py +4 -4
- ansible/modules/file.py +174 -133
- ansible/modules/find.py +20 -18
- ansible/modules/gather_facts.py +3 -3
- ansible/modules/get_url.py +59 -53
- ansible/modules/getent.py +7 -9
- ansible/modules/git.py +28 -25
- ansible/modules/group.py +6 -6
- ansible/modules/group_by.py +4 -4
- ansible/modules/hostname.py +13 -29
- ansible/modules/import_playbook.py +6 -6
- ansible/modules/import_role.py +7 -7
- ansible/modules/import_tasks.py +6 -6
- ansible/modules/include_role.py +6 -6
- ansible/modules/include_tasks.py +6 -6
- ansible/modules/include_vars.py +6 -6
- ansible/modules/iptables.py +86 -73
- ansible/modules/known_hosts.py +10 -10
- ansible/modules/lineinfile.py +5 -5
- ansible/modules/meta.py +4 -4
- ansible/modules/mount_facts.py +2 -2
- ansible/modules/package.py +4 -4
- ansible/modules/package_facts.py +22 -10
- ansible/modules/pause.py +6 -6
- ansible/modules/ping.py +6 -6
- ansible/modules/pip.py +10 -11
- ansible/modules/raw.py +4 -4
- ansible/modules/reboot.py +6 -6
- ansible/modules/replace.py +9 -13
- ansible/modules/rpm_key.py +7 -8
- ansible/modules/script.py +4 -4
- ansible/modules/service.py +7 -8
- ansible/modules/service_facts.py +87 -10
- ansible/modules/set_fact.py +5 -5
- ansible/modules/set_stats.py +4 -4
- ansible/modules/setup.py +2 -2
- ansible/modules/shell.py +6 -6
- ansible/modules/slurp.py +6 -6
- ansible/modules/stat.py +9 -23
- ansible/modules/subversion.py +15 -15
- ansible/modules/systemd.py +6 -6
- ansible/modules/systemd_service.py +6 -6
- ansible/modules/sysvinit.py +6 -6
- ansible/modules/tempfile.py +5 -6
- ansible/modules/template.py +6 -6
- ansible/modules/unarchive.py +32 -11
- ansible/modules/uri.py +35 -49
- ansible/modules/user.py +53 -34
- ansible/modules/validate_argument_spec.py +10 -7
- ansible/modules/wait_for.py +39 -32
- ansible/modules/wait_for_connection.py +6 -6
- ansible/modules/yum_repository.py +6 -6
- ansible/parsing/ajson.py +14 -32
- ansible/parsing/dataloader.py +99 -54
- ansible/parsing/mod_args.py +28 -44
- ansible/parsing/plugin_docs.py +21 -86
- ansible/parsing/quoting.py +1 -1
- ansible/parsing/splitter.py +27 -12
- ansible/parsing/utils/addresses.py +24 -24
- ansible/parsing/utils/yaml.py +32 -61
- ansible/parsing/vault/__init__.py +319 -87
- ansible/parsing/yaml/__init__.py +0 -18
- ansible/parsing/yaml/dumper.py +6 -120
- ansible/parsing/yaml/loader.py +6 -39
- ansible/parsing/yaml/objects.py +36 -339
- ansible/playbook/__init__.py +1 -1
- ansible/playbook/attribute.py +8 -3
- ansible/playbook/base.py +182 -132
- ansible/playbook/block.py +26 -24
- ansible/playbook/collectionsearch.py +1 -15
- ansible/playbook/conditional.py +3 -77
- ansible/playbook/handler.py +8 -2
- ansible/playbook/helpers.py +41 -53
- ansible/playbook/included_file.py +6 -15
- ansible/playbook/loop_control.py +2 -2
- ansible/playbook/play.py +85 -44
- ansible/playbook/play_context.py +12 -17
- ansible/playbook/playbook_include.py +14 -15
- ansible/playbook/role/__init__.py +24 -26
- ansible/playbook/role/definition.py +15 -17
- ansible/playbook/role/include.py +2 -4
- ansible/playbook/role/metadata.py +10 -11
- ansible/playbook/role_include.py +3 -3
- ansible/playbook/taggable.py +13 -8
- ansible/playbook/task.py +188 -118
- ansible/playbook/task_include.py +5 -5
- ansible/plugins/__init__.py +68 -21
- ansible/plugins/action/__init__.py +209 -176
- ansible/plugins/action/add_host.py +1 -1
- ansible/plugins/action/assemble.py +1 -1
- ansible/plugins/action/assert.py +54 -66
- ansible/plugins/action/copy.py +7 -11
- ansible/plugins/action/debug.py +37 -31
- ansible/plugins/action/dnf.py +3 -4
- ansible/plugins/action/fail.py +1 -1
- ansible/plugins/action/fetch.py +4 -5
- ansible/plugins/action/gather_facts.py +8 -7
- ansible/plugins/action/group_by.py +1 -1
- ansible/plugins/action/include_vars.py +10 -11
- ansible/plugins/action/package.py +3 -6
- ansible/plugins/action/pause.py +2 -2
- ansible/plugins/action/script.py +15 -8
- ansible/plugins/action/service.py +6 -11
- ansible/plugins/action/set_fact.py +3 -12
- ansible/plugins/action/set_stats.py +3 -8
- ansible/plugins/action/template.py +35 -59
- ansible/plugins/action/unarchive.py +1 -1
- ansible/plugins/action/validate_argument_spec.py +5 -5
- ansible/plugins/action/wait_for_connection.py +1 -1
- ansible/plugins/become/__init__.py +31 -8
- ansible/plugins/become/runas.py +71 -0
- ansible/plugins/become/su.py +13 -8
- ansible/plugins/become/sudo.py +19 -0
- ansible/plugins/cache/__init__.py +35 -44
- ansible/plugins/cache/base.py +8 -0
- ansible/plugins/cache/jsonfile.py +10 -16
- ansible/plugins/cache/memory.py +6 -12
- ansible/plugins/callback/__init__.py +141 -123
- ansible/plugins/callback/default.py +30 -23
- ansible/plugins/callback/junit.py +28 -24
- ansible/plugins/callback/minimal.py +17 -14
- ansible/plugins/callback/oneline.py +13 -7
- ansible/plugins/callback/tree.py +10 -6
- ansible/plugins/connection/__init__.py +47 -34
- ansible/plugins/connection/local.py +150 -54
- ansible/plugins/connection/paramiko_ssh.py +21 -18
- ansible/plugins/connection/psrp.py +76 -165
- ansible/plugins/connection/ssh.py +301 -78
- ansible/plugins/connection/winrm.py +58 -140
- ansible/plugins/doc_fragments/action_common_attributes.py +14 -14
- ansible/plugins/doc_fragments/action_core.py +6 -6
- ansible/plugins/doc_fragments/backup.py +2 -2
- ansible/plugins/doc_fragments/checksum_common.py +27 -0
- ansible/plugins/doc_fragments/constructed.py +6 -2
- ansible/plugins/doc_fragments/decrypt.py +2 -2
- ansible/plugins/doc_fragments/default_callback.py +2 -2
- ansible/plugins/doc_fragments/files.py +2 -2
- ansible/plugins/doc_fragments/inventory_cache.py +2 -2
- ansible/plugins/doc_fragments/result_format_callback.py +2 -2
- ansible/plugins/doc_fragments/return_common.py +2 -2
- ansible/plugins/doc_fragments/template_common.py +4 -4
- ansible/plugins/doc_fragments/url.py +17 -1
- ansible/plugins/doc_fragments/url_windows.py +2 -2
- ansible/plugins/doc_fragments/validate.py +2 -2
- ansible/plugins/doc_fragments/vars_plugin_staging.py +2 -2
- ansible/plugins/filter/__init__.py +6 -2
- ansible/plugins/filter/b64decode.yml +22 -0
- ansible/plugins/filter/b64encode.yml +22 -0
- ansible/plugins/filter/bool.yml +11 -4
- ansible/plugins/filter/core.py +218 -108
- ansible/plugins/filter/encryption.py +32 -32
- ansible/plugins/filter/flatten.yml +3 -2
- ansible/plugins/filter/human_to_bytes.yml +2 -2
- ansible/plugins/filter/mathstuff.py +30 -37
- ansible/plugins/filter/password_hash.yml +8 -0
- ansible/plugins/filter/regex_search.yml +1 -4
- ansible/plugins/filter/split.yml +1 -1
- ansible/plugins/filter/to_nice_yaml.yml +0 -4
- ansible/plugins/filter/to_yaml.yml +0 -4
- ansible/plugins/filter/unvault.yml +1 -1
- ansible/plugins/filter/urls.py +1 -1
- ansible/plugins/filter/urlsplit.py +8 -9
- ansible/plugins/filter/vault.yml +14 -9
- ansible/plugins/filter/win_basename.yml +6 -1
- ansible/plugins/filter/win_dirname.yml +5 -0
- ansible/plugins/inventory/__init__.py +97 -77
- ansible/plugins/inventory/advanced_host_list.py +7 -5
- ansible/plugins/inventory/auto.py +11 -4
- ansible/plugins/inventory/constructed.py +21 -24
- ansible/plugins/inventory/generator.py +16 -11
- ansible/plugins/inventory/host_list.py +7 -5
- ansible/plugins/inventory/ini.py +78 -44
- ansible/plugins/inventory/script.py +189 -119
- ansible/plugins/inventory/toml.py +16 -126
- ansible/plugins/inventory/yaml.py +10 -8
- ansible/plugins/list.py +3 -3
- ansible/plugins/loader.py +197 -82
- ansible/plugins/lookup/__init__.py +21 -4
- ansible/plugins/lookup/config.py +21 -35
- ansible/plugins/lookup/csvfile.py +3 -2
- ansible/plugins/lookup/dict.py +1 -6
- ansible/plugins/lookup/env.py +12 -9
- ansible/plugins/lookup/file.py +5 -8
- ansible/plugins/lookup/first_found.py +86 -55
- ansible/plugins/lookup/indexed_items.py +1 -10
- ansible/plugins/lookup/ini.py +14 -13
- ansible/plugins/lookup/items.py +1 -1
- ansible/plugins/lookup/lines.py +8 -1
- ansible/plugins/lookup/list.py +1 -1
- ansible/plugins/lookup/nested.py +2 -18
- ansible/plugins/lookup/password.py +5 -5
- ansible/plugins/lookup/pipe.py +5 -7
- ansible/plugins/lookup/sequence.py +18 -8
- ansible/plugins/lookup/subelements.py +1 -4
- ansible/plugins/lookup/template.py +42 -36
- ansible/plugins/lookup/together.py +0 -12
- ansible/plugins/lookup/unvault.py +1 -5
- ansible/plugins/lookup/url.py +2 -8
- ansible/plugins/lookup/vars.py +16 -24
- ansible/plugins/shell/__init__.py +2 -2
- ansible/plugins/shell/cmd.py +2 -2
- ansible/plugins/shell/powershell.py +39 -22
- ansible/plugins/shell/sh.py +3 -2
- ansible/plugins/strategy/__init__.py +94 -113
- ansible/plugins/strategy/debug.py +2 -2
- ansible/plugins/strategy/free.py +13 -28
- ansible/plugins/strategy/host_pinned.py +2 -2
- ansible/plugins/strategy/linear.py +31 -33
- ansible/plugins/terminal/__init__.py +4 -4
- ansible/plugins/test/__init__.py +7 -2
- ansible/plugins/test/core.py +54 -20
- ansible/plugins/test/files.py +1 -1
- ansible/plugins/test/mathstuff.py +3 -3
- ansible/plugins/test/uri.py +3 -3
- ansible/plugins/vars/host_group_vars.py +7 -14
- ansible/release.py +2 -2
- ansible/template/__init__.py +368 -944
- ansible/utils/__init__.py +0 -18
- ansible/utils/_ssh_agent.py +657 -0
- ansible/utils/collection_loader/__init__.py +52 -5
- ansible/utils/collection_loader/_collection_config.py +5 -6
- ansible/utils/collection_loader/_collection_finder.py +79 -93
- ansible/utils/collection_loader/_collection_meta.py +13 -8
- ansible/utils/display.py +428 -58
- ansible/utils/encrypt.py +27 -19
- ansible/utils/fqcn.py +2 -2
- ansible/utils/hashing.py +2 -2
- ansible/utils/helpers.py +2 -2
- ansible/utils/listify.py +8 -8
- ansible/utils/lock.py +2 -2
- ansible/utils/path.py +4 -4
- ansible/utils/plugin_docs.py +14 -13
- ansible/utils/sentinel.py +4 -62
- ansible/utils/singleton.py +2 -0
- ansible/utils/ssh_functions.py +1 -1
- ansible/utils/unsafe_proxy.py +23 -332
- ansible/utils/vars.py +28 -8
- ansible/utils/version.py +2 -2
- ansible/vars/clean.py +4 -4
- ansible/vars/hostvars.py +60 -90
- ansible/vars/manager.py +205 -264
- ansible/vars/reserved.py +8 -9
- ansible_core-2.19.0b1.dist-info/BSD-3-Clause.txt +28 -0
- {ansible_core-2.18.4rc1.dist-info → ansible_core-2.19.0b1.dist-info}/METADATA +5 -4
- ansible_core-2.19.0b1.dist-info/RECORD +1070 -0
- {ansible_core-2.18.4rc1.dist-info → ansible_core-2.19.0b1.dist-info}/WHEEL +1 -1
- ansible_test/_data/completion/docker.txt +7 -7
- ansible_test/_data/completion/remote.txt +6 -6
- ansible_test/_data/completion/windows.txt +1 -0
- ansible_test/_data/requirements/ansible.txt +2 -2
- ansible_test/_data/requirements/sanity.ansible-doc.txt +3 -3
- ansible_test/_data/requirements/sanity.changelog.txt +1 -1
- ansible_test/_data/requirements/sanity.import.plugin.txt +2 -2
- ansible_test/_data/requirements/sanity.pylint.txt +4 -4
- ansible_test/_data/requirements/sanity.validate-modules.txt +2 -2
- ansible_test/_data/requirements/sanity.yamllint.txt +1 -1
- ansible_test/_data/requirements/units.txt +1 -0
- ansible_test/_internal/__init__.py +1 -0
- ansible_test/_internal/ansible_util.py +2 -0
- ansible_test/_internal/become.py +1 -0
- ansible_test/_internal/bootstrap.py +1 -0
- ansible_test/_internal/cache.py +1 -0
- ansible_test/_internal/cgroup.py +1 -0
- ansible_test/_internal/ci/__init__.py +1 -0
- ansible_test/_internal/ci/azp.py +1 -0
- ansible_test/_internal/ci/local.py +1 -0
- ansible_test/_internal/classification/__init__.py +1 -0
- ansible_test/_internal/classification/common.py +1 -0
- ansible_test/_internal/classification/csharp.py +1 -0
- ansible_test/_internal/classification/powershell.py +1 -0
- ansible_test/_internal/classification/python.py +1 -0
- ansible_test/_internal/cli/__init__.py +1 -0
- ansible_test/_internal/cli/actions.py +1 -0
- ansible_test/_internal/cli/argparsing/__init__.py +1 -0
- ansible_test/_internal/cli/argparsing/actions.py +1 -0
- ansible_test/_internal/cli/argparsing/argcompletion.py +1 -0
- ansible_test/_internal/cli/argparsing/parsers.py +1 -0
- ansible_test/_internal/cli/commands/__init__.py +11 -0
- ansible_test/_internal/cli/commands/coverage/__init__.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/__init__.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/__init__.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/combine.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/expand.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/filter.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/generate.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/missing.py +1 -0
- ansible_test/_internal/cli/commands/coverage/combine.py +1 -0
- ansible_test/_internal/cli/commands/coverage/erase.py +1 -0
- ansible_test/_internal/cli/commands/coverage/html.py +1 -0
- ansible_test/_internal/cli/commands/coverage/report.py +1 -0
- ansible_test/_internal/cli/commands/coverage/xml.py +1 -0
- ansible_test/_internal/cli/commands/env.py +1 -0
- ansible_test/_internal/cli/commands/integration/__init__.py +1 -0
- ansible_test/_internal/cli/commands/integration/network.py +1 -0
- ansible_test/_internal/cli/commands/integration/posix.py +1 -0
- ansible_test/_internal/cli/commands/integration/windows.py +1 -0
- ansible_test/_internal/cli/commands/sanity.py +9 -0
- ansible_test/_internal/cli/commands/shell.py +1 -0
- ansible_test/_internal/cli/commands/units.py +1 -0
- ansible_test/_internal/cli/compat.py +1 -0
- ansible_test/_internal/cli/completers.py +1 -0
- ansible_test/_internal/cli/converters.py +1 -0
- ansible_test/_internal/cli/environments.py +1 -0
- ansible_test/_internal/cli/epilog.py +1 -0
- ansible_test/_internal/cli/parsers/__init__.py +1 -0
- ansible_test/_internal/cli/parsers/base_argument_parsers.py +1 -0
- ansible_test/_internal/cli/parsers/helpers.py +1 -0
- ansible_test/_internal/cli/parsers/host_config_parsers.py +1 -0
- ansible_test/_internal/cli/parsers/key_value_parsers.py +1 -0
- ansible_test/_internal/cli/parsers/value_parsers.py +1 -0
- ansible_test/_internal/commands/__init__.py +1 -0
- ansible_test/_internal/commands/coverage/__init__.py +2 -1
- ansible_test/_internal/commands/coverage/analyze/__init__.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/__init__.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/combine.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/expand.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/filter.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/generate.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/missing.py +1 -0
- ansible_test/_internal/commands/coverage/combine.py +2 -1
- ansible_test/_internal/commands/coverage/erase.py +1 -0
- ansible_test/_internal/commands/coverage/html.py +1 -0
- ansible_test/_internal/commands/coverage/report.py +1 -0
- ansible_test/_internal/commands/coverage/xml.py +1 -0
- ansible_test/_internal/commands/env/__init__.py +2 -0
- ansible_test/_internal/commands/integration/__init__.py +4 -0
- ansible_test/_internal/commands/integration/cloud/__init__.py +1 -0
- ansible_test/_internal/commands/integration/cloud/acme.py +2 -1
- ansible_test/_internal/commands/integration/cloud/aws.py +1 -0
- ansible_test/_internal/commands/integration/cloud/azure.py +1 -0
- ansible_test/_internal/commands/integration/cloud/cs.py +1 -0
- ansible_test/_internal/commands/integration/cloud/digitalocean.py +1 -0
- ansible_test/_internal/commands/integration/cloud/galaxy.py +3 -2
- ansible_test/_internal/commands/integration/cloud/hcloud.py +1 -0
- ansible_test/_internal/commands/integration/cloud/httptester.py +2 -1
- ansible_test/_internal/commands/integration/cloud/nios.py +2 -1
- ansible_test/_internal/commands/integration/cloud/opennebula.py +1 -0
- ansible_test/_internal/commands/integration/cloud/openshift.py +1 -0
- ansible_test/_internal/commands/integration/cloud/scaleway.py +1 -0
- ansible_test/_internal/commands/integration/cloud/vcenter.py +1 -0
- ansible_test/_internal/commands/integration/cloud/vultr.py +1 -0
- ansible_test/_internal/commands/integration/coverage.py +1 -0
- ansible_test/_internal/commands/integration/filters.py +1 -0
- ansible_test/_internal/commands/integration/network.py +1 -0
- ansible_test/_internal/commands/integration/posix.py +1 -0
- ansible_test/_internal/commands/integration/windows.py +1 -0
- ansible_test/_internal/commands/sanity/__init__.py +16 -1
- ansible_test/_internal/commands/sanity/ansible_doc.py +1 -0
- ansible_test/_internal/commands/sanity/bin_symlinks.py +1 -0
- ansible_test/_internal/commands/sanity/compile.py +1 -0
- ansible_test/_internal/commands/sanity/ignores.py +1 -0
- ansible_test/_internal/commands/sanity/import.py +1 -0
- ansible_test/_internal/commands/sanity/integration_aliases.py +1 -0
- ansible_test/_internal/commands/sanity/pep8.py +1 -0
- ansible_test/_internal/commands/sanity/pslint.py +1 -0
- ansible_test/_internal/commands/sanity/pylint.py +24 -26
- ansible_test/_internal/commands/sanity/shellcheck.py +1 -0
- ansible_test/_internal/commands/sanity/validate_modules.py +1 -0
- ansible_test/_internal/commands/sanity/yamllint.py +1 -0
- ansible_test/_internal/commands/shell/__init__.py +1 -0
- ansible_test/_internal/commands/units/__init__.py +1 -0
- ansible_test/_internal/compat/__init__.py +1 -0
- ansible_test/_internal/compat/packaging.py +1 -0
- ansible_test/_internal/compat/yaml.py +1 -0
- ansible_test/_internal/completion.py +1 -0
- ansible_test/_internal/config.py +2 -0
- ansible_test/_internal/connections.py +1 -0
- ansible_test/_internal/constants.py +1 -0
- ansible_test/_internal/containers.py +1 -0
- ansible_test/_internal/content_config.py +1 -0
- ansible_test/_internal/core_ci.py +1 -0
- ansible_test/_internal/coverage_util.py +11 -10
- ansible_test/_internal/data.py +1 -0
- ansible_test/_internal/delegation.py +1 -0
- ansible_test/_internal/dev/__init__.py +1 -0
- ansible_test/_internal/dev/container_probe.py +1 -0
- ansible_test/_internal/diff.py +3 -2
- ansible_test/_internal/docker_util.py +2 -1
- ansible_test/_internal/encoding.py +1 -0
- ansible_test/_internal/executor.py +1 -0
- ansible_test/_internal/git.py +1 -0
- ansible_test/_internal/host_configs.py +1 -0
- ansible_test/_internal/host_profiles.py +1 -0
- ansible_test/_internal/http.py +1 -0
- ansible_test/_internal/init.py +1 -0
- ansible_test/_internal/inventory.py +35 -3
- ansible_test/_internal/io.py +1 -0
- ansible_test/_internal/metadata.py +1 -0
- ansible_test/_internal/payload.py +1 -0
- ansible_test/_internal/provider/__init__.py +1 -0
- ansible_test/_internal/provider/layout/__init__.py +1 -0
- ansible_test/_internal/provider/layout/ansible.py +1 -0
- ansible_test/_internal/provider/layout/collection.py +1 -0
- ansible_test/_internal/provider/layout/unsupported.py +1 -0
- ansible_test/_internal/provider/source/__init__.py +1 -0
- ansible_test/_internal/provider/source/git.py +1 -0
- ansible_test/_internal/provider/source/installed.py +1 -0
- ansible_test/_internal/provider/source/unsupported.py +1 -0
- ansible_test/_internal/provider/source/unversioned.py +1 -0
- ansible_test/_internal/provisioning.py +1 -0
- ansible_test/_internal/pypi_proxy.py +6 -5
- ansible_test/_internal/python_requirements.py +1 -0
- ansible_test/_internal/ssh.py +1 -0
- ansible_test/_internal/target.py +1 -0
- ansible_test/_internal/test.py +3 -2
- ansible_test/_internal/thread.py +1 -0
- ansible_test/_internal/timeout.py +1 -0
- ansible_test/_internal/util.py +1 -0
- ansible_test/_internal/util_common.py +5 -2
- ansible_test/_internal/venv.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/action-plugin-docs.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/changelog/sphinx.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/changelog.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/empty-init.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/line-endings.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/no-assert.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/no-get-exception.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/no-illegal-filenames.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/no-smart-quotes.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/replace-urlopen.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/runtime-metadata.py +28 -1
- ansible_test/_util/controller/sanity/code-smell/shebang.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/symlinks.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/use-argspec-type-path.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/use-compat-six.py +1 -0
- ansible_test/_util/controller/sanity/integration-aliases/yaml_to_json.py +2 -1
- ansible_test/_util/controller/sanity/pep8/current-ignore.txt +4 -0
- ansible_test/_util/controller/sanity/pylint/config/ansible-test-target.cfg +7 -5
- ansible_test/_util/controller/sanity/pylint/config/ansible-test.cfg +7 -5
- ansible_test/_util/controller/sanity/pylint/config/code-smell.cfg +7 -5
- ansible_test/_util/controller/sanity/pylint/config/collection.cfg +3 -5
- ansible_test/_util/controller/sanity/pylint/config/default.cfg +7 -7
- ansible_test/_util/controller/sanity/pylint/plugins/deprecated.py +1 -13
- ansible_test/_util/controller/sanity/pylint/plugins/hide_unraisable.py +1 -0
- ansible_test/_util/controller/sanity/pylint/plugins/string_format.py +1 -8
- ansible_test/_util/controller/sanity/pylint/plugins/unwanted.py +1 -8
- ansible_test/_util/controller/sanity/validate-modules/validate_modules/main.py +55 -28
- ansible_test/_util/controller/sanity/validate-modules/validate_modules/module_args.py +12 -5
- ansible_test/_util/controller/sanity/validate-modules/validate_modules/schema.py +13 -2
- ansible_test/_util/controller/sanity/validate-modules/validate_modules/utils.py +1 -0
- ansible_test/_util/controller/sanity/yamllint/yamllinter.py +35 -17
- ansible_test/_util/controller/tools/collection_detail.py +1 -0
- ansible_test/_util/controller/tools/yaml_to_json.py +2 -1
- ansible_test/_util/target/pytest/plugins/ansible_forked.py +6 -1
- ansible_test/_util/target/pytest/plugins/ansible_pytest_collections.py +2 -1
- ansible_test/_util/target/pytest/plugins/ansible_pytest_coverage.py +1 -0
- ansible_test/_util/target/sanity/compile/compile.py +1 -0
- ansible_test/_util/target/sanity/import/importer.py +15 -16
- ansible_test/_util/target/setup/bootstrap.sh +9 -20
- ansible_test/_util/target/setup/probe_cgroups.py +1 -0
- ansible_test/_util/target/setup/quiet_pip.py +1 -0
- ansible_test/_util/target/setup/requirements.py +35 -27
- ansible_test/_util/target/tools/virtualenvcheck.py +2 -1
- ansible_test/_util/target/tools/yamlcheck.py +2 -1
- ansible/compat/selectors.py +0 -32
- ansible/errors/yaml_strings.py +0 -138
- ansible/executor/action_write_locks.py +0 -44
- ansible/executor/discovery/python_target.py +0 -47
- ansible/executor/powershell/module_powershell_wrapper.ps1 +0 -86
- ansible/executor/powershell/module_script_wrapper.ps1 +0 -22
- ansible/module_utils/compat/importlib.py +0 -26
- ansible/module_utils/compat/selectors.py +0 -32
- ansible/module_utils/pycompat24.py +0 -73
- ansible/parsing/utils/jsonify.py +0 -36
- ansible/parsing/yaml/constructor.py +0 -178
- ansible/template/native_helpers.py +0 -251
- ansible/template/template.py +0 -43
- ansible/template/vars.py +0 -77
- ansible/utils/native_jinja.py +0 -11
- ansible/vars/fact_cache.py +0 -71
- ansible_core-2.18.4rc1.dist-info/RECORD +0 -992
- {ansible_core-2.18.4rc1.dist-info → ansible_core-2.19.0b1.dist-info}/Apache-License.txt +0 -0
- {ansible_core-2.18.4rc1.dist-info → ansible_core-2.19.0b1.dist-info}/COPYING +0 -0
- {ansible_core-2.18.4rc1.dist-info → ansible_core-2.19.0b1.dist-info}/MIT-license.txt +0 -0
- {ansible_core-2.18.4rc1.dist-info → ansible_core-2.19.0b1.dist-info}/PSF-license.txt +0 -0
- {ansible_core-2.18.4rc1.dist-info → ansible_core-2.19.0b1.dist-info}/entry_points.txt +0 -0
- {ansible_core-2.18.4rc1.dist-info → ansible_core-2.19.0b1.dist-info}/simplified_bsd.txt +0 -0
- {ansible_core-2.18.4rc1.dist-info → ansible_core-2.19.0b1.dist-info}/top_level.txt +0 -0
@@ -2,80 +2,80 @@
|
|
2
2
|
|
3
3
|
from __future__ import annotations
|
4
4
|
|
5
|
-
from
|
6
|
-
from jinja2.exceptions import UndefinedError
|
7
|
-
|
8
|
-
from ansible.errors import AnsibleFilterError, AnsibleFilterTypeError
|
5
|
+
from ansible.errors import AnsibleError
|
9
6
|
from ansible.module_utils.common.text.converters import to_native, to_bytes
|
10
|
-
from ansible.
|
11
|
-
from ansible.
|
12
|
-
from ansible.
|
7
|
+
from ansible.plugins import accept_args_markers
|
8
|
+
from ansible._internal._templating._jinja_common import get_first_marker_arg, VaultExceptionMarker
|
9
|
+
from ansible._internal._datatag._tags import VaultedValue
|
10
|
+
from ansible.parsing.vault import is_encrypted, VaultSecret, VaultLib, VaultHelper
|
13
11
|
from ansible.utils.display import Display
|
14
12
|
|
15
13
|
display = Display()
|
16
14
|
|
17
15
|
|
18
16
|
def do_vault(data, secret, salt=None, vault_id='filter_default', wrap_object=False, vaultid=None):
|
17
|
+
if not isinstance(secret, (str, bytes)):
|
18
|
+
raise TypeError(f"Secret passed is required to be a string, instead we got {type(secret)}.")
|
19
19
|
|
20
|
-
if not isinstance(
|
21
|
-
raise
|
22
|
-
|
23
|
-
if not isinstance(data, (string_types, binary_type, Undefined)):
|
24
|
-
raise AnsibleFilterTypeError("Can only vault strings, instead we got: %s" % type(data))
|
20
|
+
if not isinstance(data, (str, bytes)):
|
21
|
+
raise TypeError(f"Can only vault strings, instead we got {type(data)}.")
|
25
22
|
|
26
23
|
if vaultid is not None:
|
27
24
|
display.deprecated("Use of undocumented 'vaultid', use 'vault_id' instead", version='2.20')
|
25
|
+
|
28
26
|
if vault_id == 'filter_default':
|
29
27
|
vault_id = vaultid
|
30
28
|
else:
|
31
29
|
display.warning("Ignoring vaultid as vault_id is already set.")
|
32
30
|
|
33
|
-
vault = ''
|
34
31
|
vs = VaultSecret(to_bytes(secret))
|
35
32
|
vl = VaultLib()
|
36
33
|
try:
|
37
34
|
vault = vl.encrypt(to_bytes(data), vs, vault_id, salt)
|
38
|
-
except
|
39
|
-
raise
|
40
|
-
except Exception as e:
|
41
|
-
raise AnsibleFilterError("Unable to encrypt: %s" % to_native(e), orig_exc=e)
|
35
|
+
except Exception as ex:
|
36
|
+
raise AnsibleError("Unable to encrypt.") from ex
|
42
37
|
|
43
38
|
if wrap_object:
|
44
|
-
vault =
|
39
|
+
vault = VaultedValue(ciphertext=str(vault)).tag(secret)
|
45
40
|
else:
|
46
41
|
vault = to_native(vault)
|
47
42
|
|
48
43
|
return vault
|
49
44
|
|
50
45
|
|
46
|
+
@accept_args_markers
|
51
47
|
def do_unvault(vault, secret, vault_id='filter_default', vaultid=None):
|
48
|
+
if isinstance(vault, VaultExceptionMarker):
|
49
|
+
vault = vault._disarm()
|
50
|
+
|
51
|
+
if (first_marker := get_first_marker_arg((vault, secret, vault_id, vaultid), {})) is not None:
|
52
|
+
return first_marker
|
52
53
|
|
53
|
-
if not isinstance(secret, (
|
54
|
-
raise
|
54
|
+
if not isinstance(secret, (str, bytes)):
|
55
|
+
raise TypeError(f"Secret passed is required to be as string, instead we got {type(secret)}.")
|
55
56
|
|
56
|
-
if not isinstance(vault, (
|
57
|
-
raise
|
57
|
+
if not isinstance(vault, (str, bytes)):
|
58
|
+
raise TypeError(f"Vault should be in the form of a string, instead we got {type(vault)}.")
|
58
59
|
|
59
60
|
if vaultid is not None:
|
60
61
|
display.deprecated("Use of undocumented 'vaultid', use 'vault_id' instead", version='2.20')
|
62
|
+
|
61
63
|
if vault_id == 'filter_default':
|
62
64
|
vault_id = vaultid
|
63
65
|
else:
|
64
66
|
display.warning("Ignoring vaultid as vault_id is already set.")
|
65
67
|
|
66
|
-
data = ''
|
67
68
|
vs = VaultSecret(to_bytes(secret))
|
68
69
|
vl = VaultLib([(vault_id, vs)])
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
70
|
+
|
71
|
+
if ciphertext := VaultHelper.get_ciphertext(vault, with_tags=True):
|
72
|
+
vault = ciphertext
|
73
|
+
|
74
|
+
if is_encrypted(vault):
|
73
75
|
try:
|
74
76
|
data = vl.decrypt(vault)
|
75
|
-
except
|
76
|
-
raise
|
77
|
-
except Exception as e:
|
78
|
-
raise AnsibleFilterError("Unable to decrypt: %s" % to_native(e), orig_exc=e)
|
77
|
+
except Exception as ex:
|
78
|
+
raise AnsibleError("Unable to decrypt.") from ex
|
79
79
|
else:
|
80
80
|
data = vault
|
81
81
|
|
@@ -83,7 +83,7 @@ def do_unvault(vault, secret, vault_id='filter_default', vaultid=None):
|
|
83
83
|
|
84
84
|
|
85
85
|
class FilterModule(object):
|
86
|
-
|
86
|
+
""" Ansible vault jinja2 filters """
|
87
87
|
|
88
88
|
def filters(self):
|
89
89
|
filters = {
|
@@ -7,8 +7,9 @@ DOCUMENTATION:
|
|
7
7
|
positional: _input, levels, skip_nulls
|
8
8
|
options:
|
9
9
|
_input:
|
10
|
-
description:
|
11
|
-
type:
|
10
|
+
description: List to flatten.
|
11
|
+
type: list
|
12
|
+
elements: any
|
12
13
|
required: true
|
13
14
|
levels:
|
14
15
|
description: Number of recursive list depths to flatten.
|
@@ -8,7 +8,7 @@ DOCUMENTATION:
|
|
8
8
|
options:
|
9
9
|
_input:
|
10
10
|
description: human-readable description of a number of bytes.
|
11
|
-
type:
|
11
|
+
type: string
|
12
12
|
required: true
|
13
13
|
default_unit:
|
14
14
|
description: Unit to assume when input does not specify it.
|
@@ -31,7 +31,7 @@ EXAMPLES: |
|
|
31
31
|
# size => 2684354560
|
32
32
|
size: '{{ "2.5 gigabyte" | human_to_bytes }}'
|
33
33
|
|
34
|
-
# size =>
|
34
|
+
# size => 1073741824
|
35
35
|
size: '{{ "1 Gigabyte" | human_to_bytes }}'
|
36
36
|
|
37
37
|
# this is an error, because gigggabyte is not a valid unit
|
@@ -27,10 +27,9 @@ from collections.abc import Mapping, Iterable
|
|
27
27
|
|
28
28
|
from jinja2.filters import pass_environment
|
29
29
|
|
30
|
-
from ansible.errors import
|
30
|
+
from ansible.errors import AnsibleError
|
31
31
|
from ansible.module_utils.common.text import formatters
|
32
32
|
from ansible.module_utils.six import binary_type, text_type
|
33
|
-
from ansible.module_utils.common.text.converters import to_native, to_text
|
34
33
|
from ansible.utils.display import Display
|
35
34
|
|
36
35
|
try:
|
@@ -48,10 +47,11 @@ display = Display()
|
|
48
47
|
# explicitly set and cannot be handle (by Jinja2 w/o 'unique' or fallback version)
|
49
48
|
def unique(environment, a, case_sensitive=None, attribute=None):
|
50
49
|
|
51
|
-
def _do_fail(
|
50
|
+
def _do_fail(ex):
|
52
51
|
if case_sensitive is False or attribute:
|
53
|
-
raise
|
54
|
-
|
52
|
+
raise AnsibleError(
|
53
|
+
"Jinja2's unique filter failed and we cannot fall back to Ansible's version as it does not support the parameters supplied."
|
54
|
+
) from ex
|
55
55
|
|
56
56
|
error = e = None
|
57
57
|
try:
|
@@ -63,14 +63,14 @@ def unique(environment, a, case_sensitive=None, attribute=None):
|
|
63
63
|
except Exception as e:
|
64
64
|
error = e
|
65
65
|
_do_fail(e)
|
66
|
-
display.
|
66
|
+
display.error_as_warning('Falling back to Ansible unique filter as Jinja2 one failed.', e)
|
67
67
|
|
68
68
|
if not HAS_UNIQUE or error:
|
69
69
|
|
70
70
|
# handle Jinja2 specific attributes when using Ansible's version
|
71
71
|
if case_sensitive is False or attribute:
|
72
|
-
raise
|
73
|
-
|
72
|
+
raise AnsibleError("Ansible's unique filter does not support case_sensitive=False nor attribute parameters, "
|
73
|
+
"you need a newer version of Jinja2 that provides their version of the filter.")
|
74
74
|
|
75
75
|
c = []
|
76
76
|
for x in a:
|
@@ -123,15 +123,15 @@ def logarithm(x, base=math.e):
|
|
123
123
|
return math.log10(x)
|
124
124
|
else:
|
125
125
|
return math.log(x, base)
|
126
|
-
except TypeError as
|
127
|
-
raise
|
126
|
+
except TypeError as ex:
|
127
|
+
raise AnsibleError('log() can only be used on numbers') from ex
|
128
128
|
|
129
129
|
|
130
130
|
def power(x, y):
|
131
131
|
try:
|
132
132
|
return math.pow(x, y)
|
133
|
-
except TypeError as
|
134
|
-
raise
|
133
|
+
except TypeError as ex:
|
134
|
+
raise AnsibleError('pow() can only be used on numbers') from ex
|
135
135
|
|
136
136
|
|
137
137
|
def inversepower(x, base=2):
|
@@ -140,28 +140,28 @@ def inversepower(x, base=2):
|
|
140
140
|
return math.sqrt(x)
|
141
141
|
else:
|
142
142
|
return math.pow(x, 1.0 / float(base))
|
143
|
-
except (ValueError, TypeError) as
|
144
|
-
raise
|
143
|
+
except (ValueError, TypeError) as ex:
|
144
|
+
raise AnsibleError('root() can only be used on numbers') from ex
|
145
145
|
|
146
146
|
|
147
147
|
def human_readable(size, isbits=False, unit=None):
|
148
|
-
|
148
|
+
""" Return a human-readable string """
|
149
149
|
try:
|
150
150
|
return formatters.bytes_to_human(size, isbits, unit)
|
151
|
-
except TypeError as
|
152
|
-
raise
|
153
|
-
except Exception:
|
154
|
-
raise
|
151
|
+
except TypeError as ex:
|
152
|
+
raise AnsibleError("human_readable() failed on bad input") from ex
|
153
|
+
except Exception as ex:
|
154
|
+
raise AnsibleError("human_readable() can't interpret the input") from ex
|
155
155
|
|
156
156
|
|
157
157
|
def human_to_bytes(size, default_unit=None, isbits=False):
|
158
|
-
|
158
|
+
""" Return bytes count from a human-readable string """
|
159
159
|
try:
|
160
160
|
return formatters.human_to_bytes(size, default_unit, isbits)
|
161
|
-
except TypeError as
|
162
|
-
raise
|
163
|
-
except Exception:
|
164
|
-
raise
|
161
|
+
except TypeError as ex:
|
162
|
+
raise AnsibleError("human_to_bytes() failed on bad input") from ex
|
163
|
+
except Exception as ex:
|
164
|
+
raise AnsibleError("human_to_bytes() can't interpret the input") from ex
|
165
165
|
|
166
166
|
|
167
167
|
def rekey_on_member(data, key, duplicates='error'):
|
@@ -174,38 +174,31 @@ def rekey_on_member(data, key, duplicates='error'):
|
|
174
174
|
value would be duplicated or to overwrite previous entries if that's the case.
|
175
175
|
"""
|
176
176
|
if duplicates not in ('error', 'overwrite'):
|
177
|
-
raise
|
177
|
+
raise AnsibleError(f"duplicates parameter to rekey_on_member has unknown value {duplicates!r}")
|
178
178
|
|
179
179
|
new_obj = {}
|
180
180
|
|
181
|
-
# Ensure the positional args are defined - raise jinja2.exceptions.UndefinedError if not
|
182
|
-
bool(data) and bool(key)
|
183
|
-
|
184
181
|
if isinstance(data, Mapping):
|
185
182
|
iterate_over = data.values()
|
186
183
|
elif isinstance(data, Iterable) and not isinstance(data, (text_type, binary_type)):
|
187
184
|
iterate_over = data
|
188
185
|
else:
|
189
|
-
raise
|
186
|
+
raise AnsibleError("Type is not a valid list, set, or dict")
|
190
187
|
|
191
188
|
for item in iterate_over:
|
192
189
|
if not isinstance(item, Mapping):
|
193
|
-
raise
|
190
|
+
raise AnsibleError("List item is not a valid dict")
|
194
191
|
|
195
192
|
try:
|
196
193
|
key_elem = item[key]
|
197
194
|
except KeyError:
|
198
|
-
raise
|
199
|
-
except TypeError as e:
|
200
|
-
raise AnsibleFilterTypeError(to_native(e))
|
201
|
-
except Exception as e:
|
202
|
-
raise AnsibleFilterError(to_native(e))
|
195
|
+
raise AnsibleError(f"Key {key!r} was not found.", obj=item) from None
|
203
196
|
|
204
197
|
# Note: if new_obj[key_elem] exists it will always be a non-empty dict (it will at
|
205
198
|
# minimum contain {key: key_elem}
|
206
199
|
if new_obj.get(key_elem, None):
|
207
200
|
if duplicates == 'error':
|
208
|
-
raise
|
201
|
+
raise AnsibleError(f"Key {key_elem!r} is not unique, cannot convert to dict.")
|
209
202
|
elif duplicates == 'overwrite':
|
210
203
|
new_obj[key_elem] = item
|
211
204
|
else:
|
@@ -215,7 +208,7 @@ def rekey_on_member(data, key, duplicates='error'):
|
|
215
208
|
|
216
209
|
|
217
210
|
class FilterModule(object):
|
218
|
-
|
211
|
+
""" Ansible math jinja2 filters """
|
219
212
|
|
220
213
|
def filters(self):
|
221
214
|
filters = {
|
@@ -32,6 +32,14 @@ EXAMPLES: |
|
|
32
32
|
# pwdhash => "$6$/bQCntzQ7VrgVcFa$VaMkmevkY1dqrx8neaenUDlVU.6L/.ojRbrnI4ID.yBHU6XON1cB422scCiXfUL5wRucMdLgJU0Fn38uoeBni/"
|
33
33
|
pwdhash: "{{ 'testing' | password_hash }}"
|
34
34
|
|
35
|
+
# Using hash type
|
36
|
+
# wireguard_admin_password_hash => "$2b$12$ujYVRD9v9z87lpvLqeWNuOFDI4QzSSYHoRyYydW6XK4.kgqfwOXzO"
|
37
|
+
wireguard_admin_password_hash: "{{ 'vagrant-libvirt' | password_hash(hashtype='bcrypt') }}"
|
38
|
+
|
39
|
+
# Using salt value for idempotency
|
40
|
+
# wireguard_admin_password_hash => "$2b$12$abcdefghijklmnopqrstuuTEw8POU2MwwuYEM7WaKcjqZ948Hm7.W"
|
41
|
+
wireguard_admin_password_hash: "{{ 'vagrant-libvirt' | password_hash(hashtype='bcrypt', salt='abcdefghijklmnopqrstuv') }}"
|
42
|
+
|
35
43
|
RETURN:
|
36
44
|
_value:
|
37
45
|
description: The resulting password hash.
|
@@ -8,9 +8,6 @@ DOCUMENTATION:
|
|
8
8
|
- Maps to Python's C(re.search).
|
9
9
|
- 'The substring matched by the group is accessible via the symbolic group name or
|
10
10
|
the ``\{number}`` special sequence. See examples section.'
|
11
|
-
- The return for no match will be C(None) in most cases, depending on whether it is used with other filters/tests or not.
|
12
|
-
It also depends on the Jinja version used and whether native is enabled.
|
13
|
-
- "For a more complete explanation see U(https://docs.ansible.com/ansible-core/devel/reference_appendices/faq.html#why-does-the-regex-search-filter-return-none-instead-of-an-empty-string)."
|
14
11
|
positional: _input, _regex
|
15
12
|
options:
|
16
13
|
_input:
|
@@ -55,5 +52,5 @@ EXAMPLES: |
|
|
55
52
|
|
56
53
|
RETURN:
|
57
54
|
_value:
|
58
|
-
description: Matched string or
|
55
|
+
description: Matched string or C(None) if no match.
|
59
56
|
type: str
|
ansible/plugins/filter/split.yml
CHANGED
@@ -20,10 +20,6 @@ DOCUMENTATION:
|
|
20
20
|
description: Affects sorting of dictionary keys.
|
21
21
|
default: True
|
22
22
|
type: bool
|
23
|
-
#allow_unicode:
|
24
|
-
# description:
|
25
|
-
# type: bool
|
26
|
-
# default: true
|
27
23
|
#default_style=None, canonical=None, width=None, line_break=None, encoding=None, explicit_start=None, explicit_end=None, version=None, tags=None
|
28
24
|
notes:
|
29
25
|
- More options may be available, see L(PyYAML documentation, https://pyyaml.org/wiki/PyYAMLDocumentation) for details.
|
@@ -24,10 +24,6 @@ DOCUMENTATION:
|
|
24
24
|
- More options may be available, see L(PyYAML documentation, https://pyyaml.org/wiki/PyYAMLDocumentation) for details.
|
25
25
|
|
26
26
|
# TODO: find docs for these
|
27
|
-
#allow_unicode:
|
28
|
-
# description:
|
29
|
-
# type: bool
|
30
|
-
# default: true
|
31
27
|
#default_flow_style
|
32
28
|
#default_style
|
33
29
|
#canonical=None,
|
ansible/plugins/filter/urls.py
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
|
5
5
|
from __future__ import annotations
|
6
6
|
|
7
|
-
DOCUMENTATION = r
|
7
|
+
DOCUMENTATION = r"""
|
8
8
|
name: urlsplit
|
9
9
|
version_added: "2.4"
|
10
10
|
short_description: get components from URL
|
@@ -20,9 +20,9 @@ DOCUMENTATION = r'''
|
|
20
20
|
description: Specify a single component to return.
|
21
21
|
type: str
|
22
22
|
choices: ["fragment", "hostname", "netloc", "password", "path", "port", "query", "scheme", "username"]
|
23
|
-
|
23
|
+
"""
|
24
24
|
|
25
|
-
EXAMPLES = r
|
25
|
+
EXAMPLES = r"""
|
26
26
|
|
27
27
|
parts: '{{ "http://user:password@www.acme.com:9000/dir/index.html?query=term#fragment" | urlsplit }}'
|
28
28
|
# =>
|
@@ -46,19 +46,18 @@ EXAMPLES = r'''
|
|
46
46
|
|
47
47
|
path: '{{ "http://user:password@www.acme.com:9000/dir/index.html?query=term#fragment" | urlsplit("path") }}'
|
48
48
|
# => '/dir/index.html'
|
49
|
-
|
49
|
+
"""
|
50
50
|
|
51
|
-
RETURN = r
|
51
|
+
RETURN = r"""
|
52
52
|
_value:
|
53
53
|
description:
|
54
54
|
- A dictionary with components as keyword and their value.
|
55
55
|
- If O(query) is provided, a string or integer will be returned instead, depending on O(query).
|
56
56
|
type: any
|
57
|
-
|
57
|
+
"""
|
58
58
|
|
59
59
|
from urllib.parse import urlsplit
|
60
60
|
|
61
|
-
from ansible.errors import AnsibleFilterError
|
62
61
|
from ansible.utils import helpers
|
63
62
|
|
64
63
|
|
@@ -70,7 +69,7 @@ def split_url(value, query='', alias='urlsplit'):
|
|
70
69
|
# If no option is supplied, return the entire dictionary.
|
71
70
|
if query:
|
72
71
|
if query not in results:
|
73
|
-
raise
|
72
|
+
raise ValueError(alias + ': unknown URL component: %s' % query)
|
74
73
|
return results[query]
|
75
74
|
else:
|
76
75
|
return results
|
@@ -78,7 +77,7 @@ def split_url(value, query='', alias='urlsplit'):
|
|
78
77
|
|
79
78
|
# ---- Ansible filters ----
|
80
79
|
class FilterModule(object):
|
81
|
-
|
80
|
+
""" URI filter """
|
82
81
|
|
83
82
|
def filters(self):
|
84
83
|
return {
|
ansible/plugins/filter/vault.yml
CHANGED
@@ -26,23 +26,28 @@ DOCUMENTATION:
|
|
26
26
|
default: 'filter_default'
|
27
27
|
wrap_object:
|
28
28
|
description:
|
29
|
-
- This toggle can force the return of
|
29
|
+
- This toggle can force the return of a C(VaultedValue)-tagged string object, when V(False), you get a simple string.
|
30
30
|
- Mostly useful when combining with the C(to_yaml) filter to output the 'inline vault' format.
|
31
31
|
type: bool
|
32
32
|
default: False
|
33
33
|
|
34
34
|
EXAMPLES: |
|
35
|
-
#
|
35
|
+
# Encrypt a value using the vault filter
|
36
36
|
vars:
|
37
|
-
myvaultedkey: "{{
|
37
|
+
myvaultedkey: "{{ 'my_secret_key' | vault('my_vault_password') }}"
|
38
38
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
39
|
+
# Encrypt a value and save it to a file using the template module
|
40
|
+
vars:
|
41
|
+
template_data: "{{ 'my_sensitive_data' | vault('another_vault_password', salt=(2**256 | random(seed=inventory_hostname))) }}"
|
42
|
+
|
43
|
+
# The content of dump_template_data.j2 looks like
|
44
|
+
# Encrypted secret: {{ template_data }}
|
45
|
+
- name: Save vaulted data
|
46
|
+
template:
|
47
|
+
src: dump_template_data.j2
|
48
|
+
dest: /some/key/vault.txt
|
44
49
|
|
45
50
|
RETURN:
|
46
51
|
_value:
|
47
|
-
description: The vault string that contains the secret data (or C(
|
52
|
+
description: The vault string that contains the secret data (or C(VaultedValue)-tagged string object).
|
48
53
|
type: string
|
@@ -5,6 +5,7 @@ DOCUMENTATION:
|
|
5
5
|
short_description: Get a Windows path's base name
|
6
6
|
description:
|
7
7
|
- Returns the last name component of a Windows path, what is left in the string that is not 'win_dirname'.
|
8
|
+
- While specifying an UNC (Universal Naming Convention) path, please make sure the path conforms to the UNC path syntax.
|
8
9
|
options:
|
9
10
|
_input:
|
10
11
|
description: A Windows path.
|
@@ -16,7 +17,11 @@ DOCUMENTATION:
|
|
16
17
|
EXAMPLES: |
|
17
18
|
|
18
19
|
# To get the last name of a file Windows path, like 'foo.txt' out of 'C:\Users\asdf\foo.txt'
|
19
|
-
{{ mypath | win_basename }}
|
20
|
+
filename: "{{ mypath | win_basename }}"
|
21
|
+
|
22
|
+
# Get basename from the UNC path in the form of '\\<SERVER_NAME>\<SHARE_NAME>\<FILENAME.FILE_EXTENSION>'
|
23
|
+
# like '\\server1\test\foo.txt' returns 'foo.txt'
|
24
|
+
filename: "{{ mypath | win_basename }}"
|
20
25
|
|
21
26
|
RETURN:
|
22
27
|
_value:
|
@@ -5,6 +5,7 @@ DOCUMENTATION:
|
|
5
5
|
short_description: Get a Windows path's directory
|
6
6
|
description:
|
7
7
|
- Returns the directory component of a Windows path, what is left in the string that is not 'win_basename'.
|
8
|
+
- While specifying an UNC (Universal Naming Convention) path, please make sure the path conforms to the UNC path syntax.
|
8
9
|
options:
|
9
10
|
_input:
|
10
11
|
description: A Windows path.
|
@@ -18,6 +19,10 @@ EXAMPLES: |
|
|
18
19
|
# To get the last name of a file Windows path, like 'C:\users\asdf' out of 'C:\Users\asdf\foo.txt'
|
19
20
|
{{ mypath | win_dirname }}
|
20
21
|
|
22
|
+
# Get dirname from the UNC path in the form of '\\<SERVER_NAME>\<SHARE_NAME>\<FILENAME.FILE_EXTENSION>'
|
23
|
+
# like '\\server1\test\foo.txt' returns '\\\\server1\\test\\'
|
24
|
+
filename: "{{ mypath | win_dirname }}"
|
25
|
+
|
21
26
|
RETURN:
|
22
27
|
_value:
|
23
28
|
description: The directory from the Windows path provided.
|