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.
Files changed (710) hide show
  1. ansible/_internal/__init__.py +53 -0
  2. ansible/_internal/_ansiballz.py +265 -0
  3. ansible/_internal/_collection_proxy.py +47 -0
  4. ansible/_internal/_datatag/__init__.py +0 -0
  5. ansible/_internal/_datatag/_tags.py +130 -0
  6. ansible/_internal/_datatag/_utils.py +19 -0
  7. ansible/_internal/_datatag/_wrappers.py +33 -0
  8. ansible/_internal/_errors/__init__.py +0 -0
  9. ansible/_internal/_errors/_captured.py +128 -0
  10. ansible/_internal/_errors/_handler.py +91 -0
  11. ansible/_internal/_errors/_utils.py +310 -0
  12. ansible/_internal/_json/__init__.py +203 -0
  13. ansible/_internal/_json/_legacy_encoder.py +34 -0
  14. ansible/_internal/_json/_profiles/__init__.py +0 -0
  15. ansible/_internal/_json/_profiles/_cache_persistence.py +55 -0
  16. ansible/_internal/_json/_profiles/_inventory_legacy.py +40 -0
  17. ansible/_internal/_json/_profiles/_legacy.py +197 -0
  18. ansible/_internal/_locking.py +21 -0
  19. ansible/_internal/_plugins/__init__.py +0 -0
  20. ansible/_internal/_plugins/_cache.py +57 -0
  21. ansible/_internal/_task.py +78 -0
  22. ansible/_internal/_templating/__init__.py +10 -0
  23. ansible/_internal/_templating/_access.py +86 -0
  24. ansible/_internal/_templating/_chain_templar.py +63 -0
  25. ansible/_internal/_templating/_datatag.py +95 -0
  26. ansible/_internal/_templating/_engine.py +588 -0
  27. ansible/_internal/_templating/_errors.py +28 -0
  28. ansible/_internal/_templating/_jinja_bits.py +1066 -0
  29. ansible/_internal/_templating/_jinja_common.py +332 -0
  30. ansible/_internal/_templating/_jinja_patches.py +44 -0
  31. ansible/_internal/_templating/_jinja_plugins.py +345 -0
  32. ansible/_internal/_templating/_lazy_containers.py +633 -0
  33. ansible/_internal/_templating/_marker_behaviors.py +103 -0
  34. ansible/_internal/_templating/_transform.py +63 -0
  35. ansible/_internal/_templating/_utils.py +107 -0
  36. ansible/_internal/_wrapt.py +1052 -0
  37. ansible/_internal/_yaml/__init__.py +0 -0
  38. ansible/_internal/_yaml/_constructor.py +240 -0
  39. ansible/_internal/_yaml/_dumper.py +62 -0
  40. ansible/_internal/_yaml/_errors.py +166 -0
  41. ansible/_internal/_yaml/_loader.py +66 -0
  42. ansible/_internal/ansible_collections/ansible/_protomatter/README.md +11 -0
  43. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/action/debug.py +36 -0
  44. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/apply_trust.py +19 -0
  45. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/dump_object.py +18 -0
  46. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/finalize.py +16 -0
  47. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/origin.py +18 -0
  48. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.py +24 -0
  49. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.yml +33 -0
  50. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/tag_names.py +16 -0
  51. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/true_type.py +17 -0
  52. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/unmask.py +49 -0
  53. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.py +21 -0
  54. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.yml +2 -0
  55. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.py +15 -0
  56. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.yml +19 -0
  57. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.py +18 -0
  58. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.yml +19 -0
  59. ansible/cli/__init__.py +159 -89
  60. ansible/cli/_ssh_askpass.py +47 -0
  61. ansible/cli/adhoc.py +14 -7
  62. ansible/cli/arguments/option_helpers.py +154 -7
  63. ansible/cli/config.py +43 -68
  64. ansible/cli/console.py +10 -8
  65. ansible/cli/doc.py +62 -53
  66. ansible/cli/galaxy.py +27 -20
  67. ansible/cli/inventory.py +28 -26
  68. ansible/cli/playbook.py +4 -12
  69. ansible/cli/pull.py +51 -11
  70. ansible/cli/scripts/ansible_connection_cli_stub.py +7 -7
  71. ansible/cli/vault.py +12 -11
  72. ansible/compat/__init__.py +2 -2
  73. ansible/config/base.yml +166 -112
  74. ansible/config/manager.py +52 -49
  75. ansible/constants.py +3 -4
  76. ansible/errors/__init__.py +277 -235
  77. ansible/executor/interpreter_discovery.py +28 -149
  78. ansible/executor/module_common.py +426 -493
  79. ansible/executor/play_iterator.py +22 -27
  80. ansible/executor/playbook_executor.py +11 -11
  81. ansible/executor/powershell/async_watchdog.ps1 +97 -102
  82. ansible/executor/powershell/async_wrapper.ps1 +202 -151
  83. ansible/executor/powershell/become_wrapper.ps1 +89 -144
  84. ansible/executor/powershell/bootstrap_wrapper.ps1 +24 -9
  85. ansible/executor/powershell/coverage_wrapper.ps1 +82 -135
  86. ansible/executor/powershell/exec_wrapper.ps1 +462 -196
  87. ansible/executor/powershell/module_manifest.py +417 -265
  88. ansible/executor/powershell/module_wrapper.ps1 +169 -186
  89. ansible/executor/powershell/psrp_fetch_file.ps1 +41 -0
  90. ansible/executor/powershell/psrp_put_file.ps1 +122 -0
  91. ansible/executor/powershell/winrm_fetch_file.ps1 +46 -0
  92. ansible/executor/powershell/winrm_put_file.ps1 +36 -0
  93. ansible/executor/process/worker.py +161 -96
  94. ansible/executor/stats.py +5 -5
  95. ansible/executor/task_executor.py +268 -258
  96. ansible/executor/task_queue_manager.py +124 -90
  97. ansible/executor/task_result.py +183 -78
  98. ansible/galaxy/__init__.py +2 -2
  99. ansible/galaxy/api.py +22 -18
  100. ansible/galaxy/collection/__init__.py +1 -1
  101. ansible/galaxy/collection/concrete_artifact_manager.py +8 -11
  102. ansible/galaxy/dependency_resolution/dataclasses.py +14 -4
  103. ansible/galaxy/dependency_resolution/providers.py +1 -1
  104. ansible/galaxy/dependency_resolution/reporters.py +81 -0
  105. ansible/galaxy/role.py +4 -8
  106. ansible/galaxy/token.py +28 -21
  107. ansible/inventory/data.py +47 -57
  108. ansible/inventory/group.py +44 -72
  109. ansible/inventory/helpers.py +9 -0
  110. ansible/inventory/host.py +32 -54
  111. ansible/inventory/manager.py +78 -34
  112. ansible/keyword_desc.yml +1 -1
  113. ansible/module_utils/_internal/__init__.py +55 -0
  114. ansible/module_utils/_internal/_ambient_context.py +58 -0
  115. ansible/module_utils/_internal/_ansiballz.py +133 -0
  116. ansible/module_utils/_internal/_concurrent/_daemon_threading.py +1 -0
  117. ansible/module_utils/_internal/_dataclass_annotation_patch.py +64 -0
  118. ansible/module_utils/_internal/_dataclass_validation.py +217 -0
  119. ansible/module_utils/_internal/_datatag/__init__.py +928 -0
  120. ansible/module_utils/_internal/_datatag/_tags.py +38 -0
  121. ansible/module_utils/_internal/_debugging.py +31 -0
  122. ansible/module_utils/_internal/_errors.py +30 -0
  123. ansible/module_utils/_internal/_json/__init__.py +63 -0
  124. ansible/module_utils/_internal/_json/_legacy_encoder.py +26 -0
  125. ansible/module_utils/_internal/_json/_profiles/__init__.py +410 -0
  126. ansible/module_utils/_internal/_json/_profiles/_fallback_to_str.py +73 -0
  127. ansible/module_utils/_internal/_json/_profiles/_module_legacy_c2m.py +31 -0
  128. ansible/module_utils/_internal/_json/_profiles/_module_legacy_m2c.py +35 -0
  129. ansible/module_utils/_internal/_json/_profiles/_module_modern_c2m.py +35 -0
  130. ansible/module_utils/_internal/_json/_profiles/_module_modern_m2c.py +33 -0
  131. ansible/module_utils/_internal/_json/_profiles/_tagless.py +50 -0
  132. ansible/module_utils/_internal/_patches/__init__.py +66 -0
  133. ansible/module_utils/_internal/_patches/_dataclass_annotation_patch.py +55 -0
  134. ansible/module_utils/_internal/_patches/_socket_patch.py +34 -0
  135. ansible/module_utils/_internal/_patches/_sys_intern_patch.py +34 -0
  136. ansible/module_utils/_internal/_plugin_exec_context.py +49 -0
  137. ansible/module_utils/_internal/_testing.py +0 -0
  138. ansible/module_utils/_internal/_traceback.py +89 -0
  139. ansible/module_utils/ansible_release.py +2 -2
  140. ansible/module_utils/api.py +1 -2
  141. ansible/module_utils/basic.py +152 -120
  142. ansible/module_utils/common/_utils.py +24 -28
  143. ansible/module_utils/common/collections.py +1 -2
  144. ansible/module_utils/common/dict_transformations.py +2 -2
  145. ansible/module_utils/common/file.py +2 -2
  146. ansible/module_utils/common/json.py +90 -84
  147. ansible/module_utils/common/locale.py +2 -2
  148. ansible/module_utils/common/messages.py +108 -0
  149. ansible/module_utils/common/parameters.py +27 -24
  150. ansible/module_utils/common/process.py +2 -2
  151. ansible/module_utils/common/respawn.py +41 -19
  152. ansible/module_utils/common/sentinel.py +66 -0
  153. ansible/module_utils/common/sys_info.py +8 -8
  154. ansible/module_utils/common/text/converters.py +16 -37
  155. ansible/module_utils/common/validation.py +35 -24
  156. ansible/module_utils/common/warnings.py +86 -25
  157. ansible/module_utils/common/yaml.py +29 -3
  158. ansible/module_utils/compat/datetime.py +33 -21
  159. ansible/module_utils/compat/paramiko.py +21 -10
  160. ansible/module_utils/compat/typing.py +6 -5
  161. ansible/module_utils/connection.py +2 -2
  162. ansible/module_utils/csharp/Ansible.Basic.cs +14 -11
  163. ansible/module_utils/csharp/Ansible.Become.cs +1 -0
  164. ansible/module_utils/csharp/Ansible._Async.cs +517 -0
  165. ansible/module_utils/datatag.py +46 -0
  166. ansible/module_utils/distro/__init__.py +2 -2
  167. ansible/module_utils/facts/ansible_collector.py +4 -5
  168. ansible/module_utils/facts/collector.py +13 -14
  169. ansible/module_utils/facts/compat.py +4 -4
  170. ansible/module_utils/facts/default_collectors.py +1 -1
  171. ansible/module_utils/facts/hardware/aix.py +34 -0
  172. ansible/module_utils/facts/hardware/base.py +1 -1
  173. ansible/module_utils/facts/hardware/darwin.py +1 -3
  174. ansible/module_utils/facts/hardware/freebsd.py +2 -2
  175. ansible/module_utils/facts/hardware/linux.py +4 -4
  176. ansible/module_utils/facts/namespace.py +1 -1
  177. ansible/module_utils/facts/network/base.py +1 -1
  178. ansible/module_utils/facts/network/fc_wwn.py +1 -2
  179. ansible/module_utils/facts/network/iscsi.py +1 -2
  180. ansible/module_utils/facts/network/nvme.py +1 -2
  181. ansible/module_utils/facts/other/facter.py +1 -2
  182. ansible/module_utils/facts/other/ohai.py +2 -3
  183. ansible/module_utils/facts/system/apparmor.py +1 -2
  184. ansible/module_utils/facts/system/caps.py +1 -1
  185. ansible/module_utils/facts/system/chroot.py +1 -2
  186. ansible/module_utils/facts/system/cmdline.py +1 -2
  187. ansible/module_utils/facts/system/date_time.py +5 -3
  188. ansible/module_utils/facts/system/distribution.py +9 -8
  189. ansible/module_utils/facts/system/dns.py +1 -1
  190. ansible/module_utils/facts/system/env.py +1 -2
  191. ansible/module_utils/facts/system/fips.py +7 -20
  192. ansible/module_utils/facts/system/loadavg.py +1 -2
  193. ansible/module_utils/facts/system/local.py +1 -2
  194. ansible/module_utils/facts/system/lsb.py +1 -2
  195. ansible/module_utils/facts/system/pkg_mgr.py +1 -2
  196. ansible/module_utils/facts/system/platform.py +1 -2
  197. ansible/module_utils/facts/system/python.py +1 -2
  198. ansible/module_utils/facts/system/selinux.py +1 -1
  199. ansible/module_utils/facts/system/service_mgr.py +1 -2
  200. ansible/module_utils/facts/system/ssh_pub_keys.py +1 -1
  201. ansible/module_utils/facts/system/systemd.py +1 -1
  202. ansible/module_utils/facts/system/user.py +1 -2
  203. ansible/module_utils/facts/utils.py +3 -3
  204. ansible/module_utils/facts/virtual/base.py +1 -1
  205. ansible/module_utils/facts/virtual/sunos.py +3 -15
  206. ansible/module_utils/facts/virtual/sysctl.py +3 -16
  207. ansible/module_utils/json_utils.py +2 -2
  208. ansible/module_utils/parsing/convert_bool.py +1 -1
  209. ansible/module_utils/service.py +18 -21
  210. ansible/module_utils/splitter.py +7 -7
  211. ansible/module_utils/testing.py +31 -0
  212. ansible/module_utils/urls.py +60 -31
  213. ansible/modules/add_host.py +4 -4
  214. ansible/modules/apt.py +60 -46
  215. ansible/modules/apt_key.py +19 -12
  216. ansible/modules/apt_repository.py +19 -16
  217. ansible/modules/assemble.py +6 -6
  218. ansible/modules/assert.py +4 -4
  219. ansible/modules/async_status.py +10 -12
  220. ansible/modules/async_wrapper.py +8 -3
  221. ansible/modules/blockinfile.py +6 -7
  222. ansible/modules/command.py +10 -17
  223. ansible/modules/copy.py +57 -144
  224. ansible/modules/cron.py +20 -15
  225. ansible/modules/deb822_repository.py +8 -9
  226. ansible/modules/debconf.py +5 -5
  227. ansible/modules/debug.py +4 -4
  228. ansible/modules/dnf.py +8 -8
  229. ansible/modules/dnf5.py +39 -13
  230. ansible/modules/dpkg_selections.py +4 -4
  231. ansible/modules/expect.py +8 -10
  232. ansible/modules/fail.py +4 -4
  233. ansible/modules/fetch.py +4 -4
  234. ansible/modules/file.py +174 -133
  235. ansible/modules/find.py +19 -17
  236. ansible/modules/gather_facts.py +3 -3
  237. ansible/modules/get_url.py +59 -53
  238. ansible/modules/getent.py +7 -9
  239. ansible/modules/git.py +28 -25
  240. ansible/modules/group.py +6 -6
  241. ansible/modules/group_by.py +4 -4
  242. ansible/modules/hostname.py +13 -29
  243. ansible/modules/import_playbook.py +6 -6
  244. ansible/modules/import_role.py +6 -6
  245. ansible/modules/import_tasks.py +6 -6
  246. ansible/modules/include_role.py +6 -6
  247. ansible/modules/include_tasks.py +6 -6
  248. ansible/modules/include_vars.py +6 -6
  249. ansible/modules/iptables.py +86 -73
  250. ansible/modules/known_hosts.py +10 -10
  251. ansible/modules/lineinfile.py +5 -5
  252. ansible/modules/meta.py +4 -4
  253. ansible/modules/mount_facts.py +2 -2
  254. ansible/modules/package.py +4 -4
  255. ansible/modules/package_facts.py +22 -10
  256. ansible/modules/pause.py +6 -6
  257. ansible/modules/ping.py +6 -6
  258. ansible/modules/pip.py +10 -11
  259. ansible/modules/raw.py +4 -4
  260. ansible/modules/reboot.py +6 -6
  261. ansible/modules/replace.py +9 -13
  262. ansible/modules/rpm_key.py +7 -8
  263. ansible/modules/script.py +4 -4
  264. ansible/modules/service.py +7 -8
  265. ansible/modules/service_facts.py +87 -10
  266. ansible/modules/set_fact.py +5 -5
  267. ansible/modules/set_stats.py +4 -4
  268. ansible/modules/setup.py +2 -2
  269. ansible/modules/shell.py +6 -6
  270. ansible/modules/slurp.py +6 -6
  271. ansible/modules/stat.py +9 -23
  272. ansible/modules/subversion.py +15 -15
  273. ansible/modules/systemd.py +6 -6
  274. ansible/modules/systemd_service.py +6 -6
  275. ansible/modules/sysvinit.py +6 -6
  276. ansible/modules/tempfile.py +5 -6
  277. ansible/modules/template.py +6 -6
  278. ansible/modules/unarchive.py +32 -11
  279. ansible/modules/uri.py +33 -26
  280. ansible/modules/user.py +53 -34
  281. ansible/modules/validate_argument_spec.py +10 -7
  282. ansible/modules/wait_for.py +32 -27
  283. ansible/modules/wait_for_connection.py +6 -6
  284. ansible/modules/yum_repository.py +6 -6
  285. ansible/parsing/ajson.py +14 -32
  286. ansible/parsing/dataloader.py +99 -54
  287. ansible/parsing/mod_args.py +28 -44
  288. ansible/parsing/plugin_docs.py +21 -86
  289. ansible/parsing/quoting.py +1 -1
  290. ansible/parsing/splitter.py +27 -12
  291. ansible/parsing/utils/addresses.py +24 -24
  292. ansible/parsing/utils/jsonify.py +5 -1
  293. ansible/parsing/utils/yaml.py +32 -61
  294. ansible/parsing/vault/__init__.py +319 -87
  295. ansible/parsing/yaml/__init__.py +0 -18
  296. ansible/parsing/yaml/dumper.py +6 -120
  297. ansible/parsing/yaml/loader.py +6 -39
  298. ansible/parsing/yaml/objects.py +43 -335
  299. ansible/playbook/__init__.py +1 -1
  300. ansible/playbook/attribute.py +8 -3
  301. ansible/playbook/base.py +182 -132
  302. ansible/playbook/block.py +26 -24
  303. ansible/playbook/collectionsearch.py +1 -15
  304. ansible/playbook/conditional.py +3 -77
  305. ansible/playbook/handler.py +8 -2
  306. ansible/playbook/helpers.py +41 -53
  307. ansible/playbook/included_file.py +31 -27
  308. ansible/playbook/loop_control.py +2 -2
  309. ansible/playbook/play.py +85 -44
  310. ansible/playbook/play_context.py +12 -17
  311. ansible/playbook/playbook_include.py +14 -15
  312. ansible/playbook/role/__init__.py +24 -26
  313. ansible/playbook/role/definition.py +15 -17
  314. ansible/playbook/role/include.py +2 -4
  315. ansible/playbook/role/metadata.py +10 -11
  316. ansible/playbook/role_include.py +3 -3
  317. ansible/playbook/taggable.py +13 -8
  318. ansible/playbook/task.py +188 -118
  319. ansible/playbook/task_include.py +5 -5
  320. ansible/plugins/__init__.py +68 -21
  321. ansible/plugins/action/__init__.py +209 -176
  322. ansible/plugins/action/add_host.py +1 -1
  323. ansible/plugins/action/assemble.py +1 -1
  324. ansible/plugins/action/assert.py +54 -66
  325. ansible/plugins/action/copy.py +7 -11
  326. ansible/plugins/action/debug.py +37 -31
  327. ansible/plugins/action/dnf.py +3 -4
  328. ansible/plugins/action/fail.py +1 -1
  329. ansible/plugins/action/fetch.py +4 -5
  330. ansible/plugins/action/gather_facts.py +7 -6
  331. ansible/plugins/action/group_by.py +1 -1
  332. ansible/plugins/action/include_vars.py +10 -11
  333. ansible/plugins/action/package.py +3 -6
  334. ansible/plugins/action/pause.py +2 -2
  335. ansible/plugins/action/script.py +15 -8
  336. ansible/plugins/action/service.py +6 -11
  337. ansible/plugins/action/set_fact.py +3 -12
  338. ansible/plugins/action/set_stats.py +3 -8
  339. ansible/plugins/action/template.py +35 -59
  340. ansible/plugins/action/unarchive.py +1 -1
  341. ansible/plugins/action/validate_argument_spec.py +5 -5
  342. ansible/plugins/action/wait_for_connection.py +1 -1
  343. ansible/plugins/become/__init__.py +31 -8
  344. ansible/plugins/become/runas.py +71 -0
  345. ansible/plugins/become/su.py +13 -8
  346. ansible/plugins/become/sudo.py +19 -0
  347. ansible/plugins/cache/__init__.py +35 -44
  348. ansible/plugins/cache/base.py +8 -0
  349. ansible/plugins/cache/jsonfile.py +10 -16
  350. ansible/plugins/cache/memory.py +6 -12
  351. ansible/plugins/callback/__init__.py +284 -179
  352. ansible/plugins/callback/default.py +99 -92
  353. ansible/plugins/callback/junit.py +44 -39
  354. ansible/plugins/callback/minimal.py +28 -25
  355. ansible/plugins/callback/oneline.py +28 -21
  356. ansible/plugins/callback/tree.py +16 -11
  357. ansible/plugins/connection/__init__.py +47 -34
  358. ansible/plugins/connection/local.py +150 -54
  359. ansible/plugins/connection/paramiko_ssh.py +21 -18
  360. ansible/plugins/connection/psrp.py +76 -165
  361. ansible/plugins/connection/ssh.py +301 -78
  362. ansible/plugins/connection/winrm.py +58 -140
  363. ansible/plugins/doc_fragments/action_common_attributes.py +14 -14
  364. ansible/plugins/doc_fragments/action_core.py +6 -6
  365. ansible/plugins/doc_fragments/backup.py +2 -2
  366. ansible/plugins/doc_fragments/checksum_common.py +27 -0
  367. ansible/plugins/doc_fragments/constructed.py +6 -2
  368. ansible/plugins/doc_fragments/decrypt.py +2 -2
  369. ansible/plugins/doc_fragments/default_callback.py +2 -2
  370. ansible/plugins/doc_fragments/files.py +2 -2
  371. ansible/plugins/doc_fragments/inventory_cache.py +2 -2
  372. ansible/plugins/doc_fragments/result_format_callback.py +2 -2
  373. ansible/plugins/doc_fragments/return_common.py +2 -2
  374. ansible/plugins/doc_fragments/template_common.py +4 -4
  375. ansible/plugins/doc_fragments/url.py +17 -1
  376. ansible/plugins/doc_fragments/url_windows.py +2 -2
  377. ansible/plugins/doc_fragments/validate.py +2 -2
  378. ansible/plugins/doc_fragments/vars_plugin_staging.py +2 -2
  379. ansible/plugins/filter/__init__.py +6 -2
  380. ansible/plugins/filter/b64decode.yml +22 -0
  381. ansible/plugins/filter/b64encode.yml +22 -0
  382. ansible/plugins/filter/bool.yml +11 -4
  383. ansible/plugins/filter/core.py +225 -108
  384. ansible/plugins/filter/encryption.py +32 -32
  385. ansible/plugins/filter/flatten.yml +3 -2
  386. ansible/plugins/filter/human_to_bytes.yml +1 -1
  387. ansible/plugins/filter/mathstuff.py +30 -37
  388. ansible/plugins/filter/password_hash.yml +8 -0
  389. ansible/plugins/filter/regex_search.yml +1 -4
  390. ansible/plugins/filter/split.yml +1 -1
  391. ansible/plugins/filter/to_nice_yaml.yml +0 -4
  392. ansible/plugins/filter/to_yaml.yml +0 -4
  393. ansible/plugins/filter/unvault.yml +1 -1
  394. ansible/plugins/filter/urls.py +1 -1
  395. ansible/plugins/filter/urlsplit.py +8 -9
  396. ansible/plugins/filter/vault.yml +14 -9
  397. ansible/plugins/filter/win_basename.yml +6 -1
  398. ansible/plugins/filter/win_dirname.yml +5 -0
  399. ansible/plugins/inventory/__init__.py +97 -77
  400. ansible/plugins/inventory/advanced_host_list.py +7 -5
  401. ansible/plugins/inventory/auto.py +11 -4
  402. ansible/plugins/inventory/constructed.py +21 -24
  403. ansible/plugins/inventory/generator.py +16 -11
  404. ansible/plugins/inventory/host_list.py +7 -5
  405. ansible/plugins/inventory/ini.py +78 -44
  406. ansible/plugins/inventory/script.py +189 -119
  407. ansible/plugins/inventory/toml.py +16 -126
  408. ansible/plugins/inventory/yaml.py +10 -8
  409. ansible/plugins/list.py +3 -3
  410. ansible/plugins/loader.py +197 -82
  411. ansible/plugins/lookup/__init__.py +21 -4
  412. ansible/plugins/lookup/config.py +21 -35
  413. ansible/plugins/lookup/csvfile.py +3 -2
  414. ansible/plugins/lookup/dict.py +1 -6
  415. ansible/plugins/lookup/env.py +12 -9
  416. ansible/plugins/lookup/file.py +5 -8
  417. ansible/plugins/lookup/first_found.py +86 -55
  418. ansible/plugins/lookup/indexed_items.py +1 -10
  419. ansible/plugins/lookup/ini.py +14 -13
  420. ansible/plugins/lookup/items.py +1 -1
  421. ansible/plugins/lookup/lines.py +8 -1
  422. ansible/plugins/lookup/list.py +1 -1
  423. ansible/plugins/lookup/nested.py +2 -18
  424. ansible/plugins/lookup/password.py +5 -5
  425. ansible/plugins/lookup/pipe.py +5 -7
  426. ansible/plugins/lookup/sequence.py +18 -8
  427. ansible/plugins/lookup/subelements.py +1 -4
  428. ansible/plugins/lookup/template.py +42 -36
  429. ansible/plugins/lookup/together.py +0 -12
  430. ansible/plugins/lookup/unvault.py +1 -5
  431. ansible/plugins/lookup/url.py +2 -8
  432. ansible/plugins/lookup/vars.py +16 -24
  433. ansible/plugins/shell/__init__.py +2 -2
  434. ansible/plugins/shell/cmd.py +2 -2
  435. ansible/plugins/shell/powershell.py +39 -22
  436. ansible/plugins/shell/sh.py +3 -2
  437. ansible/plugins/strategy/__init__.py +159 -184
  438. ansible/plugins/strategy/debug.py +2 -2
  439. ansible/plugins/strategy/free.py +16 -31
  440. ansible/plugins/strategy/host_pinned.py +2 -2
  441. ansible/plugins/strategy/linear.py +41 -41
  442. ansible/plugins/terminal/__init__.py +4 -4
  443. ansible/plugins/test/__init__.py +7 -2
  444. ansible/plugins/test/core.py +55 -21
  445. ansible/plugins/test/files.py +1 -1
  446. ansible/plugins/test/mathstuff.py +3 -3
  447. ansible/plugins/test/uri.py +3 -3
  448. ansible/plugins/vars/host_group_vars.py +7 -14
  449. ansible/release.py +2 -2
  450. ansible/template/__init__.py +370 -944
  451. ansible/utils/__init__.py +0 -18
  452. ansible/utils/_ssh_agent.py +657 -0
  453. ansible/utils/collection_loader/__init__.py +52 -5
  454. ansible/utils/collection_loader/_collection_config.py +5 -6
  455. ansible/utils/collection_loader/_collection_finder.py +79 -93
  456. ansible/utils/collection_loader/_collection_meta.py +13 -8
  457. ansible/utils/display.py +433 -63
  458. ansible/utils/encrypt.py +27 -19
  459. ansible/utils/fqcn.py +2 -2
  460. ansible/utils/hashing.py +2 -2
  461. ansible/utils/helpers.py +2 -2
  462. ansible/utils/listify.py +8 -8
  463. ansible/utils/lock.py +2 -2
  464. ansible/utils/path.py +4 -4
  465. ansible/utils/plugin_docs.py +14 -13
  466. ansible/utils/sentinel.py +4 -62
  467. ansible/utils/singleton.py +2 -0
  468. ansible/utils/ssh_functions.py +1 -1
  469. ansible/utils/unsafe_proxy.py +23 -332
  470. ansible/utils/vars.py +51 -8
  471. ansible/utils/version.py +2 -2
  472. ansible/vars/clean.py +5 -5
  473. ansible/vars/hostvars.py +60 -90
  474. ansible/vars/manager.py +206 -282
  475. ansible/vars/reserved.py +8 -9
  476. ansible_core-2.19.0b2.dist-info/BSD-3-Clause.txt +28 -0
  477. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/METADATA +5 -4
  478. ansible_core-2.19.0b2.dist-info/RECORD +1072 -0
  479. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/WHEEL +1 -1
  480. ansible_test/_data/completion/docker.txt +7 -7
  481. ansible_test/_data/completion/remote.txt +6 -6
  482. ansible_test/_data/completion/windows.txt +1 -0
  483. ansible_test/_data/requirements/ansible.txt +2 -2
  484. ansible_test/_data/requirements/sanity.ansible-doc.txt +3 -3
  485. ansible_test/_data/requirements/sanity.changelog.txt +1 -1
  486. ansible_test/_data/requirements/sanity.import.plugin.txt +2 -2
  487. ansible_test/_data/requirements/sanity.pylint.txt +4 -4
  488. ansible_test/_data/requirements/sanity.validate-modules.txt +2 -2
  489. ansible_test/_data/requirements/sanity.yamllint.txt +1 -1
  490. ansible_test/_data/requirements/units.txt +1 -0
  491. ansible_test/_internal/__init__.py +1 -0
  492. ansible_test/_internal/ansible_util.py +2 -0
  493. ansible_test/_internal/become.py +1 -0
  494. ansible_test/_internal/bootstrap.py +1 -0
  495. ansible_test/_internal/cache.py +1 -0
  496. ansible_test/_internal/cgroup.py +1 -0
  497. ansible_test/_internal/ci/__init__.py +1 -0
  498. ansible_test/_internal/ci/azp.py +1 -0
  499. ansible_test/_internal/ci/local.py +1 -0
  500. ansible_test/_internal/classification/__init__.py +1 -0
  501. ansible_test/_internal/classification/common.py +1 -0
  502. ansible_test/_internal/classification/csharp.py +1 -0
  503. ansible_test/_internal/classification/powershell.py +1 -0
  504. ansible_test/_internal/classification/python.py +1 -0
  505. ansible_test/_internal/cli/__init__.py +1 -0
  506. ansible_test/_internal/cli/actions.py +1 -0
  507. ansible_test/_internal/cli/argparsing/__init__.py +1 -0
  508. ansible_test/_internal/cli/argparsing/actions.py +1 -0
  509. ansible_test/_internal/cli/argparsing/argcompletion.py +1 -0
  510. ansible_test/_internal/cli/argparsing/parsers.py +1 -0
  511. ansible_test/_internal/cli/commands/__init__.py +11 -0
  512. ansible_test/_internal/cli/commands/coverage/__init__.py +1 -0
  513. ansible_test/_internal/cli/commands/coverage/analyze/__init__.py +1 -0
  514. ansible_test/_internal/cli/commands/coverage/analyze/targets/__init__.py +1 -0
  515. ansible_test/_internal/cli/commands/coverage/analyze/targets/combine.py +1 -0
  516. ansible_test/_internal/cli/commands/coverage/analyze/targets/expand.py +1 -0
  517. ansible_test/_internal/cli/commands/coverage/analyze/targets/filter.py +1 -0
  518. ansible_test/_internal/cli/commands/coverage/analyze/targets/generate.py +1 -0
  519. ansible_test/_internal/cli/commands/coverage/analyze/targets/missing.py +1 -0
  520. ansible_test/_internal/cli/commands/coverage/combine.py +1 -0
  521. ansible_test/_internal/cli/commands/coverage/erase.py +1 -0
  522. ansible_test/_internal/cli/commands/coverage/html.py +1 -0
  523. ansible_test/_internal/cli/commands/coverage/report.py +1 -0
  524. ansible_test/_internal/cli/commands/coverage/xml.py +1 -0
  525. ansible_test/_internal/cli/commands/env.py +1 -0
  526. ansible_test/_internal/cli/commands/integration/__init__.py +1 -0
  527. ansible_test/_internal/cli/commands/integration/network.py +1 -0
  528. ansible_test/_internal/cli/commands/integration/posix.py +1 -0
  529. ansible_test/_internal/cli/commands/integration/windows.py +1 -0
  530. ansible_test/_internal/cli/commands/sanity.py +9 -0
  531. ansible_test/_internal/cli/commands/shell.py +1 -0
  532. ansible_test/_internal/cli/commands/units.py +1 -0
  533. ansible_test/_internal/cli/compat.py +1 -0
  534. ansible_test/_internal/cli/completers.py +1 -0
  535. ansible_test/_internal/cli/converters.py +1 -0
  536. ansible_test/_internal/cli/environments.py +1 -0
  537. ansible_test/_internal/cli/epilog.py +1 -0
  538. ansible_test/_internal/cli/parsers/__init__.py +1 -0
  539. ansible_test/_internal/cli/parsers/base_argument_parsers.py +1 -0
  540. ansible_test/_internal/cli/parsers/helpers.py +1 -0
  541. ansible_test/_internal/cli/parsers/host_config_parsers.py +1 -0
  542. ansible_test/_internal/cli/parsers/key_value_parsers.py +1 -0
  543. ansible_test/_internal/cli/parsers/value_parsers.py +1 -0
  544. ansible_test/_internal/commands/__init__.py +1 -0
  545. ansible_test/_internal/commands/coverage/__init__.py +2 -1
  546. ansible_test/_internal/commands/coverage/analyze/__init__.py +1 -0
  547. ansible_test/_internal/commands/coverage/analyze/targets/__init__.py +1 -0
  548. ansible_test/_internal/commands/coverage/analyze/targets/combine.py +1 -0
  549. ansible_test/_internal/commands/coverage/analyze/targets/expand.py +1 -0
  550. ansible_test/_internal/commands/coverage/analyze/targets/filter.py +1 -0
  551. ansible_test/_internal/commands/coverage/analyze/targets/generate.py +1 -0
  552. ansible_test/_internal/commands/coverage/analyze/targets/missing.py +1 -0
  553. ansible_test/_internal/commands/coverage/combine.py +2 -1
  554. ansible_test/_internal/commands/coverage/erase.py +1 -0
  555. ansible_test/_internal/commands/coverage/html.py +1 -0
  556. ansible_test/_internal/commands/coverage/report.py +1 -0
  557. ansible_test/_internal/commands/coverage/xml.py +1 -0
  558. ansible_test/_internal/commands/env/__init__.py +2 -0
  559. ansible_test/_internal/commands/integration/__init__.py +4 -0
  560. ansible_test/_internal/commands/integration/cloud/__init__.py +1 -0
  561. ansible_test/_internal/commands/integration/cloud/acme.py +2 -1
  562. ansible_test/_internal/commands/integration/cloud/aws.py +1 -0
  563. ansible_test/_internal/commands/integration/cloud/azure.py +1 -0
  564. ansible_test/_internal/commands/integration/cloud/cs.py +1 -0
  565. ansible_test/_internal/commands/integration/cloud/digitalocean.py +1 -0
  566. ansible_test/_internal/commands/integration/cloud/galaxy.py +3 -2
  567. ansible_test/_internal/commands/integration/cloud/hcloud.py +1 -0
  568. ansible_test/_internal/commands/integration/cloud/httptester.py +2 -1
  569. ansible_test/_internal/commands/integration/cloud/nios.py +2 -1
  570. ansible_test/_internal/commands/integration/cloud/opennebula.py +1 -0
  571. ansible_test/_internal/commands/integration/cloud/openshift.py +1 -0
  572. ansible_test/_internal/commands/integration/cloud/scaleway.py +1 -0
  573. ansible_test/_internal/commands/integration/cloud/vcenter.py +1 -0
  574. ansible_test/_internal/commands/integration/cloud/vultr.py +1 -0
  575. ansible_test/_internal/commands/integration/coverage.py +1 -0
  576. ansible_test/_internal/commands/integration/filters.py +1 -0
  577. ansible_test/_internal/commands/integration/network.py +1 -0
  578. ansible_test/_internal/commands/integration/posix.py +1 -0
  579. ansible_test/_internal/commands/integration/windows.py +1 -0
  580. ansible_test/_internal/commands/sanity/__init__.py +16 -1
  581. ansible_test/_internal/commands/sanity/ansible_doc.py +1 -0
  582. ansible_test/_internal/commands/sanity/bin_symlinks.py +1 -0
  583. ansible_test/_internal/commands/sanity/compile.py +1 -0
  584. ansible_test/_internal/commands/sanity/ignores.py +1 -0
  585. ansible_test/_internal/commands/sanity/import.py +1 -0
  586. ansible_test/_internal/commands/sanity/integration_aliases.py +1 -0
  587. ansible_test/_internal/commands/sanity/pep8.py +1 -0
  588. ansible_test/_internal/commands/sanity/pslint.py +1 -0
  589. ansible_test/_internal/commands/sanity/pylint.py +24 -26
  590. ansible_test/_internal/commands/sanity/shellcheck.py +1 -0
  591. ansible_test/_internal/commands/sanity/validate_modules.py +1 -0
  592. ansible_test/_internal/commands/sanity/yamllint.py +1 -0
  593. ansible_test/_internal/commands/shell/__init__.py +1 -0
  594. ansible_test/_internal/commands/units/__init__.py +1 -0
  595. ansible_test/_internal/compat/__init__.py +1 -0
  596. ansible_test/_internal/compat/packaging.py +1 -0
  597. ansible_test/_internal/compat/yaml.py +1 -0
  598. ansible_test/_internal/completion.py +1 -0
  599. ansible_test/_internal/config.py +2 -0
  600. ansible_test/_internal/connections.py +1 -0
  601. ansible_test/_internal/constants.py +1 -0
  602. ansible_test/_internal/containers.py +1 -0
  603. ansible_test/_internal/content_config.py +1 -0
  604. ansible_test/_internal/core_ci.py +1 -0
  605. ansible_test/_internal/coverage_util.py +11 -10
  606. ansible_test/_internal/data.py +1 -0
  607. ansible_test/_internal/delegation.py +1 -0
  608. ansible_test/_internal/dev/__init__.py +1 -0
  609. ansible_test/_internal/dev/container_probe.py +1 -0
  610. ansible_test/_internal/diff.py +3 -2
  611. ansible_test/_internal/docker_util.py +2 -1
  612. ansible_test/_internal/encoding.py +1 -0
  613. ansible_test/_internal/executor.py +1 -0
  614. ansible_test/_internal/git.py +1 -0
  615. ansible_test/_internal/host_configs.py +1 -0
  616. ansible_test/_internal/host_profiles.py +1 -0
  617. ansible_test/_internal/http.py +1 -0
  618. ansible_test/_internal/init.py +1 -0
  619. ansible_test/_internal/inventory.py +35 -3
  620. ansible_test/_internal/io.py +1 -0
  621. ansible_test/_internal/metadata.py +1 -0
  622. ansible_test/_internal/payload.py +1 -0
  623. ansible_test/_internal/provider/__init__.py +1 -0
  624. ansible_test/_internal/provider/layout/__init__.py +1 -0
  625. ansible_test/_internal/provider/layout/ansible.py +1 -0
  626. ansible_test/_internal/provider/layout/collection.py +1 -0
  627. ansible_test/_internal/provider/layout/unsupported.py +1 -0
  628. ansible_test/_internal/provider/source/__init__.py +1 -0
  629. ansible_test/_internal/provider/source/git.py +1 -0
  630. ansible_test/_internal/provider/source/installed.py +1 -0
  631. ansible_test/_internal/provider/source/unsupported.py +1 -0
  632. ansible_test/_internal/provider/source/unversioned.py +1 -0
  633. ansible_test/_internal/provisioning.py +1 -0
  634. ansible_test/_internal/pypi_proxy.py +6 -5
  635. ansible_test/_internal/python_requirements.py +1 -0
  636. ansible_test/_internal/ssh.py +1 -0
  637. ansible_test/_internal/target.py +1 -0
  638. ansible_test/_internal/test.py +3 -2
  639. ansible_test/_internal/thread.py +1 -0
  640. ansible_test/_internal/timeout.py +1 -0
  641. ansible_test/_internal/util.py +1 -0
  642. ansible_test/_internal/util_common.py +5 -2
  643. ansible_test/_internal/venv.py +1 -0
  644. ansible_test/_util/controller/sanity/code-smell/action-plugin-docs.py +1 -0
  645. ansible_test/_util/controller/sanity/code-smell/changelog/sphinx.py +1 -0
  646. ansible_test/_util/controller/sanity/code-smell/changelog.py +1 -0
  647. ansible_test/_util/controller/sanity/code-smell/empty-init.py +1 -0
  648. ansible_test/_util/controller/sanity/code-smell/line-endings.py +1 -0
  649. ansible_test/_util/controller/sanity/code-smell/no-assert.py +1 -0
  650. ansible_test/_util/controller/sanity/code-smell/no-get-exception.py +1 -0
  651. ansible_test/_util/controller/sanity/code-smell/no-illegal-filenames.py +1 -0
  652. ansible_test/_util/controller/sanity/code-smell/no-smart-quotes.py +1 -0
  653. ansible_test/_util/controller/sanity/code-smell/replace-urlopen.py +1 -0
  654. ansible_test/_util/controller/sanity/code-smell/runtime-metadata.py +28 -1
  655. ansible_test/_util/controller/sanity/code-smell/shebang.py +1 -0
  656. ansible_test/_util/controller/sanity/code-smell/symlinks.py +1 -0
  657. ansible_test/_util/controller/sanity/code-smell/use-argspec-type-path.py +1 -0
  658. ansible_test/_util/controller/sanity/code-smell/use-compat-six.py +1 -0
  659. ansible_test/_util/controller/sanity/integration-aliases/yaml_to_json.py +2 -1
  660. ansible_test/_util/controller/sanity/pep8/current-ignore.txt +4 -0
  661. ansible_test/_util/controller/sanity/pylint/config/ansible-test-target.cfg +7 -5
  662. ansible_test/_util/controller/sanity/pylint/config/ansible-test.cfg +7 -5
  663. ansible_test/_util/controller/sanity/pylint/config/code-smell.cfg +7 -5
  664. ansible_test/_util/controller/sanity/pylint/config/collection.cfg +3 -5
  665. ansible_test/_util/controller/sanity/pylint/config/default.cfg +7 -7
  666. ansible_test/_util/controller/sanity/pylint/plugins/deprecated.py +1 -13
  667. ansible_test/_util/controller/sanity/pylint/plugins/hide_unraisable.py +1 -0
  668. ansible_test/_util/controller/sanity/pylint/plugins/string_format.py +1 -8
  669. ansible_test/_util/controller/sanity/pylint/plugins/unwanted.py +1 -8
  670. ansible_test/_util/controller/sanity/validate-modules/validate_modules/main.py +55 -28
  671. ansible_test/_util/controller/sanity/validate-modules/validate_modules/module_args.py +12 -5
  672. ansible_test/_util/controller/sanity/validate-modules/validate_modules/schema.py +13 -2
  673. ansible_test/_util/controller/sanity/validate-modules/validate_modules/utils.py +1 -0
  674. ansible_test/_util/controller/sanity/yamllint/yamllinter.py +35 -17
  675. ansible_test/_util/controller/tools/collection_detail.py +1 -0
  676. ansible_test/_util/controller/tools/yaml_to_json.py +2 -1
  677. ansible_test/_util/target/pytest/plugins/ansible_forked.py +6 -1
  678. ansible_test/_util/target/pytest/plugins/ansible_pytest_collections.py +2 -1
  679. ansible_test/_util/target/pytest/plugins/ansible_pytest_coverage.py +1 -0
  680. ansible_test/_util/target/sanity/compile/compile.py +1 -0
  681. ansible_test/_util/target/sanity/import/importer.py +15 -16
  682. ansible_test/_util/target/setup/bootstrap.sh +9 -20
  683. ansible_test/_util/target/setup/probe_cgroups.py +1 -0
  684. ansible_test/_util/target/setup/quiet_pip.py +1 -0
  685. ansible_test/_util/target/setup/requirements.py +35 -27
  686. ansible_test/_util/target/tools/virtualenvcheck.py +2 -1
  687. ansible_test/_util/target/tools/yamlcheck.py +2 -1
  688. ansible/compat/selectors.py +0 -32
  689. ansible/errors/yaml_strings.py +0 -138
  690. ansible/executor/action_write_locks.py +0 -44
  691. ansible/executor/discovery/python_target.py +0 -47
  692. ansible/executor/powershell/module_powershell_wrapper.ps1 +0 -86
  693. ansible/executor/powershell/module_script_wrapper.ps1 +0 -22
  694. ansible/module_utils/compat/importlib.py +0 -26
  695. ansible/module_utils/compat/selectors.py +0 -32
  696. ansible/module_utils/pycompat24.py +0 -73
  697. ansible/parsing/yaml/constructor.py +0 -178
  698. ansible/template/native_helpers.py +0 -251
  699. ansible/template/template.py +0 -43
  700. ansible/template/vars.py +0 -77
  701. ansible/utils/native_jinja.py +0 -11
  702. ansible/vars/fact_cache.py +0 -71
  703. ansible_core-2.18.5rc1.dist-info/RECORD +0 -992
  704. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/Apache-License.txt +0 -0
  705. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/COPYING +0 -0
  706. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/MIT-license.txt +0 -0
  707. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/PSF-license.txt +0 -0
  708. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/entry_points.txt +0 -0
  709. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/simplified_bsd.txt +0 -0
  710. {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
- import traceback
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(json_dump(text))
87
- except TypeError as e:
88
- display.vvv(traceback.format_exc())
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 str files: List of candidate file names in order of precedence
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 = from_yaml(f.read(), file_name=path)
134
+ data = yaml.load(trust_as_template(f), Loader=AnsibleLoader)
132
135
  if data is None:
133
136
  data = {}
134
- except (IOError, OSError) as e:
135
- raise AnsibleParserError("Could not read the role '%s' (at %s)" % (role_name, path), orig_exc=e)
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
- ''' add ascii formatting or delimiters '''
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
- ''' displays information on modules installed in Ansible libraries.
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 AnsibleParserError as e:
702
+ except AnsibleError as ex:
700
703
  # TODO: warn and skip role?
701
- raise AnsibleParserError("Role '%s" % (role), orig_exc=e)
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 from_yaml(pkgutil.get_data('ansible', 'keyword_desc.yml'))
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 e:
772
- display.warning("Skipping Invalid keyword '%s' specified: %s" % (key, to_text(e)))
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 e:
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': 'Missing documentation or could not parse documentation: %s' % to_native(e)}
827
+ plugin_docs[plugin] = {'error': f'{msg}: {ex}.'}
825
828
  continue
826
- display.vvv(traceback.format_exc())
827
- msg = "%s %s missing documentation (or could not parse documentation): %s\n" % (plugin_type, plugin, to_native(e))
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
- json_dump(docs)
844
- except Exception as e: # pylint:disable=broad-except
845
- plugin_docs[plugin] = {'error': 'Cannot serialize documentation as JSON: %s' % to_native(e)}
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
- ''' return a plugint type specific loader '''
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
- display.vvv(traceback.format_exc())
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
- ''' return heavily commented plugin use to insert into play '''
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 e:
1097
- display.vvv(traceback.format_exc())
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
- ''' Returns a string suitable for printing of the search path '''
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
- result.append(textwrap.fill(paragraph, limit, initial_indent=initial_indent, subsequent_indent=subsequent_indent,
1177
- break_on_hyphens=False, break_long_words=False, drop_whitespace=True, **kwargs))
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 = base_indent + ' ' * max((len(opt_indent) - len(o)) - len(base_indent), 2)
1211
- sub_indent = inline_indent + ' ' * (len(o) + 3)
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, initial_indent=inline_indent, subsequent_indent=sub_indent))
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, initial_indent=inline_indent, subsequent_indent=sub_indent))
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
- '''Generate text for the supplied role suitable for display.
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 e:
1511
- raise AnsibleParserError("Unable to parse examples section", orig_exc=e)
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.template import Templar
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
- '''Command to manage Ansible roles and collections.
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
- ''' create an options parser for bin/ansible '''
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 token_val:
668
- if auth_url:
669
- server_options['token'] = KeycloakToken(access_token=token_val,
670
- auth_url=auth_url,
671
- validate_certs=validate_certs,
672
- client_id=client_id)
673
- else:
674
- # The galaxy v1 / github / django / 'Token'
675
- server_options['token'] = GalaxyToken(token=token_val)
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'), 'rb') as template_obj:
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 = Templar(loader, variables={'required_config': required_config, 'optional_config': optional_config})
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 = Templar(loader, variables=inject_data)
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 = to_text(loader._get_file_contents(src_template)[0], errors='surrogate_or_strict')
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
- ''' searches for roles on the Ansible Galaxy server'''
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(10)
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
- ''' used to display or dump the configured inventory as Ansible sees it '''
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
- results = to_text(yaml.dump(stuff, Dumper=AnsibleDumper, default_flow_style=False, allow_unicode=True))
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
- from ansible.plugins.inventory.toml import toml_dumps
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
- import json
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'] = {'hostvars': {}}
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
- ''' 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. '''
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)