ansible-core 2.18.5rc1__py3-none-any.whl → 2.19.0b2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ansible/_internal/__init__.py +53 -0
- ansible/_internal/_ansiballz.py +265 -0
- ansible/_internal/_collection_proxy.py +47 -0
- ansible/_internal/_datatag/__init__.py +0 -0
- ansible/_internal/_datatag/_tags.py +130 -0
- ansible/_internal/_datatag/_utils.py +19 -0
- ansible/_internal/_datatag/_wrappers.py +33 -0
- ansible/_internal/_errors/__init__.py +0 -0
- ansible/_internal/_errors/_captured.py +128 -0
- ansible/_internal/_errors/_handler.py +91 -0
- ansible/_internal/_errors/_utils.py +310 -0
- ansible/_internal/_json/__init__.py +203 -0
- ansible/_internal/_json/_legacy_encoder.py +34 -0
- ansible/_internal/_json/_profiles/__init__.py +0 -0
- ansible/_internal/_json/_profiles/_cache_persistence.py +55 -0
- ansible/_internal/_json/_profiles/_inventory_legacy.py +40 -0
- ansible/_internal/_json/_profiles/_legacy.py +197 -0
- ansible/_internal/_locking.py +21 -0
- ansible/_internal/_plugins/__init__.py +0 -0
- ansible/_internal/_plugins/_cache.py +57 -0
- ansible/_internal/_task.py +78 -0
- ansible/_internal/_templating/__init__.py +10 -0
- ansible/_internal/_templating/_access.py +86 -0
- ansible/_internal/_templating/_chain_templar.py +63 -0
- ansible/_internal/_templating/_datatag.py +95 -0
- ansible/_internal/_templating/_engine.py +588 -0
- ansible/_internal/_templating/_errors.py +28 -0
- ansible/_internal/_templating/_jinja_bits.py +1066 -0
- ansible/_internal/_templating/_jinja_common.py +332 -0
- ansible/_internal/_templating/_jinja_patches.py +44 -0
- ansible/_internal/_templating/_jinja_plugins.py +345 -0
- ansible/_internal/_templating/_lazy_containers.py +633 -0
- ansible/_internal/_templating/_marker_behaviors.py +103 -0
- ansible/_internal/_templating/_transform.py +63 -0
- ansible/_internal/_templating/_utils.py +107 -0
- ansible/_internal/_wrapt.py +1052 -0
- ansible/_internal/_yaml/__init__.py +0 -0
- ansible/_internal/_yaml/_constructor.py +240 -0
- ansible/_internal/_yaml/_dumper.py +62 -0
- ansible/_internal/_yaml/_errors.py +166 -0
- ansible/_internal/_yaml/_loader.py +66 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/README.md +11 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/action/debug.py +36 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/apply_trust.py +19 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/dump_object.py +18 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/finalize.py +16 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/origin.py +18 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.py +24 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.yml +33 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/tag_names.py +16 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/true_type.py +17 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/unmask.py +49 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.py +21 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.yml +2 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.py +15 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.yml +19 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.py +18 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.yml +19 -0
- ansible/cli/__init__.py +159 -89
- ansible/cli/_ssh_askpass.py +47 -0
- ansible/cli/adhoc.py +14 -7
- ansible/cli/arguments/option_helpers.py +154 -7
- ansible/cli/config.py +43 -68
- ansible/cli/console.py +10 -8
- ansible/cli/doc.py +62 -53
- ansible/cli/galaxy.py +27 -20
- ansible/cli/inventory.py +28 -26
- ansible/cli/playbook.py +4 -12
- ansible/cli/pull.py +51 -11
- ansible/cli/scripts/ansible_connection_cli_stub.py +7 -7
- ansible/cli/vault.py +12 -11
- ansible/compat/__init__.py +2 -2
- ansible/config/base.yml +166 -112
- ansible/config/manager.py +52 -49
- ansible/constants.py +3 -4
- ansible/errors/__init__.py +277 -235
- ansible/executor/interpreter_discovery.py +28 -149
- ansible/executor/module_common.py +426 -493
- ansible/executor/play_iterator.py +22 -27
- ansible/executor/playbook_executor.py +11 -11
- ansible/executor/powershell/async_watchdog.ps1 +97 -102
- ansible/executor/powershell/async_wrapper.ps1 +202 -151
- ansible/executor/powershell/become_wrapper.ps1 +89 -144
- ansible/executor/powershell/bootstrap_wrapper.ps1 +24 -9
- ansible/executor/powershell/coverage_wrapper.ps1 +82 -135
- ansible/executor/powershell/exec_wrapper.ps1 +462 -196
- ansible/executor/powershell/module_manifest.py +417 -265
- ansible/executor/powershell/module_wrapper.ps1 +169 -186
- ansible/executor/powershell/psrp_fetch_file.ps1 +41 -0
- ansible/executor/powershell/psrp_put_file.ps1 +122 -0
- ansible/executor/powershell/winrm_fetch_file.ps1 +46 -0
- ansible/executor/powershell/winrm_put_file.ps1 +36 -0
- ansible/executor/process/worker.py +161 -96
- ansible/executor/stats.py +5 -5
- ansible/executor/task_executor.py +268 -258
- ansible/executor/task_queue_manager.py +124 -90
- ansible/executor/task_result.py +183 -78
- ansible/galaxy/__init__.py +2 -2
- ansible/galaxy/api.py +22 -18
- ansible/galaxy/collection/__init__.py +1 -1
- ansible/galaxy/collection/concrete_artifact_manager.py +8 -11
- ansible/galaxy/dependency_resolution/dataclasses.py +14 -4
- ansible/galaxy/dependency_resolution/providers.py +1 -1
- ansible/galaxy/dependency_resolution/reporters.py +81 -0
- ansible/galaxy/role.py +4 -8
- ansible/galaxy/token.py +28 -21
- ansible/inventory/data.py +47 -57
- ansible/inventory/group.py +44 -72
- ansible/inventory/helpers.py +9 -0
- ansible/inventory/host.py +32 -54
- ansible/inventory/manager.py +78 -34
- ansible/keyword_desc.yml +1 -1
- ansible/module_utils/_internal/__init__.py +55 -0
- ansible/module_utils/_internal/_ambient_context.py +58 -0
- ansible/module_utils/_internal/_ansiballz.py +133 -0
- ansible/module_utils/_internal/_concurrent/_daemon_threading.py +1 -0
- ansible/module_utils/_internal/_dataclass_annotation_patch.py +64 -0
- ansible/module_utils/_internal/_dataclass_validation.py +217 -0
- ansible/module_utils/_internal/_datatag/__init__.py +928 -0
- ansible/module_utils/_internal/_datatag/_tags.py +38 -0
- ansible/module_utils/_internal/_debugging.py +31 -0
- ansible/module_utils/_internal/_errors.py +30 -0
- ansible/module_utils/_internal/_json/__init__.py +63 -0
- ansible/module_utils/_internal/_json/_legacy_encoder.py +26 -0
- ansible/module_utils/_internal/_json/_profiles/__init__.py +410 -0
- ansible/module_utils/_internal/_json/_profiles/_fallback_to_str.py +73 -0
- ansible/module_utils/_internal/_json/_profiles/_module_legacy_c2m.py +31 -0
- ansible/module_utils/_internal/_json/_profiles/_module_legacy_m2c.py +35 -0
- ansible/module_utils/_internal/_json/_profiles/_module_modern_c2m.py +35 -0
- ansible/module_utils/_internal/_json/_profiles/_module_modern_m2c.py +33 -0
- ansible/module_utils/_internal/_json/_profiles/_tagless.py +50 -0
- ansible/module_utils/_internal/_patches/__init__.py +66 -0
- ansible/module_utils/_internal/_patches/_dataclass_annotation_patch.py +55 -0
- ansible/module_utils/_internal/_patches/_socket_patch.py +34 -0
- ansible/module_utils/_internal/_patches/_sys_intern_patch.py +34 -0
- ansible/module_utils/_internal/_plugin_exec_context.py +49 -0
- ansible/module_utils/_internal/_testing.py +0 -0
- ansible/module_utils/_internal/_traceback.py +89 -0
- ansible/module_utils/ansible_release.py +2 -2
- ansible/module_utils/api.py +1 -2
- ansible/module_utils/basic.py +152 -120
- ansible/module_utils/common/_utils.py +24 -28
- ansible/module_utils/common/collections.py +1 -2
- ansible/module_utils/common/dict_transformations.py +2 -2
- ansible/module_utils/common/file.py +2 -2
- ansible/module_utils/common/json.py +90 -84
- ansible/module_utils/common/locale.py +2 -2
- ansible/module_utils/common/messages.py +108 -0
- ansible/module_utils/common/parameters.py +27 -24
- ansible/module_utils/common/process.py +2 -2
- ansible/module_utils/common/respawn.py +41 -19
- ansible/module_utils/common/sentinel.py +66 -0
- ansible/module_utils/common/sys_info.py +8 -8
- ansible/module_utils/common/text/converters.py +16 -37
- ansible/module_utils/common/validation.py +35 -24
- ansible/module_utils/common/warnings.py +86 -25
- ansible/module_utils/common/yaml.py +29 -3
- ansible/module_utils/compat/datetime.py +33 -21
- ansible/module_utils/compat/paramiko.py +21 -10
- ansible/module_utils/compat/typing.py +6 -5
- ansible/module_utils/connection.py +2 -2
- ansible/module_utils/csharp/Ansible.Basic.cs +14 -11
- ansible/module_utils/csharp/Ansible.Become.cs +1 -0
- ansible/module_utils/csharp/Ansible._Async.cs +517 -0
- ansible/module_utils/datatag.py +46 -0
- ansible/module_utils/distro/__init__.py +2 -2
- ansible/module_utils/facts/ansible_collector.py +4 -5
- ansible/module_utils/facts/collector.py +13 -14
- ansible/module_utils/facts/compat.py +4 -4
- ansible/module_utils/facts/default_collectors.py +1 -1
- ansible/module_utils/facts/hardware/aix.py +34 -0
- ansible/module_utils/facts/hardware/base.py +1 -1
- ansible/module_utils/facts/hardware/darwin.py +1 -3
- ansible/module_utils/facts/hardware/freebsd.py +2 -2
- ansible/module_utils/facts/hardware/linux.py +4 -4
- ansible/module_utils/facts/namespace.py +1 -1
- ansible/module_utils/facts/network/base.py +1 -1
- ansible/module_utils/facts/network/fc_wwn.py +1 -2
- ansible/module_utils/facts/network/iscsi.py +1 -2
- ansible/module_utils/facts/network/nvme.py +1 -2
- ansible/module_utils/facts/other/facter.py +1 -2
- ansible/module_utils/facts/other/ohai.py +2 -3
- ansible/module_utils/facts/system/apparmor.py +1 -2
- ansible/module_utils/facts/system/caps.py +1 -1
- ansible/module_utils/facts/system/chroot.py +1 -2
- ansible/module_utils/facts/system/cmdline.py +1 -2
- ansible/module_utils/facts/system/date_time.py +5 -3
- ansible/module_utils/facts/system/distribution.py +9 -8
- ansible/module_utils/facts/system/dns.py +1 -1
- ansible/module_utils/facts/system/env.py +1 -2
- ansible/module_utils/facts/system/fips.py +7 -20
- ansible/module_utils/facts/system/loadavg.py +1 -2
- ansible/module_utils/facts/system/local.py +1 -2
- ansible/module_utils/facts/system/lsb.py +1 -2
- ansible/module_utils/facts/system/pkg_mgr.py +1 -2
- ansible/module_utils/facts/system/platform.py +1 -2
- ansible/module_utils/facts/system/python.py +1 -2
- ansible/module_utils/facts/system/selinux.py +1 -1
- ansible/module_utils/facts/system/service_mgr.py +1 -2
- ansible/module_utils/facts/system/ssh_pub_keys.py +1 -1
- ansible/module_utils/facts/system/systemd.py +1 -1
- ansible/module_utils/facts/system/user.py +1 -2
- ansible/module_utils/facts/utils.py +3 -3
- ansible/module_utils/facts/virtual/base.py +1 -1
- ansible/module_utils/facts/virtual/sunos.py +3 -15
- ansible/module_utils/facts/virtual/sysctl.py +3 -16
- ansible/module_utils/json_utils.py +2 -2
- ansible/module_utils/parsing/convert_bool.py +1 -1
- ansible/module_utils/service.py +18 -21
- ansible/module_utils/splitter.py +7 -7
- ansible/module_utils/testing.py +31 -0
- ansible/module_utils/urls.py +60 -31
- ansible/modules/add_host.py +4 -4
- ansible/modules/apt.py +60 -46
- ansible/modules/apt_key.py +19 -12
- ansible/modules/apt_repository.py +19 -16
- ansible/modules/assemble.py +6 -6
- ansible/modules/assert.py +4 -4
- ansible/modules/async_status.py +10 -12
- ansible/modules/async_wrapper.py +8 -3
- ansible/modules/blockinfile.py +6 -7
- ansible/modules/command.py +10 -17
- ansible/modules/copy.py +57 -144
- ansible/modules/cron.py +20 -15
- ansible/modules/deb822_repository.py +8 -9
- ansible/modules/debconf.py +5 -5
- ansible/modules/debug.py +4 -4
- ansible/modules/dnf.py +8 -8
- ansible/modules/dnf5.py +39 -13
- ansible/modules/dpkg_selections.py +4 -4
- ansible/modules/expect.py +8 -10
- ansible/modules/fail.py +4 -4
- ansible/modules/fetch.py +4 -4
- ansible/modules/file.py +174 -133
- ansible/modules/find.py +19 -17
- ansible/modules/gather_facts.py +3 -3
- ansible/modules/get_url.py +59 -53
- ansible/modules/getent.py +7 -9
- ansible/modules/git.py +28 -25
- ansible/modules/group.py +6 -6
- ansible/modules/group_by.py +4 -4
- ansible/modules/hostname.py +13 -29
- ansible/modules/import_playbook.py +6 -6
- ansible/modules/import_role.py +6 -6
- ansible/modules/import_tasks.py +6 -6
- ansible/modules/include_role.py +6 -6
- ansible/modules/include_tasks.py +6 -6
- ansible/modules/include_vars.py +6 -6
- ansible/modules/iptables.py +86 -73
- ansible/modules/known_hosts.py +10 -10
- ansible/modules/lineinfile.py +5 -5
- ansible/modules/meta.py +4 -4
- ansible/modules/mount_facts.py +2 -2
- ansible/modules/package.py +4 -4
- ansible/modules/package_facts.py +22 -10
- ansible/modules/pause.py +6 -6
- ansible/modules/ping.py +6 -6
- ansible/modules/pip.py +10 -11
- ansible/modules/raw.py +4 -4
- ansible/modules/reboot.py +6 -6
- ansible/modules/replace.py +9 -13
- ansible/modules/rpm_key.py +7 -8
- ansible/modules/script.py +4 -4
- ansible/modules/service.py +7 -8
- ansible/modules/service_facts.py +87 -10
- ansible/modules/set_fact.py +5 -5
- ansible/modules/set_stats.py +4 -4
- ansible/modules/setup.py +2 -2
- ansible/modules/shell.py +6 -6
- ansible/modules/slurp.py +6 -6
- ansible/modules/stat.py +9 -23
- ansible/modules/subversion.py +15 -15
- ansible/modules/systemd.py +6 -6
- ansible/modules/systemd_service.py +6 -6
- ansible/modules/sysvinit.py +6 -6
- ansible/modules/tempfile.py +5 -6
- ansible/modules/template.py +6 -6
- ansible/modules/unarchive.py +32 -11
- ansible/modules/uri.py +33 -26
- ansible/modules/user.py +53 -34
- ansible/modules/validate_argument_spec.py +10 -7
- ansible/modules/wait_for.py +32 -27
- ansible/modules/wait_for_connection.py +6 -6
- ansible/modules/yum_repository.py +6 -6
- ansible/parsing/ajson.py +14 -32
- ansible/parsing/dataloader.py +99 -54
- ansible/parsing/mod_args.py +28 -44
- ansible/parsing/plugin_docs.py +21 -86
- ansible/parsing/quoting.py +1 -1
- ansible/parsing/splitter.py +27 -12
- ansible/parsing/utils/addresses.py +24 -24
- ansible/parsing/utils/jsonify.py +5 -1
- ansible/parsing/utils/yaml.py +32 -61
- ansible/parsing/vault/__init__.py +319 -87
- ansible/parsing/yaml/__init__.py +0 -18
- ansible/parsing/yaml/dumper.py +6 -120
- ansible/parsing/yaml/loader.py +6 -39
- ansible/parsing/yaml/objects.py +43 -335
- ansible/playbook/__init__.py +1 -1
- ansible/playbook/attribute.py +8 -3
- ansible/playbook/base.py +182 -132
- ansible/playbook/block.py +26 -24
- ansible/playbook/collectionsearch.py +1 -15
- ansible/playbook/conditional.py +3 -77
- ansible/playbook/handler.py +8 -2
- ansible/playbook/helpers.py +41 -53
- ansible/playbook/included_file.py +31 -27
- ansible/playbook/loop_control.py +2 -2
- ansible/playbook/play.py +85 -44
- ansible/playbook/play_context.py +12 -17
- ansible/playbook/playbook_include.py +14 -15
- ansible/playbook/role/__init__.py +24 -26
- ansible/playbook/role/definition.py +15 -17
- ansible/playbook/role/include.py +2 -4
- ansible/playbook/role/metadata.py +10 -11
- ansible/playbook/role_include.py +3 -3
- ansible/playbook/taggable.py +13 -8
- ansible/playbook/task.py +188 -118
- ansible/playbook/task_include.py +5 -5
- ansible/plugins/__init__.py +68 -21
- ansible/plugins/action/__init__.py +209 -176
- ansible/plugins/action/add_host.py +1 -1
- ansible/plugins/action/assemble.py +1 -1
- ansible/plugins/action/assert.py +54 -66
- ansible/plugins/action/copy.py +7 -11
- ansible/plugins/action/debug.py +37 -31
- ansible/plugins/action/dnf.py +3 -4
- ansible/plugins/action/fail.py +1 -1
- ansible/plugins/action/fetch.py +4 -5
- ansible/plugins/action/gather_facts.py +7 -6
- ansible/plugins/action/group_by.py +1 -1
- ansible/plugins/action/include_vars.py +10 -11
- ansible/plugins/action/package.py +3 -6
- ansible/plugins/action/pause.py +2 -2
- ansible/plugins/action/script.py +15 -8
- ansible/plugins/action/service.py +6 -11
- ansible/plugins/action/set_fact.py +3 -12
- ansible/plugins/action/set_stats.py +3 -8
- ansible/plugins/action/template.py +35 -59
- ansible/plugins/action/unarchive.py +1 -1
- ansible/plugins/action/validate_argument_spec.py +5 -5
- ansible/plugins/action/wait_for_connection.py +1 -1
- ansible/plugins/become/__init__.py +31 -8
- ansible/plugins/become/runas.py +71 -0
- ansible/plugins/become/su.py +13 -8
- ansible/plugins/become/sudo.py +19 -0
- ansible/plugins/cache/__init__.py +35 -44
- ansible/plugins/cache/base.py +8 -0
- ansible/plugins/cache/jsonfile.py +10 -16
- ansible/plugins/cache/memory.py +6 -12
- ansible/plugins/callback/__init__.py +284 -179
- ansible/plugins/callback/default.py +99 -92
- ansible/plugins/callback/junit.py +44 -39
- ansible/plugins/callback/minimal.py +28 -25
- ansible/plugins/callback/oneline.py +28 -21
- ansible/plugins/callback/tree.py +16 -11
- ansible/plugins/connection/__init__.py +47 -34
- ansible/plugins/connection/local.py +150 -54
- ansible/plugins/connection/paramiko_ssh.py +21 -18
- ansible/plugins/connection/psrp.py +76 -165
- ansible/plugins/connection/ssh.py +301 -78
- ansible/plugins/connection/winrm.py +58 -140
- ansible/plugins/doc_fragments/action_common_attributes.py +14 -14
- ansible/plugins/doc_fragments/action_core.py +6 -6
- ansible/plugins/doc_fragments/backup.py +2 -2
- ansible/plugins/doc_fragments/checksum_common.py +27 -0
- ansible/plugins/doc_fragments/constructed.py +6 -2
- ansible/plugins/doc_fragments/decrypt.py +2 -2
- ansible/plugins/doc_fragments/default_callback.py +2 -2
- ansible/plugins/doc_fragments/files.py +2 -2
- ansible/plugins/doc_fragments/inventory_cache.py +2 -2
- ansible/plugins/doc_fragments/result_format_callback.py +2 -2
- ansible/plugins/doc_fragments/return_common.py +2 -2
- ansible/plugins/doc_fragments/template_common.py +4 -4
- ansible/plugins/doc_fragments/url.py +17 -1
- ansible/plugins/doc_fragments/url_windows.py +2 -2
- ansible/plugins/doc_fragments/validate.py +2 -2
- ansible/plugins/doc_fragments/vars_plugin_staging.py +2 -2
- ansible/plugins/filter/__init__.py +6 -2
- ansible/plugins/filter/b64decode.yml +22 -0
- ansible/plugins/filter/b64encode.yml +22 -0
- ansible/plugins/filter/bool.yml +11 -4
- ansible/plugins/filter/core.py +225 -108
- ansible/plugins/filter/encryption.py +32 -32
- ansible/plugins/filter/flatten.yml +3 -2
- ansible/plugins/filter/human_to_bytes.yml +1 -1
- ansible/plugins/filter/mathstuff.py +30 -37
- ansible/plugins/filter/password_hash.yml +8 -0
- ansible/plugins/filter/regex_search.yml +1 -4
- ansible/plugins/filter/split.yml +1 -1
- ansible/plugins/filter/to_nice_yaml.yml +0 -4
- ansible/plugins/filter/to_yaml.yml +0 -4
- ansible/plugins/filter/unvault.yml +1 -1
- ansible/plugins/filter/urls.py +1 -1
- ansible/plugins/filter/urlsplit.py +8 -9
- ansible/plugins/filter/vault.yml +14 -9
- ansible/plugins/filter/win_basename.yml +6 -1
- ansible/plugins/filter/win_dirname.yml +5 -0
- ansible/plugins/inventory/__init__.py +97 -77
- ansible/plugins/inventory/advanced_host_list.py +7 -5
- ansible/plugins/inventory/auto.py +11 -4
- ansible/plugins/inventory/constructed.py +21 -24
- ansible/plugins/inventory/generator.py +16 -11
- ansible/plugins/inventory/host_list.py +7 -5
- ansible/plugins/inventory/ini.py +78 -44
- ansible/plugins/inventory/script.py +189 -119
- ansible/plugins/inventory/toml.py +16 -126
- ansible/plugins/inventory/yaml.py +10 -8
- ansible/plugins/list.py +3 -3
- ansible/plugins/loader.py +197 -82
- ansible/plugins/lookup/__init__.py +21 -4
- ansible/plugins/lookup/config.py +21 -35
- ansible/plugins/lookup/csvfile.py +3 -2
- ansible/plugins/lookup/dict.py +1 -6
- ansible/plugins/lookup/env.py +12 -9
- ansible/plugins/lookup/file.py +5 -8
- ansible/plugins/lookup/first_found.py +86 -55
- ansible/plugins/lookup/indexed_items.py +1 -10
- ansible/plugins/lookup/ini.py +14 -13
- ansible/plugins/lookup/items.py +1 -1
- ansible/plugins/lookup/lines.py +8 -1
- ansible/plugins/lookup/list.py +1 -1
- ansible/plugins/lookup/nested.py +2 -18
- ansible/plugins/lookup/password.py +5 -5
- ansible/plugins/lookup/pipe.py +5 -7
- ansible/plugins/lookup/sequence.py +18 -8
- ansible/plugins/lookup/subelements.py +1 -4
- ansible/plugins/lookup/template.py +42 -36
- ansible/plugins/lookup/together.py +0 -12
- ansible/plugins/lookup/unvault.py +1 -5
- ansible/plugins/lookup/url.py +2 -8
- ansible/plugins/lookup/vars.py +16 -24
- ansible/plugins/shell/__init__.py +2 -2
- ansible/plugins/shell/cmd.py +2 -2
- ansible/plugins/shell/powershell.py +39 -22
- ansible/plugins/shell/sh.py +3 -2
- ansible/plugins/strategy/__init__.py +159 -184
- ansible/plugins/strategy/debug.py +2 -2
- ansible/plugins/strategy/free.py +16 -31
- ansible/plugins/strategy/host_pinned.py +2 -2
- ansible/plugins/strategy/linear.py +41 -41
- ansible/plugins/terminal/__init__.py +4 -4
- ansible/plugins/test/__init__.py +7 -2
- ansible/plugins/test/core.py +55 -21
- ansible/plugins/test/files.py +1 -1
- ansible/plugins/test/mathstuff.py +3 -3
- ansible/plugins/test/uri.py +3 -3
- ansible/plugins/vars/host_group_vars.py +7 -14
- ansible/release.py +2 -2
- ansible/template/__init__.py +370 -944
- ansible/utils/__init__.py +0 -18
- ansible/utils/_ssh_agent.py +657 -0
- ansible/utils/collection_loader/__init__.py +52 -5
- ansible/utils/collection_loader/_collection_config.py +5 -6
- ansible/utils/collection_loader/_collection_finder.py +79 -93
- ansible/utils/collection_loader/_collection_meta.py +13 -8
- ansible/utils/display.py +433 -63
- ansible/utils/encrypt.py +27 -19
- ansible/utils/fqcn.py +2 -2
- ansible/utils/hashing.py +2 -2
- ansible/utils/helpers.py +2 -2
- ansible/utils/listify.py +8 -8
- ansible/utils/lock.py +2 -2
- ansible/utils/path.py +4 -4
- ansible/utils/plugin_docs.py +14 -13
- ansible/utils/sentinel.py +4 -62
- ansible/utils/singleton.py +2 -0
- ansible/utils/ssh_functions.py +1 -1
- ansible/utils/unsafe_proxy.py +23 -332
- ansible/utils/vars.py +51 -8
- ansible/utils/version.py +2 -2
- ansible/vars/clean.py +5 -5
- ansible/vars/hostvars.py +60 -90
- ansible/vars/manager.py +206 -282
- ansible/vars/reserved.py +8 -9
- ansible_core-2.19.0b2.dist-info/BSD-3-Clause.txt +28 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/METADATA +5 -4
- ansible_core-2.19.0b2.dist-info/RECORD +1072 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/WHEEL +1 -1
- ansible_test/_data/completion/docker.txt +7 -7
- ansible_test/_data/completion/remote.txt +6 -6
- ansible_test/_data/completion/windows.txt +1 -0
- ansible_test/_data/requirements/ansible.txt +2 -2
- ansible_test/_data/requirements/sanity.ansible-doc.txt +3 -3
- ansible_test/_data/requirements/sanity.changelog.txt +1 -1
- ansible_test/_data/requirements/sanity.import.plugin.txt +2 -2
- ansible_test/_data/requirements/sanity.pylint.txt +4 -4
- ansible_test/_data/requirements/sanity.validate-modules.txt +2 -2
- ansible_test/_data/requirements/sanity.yamllint.txt +1 -1
- ansible_test/_data/requirements/units.txt +1 -0
- ansible_test/_internal/__init__.py +1 -0
- ansible_test/_internal/ansible_util.py +2 -0
- ansible_test/_internal/become.py +1 -0
- ansible_test/_internal/bootstrap.py +1 -0
- ansible_test/_internal/cache.py +1 -0
- ansible_test/_internal/cgroup.py +1 -0
- ansible_test/_internal/ci/__init__.py +1 -0
- ansible_test/_internal/ci/azp.py +1 -0
- ansible_test/_internal/ci/local.py +1 -0
- ansible_test/_internal/classification/__init__.py +1 -0
- ansible_test/_internal/classification/common.py +1 -0
- ansible_test/_internal/classification/csharp.py +1 -0
- ansible_test/_internal/classification/powershell.py +1 -0
- ansible_test/_internal/classification/python.py +1 -0
- ansible_test/_internal/cli/__init__.py +1 -0
- ansible_test/_internal/cli/actions.py +1 -0
- ansible_test/_internal/cli/argparsing/__init__.py +1 -0
- ansible_test/_internal/cli/argparsing/actions.py +1 -0
- ansible_test/_internal/cli/argparsing/argcompletion.py +1 -0
- ansible_test/_internal/cli/argparsing/parsers.py +1 -0
- ansible_test/_internal/cli/commands/__init__.py +11 -0
- ansible_test/_internal/cli/commands/coverage/__init__.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/__init__.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/__init__.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/combine.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/expand.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/filter.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/generate.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/missing.py +1 -0
- ansible_test/_internal/cli/commands/coverage/combine.py +1 -0
- ansible_test/_internal/cli/commands/coverage/erase.py +1 -0
- ansible_test/_internal/cli/commands/coverage/html.py +1 -0
- ansible_test/_internal/cli/commands/coverage/report.py +1 -0
- ansible_test/_internal/cli/commands/coverage/xml.py +1 -0
- ansible_test/_internal/cli/commands/env.py +1 -0
- ansible_test/_internal/cli/commands/integration/__init__.py +1 -0
- ansible_test/_internal/cli/commands/integration/network.py +1 -0
- ansible_test/_internal/cli/commands/integration/posix.py +1 -0
- ansible_test/_internal/cli/commands/integration/windows.py +1 -0
- ansible_test/_internal/cli/commands/sanity.py +9 -0
- ansible_test/_internal/cli/commands/shell.py +1 -0
- ansible_test/_internal/cli/commands/units.py +1 -0
- ansible_test/_internal/cli/compat.py +1 -0
- ansible_test/_internal/cli/completers.py +1 -0
- ansible_test/_internal/cli/converters.py +1 -0
- ansible_test/_internal/cli/environments.py +1 -0
- ansible_test/_internal/cli/epilog.py +1 -0
- ansible_test/_internal/cli/parsers/__init__.py +1 -0
- ansible_test/_internal/cli/parsers/base_argument_parsers.py +1 -0
- ansible_test/_internal/cli/parsers/helpers.py +1 -0
- ansible_test/_internal/cli/parsers/host_config_parsers.py +1 -0
- ansible_test/_internal/cli/parsers/key_value_parsers.py +1 -0
- ansible_test/_internal/cli/parsers/value_parsers.py +1 -0
- ansible_test/_internal/commands/__init__.py +1 -0
- ansible_test/_internal/commands/coverage/__init__.py +2 -1
- ansible_test/_internal/commands/coverage/analyze/__init__.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/__init__.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/combine.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/expand.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/filter.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/generate.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/missing.py +1 -0
- ansible_test/_internal/commands/coverage/combine.py +2 -1
- ansible_test/_internal/commands/coverage/erase.py +1 -0
- ansible_test/_internal/commands/coverage/html.py +1 -0
- ansible_test/_internal/commands/coverage/report.py +1 -0
- ansible_test/_internal/commands/coverage/xml.py +1 -0
- ansible_test/_internal/commands/env/__init__.py +2 -0
- ansible_test/_internal/commands/integration/__init__.py +4 -0
- ansible_test/_internal/commands/integration/cloud/__init__.py +1 -0
- ansible_test/_internal/commands/integration/cloud/acme.py +2 -1
- ansible_test/_internal/commands/integration/cloud/aws.py +1 -0
- ansible_test/_internal/commands/integration/cloud/azure.py +1 -0
- ansible_test/_internal/commands/integration/cloud/cs.py +1 -0
- ansible_test/_internal/commands/integration/cloud/digitalocean.py +1 -0
- ansible_test/_internal/commands/integration/cloud/galaxy.py +3 -2
- ansible_test/_internal/commands/integration/cloud/hcloud.py +1 -0
- ansible_test/_internal/commands/integration/cloud/httptester.py +2 -1
- ansible_test/_internal/commands/integration/cloud/nios.py +2 -1
- ansible_test/_internal/commands/integration/cloud/opennebula.py +1 -0
- ansible_test/_internal/commands/integration/cloud/openshift.py +1 -0
- ansible_test/_internal/commands/integration/cloud/scaleway.py +1 -0
- ansible_test/_internal/commands/integration/cloud/vcenter.py +1 -0
- ansible_test/_internal/commands/integration/cloud/vultr.py +1 -0
- ansible_test/_internal/commands/integration/coverage.py +1 -0
- ansible_test/_internal/commands/integration/filters.py +1 -0
- ansible_test/_internal/commands/integration/network.py +1 -0
- ansible_test/_internal/commands/integration/posix.py +1 -0
- ansible_test/_internal/commands/integration/windows.py +1 -0
- ansible_test/_internal/commands/sanity/__init__.py +16 -1
- ansible_test/_internal/commands/sanity/ansible_doc.py +1 -0
- ansible_test/_internal/commands/sanity/bin_symlinks.py +1 -0
- ansible_test/_internal/commands/sanity/compile.py +1 -0
- ansible_test/_internal/commands/sanity/ignores.py +1 -0
- ansible_test/_internal/commands/sanity/import.py +1 -0
- ansible_test/_internal/commands/sanity/integration_aliases.py +1 -0
- ansible_test/_internal/commands/sanity/pep8.py +1 -0
- ansible_test/_internal/commands/sanity/pslint.py +1 -0
- ansible_test/_internal/commands/sanity/pylint.py +24 -26
- ansible_test/_internal/commands/sanity/shellcheck.py +1 -0
- ansible_test/_internal/commands/sanity/validate_modules.py +1 -0
- ansible_test/_internal/commands/sanity/yamllint.py +1 -0
- ansible_test/_internal/commands/shell/__init__.py +1 -0
- ansible_test/_internal/commands/units/__init__.py +1 -0
- ansible_test/_internal/compat/__init__.py +1 -0
- ansible_test/_internal/compat/packaging.py +1 -0
- ansible_test/_internal/compat/yaml.py +1 -0
- ansible_test/_internal/completion.py +1 -0
- ansible_test/_internal/config.py +2 -0
- ansible_test/_internal/connections.py +1 -0
- ansible_test/_internal/constants.py +1 -0
- ansible_test/_internal/containers.py +1 -0
- ansible_test/_internal/content_config.py +1 -0
- ansible_test/_internal/core_ci.py +1 -0
- ansible_test/_internal/coverage_util.py +11 -10
- ansible_test/_internal/data.py +1 -0
- ansible_test/_internal/delegation.py +1 -0
- ansible_test/_internal/dev/__init__.py +1 -0
- ansible_test/_internal/dev/container_probe.py +1 -0
- ansible_test/_internal/diff.py +3 -2
- ansible_test/_internal/docker_util.py +2 -1
- ansible_test/_internal/encoding.py +1 -0
- ansible_test/_internal/executor.py +1 -0
- ansible_test/_internal/git.py +1 -0
- ansible_test/_internal/host_configs.py +1 -0
- ansible_test/_internal/host_profiles.py +1 -0
- ansible_test/_internal/http.py +1 -0
- ansible_test/_internal/init.py +1 -0
- ansible_test/_internal/inventory.py +35 -3
- ansible_test/_internal/io.py +1 -0
- ansible_test/_internal/metadata.py +1 -0
- ansible_test/_internal/payload.py +1 -0
- ansible_test/_internal/provider/__init__.py +1 -0
- ansible_test/_internal/provider/layout/__init__.py +1 -0
- ansible_test/_internal/provider/layout/ansible.py +1 -0
- ansible_test/_internal/provider/layout/collection.py +1 -0
- ansible_test/_internal/provider/layout/unsupported.py +1 -0
- ansible_test/_internal/provider/source/__init__.py +1 -0
- ansible_test/_internal/provider/source/git.py +1 -0
- ansible_test/_internal/provider/source/installed.py +1 -0
- ansible_test/_internal/provider/source/unsupported.py +1 -0
- ansible_test/_internal/provider/source/unversioned.py +1 -0
- ansible_test/_internal/provisioning.py +1 -0
- ansible_test/_internal/pypi_proxy.py +6 -5
- ansible_test/_internal/python_requirements.py +1 -0
- ansible_test/_internal/ssh.py +1 -0
- ansible_test/_internal/target.py +1 -0
- ansible_test/_internal/test.py +3 -2
- ansible_test/_internal/thread.py +1 -0
- ansible_test/_internal/timeout.py +1 -0
- ansible_test/_internal/util.py +1 -0
- ansible_test/_internal/util_common.py +5 -2
- ansible_test/_internal/venv.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/action-plugin-docs.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/changelog/sphinx.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/changelog.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/empty-init.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/line-endings.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/no-assert.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/no-get-exception.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/no-illegal-filenames.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/no-smart-quotes.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/replace-urlopen.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/runtime-metadata.py +28 -1
- ansible_test/_util/controller/sanity/code-smell/shebang.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/symlinks.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/use-argspec-type-path.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/use-compat-six.py +1 -0
- ansible_test/_util/controller/sanity/integration-aliases/yaml_to_json.py +2 -1
- ansible_test/_util/controller/sanity/pep8/current-ignore.txt +4 -0
- ansible_test/_util/controller/sanity/pylint/config/ansible-test-target.cfg +7 -5
- ansible_test/_util/controller/sanity/pylint/config/ansible-test.cfg +7 -5
- ansible_test/_util/controller/sanity/pylint/config/code-smell.cfg +7 -5
- ansible_test/_util/controller/sanity/pylint/config/collection.cfg +3 -5
- ansible_test/_util/controller/sanity/pylint/config/default.cfg +7 -7
- ansible_test/_util/controller/sanity/pylint/plugins/deprecated.py +1 -13
- ansible_test/_util/controller/sanity/pylint/plugins/hide_unraisable.py +1 -0
- ansible_test/_util/controller/sanity/pylint/plugins/string_format.py +1 -8
- ansible_test/_util/controller/sanity/pylint/plugins/unwanted.py +1 -8
- ansible_test/_util/controller/sanity/validate-modules/validate_modules/main.py +55 -28
- ansible_test/_util/controller/sanity/validate-modules/validate_modules/module_args.py +12 -5
- ansible_test/_util/controller/sanity/validate-modules/validate_modules/schema.py +13 -2
- ansible_test/_util/controller/sanity/validate-modules/validate_modules/utils.py +1 -0
- ansible_test/_util/controller/sanity/yamllint/yamllinter.py +35 -17
- ansible_test/_util/controller/tools/collection_detail.py +1 -0
- ansible_test/_util/controller/tools/yaml_to_json.py +2 -1
- ansible_test/_util/target/pytest/plugins/ansible_forked.py +6 -1
- ansible_test/_util/target/pytest/plugins/ansible_pytest_collections.py +2 -1
- ansible_test/_util/target/pytest/plugins/ansible_pytest_coverage.py +1 -0
- ansible_test/_util/target/sanity/compile/compile.py +1 -0
- ansible_test/_util/target/sanity/import/importer.py +15 -16
- ansible_test/_util/target/setup/bootstrap.sh +9 -20
- ansible_test/_util/target/setup/probe_cgroups.py +1 -0
- ansible_test/_util/target/setup/quiet_pip.py +1 -0
- ansible_test/_util/target/setup/requirements.py +35 -27
- ansible_test/_util/target/tools/virtualenvcheck.py +2 -1
- ansible_test/_util/target/tools/yamlcheck.py +2 -1
- ansible/compat/selectors.py +0 -32
- ansible/errors/yaml_strings.py +0 -138
- ansible/executor/action_write_locks.py +0 -44
- ansible/executor/discovery/python_target.py +0 -47
- ansible/executor/powershell/module_powershell_wrapper.ps1 +0 -86
- ansible/executor/powershell/module_script_wrapper.ps1 +0 -22
- ansible/module_utils/compat/importlib.py +0 -26
- ansible/module_utils/compat/selectors.py +0 -32
- ansible/module_utils/pycompat24.py +0 -73
- ansible/parsing/yaml/constructor.py +0 -178
- ansible/template/native_helpers.py +0 -251
- ansible/template/template.py +0 -43
- ansible/template/vars.py +0 -77
- ansible/utils/native_jinja.py +0 -11
- ansible/vars/fact_cache.py +0 -71
- ansible_core-2.18.5rc1.dist-info/RECORD +0 -992
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/Apache-License.txt +0 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/COPYING +0 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/MIT-license.txt +0 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/PSF-license.txt +0 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/entry_points.txt +0 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/simplified_bsd.txt +0 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/top_level.txt +0 -0
ansible/cli/doc.py
CHANGED
@@ -15,7 +15,8 @@ import os
|
|
15
15
|
import os.path
|
16
16
|
import re
|
17
17
|
import textwrap
|
18
|
-
|
18
|
+
|
19
|
+
import yaml
|
19
20
|
|
20
21
|
import ansible.plugins.loader as plugin_loader
|
21
22
|
|
@@ -28,12 +29,12 @@ from ansible.collections.list import list_collection_dirs
|
|
28
29
|
from ansible.errors import AnsibleError, AnsibleOptionsError, AnsibleParserError, AnsiblePluginNotFound
|
29
30
|
from ansible.module_utils.common.text.converters import to_native, to_text
|
30
31
|
from ansible.module_utils.common.collections import is_sequence
|
31
|
-
from ansible.module_utils.common.json import json_dump
|
32
32
|
from ansible.module_utils.common.yaml import yaml_dump
|
33
33
|
from ansible.module_utils.six import string_types
|
34
34
|
from ansible.parsing.plugin_docs import read_docstub
|
35
|
-
from ansible.parsing.utils.yaml import from_yaml
|
36
35
|
from ansible.parsing.yaml.dumper import AnsibleDumper
|
36
|
+
from ansible.parsing.yaml.loader import AnsibleLoader
|
37
|
+
from ansible._internal._yaml._loader import AnsibleInstrumentedLoader
|
37
38
|
from ansible.plugins.list import list_plugins
|
38
39
|
from ansible.plugins.loader import action_loader, fragment_loader
|
39
40
|
from ansible.utils.collection_loader import AnsibleCollectionConfig, AnsibleCollectionRef
|
@@ -41,6 +42,8 @@ from ansible.utils.collection_loader._collection_finder import _get_collection_n
|
|
41
42
|
from ansible.utils.color import stringc
|
42
43
|
from ansible.utils.display import Display
|
43
44
|
from ansible.utils.plugin_docs import get_plugin_docs, get_docstring, get_versioned_doclink
|
45
|
+
from ansible.template import trust_as_template
|
46
|
+
from ansible._internal import _json
|
44
47
|
|
45
48
|
display = Display()
|
46
49
|
|
@@ -83,10 +86,9 @@ ref_style = {
|
|
83
86
|
|
84
87
|
def jdump(text):
|
85
88
|
try:
|
86
|
-
display.display(
|
87
|
-
except TypeError as
|
88
|
-
|
89
|
-
raise AnsibleError('We could not convert all the documentation into JSON as there was a conversion issue: %s' % to_native(e))
|
89
|
+
display.display(_json.json_dumps_formatted(text))
|
90
|
+
except TypeError as ex:
|
91
|
+
raise AnsibleError('We could not convert all the documentation into JSON as there was a conversion issue.') from ex
|
90
92
|
|
91
93
|
|
92
94
|
class RoleMixin(object):
|
@@ -104,7 +106,7 @@ class RoleMixin(object):
|
|
104
106
|
""" Load and process the YAML for the first found of a set of role files
|
105
107
|
|
106
108
|
:param str root: The root path to get the files from
|
107
|
-
:param
|
109
|
+
:param list files: List of candidate file names in order of precedence
|
108
110
|
:param str role_name: The name of the role for which we want the argspec data.
|
109
111
|
:param str collection: collection name or None in case of stand alone roles
|
110
112
|
|
@@ -117,6 +119,7 @@ class RoleMixin(object):
|
|
117
119
|
meta_path = os.path.join(root, 'meta')
|
118
120
|
|
119
121
|
# Check all potential spec files
|
122
|
+
path = None
|
120
123
|
for specfile in files:
|
121
124
|
full_path = os.path.join(meta_path, specfile)
|
122
125
|
if os.path.exists(full_path):
|
@@ -128,11 +131,11 @@ class RoleMixin(object):
|
|
128
131
|
|
129
132
|
try:
|
130
133
|
with open(path, 'r') as f:
|
131
|
-
data =
|
134
|
+
data = yaml.load(trust_as_template(f), Loader=AnsibleLoader)
|
132
135
|
if data is None:
|
133
136
|
data = {}
|
134
|
-
except (IOError, OSError) as
|
135
|
-
raise AnsibleParserError("Could not read the role
|
137
|
+
except (IOError, OSError) as ex:
|
138
|
+
raise AnsibleParserError(f"Could not read the role {role_name!r} (at {path}).") from ex
|
136
139
|
|
137
140
|
return data
|
138
141
|
|
@@ -409,7 +412,7 @@ def _doclink(url):
|
|
409
412
|
|
410
413
|
def _format(string, *args):
|
411
414
|
|
412
|
-
|
415
|
+
""" add ascii formatting or delimiters """
|
413
416
|
|
414
417
|
for style in args:
|
415
418
|
|
@@ -433,10 +436,10 @@ def _format(string, *args):
|
|
433
436
|
|
434
437
|
|
435
438
|
class DocCLI(CLI, RoleMixin):
|
436
|
-
|
439
|
+
""" displays information on modules installed in Ansible libraries.
|
437
440
|
It displays a terse listing of plugins and their short descriptions,
|
438
441
|
provides a printout of their DOCUMENTATION strings,
|
439
|
-
and it can create a short "snippet" which can be pasted into a playbook.
|
442
|
+
and it can create a short "snippet" which can be pasted into a playbook. """
|
440
443
|
|
441
444
|
name = 'ansible-doc'
|
442
445
|
|
@@ -696,16 +699,16 @@ class DocCLI(CLI, RoleMixin):
|
|
696
699
|
display.warning("Skipping role '%s' due to: %s" % (role, role_json[role]['error']), True)
|
697
700
|
continue
|
698
701
|
text += self.get_role_man_text(role, role_json[role])
|
699
|
-
except
|
702
|
+
except AnsibleError as ex:
|
700
703
|
# TODO: warn and skip role?
|
701
|
-
raise AnsibleParserError("
|
704
|
+
raise AnsibleParserError(f"Error extracting role docs from {role!r}.") from ex
|
702
705
|
|
703
706
|
# display results
|
704
707
|
DocCLI.pager("\n".join(text))
|
705
708
|
|
706
709
|
@staticmethod
|
707
710
|
def _list_keywords():
|
708
|
-
return
|
711
|
+
return yaml.load(pkgutil.get_data('ansible', 'keyword_desc.yml'), Loader=AnsibleInstrumentedLoader)
|
709
712
|
|
710
713
|
@staticmethod
|
711
714
|
def _get_keywords_docs(keys):
|
@@ -768,10 +771,8 @@ class DocCLI(CLI, RoleMixin):
|
|
768
771
|
|
769
772
|
data[key] = kdata
|
770
773
|
|
771
|
-
except (AttributeError, KeyError) as
|
772
|
-
display.
|
773
|
-
if display.verbosity >= 3:
|
774
|
-
display.verbose(traceback.format_exc())
|
774
|
+
except (AttributeError, KeyError) as ex:
|
775
|
+
display.error_as_warning(f'Skipping invalid keyword {key!r}.', ex)
|
775
776
|
|
776
777
|
return data
|
777
778
|
|
@@ -819,16 +820,19 @@ class DocCLI(CLI, RoleMixin):
|
|
819
820
|
except AnsiblePluginNotFound as e:
|
820
821
|
display.warning(to_native(e))
|
821
822
|
continue
|
822
|
-
except Exception as
|
823
|
+
except Exception as ex:
|
824
|
+
msg = "Missing documentation (or could not parse documentation)"
|
825
|
+
|
823
826
|
if not fail_on_errors:
|
824
|
-
plugin_docs[plugin] = {'error': '
|
827
|
+
plugin_docs[plugin] = {'error': f'{msg}: {ex}.'}
|
825
828
|
continue
|
826
|
-
|
827
|
-
msg = "
|
829
|
+
|
830
|
+
msg = f"{plugin_type} {plugin} {msg}"
|
831
|
+
|
828
832
|
if fail_ok:
|
829
|
-
display.warning(msg)
|
833
|
+
display.warning(f'{msg}: {ex}')
|
830
834
|
else:
|
831
|
-
raise AnsibleError(msg)
|
835
|
+
raise AnsibleError(f'{msg}.') from ex
|
832
836
|
|
833
837
|
if not doc:
|
834
838
|
# The doc section existed but was empty
|
@@ -840,9 +844,9 @@ class DocCLI(CLI, RoleMixin):
|
|
840
844
|
if not fail_on_errors:
|
841
845
|
# Check whether JSON serialization would break
|
842
846
|
try:
|
843
|
-
|
844
|
-
except Exception as
|
845
|
-
plugin_docs[plugin] = {'error': 'Cannot serialize documentation as JSON:
|
847
|
+
_json.json_dumps_formatted(docs)
|
848
|
+
except Exception as ex: # pylint:disable=broad-except
|
849
|
+
plugin_docs[plugin] = {'error': f'Cannot serialize documentation as JSON: {ex}'}
|
846
850
|
continue
|
847
851
|
|
848
852
|
plugin_docs[plugin] = docs
|
@@ -850,14 +854,14 @@ class DocCLI(CLI, RoleMixin):
|
|
850
854
|
return plugin_docs
|
851
855
|
|
852
856
|
def _get_roles_path(self):
|
853
|
-
|
857
|
+
"""
|
854
858
|
Add any 'roles' subdir in playbook dir to the roles search path.
|
855
859
|
And as a last resort, add the playbook dir itself. Order being:
|
856
860
|
- 'roles' subdir of playbook dir
|
857
861
|
- DEFAULT_ROLES_PATH (default in cliargs)
|
858
862
|
- playbook dir (basedir)
|
859
863
|
NOTE: This matches logic in RoleDefinition._load_role_path() method.
|
860
|
-
|
864
|
+
"""
|
861
865
|
roles_path = context.CLIARGS['roles_path']
|
862
866
|
if context.CLIARGS['basedir'] is not None:
|
863
867
|
subdir = os.path.join(context.CLIARGS['basedir'], "roles")
|
@@ -868,7 +872,7 @@ class DocCLI(CLI, RoleMixin):
|
|
868
872
|
|
869
873
|
@staticmethod
|
870
874
|
def _prep_loader(plugin_type):
|
871
|
-
|
875
|
+
""" return a plugint type specific loader """
|
872
876
|
loader = getattr(plugin_loader, '%s_loader' % plugin_type)
|
873
877
|
|
874
878
|
# add to plugin paths from command line
|
@@ -1015,9 +1019,8 @@ class DocCLI(CLI, RoleMixin):
|
|
1015
1019
|
try:
|
1016
1020
|
doc, __, __, __ = get_docstring(filename, fragment_loader, verbose=(context.CLIARGS['verbosity'] > 0),
|
1017
1021
|
collection_name=collection_name, plugin_type=plugin_type)
|
1018
|
-
except Exception:
|
1019
|
-
|
1020
|
-
raise AnsibleError("%s %s at %s has a documentation formatting error or is missing documentation." % (plugin_type, plugin_name, filename))
|
1022
|
+
except Exception as ex:
|
1023
|
+
raise AnsibleError(f"{plugin_type} {plugin_name} at {filename!r} has a documentation formatting error or is missing documentation.") from ex
|
1021
1024
|
|
1022
1025
|
if doc is None:
|
1023
1026
|
# Removed plugins don't have any documentation
|
@@ -1058,7 +1061,7 @@ class DocCLI(CLI, RoleMixin):
|
|
1058
1061
|
|
1059
1062
|
@staticmethod
|
1060
1063
|
def format_snippet(plugin, plugin_type, doc):
|
1061
|
-
|
1064
|
+
""" return heavily commented plugin use to insert into play """
|
1062
1065
|
if plugin_type == 'inventory' and doc.get('options', {}).get('plugin'):
|
1063
1066
|
# these do not take a yaml config that we can write a snippet for
|
1064
1067
|
raise ValueError('The {0} inventory plugin does not take YAML type config source'
|
@@ -1093,9 +1096,8 @@ class DocCLI(CLI, RoleMixin):
|
|
1093
1096
|
|
1094
1097
|
try:
|
1095
1098
|
text = DocCLI.get_man_text(doc, collection_name, plugin_type)
|
1096
|
-
except Exception as
|
1097
|
-
|
1098
|
-
raise AnsibleError("Unable to retrieve documentation from '%s'" % (plugin), orig_exc=e)
|
1099
|
+
except Exception as ex:
|
1100
|
+
raise AnsibleError(f"Unable to retrieve documentation from {plugin!r}.") from ex
|
1099
1101
|
|
1100
1102
|
return text
|
1101
1103
|
|
@@ -1140,7 +1142,7 @@ class DocCLI(CLI, RoleMixin):
|
|
1140
1142
|
|
1141
1143
|
@staticmethod
|
1142
1144
|
def print_paths(finder):
|
1143
|
-
|
1145
|
+
""" Returns a string suitable for printing of the search path """
|
1144
1146
|
|
1145
1147
|
# Uses a list to get the order right
|
1146
1148
|
ret = []
|
@@ -1170,12 +1172,16 @@ class DocCLI(CLI, RoleMixin):
|
|
1170
1172
|
return 'version %s' % (version_added, )
|
1171
1173
|
|
1172
1174
|
@staticmethod
|
1173
|
-
def warp_fill(text, limit, initial_indent='', subsequent_indent='', **kwargs):
|
1175
|
+
def warp_fill(text, limit, initial_indent='', subsequent_indent='', initial_extra=0, **kwargs):
|
1174
1176
|
result = []
|
1175
1177
|
for paragraph in text.split('\n\n'):
|
1176
|
-
|
1177
|
-
|
1178
|
+
wrapped = textwrap.fill(paragraph, limit, initial_indent=initial_indent + ' ' * initial_extra, subsequent_indent=subsequent_indent,
|
1179
|
+
break_on_hyphens=False, break_long_words=False, drop_whitespace=True, **kwargs)
|
1180
|
+
if initial_extra and wrapped.startswith(' ' * initial_extra):
|
1181
|
+
wrapped = wrapped[initial_extra:]
|
1182
|
+
result.append(wrapped)
|
1178
1183
|
initial_indent = subsequent_indent
|
1184
|
+
initial_extra = 0
|
1179
1185
|
return '\n'.join(result)
|
1180
1186
|
|
1181
1187
|
@staticmethod
|
@@ -1207,20 +1213,23 @@ class DocCLI(CLI, RoleMixin):
|
|
1207
1213
|
text.append('')
|
1208
1214
|
|
1209
1215
|
# TODO: push this to top of for and sort by size, create indent on largest key?
|
1210
|
-
inline_indent =
|
1211
|
-
|
1216
|
+
inline_indent = ' ' * max((len(opt_indent) - len(o)) - len(base_indent), 2)
|
1217
|
+
extra_indent = base_indent + ' ' * (len(o) + 3)
|
1218
|
+
sub_indent = inline_indent + extra_indent
|
1212
1219
|
if is_sequence(opt['description']):
|
1213
1220
|
for entry_idx, entry in enumerate(opt['description'], 1):
|
1214
1221
|
if not isinstance(entry, string_types):
|
1215
1222
|
raise AnsibleError("Expected string in description of %s at index %s, got %s" % (o, entry_idx, type(entry)))
|
1216
1223
|
if entry_idx == 1:
|
1217
|
-
text.append(key + DocCLI.warp_fill(DocCLI.tty_ify(entry), limit,
|
1224
|
+
text.append(key + DocCLI.warp_fill(DocCLI.tty_ify(entry), limit,
|
1225
|
+
initial_indent=inline_indent, subsequent_indent=sub_indent, initial_extra=len(extra_indent)))
|
1218
1226
|
else:
|
1219
1227
|
text.append(DocCLI.warp_fill(DocCLI.tty_ify(entry), limit, initial_indent=sub_indent, subsequent_indent=sub_indent))
|
1220
1228
|
else:
|
1221
1229
|
if not isinstance(opt['description'], string_types):
|
1222
1230
|
raise AnsibleError("Expected string in description of %s, got %s" % (o, type(opt['description'])))
|
1223
|
-
text.append(key + DocCLI.warp_fill(DocCLI.tty_ify(opt['description']), limit,
|
1231
|
+
text.append(key + DocCLI.warp_fill(DocCLI.tty_ify(opt['description']), limit,
|
1232
|
+
initial_indent=inline_indent, subsequent_indent=sub_indent, initial_extra=len(extra_indent)))
|
1224
1233
|
del opt['description']
|
1225
1234
|
|
1226
1235
|
suboptions = []
|
@@ -1280,7 +1289,7 @@ class DocCLI(CLI, RoleMixin):
|
|
1280
1289
|
DocCLI.add_fields(text, subdata, limit, opt_indent + ' ', return_values, opt_indent)
|
1281
1290
|
|
1282
1291
|
def get_role_man_text(self, role, role_json):
|
1283
|
-
|
1292
|
+
"""Generate text for the supplied role suitable for display.
|
1284
1293
|
|
1285
1294
|
This is similar to get_man_text(), but roles are different enough that we have
|
1286
1295
|
a separate method for formatting their display.
|
@@ -1289,7 +1298,7 @@ class DocCLI(CLI, RoleMixin):
|
|
1289
1298
|
:param role_json: The JSON for the given role as returned from _create_role_doc().
|
1290
1299
|
|
1291
1300
|
:returns: A array of text suitable for displaying to screen.
|
1292
|
-
|
1301
|
+
"""
|
1293
1302
|
text = []
|
1294
1303
|
opt_indent = " "
|
1295
1304
|
pad = display.columns * 0.20
|
@@ -1396,7 +1405,7 @@ class DocCLI(CLI, RoleMixin):
|
|
1396
1405
|
if 'removed_at_date' not in doc['deprecated'] and 'version' in doc['deprecated'] and 'removed_in' not in doc['deprecated']:
|
1397
1406
|
doc['deprecated']['removed_in'] = doc['deprecated']['version']
|
1398
1407
|
try:
|
1399
|
-
text.append('\t' + C.config.get_deprecated_msg_from_config(doc['deprecated'], True))
|
1408
|
+
text.append('\t' + C.config.get_deprecated_msg_from_config(doc['deprecated'], True, collection_name=collection_name))
|
1400
1409
|
except KeyError as e:
|
1401
1410
|
raise AnsibleError("Invalid deprecation documentation structure", orig_exc=e)
|
1402
1411
|
else:
|
@@ -1507,8 +1516,8 @@ class DocCLI(CLI, RoleMixin):
|
|
1507
1516
|
else:
|
1508
1517
|
try:
|
1509
1518
|
text.append(yaml_dump(doc.pop('plainexamples'), indent=2, default_flow_style=False))
|
1510
|
-
except Exception as
|
1511
|
-
raise AnsibleParserError("Unable to parse examples section"
|
1519
|
+
except Exception as ex:
|
1520
|
+
raise AnsibleParserError("Unable to parse examples section.") from ex
|
1512
1521
|
|
1513
1522
|
if doc.get('returndocs', False):
|
1514
1523
|
text.append('')
|
ansible/cli/galaxy.py
CHANGED
@@ -53,10 +53,12 @@ from ansible.module_utils.ansible_release import __version__ as ansible_version
|
|
53
53
|
from ansible.module_utils.common.collections import is_iterable
|
54
54
|
from ansible.module_utils.common.yaml import yaml_dump, yaml_load
|
55
55
|
from ansible.module_utils.common.text.converters import to_bytes, to_native, to_text
|
56
|
+
from ansible._internal._datatag._tags import TrustedAsTemplate
|
56
57
|
from ansible.module_utils import six
|
57
58
|
from ansible.parsing.dataloader import DataLoader
|
58
59
|
from ansible.playbook.role.requirement import RoleRequirement
|
59
|
-
from ansible.
|
60
|
+
from ansible._internal._templating._engine import TemplateEngine
|
61
|
+
from ansible.template import trust_as_template
|
60
62
|
from ansible.utils.collection_loader import AnsibleCollectionConfig
|
61
63
|
from ansible.utils.display import Display
|
62
64
|
from ansible.utils.plugin_docs import get_versioned_doclink
|
@@ -177,11 +179,11 @@ class RoleDistributionServer:
|
|
177
179
|
|
178
180
|
|
179
181
|
class GalaxyCLI(CLI):
|
180
|
-
|
182
|
+
"""Command to manage Ansible roles and collections.
|
181
183
|
|
182
184
|
None of the CLI tools are designed to run concurrently with themselves.
|
183
185
|
Use an external scheduler and/or locking to ensure there are no clashing operations.
|
184
|
-
|
186
|
+
"""
|
185
187
|
|
186
188
|
name = 'ansible-galaxy'
|
187
189
|
|
@@ -212,7 +214,7 @@ class GalaxyCLI(CLI):
|
|
212
214
|
super(GalaxyCLI, self).__init__(args)
|
213
215
|
|
214
216
|
def init_parser(self):
|
215
|
-
|
217
|
+
""" create an options parser for bin/ansible """
|
216
218
|
|
217
219
|
super(GalaxyCLI, self).init_parser(
|
218
220
|
desc="Perform various Role and Collection related operations.",
|
@@ -639,6 +641,7 @@ class GalaxyCLI(CLI):
|
|
639
641
|
# it doesn't need to be passed as kwarg to GalaxyApi, same for others we pop here
|
640
642
|
auth_url = server_options.pop('auth_url')
|
641
643
|
client_id = server_options.pop('client_id')
|
644
|
+
client_secret = server_options.pop('client_secret')
|
642
645
|
token_val = server_options['token'] or NoTokenSentinel
|
643
646
|
username = server_options['username']
|
644
647
|
api_version = server_options.pop('api_version')
|
@@ -664,15 +667,17 @@ class GalaxyCLI(CLI):
|
|
664
667
|
if username:
|
665
668
|
server_options['token'] = BasicAuthToken(username, server_options['password'])
|
666
669
|
else:
|
667
|
-
if
|
668
|
-
|
669
|
-
|
670
|
-
|
671
|
-
|
672
|
-
|
673
|
-
|
674
|
-
|
675
|
-
|
670
|
+
if auth_url:
|
671
|
+
server_options['token'] = KeycloakToken(
|
672
|
+
access_token=token_val,
|
673
|
+
auth_url=auth_url,
|
674
|
+
validate_certs=validate_certs,
|
675
|
+
client_id=client_id,
|
676
|
+
client_secret=client_secret,
|
677
|
+
)
|
678
|
+
elif token_val:
|
679
|
+
# The galaxy v1 / github / django / 'Token'
|
680
|
+
server_options['token'] = GalaxyToken(token=token_val)
|
676
681
|
|
677
682
|
server_options.update(galaxy_options)
|
678
683
|
config_servers.append(GalaxyAPI(
|
@@ -912,8 +917,8 @@ class GalaxyCLI(CLI):
|
|
912
917
|
|
913
918
|
@staticmethod
|
914
919
|
def _get_skeleton_galaxy_yml(template_path, inject_data):
|
915
|
-
with open(to_bytes(template_path, errors='surrogate_or_strict'), '
|
916
|
-
meta_template = to_text(template_obj.read(), errors='surrogate_or_strict')
|
920
|
+
with open(to_bytes(template_path, errors='surrogate_or_strict'), 'r') as template_obj:
|
921
|
+
meta_template = TrustedAsTemplate().tag(to_text(template_obj.read(), errors='surrogate_or_strict'))
|
917
922
|
|
918
923
|
galaxy_meta = get_collections_galaxy_meta_info()
|
919
924
|
|
@@ -949,7 +954,7 @@ class GalaxyCLI(CLI):
|
|
949
954
|
return textwrap.fill(v, width=117, initial_indent="# ", subsequent_indent="# ", break_on_hyphens=False)
|
950
955
|
|
951
956
|
loader = DataLoader()
|
952
|
-
templar =
|
957
|
+
templar = TemplateEngine(loader, variables={'required_config': required_config, 'optional_config': optional_config})
|
953
958
|
templar.environment.filters['comment_ify'] = comment_ify
|
954
959
|
|
955
960
|
meta_value = templar.template(meta_template)
|
@@ -1151,7 +1156,7 @@ class GalaxyCLI(CLI):
|
|
1151
1156
|
|
1152
1157
|
loader = DataLoader()
|
1153
1158
|
inject_data.update(load_extra_vars(loader))
|
1154
|
-
templar =
|
1159
|
+
templar = TemplateEngine(loader, variables=inject_data)
|
1155
1160
|
|
1156
1161
|
# create role directory
|
1157
1162
|
if not os.path.exists(b_obj_path):
|
@@ -1193,7 +1198,7 @@ class GalaxyCLI(CLI):
|
|
1193
1198
|
elif ext == ".j2" and not in_templates_dir:
|
1194
1199
|
src_template = os.path.join(root, f)
|
1195
1200
|
dest_file = os.path.join(obj_path, rel_root, filename)
|
1196
|
-
template_data =
|
1201
|
+
template_data = trust_as_template(loader.get_text_file_contents(src_template))
|
1197
1202
|
try:
|
1198
1203
|
b_rendered = to_bytes(templar.template(template_data), errors='surrogate_or_strict')
|
1199
1204
|
except AnsibleError as e:
|
@@ -1721,7 +1726,7 @@ class GalaxyCLI(CLI):
|
|
1721
1726
|
publish_collection(collection_path, self.api, wait, timeout)
|
1722
1727
|
|
1723
1728
|
def execute_search(self):
|
1724
|
-
|
1729
|
+
""" searches for roles on the Ansible Galaxy server"""
|
1725
1730
|
page_size = 1000
|
1726
1731
|
search = None
|
1727
1732
|
|
@@ -1761,6 +1766,8 @@ class GalaxyCLI(CLI):
|
|
1761
1766
|
|
1762
1767
|
return 0
|
1763
1768
|
|
1769
|
+
_task_check_delay_sec = 10 # allows unit test override
|
1770
|
+
|
1764
1771
|
def execute_import(self):
|
1765
1772
|
""" used to import a role into Ansible Galaxy """
|
1766
1773
|
|
@@ -1814,7 +1821,7 @@ class GalaxyCLI(CLI):
|
|
1814
1821
|
rc = ['SUCCESS', 'FAILED'].index(state)
|
1815
1822
|
finished = True
|
1816
1823
|
else:
|
1817
|
-
time.sleep(
|
1824
|
+
time.sleep(self._task_check_delay_sec)
|
1818
1825
|
|
1819
1826
|
return rc
|
1820
1827
|
|
ansible/cli/inventory.py
CHANGED
@@ -9,15 +9,19 @@ from __future__ import annotations
|
|
9
9
|
# ansible.cli needs to be imported first, to ensure the source bin/* scripts run that code first
|
10
10
|
from ansible.cli import CLI
|
11
11
|
|
12
|
+
import json
|
12
13
|
import sys
|
14
|
+
import typing as t
|
13
15
|
|
14
16
|
import argparse
|
17
|
+
import functools
|
15
18
|
|
16
19
|
from ansible import constants as C
|
17
20
|
from ansible import context
|
18
21
|
from ansible.cli.arguments import option_helpers as opt_help
|
19
|
-
from ansible.errors import AnsibleError, AnsibleOptionsError
|
22
|
+
from ansible.errors import AnsibleError, AnsibleOptionsError, AnsibleRuntimeError
|
20
23
|
from ansible.module_utils.common.text.converters import to_bytes, to_native, to_text
|
24
|
+
from ansible._internal._json._profiles import _inventory_legacy
|
21
25
|
from ansible.utils.vars import combine_vars
|
22
26
|
from ansible.utils.display import Display
|
23
27
|
from ansible.vars.plugins import get_vars_from_inventory_sources, get_vars_from_path
|
@@ -26,7 +30,7 @@ display = Display()
|
|
26
30
|
|
27
31
|
|
28
32
|
class InventoryCLI(CLI):
|
29
|
-
|
33
|
+
""" used to display or dump the configured inventory as Ansible sees it """
|
30
34
|
|
31
35
|
name = 'ansible-inventory'
|
32
36
|
|
@@ -156,34 +160,17 @@ class InventoryCLI(CLI):
|
|
156
160
|
|
157
161
|
@staticmethod
|
158
162
|
def dump(stuff):
|
159
|
-
|
160
163
|
if context.CLIARGS['yaml']:
|
161
164
|
import yaml
|
162
165
|
from ansible.parsing.yaml.dumper import AnsibleDumper
|
163
|
-
|
166
|
+
|
167
|
+
# DTFIX-RELEASE: need shared infra to smuggle custom kwargs to dumpers, since yaml.dump cannot (as of PyYAML 6.0.1)
|
168
|
+
dumper = functools.partial(AnsibleDumper, dump_vault_tags=True)
|
169
|
+
results = to_text(yaml.dump(stuff, Dumper=dumper, default_flow_style=False, allow_unicode=True))
|
164
170
|
elif context.CLIARGS['toml']:
|
165
|
-
|
166
|
-
try:
|
167
|
-
results = toml_dumps(stuff)
|
168
|
-
except TypeError as e:
|
169
|
-
raise AnsibleError(
|
170
|
-
'The source inventory contains a value that cannot be represented in TOML: %s' % e
|
171
|
-
)
|
172
|
-
except KeyError as e:
|
173
|
-
raise AnsibleError(
|
174
|
-
'The source inventory contains a non-string key (%s) which cannot be represented in TOML. '
|
175
|
-
'The specified key will need to be converted to a string. Be aware that if your playbooks '
|
176
|
-
'expect this key to be non-string, your playbooks will need to be modified to support this '
|
177
|
-
'change.' % e.args[0]
|
178
|
-
)
|
171
|
+
results = toml_dumps(stuff)
|
179
172
|
else:
|
180
|
-
|
181
|
-
from ansible.parsing.ajson import AnsibleJSONEncoder
|
182
|
-
try:
|
183
|
-
results = json.dumps(stuff, cls=AnsibleJSONEncoder, sort_keys=True, indent=4, preprocess_unsafe=True, ensure_ascii=False)
|
184
|
-
except TypeError as e:
|
185
|
-
results = json.dumps(stuff, cls=AnsibleJSONEncoder, sort_keys=False, indent=4, preprocess_unsafe=True, ensure_ascii=False)
|
186
|
-
display.warning("Could not sort JSON output due to issues while sorting keys: %s" % to_native(e))
|
173
|
+
results = json.dumps(stuff, cls=_inventory_legacy.Encoder, sort_keys=True, indent=4)
|
187
174
|
|
188
175
|
return results
|
189
176
|
|
@@ -306,7 +293,11 @@ class InventoryCLI(CLI):
|
|
306
293
|
results = format_group(top, frozenset(h.name for h in hosts))
|
307
294
|
|
308
295
|
# populate meta
|
309
|
-
results['_meta'] = {
|
296
|
+
results['_meta'] = {
|
297
|
+
'hostvars': {},
|
298
|
+
'profile': _inventory_legacy.Encoder.profile_name,
|
299
|
+
}
|
300
|
+
|
310
301
|
for host in hosts:
|
311
302
|
hvars = self._get_host_variables(host)
|
312
303
|
if hvars:
|
@@ -409,6 +400,17 @@ class InventoryCLI(CLI):
|
|
409
400
|
return results
|
410
401
|
|
411
402
|
|
403
|
+
def toml_dumps(data: t.Any) -> str:
|
404
|
+
try:
|
405
|
+
from tomli_w import dumps as _tomli_w_dumps
|
406
|
+
except ImportError:
|
407
|
+
pass
|
408
|
+
else:
|
409
|
+
return _tomli_w_dumps(data)
|
410
|
+
|
411
|
+
raise AnsibleRuntimeError('The Python library "tomli-w" is required when using the TOML output format.')
|
412
|
+
|
413
|
+
|
412
414
|
def main(args=None):
|
413
415
|
InventoryCLI.cli_executor(args)
|
414
416
|
|
ansible/cli/playbook.py
CHANGED
@@ -29,11 +29,13 @@ display = Display()
|
|
29
29
|
|
30
30
|
|
31
31
|
class PlaybookCLI(CLI):
|
32
|
-
|
33
|
-
See the project home page (https://docs.ansible.com) for more information.
|
32
|
+
""" the tool to run *Ansible playbooks*, which are a configuration and multinode deployment system.
|
33
|
+
See the project home page (https://docs.ansible.com) for more information. """
|
34
34
|
|
35
35
|
name = 'ansible-playbook'
|
36
36
|
|
37
|
+
USES_CONNECTION = True
|
38
|
+
|
37
39
|
def init_parser(self):
|
38
40
|
|
39
41
|
# create parser for CLI options
|
@@ -143,10 +145,6 @@ class PlaybookCLI(CLI):
|
|
143
145
|
# Fix this when we rewrite inventory by making localhost a real host (and thus show up in list_hosts())
|
144
146
|
CLI.get_host_list(inventory, context.CLIARGS['subset'])
|
145
147
|
|
146
|
-
# flush fact cache if requested
|
147
|
-
if context.CLIARGS['flush_cache']:
|
148
|
-
self._flush_cache(inventory, variable_manager)
|
149
|
-
|
150
148
|
# create the playbook executor, which manages running the plays via a task queue manager
|
151
149
|
pbex = PlaybookExecutor(playbooks=context.CLIARGS['args'], inventory=inventory,
|
152
150
|
variable_manager=variable_manager, loader=loader,
|
@@ -228,12 +226,6 @@ class PlaybookCLI(CLI):
|
|
228
226
|
else:
|
229
227
|
return results
|
230
228
|
|
231
|
-
@staticmethod
|
232
|
-
def _flush_cache(inventory, variable_manager):
|
233
|
-
for host in inventory.list_hosts():
|
234
|
-
hostname = host.get_name()
|
235
|
-
variable_manager.clear_facts(hostname)
|
236
|
-
|
237
229
|
|
238
230
|
def main(args=None):
|
239
231
|
PlaybookCLI.cli_executor(args)
|