ansible-core 2.18.5rc1__py3-none-any.whl → 2.19.0b1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (709) hide show
  1. ansible/_internal/__init__.py +53 -0
  2. ansible/_internal/_ansiballz.py +265 -0
  3. ansible/_internal/_datatag/__init__.py +0 -0
  4. ansible/_internal/_datatag/_tags.py +130 -0
  5. ansible/_internal/_datatag/_utils.py +19 -0
  6. ansible/_internal/_datatag/_wrappers.py +33 -0
  7. ansible/_internal/_errors/__init__.py +0 -0
  8. ansible/_internal/_errors/_captured.py +128 -0
  9. ansible/_internal/_errors/_handler.py +91 -0
  10. ansible/_internal/_errors/_utils.py +310 -0
  11. ansible/_internal/_json/__init__.py +160 -0
  12. ansible/_internal/_json/_legacy_encoder.py +34 -0
  13. ansible/_internal/_json/_profiles/__init__.py +0 -0
  14. ansible/_internal/_json/_profiles/_cache_persistence.py +55 -0
  15. ansible/_internal/_json/_profiles/_inventory_legacy.py +40 -0
  16. ansible/_internal/_json/_profiles/_legacy.py +198 -0
  17. ansible/_internal/_locking.py +21 -0
  18. ansible/_internal/_plugins/__init__.py +0 -0
  19. ansible/_internal/_plugins/_cache.py +57 -0
  20. ansible/_internal/_task.py +78 -0
  21. ansible/_internal/_templating/__init__.py +10 -0
  22. ansible/_internal/_templating/_access.py +86 -0
  23. ansible/_internal/_templating/_chain_templar.py +63 -0
  24. ansible/_internal/_templating/_datatag.py +95 -0
  25. ansible/_internal/_templating/_engine.py +588 -0
  26. ansible/_internal/_templating/_errors.py +28 -0
  27. ansible/_internal/_templating/_jinja_bits.py +1066 -0
  28. ansible/_internal/_templating/_jinja_common.py +332 -0
  29. ansible/_internal/_templating/_jinja_patches.py +44 -0
  30. ansible/_internal/_templating/_jinja_plugins.py +351 -0
  31. ansible/_internal/_templating/_lazy_containers.py +633 -0
  32. ansible/_internal/_templating/_marker_behaviors.py +103 -0
  33. ansible/_internal/_templating/_transform.py +63 -0
  34. ansible/_internal/_templating/_utils.py +107 -0
  35. ansible/_internal/_wrapt.py +1052 -0
  36. ansible/_internal/_yaml/__init__.py +0 -0
  37. ansible/_internal/_yaml/_constructor.py +240 -0
  38. ansible/_internal/_yaml/_dumper.py +62 -0
  39. ansible/_internal/_yaml/_errors.py +166 -0
  40. ansible/_internal/_yaml/_loader.py +66 -0
  41. ansible/_internal/ansible_collections/ansible/_protomatter/README.md +11 -0
  42. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/action/debug.py +36 -0
  43. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/apply_trust.py +19 -0
  44. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/dump_object.py +18 -0
  45. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/finalize.py +16 -0
  46. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/origin.py +18 -0
  47. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.py +24 -0
  48. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.yml +33 -0
  49. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/tag_names.py +16 -0
  50. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/true_type.py +17 -0
  51. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/unmask.py +49 -0
  52. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.py +21 -0
  53. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.yml +2 -0
  54. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.py +15 -0
  55. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.yml +19 -0
  56. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.py +18 -0
  57. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.yml +19 -0
  58. ansible/cli/__init__.py +153 -89
  59. ansible/cli/_ssh_askpass.py +47 -0
  60. ansible/cli/adhoc.py +14 -7
  61. ansible/cli/arguments/option_helpers.py +154 -7
  62. ansible/cli/config.py +43 -68
  63. ansible/cli/console.py +10 -8
  64. ansible/cli/doc.py +48 -46
  65. ansible/cli/galaxy.py +27 -20
  66. ansible/cli/inventory.py +28 -26
  67. ansible/cli/playbook.py +4 -12
  68. ansible/cli/pull.py +51 -11
  69. ansible/cli/scripts/ansible_connection_cli_stub.py +7 -7
  70. ansible/cli/vault.py +12 -11
  71. ansible/compat/__init__.py +2 -2
  72. ansible/config/base.yml +165 -108
  73. ansible/config/manager.py +52 -49
  74. ansible/constants.py +3 -4
  75. ansible/errors/__init__.py +277 -235
  76. ansible/executor/interpreter_discovery.py +28 -149
  77. ansible/executor/module_common.py +426 -493
  78. ansible/executor/play_iterator.py +22 -27
  79. ansible/executor/playbook_executor.py +11 -11
  80. ansible/executor/powershell/async_watchdog.ps1 +97 -102
  81. ansible/executor/powershell/async_wrapper.ps1 +202 -151
  82. ansible/executor/powershell/become_wrapper.ps1 +89 -144
  83. ansible/executor/powershell/bootstrap_wrapper.ps1 +24 -9
  84. ansible/executor/powershell/coverage_wrapper.ps1 +82 -135
  85. ansible/executor/powershell/exec_wrapper.ps1 +462 -196
  86. ansible/executor/powershell/module_manifest.py +417 -265
  87. ansible/executor/powershell/module_wrapper.ps1 +169 -186
  88. ansible/executor/powershell/psrp_fetch_file.ps1 +41 -0
  89. ansible/executor/powershell/psrp_put_file.ps1 +122 -0
  90. ansible/executor/powershell/winrm_fetch_file.ps1 +46 -0
  91. ansible/executor/powershell/winrm_put_file.ps1 +36 -0
  92. ansible/executor/process/worker.py +136 -76
  93. ansible/executor/stats.py +5 -5
  94. ansible/executor/task_executor.py +237 -236
  95. ansible/executor/task_queue_manager.py +62 -38
  96. ansible/executor/task_result.py +21 -12
  97. ansible/galaxy/__init__.py +2 -2
  98. ansible/galaxy/api.py +22 -18
  99. ansible/galaxy/collection/__init__.py +1 -1
  100. ansible/galaxy/collection/concrete_artifact_manager.py +8 -11
  101. ansible/galaxy/dependency_resolution/dataclasses.py +14 -4
  102. ansible/galaxy/dependency_resolution/providers.py +1 -1
  103. ansible/galaxy/dependency_resolution/reporters.py +81 -0
  104. ansible/galaxy/role.py +4 -8
  105. ansible/galaxy/token.py +28 -21
  106. ansible/inventory/data.py +47 -57
  107. ansible/inventory/group.py +44 -72
  108. ansible/inventory/helpers.py +9 -0
  109. ansible/inventory/host.py +32 -54
  110. ansible/inventory/manager.py +77 -34
  111. ansible/keyword_desc.yml +1 -1
  112. ansible/module_utils/_internal/__init__.py +55 -0
  113. ansible/module_utils/_internal/_ambient_context.py +58 -0
  114. ansible/module_utils/_internal/_ansiballz.py +133 -0
  115. ansible/module_utils/_internal/_concurrent/_daemon_threading.py +1 -0
  116. ansible/module_utils/_internal/_dataclass_annotation_patch.py +64 -0
  117. ansible/module_utils/_internal/_dataclass_validation.py +217 -0
  118. ansible/module_utils/_internal/_datatag/__init__.py +928 -0
  119. ansible/module_utils/_internal/_datatag/_tags.py +38 -0
  120. ansible/module_utils/_internal/_debugging.py +31 -0
  121. ansible/module_utils/_internal/_errors.py +30 -0
  122. ansible/module_utils/_internal/_json/__init__.py +63 -0
  123. ansible/module_utils/_internal/_json/_legacy_encoder.py +26 -0
  124. ansible/module_utils/_internal/_json/_profiles/__init__.py +410 -0
  125. ansible/module_utils/_internal/_json/_profiles/_fallback_to_str.py +73 -0
  126. ansible/module_utils/_internal/_json/_profiles/_module_legacy_c2m.py +31 -0
  127. ansible/module_utils/_internal/_json/_profiles/_module_legacy_m2c.py +35 -0
  128. ansible/module_utils/_internal/_json/_profiles/_module_modern_c2m.py +35 -0
  129. ansible/module_utils/_internal/_json/_profiles/_module_modern_m2c.py +33 -0
  130. ansible/module_utils/_internal/_json/_profiles/_tagless.py +50 -0
  131. ansible/module_utils/_internal/_patches/__init__.py +66 -0
  132. ansible/module_utils/_internal/_patches/_dataclass_annotation_patch.py +55 -0
  133. ansible/module_utils/_internal/_patches/_socket_patch.py +34 -0
  134. ansible/module_utils/_internal/_patches/_sys_intern_patch.py +34 -0
  135. ansible/module_utils/_internal/_plugin_exec_context.py +49 -0
  136. ansible/module_utils/_internal/_testing.py +0 -0
  137. ansible/module_utils/_internal/_traceback.py +89 -0
  138. ansible/module_utils/ansible_release.py +2 -2
  139. ansible/module_utils/api.py +1 -2
  140. ansible/module_utils/basic.py +154 -120
  141. ansible/module_utils/common/_utils.py +24 -28
  142. ansible/module_utils/common/collections.py +1 -2
  143. ansible/module_utils/common/dict_transformations.py +2 -2
  144. ansible/module_utils/common/file.py +2 -2
  145. ansible/module_utils/common/json.py +90 -84
  146. ansible/module_utils/common/locale.py +2 -2
  147. ansible/module_utils/common/messages.py +108 -0
  148. ansible/module_utils/common/parameters.py +27 -24
  149. ansible/module_utils/common/process.py +2 -2
  150. ansible/module_utils/common/respawn.py +41 -19
  151. ansible/module_utils/common/sentinel.py +66 -0
  152. ansible/module_utils/common/sys_info.py +8 -8
  153. ansible/module_utils/common/text/converters.py +16 -37
  154. ansible/module_utils/common/validation.py +35 -24
  155. ansible/module_utils/common/warnings.py +86 -25
  156. ansible/module_utils/common/yaml.py +29 -3
  157. ansible/module_utils/compat/datetime.py +33 -21
  158. ansible/module_utils/compat/paramiko.py +21 -10
  159. ansible/module_utils/compat/typing.py +6 -5
  160. ansible/module_utils/connection.py +2 -2
  161. ansible/module_utils/csharp/Ansible.Basic.cs +14 -11
  162. ansible/module_utils/csharp/Ansible.Become.cs +1 -0
  163. ansible/module_utils/csharp/Ansible._Async.cs +517 -0
  164. ansible/module_utils/datatag.py +46 -0
  165. ansible/module_utils/distro/__init__.py +2 -2
  166. ansible/module_utils/facts/ansible_collector.py +4 -5
  167. ansible/module_utils/facts/collector.py +13 -14
  168. ansible/module_utils/facts/compat.py +4 -4
  169. ansible/module_utils/facts/default_collectors.py +1 -1
  170. ansible/module_utils/facts/hardware/aix.py +34 -0
  171. ansible/module_utils/facts/hardware/base.py +1 -1
  172. ansible/module_utils/facts/hardware/darwin.py +1 -3
  173. ansible/module_utils/facts/hardware/freebsd.py +2 -2
  174. ansible/module_utils/facts/hardware/linux.py +4 -4
  175. ansible/module_utils/facts/namespace.py +1 -1
  176. ansible/module_utils/facts/network/base.py +1 -1
  177. ansible/module_utils/facts/network/fc_wwn.py +1 -2
  178. ansible/module_utils/facts/network/iscsi.py +1 -2
  179. ansible/module_utils/facts/network/nvme.py +1 -2
  180. ansible/module_utils/facts/other/facter.py +1 -2
  181. ansible/module_utils/facts/other/ohai.py +2 -3
  182. ansible/module_utils/facts/system/apparmor.py +1 -2
  183. ansible/module_utils/facts/system/caps.py +1 -1
  184. ansible/module_utils/facts/system/chroot.py +1 -2
  185. ansible/module_utils/facts/system/cmdline.py +1 -2
  186. ansible/module_utils/facts/system/date_time.py +5 -3
  187. ansible/module_utils/facts/system/distribution.py +9 -8
  188. ansible/module_utils/facts/system/dns.py +1 -1
  189. ansible/module_utils/facts/system/env.py +1 -2
  190. ansible/module_utils/facts/system/fips.py +7 -20
  191. ansible/module_utils/facts/system/loadavg.py +1 -2
  192. ansible/module_utils/facts/system/local.py +1 -2
  193. ansible/module_utils/facts/system/lsb.py +1 -2
  194. ansible/module_utils/facts/system/pkg_mgr.py +1 -2
  195. ansible/module_utils/facts/system/platform.py +1 -2
  196. ansible/module_utils/facts/system/python.py +1 -2
  197. ansible/module_utils/facts/system/selinux.py +1 -1
  198. ansible/module_utils/facts/system/service_mgr.py +1 -2
  199. ansible/module_utils/facts/system/ssh_pub_keys.py +1 -1
  200. ansible/module_utils/facts/system/systemd.py +1 -1
  201. ansible/module_utils/facts/system/user.py +1 -2
  202. ansible/module_utils/facts/utils.py +3 -3
  203. ansible/module_utils/facts/virtual/base.py +1 -1
  204. ansible/module_utils/facts/virtual/sunos.py +3 -15
  205. ansible/module_utils/facts/virtual/sysctl.py +3 -16
  206. ansible/module_utils/json_utils.py +2 -2
  207. ansible/module_utils/parsing/convert_bool.py +1 -1
  208. ansible/module_utils/service.py +18 -21
  209. ansible/module_utils/splitter.py +7 -7
  210. ansible/module_utils/testing.py +31 -0
  211. ansible/module_utils/urls.py +60 -31
  212. ansible/modules/add_host.py +4 -4
  213. ansible/modules/apt.py +60 -46
  214. ansible/modules/apt_key.py +19 -12
  215. ansible/modules/apt_repository.py +19 -16
  216. ansible/modules/assemble.py +6 -6
  217. ansible/modules/assert.py +4 -4
  218. ansible/modules/async_status.py +10 -12
  219. ansible/modules/async_wrapper.py +8 -3
  220. ansible/modules/blockinfile.py +6 -7
  221. ansible/modules/command.py +10 -17
  222. ansible/modules/copy.py +57 -144
  223. ansible/modules/cron.py +20 -15
  224. ansible/modules/deb822_repository.py +8 -9
  225. ansible/modules/debconf.py +5 -5
  226. ansible/modules/debug.py +4 -4
  227. ansible/modules/dnf.py +8 -8
  228. ansible/modules/dnf5.py +39 -13
  229. ansible/modules/dpkg_selections.py +4 -4
  230. ansible/modules/expect.py +8 -10
  231. ansible/modules/fail.py +4 -4
  232. ansible/modules/fetch.py +4 -4
  233. ansible/modules/file.py +174 -133
  234. ansible/modules/find.py +19 -17
  235. ansible/modules/gather_facts.py +3 -3
  236. ansible/modules/get_url.py +59 -53
  237. ansible/modules/getent.py +7 -9
  238. ansible/modules/git.py +28 -25
  239. ansible/modules/group.py +6 -6
  240. ansible/modules/group_by.py +4 -4
  241. ansible/modules/hostname.py +13 -29
  242. ansible/modules/import_playbook.py +6 -6
  243. ansible/modules/import_role.py +6 -6
  244. ansible/modules/import_tasks.py +6 -6
  245. ansible/modules/include_role.py +6 -6
  246. ansible/modules/include_tasks.py +6 -6
  247. ansible/modules/include_vars.py +6 -6
  248. ansible/modules/iptables.py +86 -73
  249. ansible/modules/known_hosts.py +10 -10
  250. ansible/modules/lineinfile.py +5 -5
  251. ansible/modules/meta.py +4 -4
  252. ansible/modules/mount_facts.py +2 -2
  253. ansible/modules/package.py +4 -4
  254. ansible/modules/package_facts.py +22 -10
  255. ansible/modules/pause.py +6 -6
  256. ansible/modules/ping.py +6 -6
  257. ansible/modules/pip.py +10 -11
  258. ansible/modules/raw.py +4 -4
  259. ansible/modules/reboot.py +6 -6
  260. ansible/modules/replace.py +9 -13
  261. ansible/modules/rpm_key.py +7 -8
  262. ansible/modules/script.py +4 -4
  263. ansible/modules/service.py +7 -8
  264. ansible/modules/service_facts.py +87 -10
  265. ansible/modules/set_fact.py +5 -5
  266. ansible/modules/set_stats.py +4 -4
  267. ansible/modules/setup.py +2 -2
  268. ansible/modules/shell.py +6 -6
  269. ansible/modules/slurp.py +6 -6
  270. ansible/modules/stat.py +9 -23
  271. ansible/modules/subversion.py +15 -15
  272. ansible/modules/systemd.py +6 -6
  273. ansible/modules/systemd_service.py +6 -6
  274. ansible/modules/sysvinit.py +6 -6
  275. ansible/modules/tempfile.py +5 -6
  276. ansible/modules/template.py +6 -6
  277. ansible/modules/unarchive.py +32 -11
  278. ansible/modules/uri.py +33 -26
  279. ansible/modules/user.py +53 -34
  280. ansible/modules/validate_argument_spec.py +10 -7
  281. ansible/modules/wait_for.py +32 -27
  282. ansible/modules/wait_for_connection.py +6 -6
  283. ansible/modules/yum_repository.py +6 -6
  284. ansible/parsing/ajson.py +14 -32
  285. ansible/parsing/dataloader.py +99 -54
  286. ansible/parsing/mod_args.py +28 -44
  287. ansible/parsing/plugin_docs.py +21 -86
  288. ansible/parsing/quoting.py +1 -1
  289. ansible/parsing/splitter.py +27 -12
  290. ansible/parsing/utils/addresses.py +24 -24
  291. ansible/parsing/utils/yaml.py +32 -61
  292. ansible/parsing/vault/__init__.py +319 -87
  293. ansible/parsing/yaml/__init__.py +0 -18
  294. ansible/parsing/yaml/dumper.py +6 -120
  295. ansible/parsing/yaml/loader.py +6 -39
  296. ansible/parsing/yaml/objects.py +36 -339
  297. ansible/playbook/__init__.py +1 -1
  298. ansible/playbook/attribute.py +8 -3
  299. ansible/playbook/base.py +182 -132
  300. ansible/playbook/block.py +26 -24
  301. ansible/playbook/collectionsearch.py +1 -15
  302. ansible/playbook/conditional.py +3 -77
  303. ansible/playbook/handler.py +8 -2
  304. ansible/playbook/helpers.py +41 -53
  305. ansible/playbook/included_file.py +6 -15
  306. ansible/playbook/loop_control.py +2 -2
  307. ansible/playbook/play.py +85 -44
  308. ansible/playbook/play_context.py +12 -17
  309. ansible/playbook/playbook_include.py +14 -15
  310. ansible/playbook/role/__init__.py +24 -26
  311. ansible/playbook/role/definition.py +15 -17
  312. ansible/playbook/role/include.py +2 -4
  313. ansible/playbook/role/metadata.py +10 -11
  314. ansible/playbook/role_include.py +3 -3
  315. ansible/playbook/taggable.py +13 -8
  316. ansible/playbook/task.py +188 -118
  317. ansible/playbook/task_include.py +5 -5
  318. ansible/plugins/__init__.py +68 -21
  319. ansible/plugins/action/__init__.py +209 -176
  320. ansible/plugins/action/add_host.py +1 -1
  321. ansible/plugins/action/assemble.py +1 -1
  322. ansible/plugins/action/assert.py +54 -66
  323. ansible/plugins/action/copy.py +7 -11
  324. ansible/plugins/action/debug.py +37 -31
  325. ansible/plugins/action/dnf.py +3 -4
  326. ansible/plugins/action/fail.py +1 -1
  327. ansible/plugins/action/fetch.py +4 -5
  328. ansible/plugins/action/gather_facts.py +7 -6
  329. ansible/plugins/action/group_by.py +1 -1
  330. ansible/plugins/action/include_vars.py +10 -11
  331. ansible/plugins/action/package.py +3 -6
  332. ansible/plugins/action/pause.py +2 -2
  333. ansible/plugins/action/script.py +15 -8
  334. ansible/plugins/action/service.py +6 -11
  335. ansible/plugins/action/set_fact.py +3 -12
  336. ansible/plugins/action/set_stats.py +3 -8
  337. ansible/plugins/action/template.py +35 -59
  338. ansible/plugins/action/unarchive.py +1 -1
  339. ansible/plugins/action/validate_argument_spec.py +5 -5
  340. ansible/plugins/action/wait_for_connection.py +1 -1
  341. ansible/plugins/become/__init__.py +31 -8
  342. ansible/plugins/become/runas.py +71 -0
  343. ansible/plugins/become/su.py +13 -8
  344. ansible/plugins/become/sudo.py +19 -0
  345. ansible/plugins/cache/__init__.py +35 -44
  346. ansible/plugins/cache/base.py +8 -0
  347. ansible/plugins/cache/jsonfile.py +10 -16
  348. ansible/plugins/cache/memory.py +6 -12
  349. ansible/plugins/callback/__init__.py +141 -123
  350. ansible/plugins/callback/default.py +30 -23
  351. ansible/plugins/callback/junit.py +28 -24
  352. ansible/plugins/callback/minimal.py +17 -14
  353. ansible/plugins/callback/oneline.py +13 -7
  354. ansible/plugins/callback/tree.py +10 -6
  355. ansible/plugins/connection/__init__.py +47 -34
  356. ansible/plugins/connection/local.py +150 -54
  357. ansible/plugins/connection/paramiko_ssh.py +21 -18
  358. ansible/plugins/connection/psrp.py +76 -165
  359. ansible/plugins/connection/ssh.py +301 -78
  360. ansible/plugins/connection/winrm.py +58 -140
  361. ansible/plugins/doc_fragments/action_common_attributes.py +14 -14
  362. ansible/plugins/doc_fragments/action_core.py +6 -6
  363. ansible/plugins/doc_fragments/backup.py +2 -2
  364. ansible/plugins/doc_fragments/checksum_common.py +27 -0
  365. ansible/plugins/doc_fragments/constructed.py +6 -2
  366. ansible/plugins/doc_fragments/decrypt.py +2 -2
  367. ansible/plugins/doc_fragments/default_callback.py +2 -2
  368. ansible/plugins/doc_fragments/files.py +2 -2
  369. ansible/plugins/doc_fragments/inventory_cache.py +2 -2
  370. ansible/plugins/doc_fragments/result_format_callback.py +2 -2
  371. ansible/plugins/doc_fragments/return_common.py +2 -2
  372. ansible/plugins/doc_fragments/template_common.py +4 -4
  373. ansible/plugins/doc_fragments/url.py +17 -1
  374. ansible/plugins/doc_fragments/url_windows.py +2 -2
  375. ansible/plugins/doc_fragments/validate.py +2 -2
  376. ansible/plugins/doc_fragments/vars_plugin_staging.py +2 -2
  377. ansible/plugins/filter/__init__.py +6 -2
  378. ansible/plugins/filter/b64decode.yml +22 -0
  379. ansible/plugins/filter/b64encode.yml +22 -0
  380. ansible/plugins/filter/bool.yml +11 -4
  381. ansible/plugins/filter/core.py +218 -108
  382. ansible/plugins/filter/encryption.py +32 -32
  383. ansible/plugins/filter/flatten.yml +3 -2
  384. ansible/plugins/filter/human_to_bytes.yml +1 -1
  385. ansible/plugins/filter/mathstuff.py +30 -37
  386. ansible/plugins/filter/password_hash.yml +8 -0
  387. ansible/plugins/filter/regex_search.yml +1 -4
  388. ansible/plugins/filter/split.yml +1 -1
  389. ansible/plugins/filter/to_nice_yaml.yml +0 -4
  390. ansible/plugins/filter/to_yaml.yml +0 -4
  391. ansible/plugins/filter/unvault.yml +1 -1
  392. ansible/plugins/filter/urls.py +1 -1
  393. ansible/plugins/filter/urlsplit.py +8 -9
  394. ansible/plugins/filter/vault.yml +14 -9
  395. ansible/plugins/filter/win_basename.yml +6 -1
  396. ansible/plugins/filter/win_dirname.yml +5 -0
  397. ansible/plugins/inventory/__init__.py +97 -77
  398. ansible/plugins/inventory/advanced_host_list.py +7 -5
  399. ansible/plugins/inventory/auto.py +11 -4
  400. ansible/plugins/inventory/constructed.py +21 -24
  401. ansible/plugins/inventory/generator.py +16 -11
  402. ansible/plugins/inventory/host_list.py +7 -5
  403. ansible/plugins/inventory/ini.py +78 -44
  404. ansible/plugins/inventory/script.py +189 -119
  405. ansible/plugins/inventory/toml.py +16 -126
  406. ansible/plugins/inventory/yaml.py +10 -8
  407. ansible/plugins/list.py +3 -3
  408. ansible/plugins/loader.py +197 -82
  409. ansible/plugins/lookup/__init__.py +21 -4
  410. ansible/plugins/lookup/config.py +21 -35
  411. ansible/plugins/lookup/csvfile.py +3 -2
  412. ansible/plugins/lookup/dict.py +1 -6
  413. ansible/plugins/lookup/env.py +12 -9
  414. ansible/plugins/lookup/file.py +5 -8
  415. ansible/plugins/lookup/first_found.py +86 -55
  416. ansible/plugins/lookup/indexed_items.py +1 -10
  417. ansible/plugins/lookup/ini.py +14 -13
  418. ansible/plugins/lookup/items.py +1 -1
  419. ansible/plugins/lookup/lines.py +8 -1
  420. ansible/plugins/lookup/list.py +1 -1
  421. ansible/plugins/lookup/nested.py +2 -18
  422. ansible/plugins/lookup/password.py +5 -5
  423. ansible/plugins/lookup/pipe.py +5 -7
  424. ansible/plugins/lookup/sequence.py +18 -8
  425. ansible/plugins/lookup/subelements.py +1 -4
  426. ansible/plugins/lookup/template.py +42 -36
  427. ansible/plugins/lookup/together.py +0 -12
  428. ansible/plugins/lookup/unvault.py +1 -5
  429. ansible/plugins/lookup/url.py +2 -8
  430. ansible/plugins/lookup/vars.py +16 -24
  431. ansible/plugins/shell/__init__.py +2 -2
  432. ansible/plugins/shell/cmd.py +2 -2
  433. ansible/plugins/shell/powershell.py +39 -22
  434. ansible/plugins/shell/sh.py +3 -2
  435. ansible/plugins/strategy/__init__.py +94 -113
  436. ansible/plugins/strategy/debug.py +2 -2
  437. ansible/plugins/strategy/free.py +13 -28
  438. ansible/plugins/strategy/host_pinned.py +2 -2
  439. ansible/plugins/strategy/linear.py +31 -33
  440. ansible/plugins/terminal/__init__.py +4 -4
  441. ansible/plugins/test/__init__.py +7 -2
  442. ansible/plugins/test/core.py +54 -20
  443. ansible/plugins/test/files.py +1 -1
  444. ansible/plugins/test/mathstuff.py +3 -3
  445. ansible/plugins/test/uri.py +3 -3
  446. ansible/plugins/vars/host_group_vars.py +7 -14
  447. ansible/release.py +2 -2
  448. ansible/template/__init__.py +368 -944
  449. ansible/utils/__init__.py +0 -18
  450. ansible/utils/_ssh_agent.py +657 -0
  451. ansible/utils/collection_loader/__init__.py +52 -5
  452. ansible/utils/collection_loader/_collection_config.py +5 -6
  453. ansible/utils/collection_loader/_collection_finder.py +79 -93
  454. ansible/utils/collection_loader/_collection_meta.py +13 -8
  455. ansible/utils/display.py +428 -58
  456. ansible/utils/encrypt.py +27 -19
  457. ansible/utils/fqcn.py +2 -2
  458. ansible/utils/hashing.py +2 -2
  459. ansible/utils/helpers.py +2 -2
  460. ansible/utils/listify.py +8 -8
  461. ansible/utils/lock.py +2 -2
  462. ansible/utils/path.py +4 -4
  463. ansible/utils/plugin_docs.py +14 -13
  464. ansible/utils/sentinel.py +4 -62
  465. ansible/utils/singleton.py +2 -0
  466. ansible/utils/ssh_functions.py +1 -1
  467. ansible/utils/unsafe_proxy.py +23 -332
  468. ansible/utils/vars.py +28 -8
  469. ansible/utils/version.py +2 -2
  470. ansible/vars/clean.py +4 -4
  471. ansible/vars/hostvars.py +60 -90
  472. ansible/vars/manager.py +205 -264
  473. ansible/vars/reserved.py +8 -9
  474. ansible_core-2.19.0b1.dist-info/BSD-3-Clause.txt +28 -0
  475. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b1.dist-info}/METADATA +5 -4
  476. ansible_core-2.19.0b1.dist-info/RECORD +1070 -0
  477. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b1.dist-info}/WHEEL +1 -1
  478. ansible_test/_data/completion/docker.txt +7 -7
  479. ansible_test/_data/completion/remote.txt +6 -6
  480. ansible_test/_data/completion/windows.txt +1 -0
  481. ansible_test/_data/requirements/ansible.txt +2 -2
  482. ansible_test/_data/requirements/sanity.ansible-doc.txt +3 -3
  483. ansible_test/_data/requirements/sanity.changelog.txt +1 -1
  484. ansible_test/_data/requirements/sanity.import.plugin.txt +2 -2
  485. ansible_test/_data/requirements/sanity.pylint.txt +4 -4
  486. ansible_test/_data/requirements/sanity.validate-modules.txt +2 -2
  487. ansible_test/_data/requirements/sanity.yamllint.txt +1 -1
  488. ansible_test/_data/requirements/units.txt +1 -0
  489. ansible_test/_internal/__init__.py +1 -0
  490. ansible_test/_internal/ansible_util.py +2 -0
  491. ansible_test/_internal/become.py +1 -0
  492. ansible_test/_internal/bootstrap.py +1 -0
  493. ansible_test/_internal/cache.py +1 -0
  494. ansible_test/_internal/cgroup.py +1 -0
  495. ansible_test/_internal/ci/__init__.py +1 -0
  496. ansible_test/_internal/ci/azp.py +1 -0
  497. ansible_test/_internal/ci/local.py +1 -0
  498. ansible_test/_internal/classification/__init__.py +1 -0
  499. ansible_test/_internal/classification/common.py +1 -0
  500. ansible_test/_internal/classification/csharp.py +1 -0
  501. ansible_test/_internal/classification/powershell.py +1 -0
  502. ansible_test/_internal/classification/python.py +1 -0
  503. ansible_test/_internal/cli/__init__.py +1 -0
  504. ansible_test/_internal/cli/actions.py +1 -0
  505. ansible_test/_internal/cli/argparsing/__init__.py +1 -0
  506. ansible_test/_internal/cli/argparsing/actions.py +1 -0
  507. ansible_test/_internal/cli/argparsing/argcompletion.py +1 -0
  508. ansible_test/_internal/cli/argparsing/parsers.py +1 -0
  509. ansible_test/_internal/cli/commands/__init__.py +11 -0
  510. ansible_test/_internal/cli/commands/coverage/__init__.py +1 -0
  511. ansible_test/_internal/cli/commands/coverage/analyze/__init__.py +1 -0
  512. ansible_test/_internal/cli/commands/coverage/analyze/targets/__init__.py +1 -0
  513. ansible_test/_internal/cli/commands/coverage/analyze/targets/combine.py +1 -0
  514. ansible_test/_internal/cli/commands/coverage/analyze/targets/expand.py +1 -0
  515. ansible_test/_internal/cli/commands/coverage/analyze/targets/filter.py +1 -0
  516. ansible_test/_internal/cli/commands/coverage/analyze/targets/generate.py +1 -0
  517. ansible_test/_internal/cli/commands/coverage/analyze/targets/missing.py +1 -0
  518. ansible_test/_internal/cli/commands/coverage/combine.py +1 -0
  519. ansible_test/_internal/cli/commands/coverage/erase.py +1 -0
  520. ansible_test/_internal/cli/commands/coverage/html.py +1 -0
  521. ansible_test/_internal/cli/commands/coverage/report.py +1 -0
  522. ansible_test/_internal/cli/commands/coverage/xml.py +1 -0
  523. ansible_test/_internal/cli/commands/env.py +1 -0
  524. ansible_test/_internal/cli/commands/integration/__init__.py +1 -0
  525. ansible_test/_internal/cli/commands/integration/network.py +1 -0
  526. ansible_test/_internal/cli/commands/integration/posix.py +1 -0
  527. ansible_test/_internal/cli/commands/integration/windows.py +1 -0
  528. ansible_test/_internal/cli/commands/sanity.py +9 -0
  529. ansible_test/_internal/cli/commands/shell.py +1 -0
  530. ansible_test/_internal/cli/commands/units.py +1 -0
  531. ansible_test/_internal/cli/compat.py +1 -0
  532. ansible_test/_internal/cli/completers.py +1 -0
  533. ansible_test/_internal/cli/converters.py +1 -0
  534. ansible_test/_internal/cli/environments.py +1 -0
  535. ansible_test/_internal/cli/epilog.py +1 -0
  536. ansible_test/_internal/cli/parsers/__init__.py +1 -0
  537. ansible_test/_internal/cli/parsers/base_argument_parsers.py +1 -0
  538. ansible_test/_internal/cli/parsers/helpers.py +1 -0
  539. ansible_test/_internal/cli/parsers/host_config_parsers.py +1 -0
  540. ansible_test/_internal/cli/parsers/key_value_parsers.py +1 -0
  541. ansible_test/_internal/cli/parsers/value_parsers.py +1 -0
  542. ansible_test/_internal/commands/__init__.py +1 -0
  543. ansible_test/_internal/commands/coverage/__init__.py +2 -1
  544. ansible_test/_internal/commands/coverage/analyze/__init__.py +1 -0
  545. ansible_test/_internal/commands/coverage/analyze/targets/__init__.py +1 -0
  546. ansible_test/_internal/commands/coverage/analyze/targets/combine.py +1 -0
  547. ansible_test/_internal/commands/coverage/analyze/targets/expand.py +1 -0
  548. ansible_test/_internal/commands/coverage/analyze/targets/filter.py +1 -0
  549. ansible_test/_internal/commands/coverage/analyze/targets/generate.py +1 -0
  550. ansible_test/_internal/commands/coverage/analyze/targets/missing.py +1 -0
  551. ansible_test/_internal/commands/coverage/combine.py +2 -1
  552. ansible_test/_internal/commands/coverage/erase.py +1 -0
  553. ansible_test/_internal/commands/coverage/html.py +1 -0
  554. ansible_test/_internal/commands/coverage/report.py +1 -0
  555. ansible_test/_internal/commands/coverage/xml.py +1 -0
  556. ansible_test/_internal/commands/env/__init__.py +2 -0
  557. ansible_test/_internal/commands/integration/__init__.py +4 -0
  558. ansible_test/_internal/commands/integration/cloud/__init__.py +1 -0
  559. ansible_test/_internal/commands/integration/cloud/acme.py +2 -1
  560. ansible_test/_internal/commands/integration/cloud/aws.py +1 -0
  561. ansible_test/_internal/commands/integration/cloud/azure.py +1 -0
  562. ansible_test/_internal/commands/integration/cloud/cs.py +1 -0
  563. ansible_test/_internal/commands/integration/cloud/digitalocean.py +1 -0
  564. ansible_test/_internal/commands/integration/cloud/galaxy.py +3 -2
  565. ansible_test/_internal/commands/integration/cloud/hcloud.py +1 -0
  566. ansible_test/_internal/commands/integration/cloud/httptester.py +2 -1
  567. ansible_test/_internal/commands/integration/cloud/nios.py +2 -1
  568. ansible_test/_internal/commands/integration/cloud/opennebula.py +1 -0
  569. ansible_test/_internal/commands/integration/cloud/openshift.py +1 -0
  570. ansible_test/_internal/commands/integration/cloud/scaleway.py +1 -0
  571. ansible_test/_internal/commands/integration/cloud/vcenter.py +1 -0
  572. ansible_test/_internal/commands/integration/cloud/vultr.py +1 -0
  573. ansible_test/_internal/commands/integration/coverage.py +1 -0
  574. ansible_test/_internal/commands/integration/filters.py +1 -0
  575. ansible_test/_internal/commands/integration/network.py +1 -0
  576. ansible_test/_internal/commands/integration/posix.py +1 -0
  577. ansible_test/_internal/commands/integration/windows.py +1 -0
  578. ansible_test/_internal/commands/sanity/__init__.py +16 -1
  579. ansible_test/_internal/commands/sanity/ansible_doc.py +1 -0
  580. ansible_test/_internal/commands/sanity/bin_symlinks.py +1 -0
  581. ansible_test/_internal/commands/sanity/compile.py +1 -0
  582. ansible_test/_internal/commands/sanity/ignores.py +1 -0
  583. ansible_test/_internal/commands/sanity/import.py +1 -0
  584. ansible_test/_internal/commands/sanity/integration_aliases.py +1 -0
  585. ansible_test/_internal/commands/sanity/pep8.py +1 -0
  586. ansible_test/_internal/commands/sanity/pslint.py +1 -0
  587. ansible_test/_internal/commands/sanity/pylint.py +24 -26
  588. ansible_test/_internal/commands/sanity/shellcheck.py +1 -0
  589. ansible_test/_internal/commands/sanity/validate_modules.py +1 -0
  590. ansible_test/_internal/commands/sanity/yamllint.py +1 -0
  591. ansible_test/_internal/commands/shell/__init__.py +1 -0
  592. ansible_test/_internal/commands/units/__init__.py +1 -0
  593. ansible_test/_internal/compat/__init__.py +1 -0
  594. ansible_test/_internal/compat/packaging.py +1 -0
  595. ansible_test/_internal/compat/yaml.py +1 -0
  596. ansible_test/_internal/completion.py +1 -0
  597. ansible_test/_internal/config.py +2 -0
  598. ansible_test/_internal/connections.py +1 -0
  599. ansible_test/_internal/constants.py +1 -0
  600. ansible_test/_internal/containers.py +1 -0
  601. ansible_test/_internal/content_config.py +1 -0
  602. ansible_test/_internal/core_ci.py +1 -0
  603. ansible_test/_internal/coverage_util.py +11 -10
  604. ansible_test/_internal/data.py +1 -0
  605. ansible_test/_internal/delegation.py +1 -0
  606. ansible_test/_internal/dev/__init__.py +1 -0
  607. ansible_test/_internal/dev/container_probe.py +1 -0
  608. ansible_test/_internal/diff.py +3 -2
  609. ansible_test/_internal/docker_util.py +2 -1
  610. ansible_test/_internal/encoding.py +1 -0
  611. ansible_test/_internal/executor.py +1 -0
  612. ansible_test/_internal/git.py +1 -0
  613. ansible_test/_internal/host_configs.py +1 -0
  614. ansible_test/_internal/host_profiles.py +1 -0
  615. ansible_test/_internal/http.py +1 -0
  616. ansible_test/_internal/init.py +1 -0
  617. ansible_test/_internal/inventory.py +35 -3
  618. ansible_test/_internal/io.py +1 -0
  619. ansible_test/_internal/metadata.py +1 -0
  620. ansible_test/_internal/payload.py +1 -0
  621. ansible_test/_internal/provider/__init__.py +1 -0
  622. ansible_test/_internal/provider/layout/__init__.py +1 -0
  623. ansible_test/_internal/provider/layout/ansible.py +1 -0
  624. ansible_test/_internal/provider/layout/collection.py +1 -0
  625. ansible_test/_internal/provider/layout/unsupported.py +1 -0
  626. ansible_test/_internal/provider/source/__init__.py +1 -0
  627. ansible_test/_internal/provider/source/git.py +1 -0
  628. ansible_test/_internal/provider/source/installed.py +1 -0
  629. ansible_test/_internal/provider/source/unsupported.py +1 -0
  630. ansible_test/_internal/provider/source/unversioned.py +1 -0
  631. ansible_test/_internal/provisioning.py +1 -0
  632. ansible_test/_internal/pypi_proxy.py +6 -5
  633. ansible_test/_internal/python_requirements.py +1 -0
  634. ansible_test/_internal/ssh.py +1 -0
  635. ansible_test/_internal/target.py +1 -0
  636. ansible_test/_internal/test.py +3 -2
  637. ansible_test/_internal/thread.py +1 -0
  638. ansible_test/_internal/timeout.py +1 -0
  639. ansible_test/_internal/util.py +1 -0
  640. ansible_test/_internal/util_common.py +5 -2
  641. ansible_test/_internal/venv.py +1 -0
  642. ansible_test/_util/controller/sanity/code-smell/action-plugin-docs.py +1 -0
  643. ansible_test/_util/controller/sanity/code-smell/changelog/sphinx.py +1 -0
  644. ansible_test/_util/controller/sanity/code-smell/changelog.py +1 -0
  645. ansible_test/_util/controller/sanity/code-smell/empty-init.py +1 -0
  646. ansible_test/_util/controller/sanity/code-smell/line-endings.py +1 -0
  647. ansible_test/_util/controller/sanity/code-smell/no-assert.py +1 -0
  648. ansible_test/_util/controller/sanity/code-smell/no-get-exception.py +1 -0
  649. ansible_test/_util/controller/sanity/code-smell/no-illegal-filenames.py +1 -0
  650. ansible_test/_util/controller/sanity/code-smell/no-smart-quotes.py +1 -0
  651. ansible_test/_util/controller/sanity/code-smell/replace-urlopen.py +1 -0
  652. ansible_test/_util/controller/sanity/code-smell/runtime-metadata.py +28 -1
  653. ansible_test/_util/controller/sanity/code-smell/shebang.py +1 -0
  654. ansible_test/_util/controller/sanity/code-smell/symlinks.py +1 -0
  655. ansible_test/_util/controller/sanity/code-smell/use-argspec-type-path.py +1 -0
  656. ansible_test/_util/controller/sanity/code-smell/use-compat-six.py +1 -0
  657. ansible_test/_util/controller/sanity/integration-aliases/yaml_to_json.py +2 -1
  658. ansible_test/_util/controller/sanity/pep8/current-ignore.txt +4 -0
  659. ansible_test/_util/controller/sanity/pylint/config/ansible-test-target.cfg +7 -5
  660. ansible_test/_util/controller/sanity/pylint/config/ansible-test.cfg +7 -5
  661. ansible_test/_util/controller/sanity/pylint/config/code-smell.cfg +7 -5
  662. ansible_test/_util/controller/sanity/pylint/config/collection.cfg +3 -5
  663. ansible_test/_util/controller/sanity/pylint/config/default.cfg +7 -7
  664. ansible_test/_util/controller/sanity/pylint/plugins/deprecated.py +1 -13
  665. ansible_test/_util/controller/sanity/pylint/plugins/hide_unraisable.py +1 -0
  666. ansible_test/_util/controller/sanity/pylint/plugins/string_format.py +1 -8
  667. ansible_test/_util/controller/sanity/pylint/plugins/unwanted.py +1 -8
  668. ansible_test/_util/controller/sanity/validate-modules/validate_modules/main.py +55 -28
  669. ansible_test/_util/controller/sanity/validate-modules/validate_modules/module_args.py +12 -5
  670. ansible_test/_util/controller/sanity/validate-modules/validate_modules/schema.py +13 -2
  671. ansible_test/_util/controller/sanity/validate-modules/validate_modules/utils.py +1 -0
  672. ansible_test/_util/controller/sanity/yamllint/yamllinter.py +35 -17
  673. ansible_test/_util/controller/tools/collection_detail.py +1 -0
  674. ansible_test/_util/controller/tools/yaml_to_json.py +2 -1
  675. ansible_test/_util/target/pytest/plugins/ansible_forked.py +6 -1
  676. ansible_test/_util/target/pytest/plugins/ansible_pytest_collections.py +2 -1
  677. ansible_test/_util/target/pytest/plugins/ansible_pytest_coverage.py +1 -0
  678. ansible_test/_util/target/sanity/compile/compile.py +1 -0
  679. ansible_test/_util/target/sanity/import/importer.py +15 -16
  680. ansible_test/_util/target/setup/bootstrap.sh +9 -20
  681. ansible_test/_util/target/setup/probe_cgroups.py +1 -0
  682. ansible_test/_util/target/setup/quiet_pip.py +1 -0
  683. ansible_test/_util/target/setup/requirements.py +35 -27
  684. ansible_test/_util/target/tools/virtualenvcheck.py +2 -1
  685. ansible_test/_util/target/tools/yamlcheck.py +2 -1
  686. ansible/compat/selectors.py +0 -32
  687. ansible/errors/yaml_strings.py +0 -138
  688. ansible/executor/action_write_locks.py +0 -44
  689. ansible/executor/discovery/python_target.py +0 -47
  690. ansible/executor/powershell/module_powershell_wrapper.ps1 +0 -86
  691. ansible/executor/powershell/module_script_wrapper.ps1 +0 -22
  692. ansible/module_utils/compat/importlib.py +0 -26
  693. ansible/module_utils/compat/selectors.py +0 -32
  694. ansible/module_utils/pycompat24.py +0 -73
  695. ansible/parsing/utils/jsonify.py +0 -36
  696. ansible/parsing/yaml/constructor.py +0 -178
  697. ansible/template/native_helpers.py +0 -251
  698. ansible/template/template.py +0 -43
  699. ansible/template/vars.py +0 -77
  700. ansible/utils/native_jinja.py +0 -11
  701. ansible/vars/fact_cache.py +0 -71
  702. ansible_core-2.18.5rc1.dist-info/RECORD +0 -992
  703. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b1.dist-info}/Apache-License.txt +0 -0
  704. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b1.dist-info}/COPYING +0 -0
  705. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b1.dist-info}/MIT-license.txt +0 -0
  706. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b1.dist-info}/PSF-license.txt +0 -0
  707. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b1.dist-info}/entry_points.txt +0 -0
  708. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b1.dist-info}/simplified_bsd.txt +0 -0
  709. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b1.dist-info}/top_level.txt +0 -0
@@ -16,7 +16,7 @@
16
16
  # along with Ansible. If not, see <http://www.gnu.org/licenses/>.
17
17
  from __future__ import annotations
18
18
 
19
- DOCUMENTATION = '''
19
+ DOCUMENTATION = """
20
20
  name: linear
21
21
  short_description: Executes tasks in a linear fashion
22
22
  description:
@@ -27,29 +27,32 @@ DOCUMENTATION = '''
27
27
  notes:
28
28
  - This was the default Ansible behaviour before 'strategy plugins' were introduced in 2.0.
29
29
  author: Ansible Core Team
30
- '''
30
+ """
31
31
 
32
32
  from ansible import constants as C
33
- from ansible.errors import AnsibleError, AnsibleAssertionError, AnsibleParserError
34
- from ansible.module_utils.common.text.converters import to_text
33
+ from ansible.errors import AnsibleError, AnsibleAssertionError, AnsibleParserError, AnsibleValueOmittedError
35
34
  from ansible.playbook.handler import Handler
36
35
  from ansible.playbook.included_file import IncludedFile
37
36
  from ansible.plugins.loader import action_loader
38
37
  from ansible.plugins.strategy import StrategyBase
39
- from ansible.template import Templar
38
+ from ansible._internal._templating._engine import TemplateEngine
40
39
  from ansible.utils.display import Display
40
+ from ansible.inventory.host import Host
41
+ from ansible.playbook.task import Task
42
+ from ansible.executor.play_iterator import PlayIterator
41
43
 
42
44
  display = Display()
43
45
 
44
46
 
45
47
  class StrategyModule(StrategyBase):
46
48
 
47
- def _get_next_task_lockstep(self, hosts, iterator):
48
- '''
49
+ def _get_next_task_lockstep(self, hosts: list[Host], iterator: PlayIterator) -> list[tuple[Host, Task]]:
50
+ """
49
51
  Returns a list of (host, task) tuples, where the task may
50
52
  be a noop task to keep the iterator in lock step across
51
53
  all hosts.
52
- '''
54
+ """
55
+
53
56
  state_task_per_host = {}
54
57
  for host in hosts:
55
58
  state, task = iterator.get_next_task_for_host(host, peek=True)
@@ -84,17 +87,17 @@ class StrategyModule(StrategyBase):
84
87
  iterator.set_state_for_host(host.name, state)
85
88
  host_tasks.append((host, task))
86
89
 
87
- if cur_task.action in C._ACTION_META and cur_task.args.get('_raw_params') == 'flush_handlers':
90
+ if cur_task._get_meta() == 'flush_handlers':
88
91
  iterator.all_tasks[iterator.cur_task:iterator.cur_task] = [h for b in iterator._play.handlers for h in b.block]
89
92
 
90
93
  return host_tasks
91
94
 
92
95
  def run(self, iterator, play_context):
93
- '''
96
+ """
94
97
  The linear strategy is simple - get the next task and queue
95
98
  it for all hosts, then wait for the queue to drain before
96
99
  moving on to the next task
97
- '''
100
+ """
98
101
 
99
102
  # iterate over each task, while there is one left to run
100
103
  result = self._tqm.RUN_OK
@@ -130,26 +133,23 @@ class StrategyModule(StrategyBase):
130
133
  run_once = False
131
134
  work_to_do = True
132
135
 
133
- # check to see if this task should be skipped, due to it being a member of a
134
- # role which has already run (and whether that role allows duplicate execution)
135
- if not isinstance(task, Handler) and task._role:
136
- role_obj = self._get_cached_role(task, iterator._play)
137
- if role_obj.has_run(host) and task._role._metadata.allow_duplicates is False:
138
- display.debug("'%s' skipped because role has already run" % task)
139
- continue
136
+ host_name = host.get_name()
140
137
 
141
138
  display.debug("getting variables")
142
139
  task_vars = self._variable_manager.get_vars(play=iterator._play, host=host, task=task,
143
140
  _hosts=self._hosts_cache, _hosts_all=self._hosts_cache_all)
144
141
  self.add_tqm_variables(task_vars, play=iterator._play)
145
- templar = Templar(loader=self._loader, variables=task_vars)
142
+ templar = TemplateEngine(loader=self._loader, variables=task_vars)
146
143
  display.debug("done getting variables")
147
144
 
148
145
  # test to see if the task across all hosts points to an action plugin which
149
146
  # sets BYPASS_HOST_LOOP to true, or if it has run_once enabled. If so, we
150
147
  # will only send this task to the first host in the list.
151
148
 
152
- task_action = templar.template(task.action)
149
+ try:
150
+ task_action = templar.template(task.action)
151
+ except AnsibleValueOmittedError:
152
+ raise AnsibleParserError("Omit is not valid for the `action` keyword.", obj=task.action) from None
153
153
 
154
154
  try:
155
155
  action = action_loader.get(task_action, class_only=True, collection_list=task.collections)
@@ -162,7 +162,7 @@ class StrategyModule(StrategyBase):
162
162
  # for the linear strategy, we run meta tasks just once and for
163
163
  # all hosts currently being iterated over rather than one host
164
164
  results.extend(self._execute_meta(task, play_context, iterator, host))
165
- if task.args.get('_raw_params', None) not in ('noop', 'reset_connection', 'end_host', 'role_complete', 'flush_handlers', 'end_role'):
165
+ if task._get_meta() not in ('noop', 'reset_connection', 'end_host', 'role_complete', 'flush_handlers', 'end_role'):
166
166
  run_once = True
167
167
  if (task.any_errors_fatal or run_once) and not task.ignore_errors:
168
168
  any_errors_fatal = True
@@ -176,22 +176,20 @@ class StrategyModule(StrategyBase):
176
176
  break
177
177
 
178
178
  run_once = action and getattr(action, 'BYPASS_HOST_LOOP', False) or templar.template(task.run_once)
179
- try:
180
- task.name = to_text(templar.template(task.name, fail_on_undefined=False), nonstring='empty')
181
- except Exception as e:
182
- display.debug(f"Failed to templalte task name ({task.name}), ignoring error and continuing: {e}")
183
179
 
184
180
  if (task.any_errors_fatal or run_once) and not task.ignore_errors:
185
181
  any_errors_fatal = True
186
182
 
187
183
  if not callback_sent:
184
+ task.post_validate_attribute("name", templar=templar)
185
+
188
186
  if isinstance(task, Handler):
189
187
  self._tqm.send_callback('v2_playbook_on_handler_task_start', task)
190
188
  else:
191
189
  self._tqm.send_callback('v2_playbook_on_task_start', task, is_conditional=False)
192
190
  callback_sent = True
193
191
 
194
- self._blocked_hosts[host.get_name()] = True
192
+ self._blocked_hosts[host_name] = True
195
193
  self._queue_task(host, task, task_vars, play_context)
196
194
  del task_vars
197
195
 
@@ -283,11 +281,12 @@ class StrategyModule(StrategyBase):
283
281
  display.debug("done iterating over new_blocks loaded from include file")
284
282
  except AnsibleParserError:
285
283
  raise
286
- except AnsibleError as e:
287
- display.error(to_text(e), wrap_text=False)
284
+ except AnsibleError as ex:
285
+ # FIXME: send the error to the callback; don't directly write to display here
286
+ display.error(ex)
288
287
  for r in included_file._results:
289
288
  r._result['failed'] = True
290
- r._result['reason'] = str(e)
289
+ r._result['reason'] = str(ex)
291
290
  self._tqm._stats.increment('failures', r._host.name)
292
291
  self._tqm.send_callback('v2_runner_on_failed', r)
293
292
  failed_includes_hosts.add(r._host)
@@ -355,10 +354,9 @@ class StrategyModule(StrategyBase):
355
354
  return result
356
355
  display.debug("done checking to see if all hosts have failed")
357
356
 
358
- except (IOError, EOFError) as e:
359
- display.debug("got IOError/EOFError in task loop: %s" % e)
360
- # most likely an abort, return failed
361
- return self._tqm.RUN_UNKNOWN_ERROR
357
+ finally:
358
+ # removed unnecessary exception handler, don't want to mis-attribute the entire code block by changing indentation
359
+ pass
362
360
 
363
361
  # run the base class run() method, which executes the cleanup function
364
362
  # and runs any outstanding handlers which have been triggered
@@ -26,7 +26,7 @@ from ansible.errors import AnsibleConnectionFailure
26
26
 
27
27
 
28
28
  class TerminalBase(ABC):
29
- '''
29
+ """
30
30
  A base class for implementing cli connections
31
31
 
32
32
  .. note:: Unlike most of Ansible, nearly all strings in
@@ -36,7 +36,7 @@ class TerminalBase(ABC):
36
36
  :func:`~ansible.module_utils.common.text.converters.to_bytes` and
37
37
  :func:`~ansible.module_utils.common.text.converters.to_text` to avoid unexpected
38
38
  problems.
39
- '''
39
+ """
40
40
 
41
41
  #: compiled bytes regular expressions as stdout
42
42
  terminal_stdout_re = [] # type: list[re.Pattern]
@@ -64,11 +64,11 @@ class TerminalBase(ABC):
64
64
  self._connection = connection
65
65
 
66
66
  def _exec_cli_command(self, cmd, check_rc=True):
67
- '''
67
+ """
68
68
  Executes the CLI command on the remote device and returns the output
69
69
 
70
70
  :arg cmd: Byte string command to be executed
71
- '''
71
+ """
72
72
  return self._connection.exec_command(cmd)
73
73
 
74
74
  def _get_prompt(self):
@@ -3,10 +3,15 @@
3
3
 
4
4
  from __future__ import annotations
5
5
 
6
+ import typing as t
7
+
6
8
  from ansible.plugins import AnsibleJinja2Plugin
7
9
 
8
10
 
9
11
  class AnsibleJinja2Test(AnsibleJinja2Plugin):
12
+ @property
13
+ def plugin_type(self) -> str:
14
+ return "test"
10
15
 
11
- def _no_options(self, *args, **kwargs):
12
- raise NotImplementedError("Jinaj2 test plugins do not support option functions, they use direct arguments instead.")
16
+ def _no_options(self, *args, **kwargs) -> t.NoReturn:
17
+ raise NotImplementedError("Jinja2 test plugins do not support option functions, they use direct arguments instead.")
@@ -17,17 +17,22 @@
17
17
 
18
18
  from __future__ import annotations
19
19
 
20
+ import functools
20
21
  import re
21
22
  import operator as py_operator
22
23
 
23
24
  from collections.abc import MutableMapping, MutableSequence
24
25
 
26
+ from jinja2.tests import test_defined, test_undefined
27
+
25
28
  from ansible.module_utils.compat.version import LooseVersion, StrictVersion
26
29
 
27
30
  from ansible import errors
28
31
  from ansible.module_utils.common.text.converters import to_native, to_text, to_bytes
32
+ from ansible._internal._templating._jinja_common import Marker, UndefinedMarker
29
33
  from ansible.module_utils.parsing.convert_bool import boolean
30
- from ansible.parsing.vault import is_encrypted_file
34
+ from ansible.plugins import accept_args_markers
35
+ from ansible.parsing.vault import is_encrypted_file, VaultHelper, VaultLib
31
36
  from ansible.utils.display import Display
32
37
  from ansible.utils.version import SemanticVersion
33
38
 
@@ -41,38 +46,38 @@ display = Display()
41
46
 
42
47
 
43
48
  def timedout(result):
44
- ''' Test if task result yields a time out'''
49
+ """ Test if task result yields a time out"""
45
50
  if not isinstance(result, MutableMapping):
46
51
  raise errors.AnsibleFilterError("The 'timedout' test expects a dictionary")
47
52
  return result.get('timedout', False) and result['timedout'].get('period', False)
48
53
 
49
54
 
50
55
  def failed(result):
51
- ''' Test if task result yields failed '''
56
+ """ Test if task result yields failed """
52
57
  if not isinstance(result, MutableMapping):
53
58
  raise errors.AnsibleFilterError("The 'failed' test expects a dictionary")
54
59
  return result.get('failed', False)
55
60
 
56
61
 
57
62
  def success(result):
58
- ''' Test if task result yields success '''
63
+ """ Test if task result yields success """
59
64
  return not failed(result)
60
65
 
61
66
 
62
67
  def unreachable(result):
63
- ''' Test if task result yields unreachable '''
68
+ """ Test if task result yields unreachable """
64
69
  if not isinstance(result, MutableMapping):
65
70
  raise errors.AnsibleFilterError("The 'unreachable' test expects a dictionary")
66
71
  return result.get('unreachable', False)
67
72
 
68
73
 
69
74
  def reachable(result):
70
- ''' Test if task result yields reachable '''
75
+ """ Test if task result yields reachable """
71
76
  return not unreachable(result)
72
77
 
73
78
 
74
79
  def changed(result):
75
- ''' Test if task result yields changed '''
80
+ """ Test if task result yields changed """
76
81
  if not isinstance(result, MutableMapping):
77
82
  raise errors.AnsibleFilterError("The 'changed' test expects a dictionary")
78
83
  if 'changed' not in result:
@@ -92,14 +97,14 @@ def changed(result):
92
97
 
93
98
 
94
99
  def skipped(result):
95
- ''' Test if task result yields skipped '''
100
+ """ Test if task result yields skipped """
96
101
  if not isinstance(result, MutableMapping):
97
102
  raise errors.AnsibleFilterError("The 'skipped' test expects a dictionary")
98
103
  return result.get('skipped', False)
99
104
 
100
105
 
101
106
  def started(result):
102
- ''' Test if async task has started '''
107
+ """ Test if async task has started """
103
108
  if not isinstance(result, MutableMapping):
104
109
  raise errors.AnsibleFilterError("The 'started' test expects a dictionary")
105
110
  if 'started' in result:
@@ -113,7 +118,7 @@ def started(result):
113
118
 
114
119
 
115
120
  def finished(result):
116
- ''' Test if async task has finished '''
121
+ """ Test if async task has finished """
117
122
  if not isinstance(result, MutableMapping):
118
123
  raise errors.AnsibleFilterError("The 'finished' test expects a dictionary")
119
124
  if 'finished' in result:
@@ -127,12 +132,10 @@ def finished(result):
127
132
 
128
133
 
129
134
  def regex(value='', pattern='', ignorecase=False, multiline=False, match_type='search'):
130
- ''' Expose `re` as a boolean filter using the `search` method by default.
135
+ """ Expose `re` as a boolean filter using the `search` method by default.
131
136
  This is likely only useful for `search` and `match` which already
132
137
  have their own filters.
133
- '''
134
- # In addition to ensuring the correct type, to_text here will ensure
135
- # _fail_with_undefined_error happens if the value is Undefined
138
+ """
136
139
  value = to_text(value, errors='surrogate_or_strict')
137
140
  flags = 0
138
141
  if ignorecase:
@@ -143,12 +146,19 @@ def regex(value='', pattern='', ignorecase=False, multiline=False, match_type='s
143
146
  return bool(getattr(_re, match_type, 'search')(value))
144
147
 
145
148
 
146
- def vault_encrypted(value):
149
+ @accept_args_markers
150
+ def vault_encrypted(value: object) -> bool:
147
151
  """Evaluate whether a variable is a single vault encrypted value
148
152
 
149
153
  .. versionadded:: 2.10
150
154
  """
151
- return getattr(value, '__ENCRYPTED__', False) and value.is_encrypted()
155
+ if ciphertext := VaultHelper.get_ciphertext(value, with_tags=False):
156
+ return VaultLib.is_encrypted(ciphertext)
157
+
158
+ if isinstance(value, Marker):
159
+ value.trip()
160
+
161
+ return False
152
162
 
153
163
 
154
164
  def vaulted_file(value):
@@ -164,17 +174,17 @@ def vaulted_file(value):
164
174
 
165
175
 
166
176
  def match(value, pattern='', ignorecase=False, multiline=False):
167
- ''' Perform a `re.match` returning a boolean '''
177
+ """ Perform a `re.match` returning a boolean """
168
178
  return regex(value, pattern, ignorecase, multiline, 'match')
169
179
 
170
180
 
171
181
  def search(value, pattern='', ignorecase=False, multiline=False):
172
- ''' Perform a `re.search` returning a boolean '''
182
+ """ Perform a `re.search` returning a boolean """
173
183
  return regex(value, pattern, ignorecase, multiline, 'search')
174
184
 
175
185
 
176
186
  def version_compare(value, version, operator='eq', strict=None, version_type=None):
177
- ''' Perform a version comparison on a value '''
187
+ """ Perform a version comparison on a value """
178
188
  op_map = {
179
189
  '==': 'eq', '=': 'eq', 'eq': 'eq',
180
190
  '<': 'lt', 'lt': 'lt',
@@ -257,8 +267,28 @@ def falsy(value, convert_bool=False):
257
267
  return not truthy(value, convert_bool=convert_bool)
258
268
 
259
269
 
270
+ @accept_args_markers
271
+ @functools.wraps(test_defined)
272
+ def wrapped_test_defined(value: object) -> Marker | bool:
273
+ """Wrapper around Jinja's `defined` test to avoid mutating the externally-owned function with our marker attribute."""
274
+ if isinstance(value, Marker) and not isinstance(value, UndefinedMarker):
275
+ return value
276
+
277
+ return test_defined(value)
278
+
279
+
280
+ @accept_args_markers
281
+ @functools.wraps(test_undefined)
282
+ def wrapped_test_undefined(value: object) -> Marker | bool:
283
+ """Wrapper around Jinja's `undefined` test to avoid mutating the externally-owned function with our marker attribute."""
284
+ if isinstance(value, Marker) and not isinstance(value, UndefinedMarker):
285
+ return value
286
+
287
+ return test_undefined(value)
288
+
289
+
260
290
  class TestModule(object):
261
- ''' Ansible core jinja2 tests '''
291
+ """ Ansible core jinja2 tests """
262
292
 
263
293
  def tests(self):
264
294
  return {
@@ -304,4 +334,8 @@ class TestModule(object):
304
334
  # vault
305
335
  'vault_encrypted': vault_encrypted,
306
336
  'vaulted_file': vaulted_file,
337
+
338
+ # overrides that require special arg handling
339
+ 'defined': wrapped_test_defined,
340
+ 'undefined': wrapped_test_undefined,
307
341
  }
@@ -21,7 +21,7 @@ from os.path import isdir, isfile, isabs, exists, lexists, islink, samefile, ism
21
21
 
22
22
 
23
23
  class TestModule(object):
24
- ''' Ansible file jinja2 tests '''
24
+ """ Ansible file jinja2 tests """
25
25
 
26
26
  def tests(self):
27
27
  return {
@@ -36,15 +36,15 @@ def isnotanumber(x):
36
36
 
37
37
 
38
38
  def contains(seq, value):
39
- '''Opposite of the ``in`` test, allowing use as a test in filters like ``selectattr``
39
+ """Opposite of the ``in`` test, allowing use as a test in filters like ``selectattr``
40
40
 
41
41
  .. versionadded:: 2.8
42
- '''
42
+ """
43
43
  return value in seq
44
44
 
45
45
 
46
46
  class TestModule:
47
- ''' Ansible math jinja2 tests '''
47
+ """ Ansible math jinja2 tests """
48
48
 
49
49
  def tests(self):
50
50
  return {
@@ -6,7 +6,7 @@ from urllib.parse import urlparse
6
6
 
7
7
 
8
8
  def is_uri(value, schemes=None):
9
- ''' Will verify that the string passed is a valid 'URI', if given a list of valid schemes it will match those '''
9
+ """ Will verify that the string passed is a valid 'URI', if given a list of valid schemes it will match those """
10
10
  try:
11
11
  x = urlparse(value)
12
12
  isit = all([x.scheme is not None, x.path is not None, not schemes or x.scheme in schemes])
@@ -16,7 +16,7 @@ def is_uri(value, schemes=None):
16
16
 
17
17
 
18
18
  def is_url(value, schemes=None):
19
- ''' Will verify that the string passed is a valid 'URL' '''
19
+ """ Will verify that the string passed is a valid 'URL' """
20
20
 
21
21
  isit = is_uri(value, schemes)
22
22
  if isit:
@@ -33,7 +33,7 @@ def is_urn(value):
33
33
 
34
34
 
35
35
  class TestModule(object):
36
- ''' Ansible URI jinja2 test '''
36
+ """ Ansible URI jinja2 test """
37
37
 
38
38
  def tests(self):
39
39
  return {
@@ -17,7 +17,7 @@
17
17
  #############################################
18
18
  from __future__ import annotations
19
19
 
20
- DOCUMENTATION = '''
20
+ DOCUMENTATION = """
21
21
  name: host_group_vars
22
22
  version_added: "2.4"
23
23
  short_description: In charge of loading group_vars and host_vars
@@ -50,7 +50,7 @@ DOCUMENTATION = '''
50
50
  elements: string
51
51
  extends_documentation_fragment:
52
52
  - vars_plugin_staging
53
- '''
53
+ """
54
54
 
55
55
  import os
56
56
  from ansible.errors import AnsibleParserError
@@ -63,7 +63,6 @@ from ansible.utils.vars import combine_vars
63
63
  CANONICAL_PATHS = {} # type: dict[str, str]
64
64
  FOUND = {} # type: dict[str, list[str]]
65
65
  NAK = set() # type: set[str]
66
- PATH_CACHE = {} # type: dict[tuple[str, str], str]
67
66
 
68
67
 
69
68
  class VarsModule(BaseVarsPlugin):
@@ -73,13 +72,13 @@ class VarsModule(BaseVarsPlugin):
73
72
 
74
73
  def load_found_files(self, loader, data, found_files):
75
74
  for found in found_files:
76
- new_data = loader.load_from_file(found, cache='all', unsafe=True)
75
+ new_data = loader.load_from_file(found, cache='all', unsafe=True, trusted_as_template=True)
77
76
  if new_data: # ignore empty files
78
77
  data = combine_vars(data, new_data)
79
78
  return data
80
79
 
81
80
  def get_vars(self, loader, path, entities, cache=True):
82
- ''' parses the inventory file '''
81
+ """ parses the inventory file """
83
82
 
84
83
  if not isinstance(entities, list):
85
84
  entities = [entities]
@@ -119,21 +118,15 @@ class VarsModule(BaseVarsPlugin):
119
118
  else:
120
119
  raise AnsibleParserError("Supplied entity must be Host or Group, got %s instead" % (type(entity)))
121
120
 
122
- if cache:
123
- try:
124
- opath = PATH_CACHE[(realpath_basedir, subdir)]
125
- except KeyError:
126
- opath = PATH_CACHE[(realpath_basedir, subdir)] = os.path.join(realpath_basedir, subdir)
121
+ opath = os.path.join(realpath_basedir, subdir)
122
+ key = '%s.%s' % (entity_name, opath)
127
123
 
124
+ if cache:
128
125
  if opath in NAK:
129
126
  continue
130
- key = '%s.%s' % (entity_name, opath)
131
127
  if key in FOUND:
132
128
  data = self.load_found_files(loader, data, FOUND[key])
133
129
  continue
134
- else:
135
- opath = PATH_CACHE[(realpath_basedir, subdir)] = os.path.join(realpath_basedir, subdir)
136
-
137
130
  if os.path.isdir(opath):
138
131
  self._display.debug("\tprocessing dir %s" % opath)
139
132
  FOUND[key] = found_files = loader.find_vars_files(opath, entity_name)
ansible/release.py CHANGED
@@ -17,6 +17,6 @@
17
17
 
18
18
  from __future__ import annotations
19
19
 
20
- __version__ = '2.18.5rc1'
20
+ __version__ = '2.19.0b1'
21
21
  __author__ = 'Ansible, Inc.'
22
- __codename__ = "Fool in the Rain"
22
+ __codename__ = "What Is and What Should Never Be"