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
@@ -2,80 +2,80 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from jinja2.runtime import Undefined
6
- from jinja2.exceptions import UndefinedError
7
-
8
- from ansible.errors import AnsibleFilterError, AnsibleFilterTypeError
5
+ from ansible.errors import AnsibleError
9
6
  from ansible.module_utils.common.text.converters import to_native, to_bytes
10
- from ansible.module_utils.six import string_types, binary_type
11
- from ansible.parsing.yaml.objects import AnsibleVaultEncryptedUnicode
12
- from ansible.parsing.vault import is_encrypted, VaultSecret, VaultLib
7
+ from ansible.plugins import accept_args_markers
8
+ from ansible._internal._templating._jinja_common import get_first_marker_arg, VaultExceptionMarker
9
+ from ansible._internal._datatag._tags import VaultedValue
10
+ from ansible.parsing.vault import is_encrypted, VaultSecret, VaultLib, VaultHelper
13
11
  from ansible.utils.display import Display
14
12
 
15
13
  display = Display()
16
14
 
17
15
 
18
16
  def do_vault(data, secret, salt=None, vault_id='filter_default', wrap_object=False, vaultid=None):
17
+ if not isinstance(secret, (str, bytes)):
18
+ raise TypeError(f"Secret passed is required to be a string, instead we got {type(secret)}.")
19
19
 
20
- if not isinstance(secret, (string_types, binary_type, Undefined)):
21
- raise AnsibleFilterTypeError("Secret passed is required to be a string, instead we got: %s" % type(secret))
22
-
23
- if not isinstance(data, (string_types, binary_type, Undefined)):
24
- raise AnsibleFilterTypeError("Can only vault strings, instead we got: %s" % type(data))
20
+ if not isinstance(data, (str, bytes)):
21
+ raise TypeError(f"Can only vault strings, instead we got {type(data)}.")
25
22
 
26
23
  if vaultid is not None:
27
24
  display.deprecated("Use of undocumented 'vaultid', use 'vault_id' instead", version='2.20')
25
+
28
26
  if vault_id == 'filter_default':
29
27
  vault_id = vaultid
30
28
  else:
31
29
  display.warning("Ignoring vaultid as vault_id is already set.")
32
30
 
33
- vault = ''
34
31
  vs = VaultSecret(to_bytes(secret))
35
32
  vl = VaultLib()
36
33
  try:
37
34
  vault = vl.encrypt(to_bytes(data), vs, vault_id, salt)
38
- except UndefinedError:
39
- raise
40
- except Exception as e:
41
- raise AnsibleFilterError("Unable to encrypt: %s" % to_native(e), orig_exc=e)
35
+ except Exception as ex:
36
+ raise AnsibleError("Unable to encrypt.") from ex
42
37
 
43
38
  if wrap_object:
44
- vault = AnsibleVaultEncryptedUnicode(vault)
39
+ vault = VaultedValue(ciphertext=str(vault)).tag(secret)
45
40
  else:
46
41
  vault = to_native(vault)
47
42
 
48
43
  return vault
49
44
 
50
45
 
46
+ @accept_args_markers
51
47
  def do_unvault(vault, secret, vault_id='filter_default', vaultid=None):
48
+ if isinstance(vault, VaultExceptionMarker):
49
+ vault = vault._disarm()
50
+
51
+ if (first_marker := get_first_marker_arg((vault, secret, vault_id, vaultid), {})) is not None:
52
+ return first_marker
52
53
 
53
- if not isinstance(secret, (string_types, binary_type, Undefined)):
54
- raise AnsibleFilterTypeError("Secret passed is required to be as string, instead we got: %s" % type(secret))
54
+ if not isinstance(secret, (str, bytes)):
55
+ raise TypeError(f"Secret passed is required to be as string, instead we got {type(secret)}.")
55
56
 
56
- if not isinstance(vault, (string_types, binary_type, AnsibleVaultEncryptedUnicode, Undefined)):
57
- raise AnsibleFilterTypeError("Vault should be in the form of a string, instead we got: %s" % type(vault))
57
+ if not isinstance(vault, (str, bytes)):
58
+ raise TypeError(f"Vault should be in the form of a string, instead we got {type(vault)}.")
58
59
 
59
60
  if vaultid is not None:
60
61
  display.deprecated("Use of undocumented 'vaultid', use 'vault_id' instead", version='2.20')
62
+
61
63
  if vault_id == 'filter_default':
62
64
  vault_id = vaultid
63
65
  else:
64
66
  display.warning("Ignoring vaultid as vault_id is already set.")
65
67
 
66
- data = ''
67
68
  vs = VaultSecret(to_bytes(secret))
68
69
  vl = VaultLib([(vault_id, vs)])
69
- if isinstance(vault, AnsibleVaultEncryptedUnicode):
70
- vault.vault = vl
71
- data = vault.data
72
- elif is_encrypted(vault):
70
+
71
+ if ciphertext := VaultHelper.get_ciphertext(vault, with_tags=True):
72
+ vault = ciphertext
73
+
74
+ if is_encrypted(vault):
73
75
  try:
74
76
  data = vl.decrypt(vault)
75
- except UndefinedError:
76
- raise
77
- except Exception as e:
78
- raise AnsibleFilterError("Unable to decrypt: %s" % to_native(e), orig_exc=e)
77
+ except Exception as ex:
78
+ raise AnsibleError("Unable to decrypt.") from ex
79
79
  else:
80
80
  data = vault
81
81
 
@@ -83,7 +83,7 @@ def do_unvault(vault, secret, vault_id='filter_default', vaultid=None):
83
83
 
84
84
 
85
85
  class FilterModule(object):
86
- ''' Ansible vault jinja2 filters '''
86
+ """ Ansible vault jinja2 filters """
87
87
 
88
88
  def filters(self):
89
89
  filters = {
@@ -7,8 +7,9 @@ DOCUMENTATION:
7
7
  positional: _input, levels, skip_nulls
8
8
  options:
9
9
  _input:
10
- description: First dictionary to combine.
11
- type: dict
10
+ description: List to flatten.
11
+ type: list
12
+ elements: any
12
13
  required: true
13
14
  levels:
14
15
  description: Number of recursive list depths to flatten.
@@ -31,7 +31,7 @@ EXAMPLES: |
31
31
  # size => 2684354560
32
32
  size: '{{ "2.5 gigabyte" | human_to_bytes }}'
33
33
 
34
- # size => 1234803098
34
+ # size => 1073741824
35
35
  size: '{{ "1 Gigabyte" | human_to_bytes }}'
36
36
 
37
37
  # this is an error, because gigggabyte is not a valid unit
@@ -27,10 +27,9 @@ from collections.abc import Mapping, Iterable
27
27
 
28
28
  from jinja2.filters import pass_environment
29
29
 
30
- from ansible.errors import AnsibleFilterError, AnsibleFilterTypeError
30
+ from ansible.errors import AnsibleError
31
31
  from ansible.module_utils.common.text import formatters
32
32
  from ansible.module_utils.six import binary_type, text_type
33
- from ansible.module_utils.common.text.converters import to_native, to_text
34
33
  from ansible.utils.display import Display
35
34
 
36
35
  try:
@@ -48,10 +47,11 @@ display = Display()
48
47
  # explicitly set and cannot be handle (by Jinja2 w/o 'unique' or fallback version)
49
48
  def unique(environment, a, case_sensitive=None, attribute=None):
50
49
 
51
- def _do_fail(e):
50
+ def _do_fail(ex):
52
51
  if case_sensitive is False or attribute:
53
- raise AnsibleFilterError("Jinja2's unique filter failed and we cannot fall back to Ansible's version "
54
- "as it does not support the parameters supplied", orig_exc=e)
52
+ raise AnsibleError(
53
+ "Jinja2's unique filter failed and we cannot fall back to Ansible's version as it does not support the parameters supplied."
54
+ ) from ex
55
55
 
56
56
  error = e = None
57
57
  try:
@@ -63,14 +63,14 @@ def unique(environment, a, case_sensitive=None, attribute=None):
63
63
  except Exception as e:
64
64
  error = e
65
65
  _do_fail(e)
66
- display.warning('Falling back to Ansible unique filter as Jinja2 one failed: %s' % to_text(e))
66
+ display.error_as_warning('Falling back to Ansible unique filter as Jinja2 one failed.', e)
67
67
 
68
68
  if not HAS_UNIQUE or error:
69
69
 
70
70
  # handle Jinja2 specific attributes when using Ansible's version
71
71
  if case_sensitive is False or attribute:
72
- raise AnsibleFilterError("Ansible's unique filter does not support case_sensitive=False nor attribute parameters, "
73
- "you need a newer version of Jinja2 that provides their version of the filter.")
72
+ raise AnsibleError("Ansible's unique filter does not support case_sensitive=False nor attribute parameters, "
73
+ "you need a newer version of Jinja2 that provides their version of the filter.")
74
74
 
75
75
  c = []
76
76
  for x in a:
@@ -123,15 +123,15 @@ def logarithm(x, base=math.e):
123
123
  return math.log10(x)
124
124
  else:
125
125
  return math.log(x, base)
126
- except TypeError as e:
127
- raise AnsibleFilterTypeError('log() can only be used on numbers: %s' % to_native(e))
126
+ except TypeError as ex:
127
+ raise AnsibleError('log() can only be used on numbers') from ex
128
128
 
129
129
 
130
130
  def power(x, y):
131
131
  try:
132
132
  return math.pow(x, y)
133
- except TypeError as e:
134
- raise AnsibleFilterTypeError('pow() can only be used on numbers: %s' % to_native(e))
133
+ except TypeError as ex:
134
+ raise AnsibleError('pow() can only be used on numbers') from ex
135
135
 
136
136
 
137
137
  def inversepower(x, base=2):
@@ -140,28 +140,28 @@ def inversepower(x, base=2):
140
140
  return math.sqrt(x)
141
141
  else:
142
142
  return math.pow(x, 1.0 / float(base))
143
- except (ValueError, TypeError) as e:
144
- raise AnsibleFilterTypeError('root() can only be used on numbers: %s' % to_native(e))
143
+ except (ValueError, TypeError) as ex:
144
+ raise AnsibleError('root() can only be used on numbers') from ex
145
145
 
146
146
 
147
147
  def human_readable(size, isbits=False, unit=None):
148
- ''' Return a human-readable string '''
148
+ """ Return a human-readable string """
149
149
  try:
150
150
  return formatters.bytes_to_human(size, isbits, unit)
151
- except TypeError as e:
152
- raise AnsibleFilterTypeError("human_readable() failed on bad input: %s" % to_native(e))
153
- except Exception:
154
- raise AnsibleFilterError("human_readable() can't interpret following string: %s" % size)
151
+ except TypeError as ex:
152
+ raise AnsibleError("human_readable() failed on bad input") from ex
153
+ except Exception as ex:
154
+ raise AnsibleError("human_readable() can't interpret the input") from ex
155
155
 
156
156
 
157
157
  def human_to_bytes(size, default_unit=None, isbits=False):
158
- ''' Return bytes count from a human-readable string '''
158
+ """ Return bytes count from a human-readable string """
159
159
  try:
160
160
  return formatters.human_to_bytes(size, default_unit, isbits)
161
- except TypeError as e:
162
- raise AnsibleFilterTypeError("human_to_bytes() failed on bad input: %s" % to_native(e))
163
- except Exception:
164
- raise AnsibleFilterError("human_to_bytes() can't interpret following string: %s" % size)
161
+ except TypeError as ex:
162
+ raise AnsibleError("human_to_bytes() failed on bad input") from ex
163
+ except Exception as ex:
164
+ raise AnsibleError("human_to_bytes() can't interpret the input") from ex
165
165
 
166
166
 
167
167
  def rekey_on_member(data, key, duplicates='error'):
@@ -174,38 +174,31 @@ def rekey_on_member(data, key, duplicates='error'):
174
174
  value would be duplicated or to overwrite previous entries if that's the case.
175
175
  """
176
176
  if duplicates not in ('error', 'overwrite'):
177
- raise AnsibleFilterError("duplicates parameter to rekey_on_member has unknown value: {0}".format(duplicates))
177
+ raise AnsibleError(f"duplicates parameter to rekey_on_member has unknown value {duplicates!r}")
178
178
 
179
179
  new_obj = {}
180
180
 
181
- # Ensure the positional args are defined - raise jinja2.exceptions.UndefinedError if not
182
- bool(data) and bool(key)
183
-
184
181
  if isinstance(data, Mapping):
185
182
  iterate_over = data.values()
186
183
  elif isinstance(data, Iterable) and not isinstance(data, (text_type, binary_type)):
187
184
  iterate_over = data
188
185
  else:
189
- raise AnsibleFilterTypeError("Type is not a valid list, set, or dict")
186
+ raise AnsibleError("Type is not a valid list, set, or dict")
190
187
 
191
188
  for item in iterate_over:
192
189
  if not isinstance(item, Mapping):
193
- raise AnsibleFilterTypeError("List item is not a valid dict")
190
+ raise AnsibleError("List item is not a valid dict")
194
191
 
195
192
  try:
196
193
  key_elem = item[key]
197
194
  except KeyError:
198
- raise AnsibleFilterError("Key {0} was not found".format(key))
199
- except TypeError as e:
200
- raise AnsibleFilterTypeError(to_native(e))
201
- except Exception as e:
202
- raise AnsibleFilterError(to_native(e))
195
+ raise AnsibleError(f"Key {key!r} was not found.", obj=item) from None
203
196
 
204
197
  # Note: if new_obj[key_elem] exists it will always be a non-empty dict (it will at
205
198
  # minimum contain {key: key_elem}
206
199
  if new_obj.get(key_elem, None):
207
200
  if duplicates == 'error':
208
- raise AnsibleFilterError("Key {0} is not unique, cannot correctly turn into dict".format(key_elem))
201
+ raise AnsibleError(f"Key {key_elem!r} is not unique, cannot convert to dict.")
209
202
  elif duplicates == 'overwrite':
210
203
  new_obj[key_elem] = item
211
204
  else:
@@ -215,7 +208,7 @@ def rekey_on_member(data, key, duplicates='error'):
215
208
 
216
209
 
217
210
  class FilterModule(object):
218
- ''' Ansible math jinja2 filters '''
211
+ """ Ansible math jinja2 filters """
219
212
 
220
213
  def filters(self):
221
214
  filters = {
@@ -32,6 +32,14 @@ EXAMPLES: |
32
32
  # pwdhash => "$6$/bQCntzQ7VrgVcFa$VaMkmevkY1dqrx8neaenUDlVU.6L/.ojRbrnI4ID.yBHU6XON1cB422scCiXfUL5wRucMdLgJU0Fn38uoeBni/"
33
33
  pwdhash: "{{ 'testing' | password_hash }}"
34
34
 
35
+ # Using hash type
36
+ # wireguard_admin_password_hash => "$2b$12$ujYVRD9v9z87lpvLqeWNuOFDI4QzSSYHoRyYydW6XK4.kgqfwOXzO"
37
+ wireguard_admin_password_hash: "{{ 'vagrant-libvirt' | password_hash(hashtype='bcrypt') }}"
38
+
39
+ # Using salt value for idempotency
40
+ # wireguard_admin_password_hash => "$2b$12$abcdefghijklmnopqrstuuTEw8POU2MwwuYEM7WaKcjqZ948Hm7.W"
41
+ wireguard_admin_password_hash: "{{ 'vagrant-libvirt' | password_hash(hashtype='bcrypt', salt='abcdefghijklmnopqrstuv') }}"
42
+
35
43
  RETURN:
36
44
  _value:
37
45
  description: The resulting password hash.
@@ -8,9 +8,6 @@ DOCUMENTATION:
8
8
  - Maps to Python's C(re.search).
9
9
  - 'The substring matched by the group is accessible via the symbolic group name or
10
10
  the ``\{number}`` special sequence. See examples section.'
11
- - The return for no match will be C(None) in most cases, depending on whether it is used with other filters/tests or not.
12
- It also depends on the Jinja version used and whether native is enabled.
13
- - "For a more complete explanation see U(https://docs.ansible.com/ansible-core/devel/reference_appendices/faq.html#why-does-the-regex-search-filter-return-none-instead-of-an-empty-string)."
14
11
  positional: _input, _regex
15
12
  options:
16
13
  _input:
@@ -55,5 +52,5 @@ EXAMPLES: |
55
52
 
56
53
  RETURN:
57
54
  _value:
58
- description: Matched string or if no match a C(None) or an empty string (see notes)
55
+ description: Matched string or C(None) if no match.
59
56
  type: str
@@ -22,7 +22,7 @@ EXAMPLES: |
22
22
  # listjojo => [ "jojo", "is", "a" ]
23
23
  listjojo: "{{ 'jojo is a' | split }}"
24
24
 
25
- # listjojocomma => [ "jojo is", "a" ]
25
+ # listjojocomma => [ "jojo is", " a" ]
26
26
  listjojocomma: "{{ 'jojo is, a' | split(',') }}"
27
27
 
28
28
  RETURN:
@@ -20,10 +20,6 @@ DOCUMENTATION:
20
20
  description: Affects sorting of dictionary keys.
21
21
  default: True
22
22
  type: bool
23
- #allow_unicode:
24
- # description:
25
- # type: bool
26
- # default: true
27
23
  #default_style=None, canonical=None, width=None, line_break=None, encoding=None, explicit_start=None, explicit_end=None, version=None, tags=None
28
24
  notes:
29
25
  - More options may be available, see L(PyYAML documentation, https://pyyaml.org/wiki/PyYAMLDocumentation) for details.
@@ -24,10 +24,6 @@ DOCUMENTATION:
24
24
  - More options may be available, see L(PyYAML documentation, https://pyyaml.org/wiki/PyYAMLDocumentation) for details.
25
25
 
26
26
  # TODO: find docs for these
27
- #allow_unicode:
28
- # description:
29
- # type: bool
30
- # default: true
31
27
  #default_flow_style
32
28
  #default_style
33
29
  #canonical=None,
@@ -8,7 +8,7 @@ DOCUMENTATION:
8
8
  positional: secret
9
9
  options:
10
10
  _input:
11
- description: Vault string, or an C(AnsibleVaultEncryptedUnicode) string object.
11
+ description: Vault string.
12
12
  type: string
13
13
  required: true
14
14
  secret:
@@ -11,7 +11,7 @@ from urllib.parse import unquote_plus
11
11
 
12
12
 
13
13
  class FilterModule(object):
14
- ''' Ansible core jinja2 filters '''
14
+ """ Ansible core jinja2 filters """
15
15
 
16
16
  def filters(self):
17
17
  return {
@@ -4,7 +4,7 @@
4
4
 
5
5
  from __future__ import annotations
6
6
 
7
- DOCUMENTATION = r'''
7
+ DOCUMENTATION = r"""
8
8
  name: urlsplit
9
9
  version_added: "2.4"
10
10
  short_description: get components from URL
@@ -20,9 +20,9 @@ DOCUMENTATION = r'''
20
20
  description: Specify a single component to return.
21
21
  type: str
22
22
  choices: ["fragment", "hostname", "netloc", "password", "path", "port", "query", "scheme", "username"]
23
- '''
23
+ """
24
24
 
25
- EXAMPLES = r'''
25
+ EXAMPLES = r"""
26
26
 
27
27
  parts: '{{ "http://user:password@www.acme.com:9000/dir/index.html?query=term#fragment" | urlsplit }}'
28
28
  # =>
@@ -46,19 +46,18 @@ EXAMPLES = r'''
46
46
 
47
47
  path: '{{ "http://user:password@www.acme.com:9000/dir/index.html?query=term#fragment" | urlsplit("path") }}'
48
48
  # => '/dir/index.html'
49
- '''
49
+ """
50
50
 
51
- RETURN = r'''
51
+ RETURN = r"""
52
52
  _value:
53
53
  description:
54
54
  - A dictionary with components as keyword and their value.
55
55
  - If O(query) is provided, a string or integer will be returned instead, depending on O(query).
56
56
  type: any
57
- '''
57
+ """
58
58
 
59
59
  from urllib.parse import urlsplit
60
60
 
61
- from ansible.errors import AnsibleFilterError
62
61
  from ansible.utils import helpers
63
62
 
64
63
 
@@ -70,7 +69,7 @@ def split_url(value, query='', alias='urlsplit'):
70
69
  # If no option is supplied, return the entire dictionary.
71
70
  if query:
72
71
  if query not in results:
73
- raise AnsibleFilterError(alias + ': unknown URL component: %s' % query)
72
+ raise ValueError(alias + ': unknown URL component: %s' % query)
74
73
  return results[query]
75
74
  else:
76
75
  return results
@@ -78,7 +77,7 @@ def split_url(value, query='', alias='urlsplit'):
78
77
 
79
78
  # ---- Ansible filters ----
80
79
  class FilterModule(object):
81
- ''' URI filter '''
80
+ """ URI filter """
82
81
 
83
82
  def filters(self):
84
83
  return {
@@ -26,23 +26,28 @@ DOCUMENTATION:
26
26
  default: 'filter_default'
27
27
  wrap_object:
28
28
  description:
29
- - This toggle can force the return of an C(AnsibleVaultEncryptedUnicode) string object, when V(False), you get a simple string.
29
+ - This toggle can force the return of a C(VaultedValue)-tagged string object, when V(False), you get a simple string.
30
30
  - Mostly useful when combining with the C(to_yaml) filter to output the 'inline vault' format.
31
31
  type: bool
32
32
  default: False
33
33
 
34
34
  EXAMPLES: |
35
- # simply encrypt my key in a vault
35
+ # Encrypt a value using the vault filter
36
36
  vars:
37
- myvaultedkey: "{{ keyrawdata|vault(passphrase) }} "
37
+ myvaultedkey: "{{ 'my_secret_key' | vault('my_vault_password') }}"
38
38
 
39
- - name: save templated vaulted data
40
- template: src=dump_template_data.j2 dest=/some/key/vault.txt
41
- vars:
42
- mysalt: '{{2**256|random(seed=inventory_hostname)}}'
43
- template_data: '{{ secretdata|vault(vaultsecret, salt=mysalt) }}'
39
+ # Encrypt a value and save it to a file using the template module
40
+ vars:
41
+ template_data: "{{ 'my_sensitive_data' | vault('another_vault_password', salt=(2**256 | random(seed=inventory_hostname))) }}"
42
+
43
+ # The content of dump_template_data.j2 looks like
44
+ # Encrypted secret: {{ template_data }}
45
+ - name: Save vaulted data
46
+ template:
47
+ src: dump_template_data.j2
48
+ dest: /some/key/vault.txt
44
49
 
45
50
  RETURN:
46
51
  _value:
47
- description: The vault string that contains the secret data (or C(AnsibleVaultEncryptedUnicode) string object).
52
+ description: The vault string that contains the secret data (or C(VaultedValue)-tagged string object).
48
53
  type: string
@@ -5,6 +5,7 @@ DOCUMENTATION:
5
5
  short_description: Get a Windows path's base name
6
6
  description:
7
7
  - Returns the last name component of a Windows path, what is left in the string that is not 'win_dirname'.
8
+ - While specifying an UNC (Universal Naming Convention) path, please make sure the path conforms to the UNC path syntax.
8
9
  options:
9
10
  _input:
10
11
  description: A Windows path.
@@ -16,7 +17,11 @@ DOCUMENTATION:
16
17
  EXAMPLES: |
17
18
 
18
19
  # To get the last name of a file Windows path, like 'foo.txt' out of 'C:\Users\asdf\foo.txt'
19
- {{ mypath | win_basename }}
20
+ filename: "{{ mypath | win_basename }}"
21
+
22
+ # Get basename from the UNC path in the form of '\\<SERVER_NAME>\<SHARE_NAME>\<FILENAME.FILE_EXTENSION>'
23
+ # like '\\server1\test\foo.txt' returns 'foo.txt'
24
+ filename: "{{ mypath | win_basename }}"
20
25
 
21
26
  RETURN:
22
27
  _value:
@@ -5,6 +5,7 @@ DOCUMENTATION:
5
5
  short_description: Get a Windows path's directory
6
6
  description:
7
7
  - Returns the directory component of a Windows path, what is left in the string that is not 'win_basename'.
8
+ - While specifying an UNC (Universal Naming Convention) path, please make sure the path conforms to the UNC path syntax.
8
9
  options:
9
10
  _input:
10
11
  description: A Windows path.
@@ -18,6 +19,10 @@ EXAMPLES: |
18
19
  # To get the last name of a file Windows path, like 'C:\users\asdf' out of 'C:\Users\asdf\foo.txt'
19
20
  {{ mypath | win_dirname }}
20
21
 
22
+ # Get dirname from the UNC path in the form of '\\<SERVER_NAME>\<SHARE_NAME>\<FILENAME.FILE_EXTENSION>'
23
+ # like '\\server1\test\foo.txt' returns '\\\\server1\\test\\'
24
+ filename: "{{ mypath | win_dirname }}"
25
+
21
26
  RETURN:
22
27
  _value:
23
28
  description: The directory from the Windows path provided.