ansible-core 2.18.7rc1__py3-none-any.whl → 2.19.0__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.

Potentially problematic release.


This version of ansible-core might be problematic. Click here for more details.

Files changed (757) hide show
  1. ansible/_internal/__init__.py +53 -0
  2. ansible/_internal/_ansiballz/__init__.py +0 -0
  3. ansible/_internal/_ansiballz/_builder.py +101 -0
  4. ansible/_internal/_ansiballz/_wrapper.py +262 -0
  5. ansible/_internal/_collection_proxy.py +47 -0
  6. ansible/_internal/_datatag/__init__.py +0 -0
  7. ansible/_internal/_datatag/_tags.py +130 -0
  8. ansible/_internal/_datatag/_utils.py +19 -0
  9. ansible/_internal/_datatag/_wrappers.py +33 -0
  10. ansible/_internal/_errors/__init__.py +0 -0
  11. ansible/_internal/_errors/_alarm_timeout.py +66 -0
  12. ansible/_internal/_errors/_captured.py +123 -0
  13. ansible/_internal/_errors/_error_factory.py +89 -0
  14. ansible/_internal/_errors/_error_utils.py +240 -0
  15. ansible/_internal/_errors/_handler.py +91 -0
  16. ansible/_internal/_errors/_task_timeout.py +28 -0
  17. ansible/_internal/_event_formatting.py +127 -0
  18. ansible/_internal/_json/__init__.py +214 -0
  19. ansible/_internal/_json/_legacy_encoder.py +34 -0
  20. ansible/_internal/_json/_profiles/__init__.py +0 -0
  21. ansible/_internal/_json/_profiles/_cache_persistence.py +57 -0
  22. ansible/_internal/_json/_profiles/_inventory_legacy.py +40 -0
  23. ansible/_internal/_json/_profiles/_legacy.py +189 -0
  24. ansible/_internal/_locking.py +21 -0
  25. ansible/_internal/_plugins/__init__.py +0 -0
  26. ansible/_internal/_plugins/_cache.py +57 -0
  27. ansible/_internal/_ssh/__init__.py +0 -0
  28. ansible/_internal/_ssh/_agent_launch.py +91 -0
  29. ansible/_internal/_ssh/_ssh_agent.py +619 -0
  30. ansible/_internal/_task.py +78 -0
  31. ansible/_internal/_templating/__init__.py +12 -0
  32. ansible/_internal/_templating/_access.py +86 -0
  33. ansible/_internal/_templating/_chain_templar.py +63 -0
  34. ansible/_internal/_templating/_datatag.py +95 -0
  35. ansible/_internal/_templating/_engine.py +592 -0
  36. ansible/_internal/_templating/_errors.py +28 -0
  37. ansible/_internal/_templating/_jinja_bits.py +1106 -0
  38. ansible/_internal/_templating/_jinja_common.py +323 -0
  39. ansible/_internal/_templating/_jinja_patches.py +44 -0
  40. ansible/_internal/_templating/_jinja_plugins.py +375 -0
  41. ansible/_internal/_templating/_lazy_containers.py +633 -0
  42. ansible/_internal/_templating/_marker_behaviors.py +103 -0
  43. ansible/_internal/_templating/_template_vars.py +72 -0
  44. ansible/_internal/_templating/_transform.py +70 -0
  45. ansible/_internal/_templating/_utils.py +108 -0
  46. ansible/_internal/_testing.py +26 -0
  47. ansible/_internal/_wrapt.py +1052 -0
  48. ansible/_internal/_yaml/__init__.py +0 -0
  49. ansible/_internal/_yaml/_constructor.py +240 -0
  50. ansible/_internal/_yaml/_dumper.py +70 -0
  51. ansible/_internal/_yaml/_errors.py +166 -0
  52. ansible/_internal/_yaml/_loader.py +66 -0
  53. ansible/_internal/ansible_collections/ansible/_protomatter/README.md +11 -0
  54. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/action/debug.py +36 -0
  55. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/apply_trust.py +19 -0
  56. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/dump_object.py +27 -0
  57. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/finalize.py +16 -0
  58. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/origin.py +18 -0
  59. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.py +24 -0
  60. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.yml +33 -0
  61. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/tag_names.py +16 -0
  62. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/true_type.py +17 -0
  63. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/unmask.py +49 -0
  64. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.py +21 -0
  65. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.yml +2 -0
  66. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.py +15 -0
  67. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.yml +19 -0
  68. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.py +18 -0
  69. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.yml +19 -0
  70. ansible/cli/__init__.py +93 -104
  71. ansible/cli/_ssh_askpass.py +54 -0
  72. ansible/cli/adhoc.py +20 -10
  73. ansible/cli/arguments/option_helpers.py +163 -10
  74. ansible/cli/config.py +43 -68
  75. ansible/cli/console.py +13 -11
  76. ansible/cli/doc.py +134 -77
  77. ansible/cli/galaxy.py +27 -20
  78. ansible/cli/inventory.py +28 -28
  79. ansible/cli/playbook.py +4 -12
  80. ansible/cli/pull.py +6 -3
  81. ansible/cli/scripts/ansible_connection_cli_stub.py +7 -7
  82. ansible/cli/vault.py +12 -11
  83. ansible/compat/__init__.py +2 -2
  84. ansible/compat/importlib_resources.py +9 -12
  85. ansible/config/base.yml +218 -133
  86. ansible/config/manager.py +220 -159
  87. ansible/constants.py +2 -65
  88. ansible/errors/__init__.py +350 -256
  89. ansible/executor/interpreter_discovery.py +28 -149
  90. ansible/executor/module_common.py +480 -514
  91. ansible/executor/play_iterator.py +22 -27
  92. ansible/executor/playbook_executor.py +11 -11
  93. ansible/executor/powershell/async_watchdog.ps1 +97 -102
  94. ansible/executor/powershell/async_wrapper.ps1 +204 -153
  95. ansible/executor/powershell/become_wrapper.ps1 +107 -144
  96. ansible/executor/powershell/bootstrap_wrapper.ps1 +46 -9
  97. ansible/executor/powershell/coverage_wrapper.ps1 +91 -135
  98. ansible/executor/powershell/exec_wrapper.ps1 +675 -196
  99. ansible/executor/powershell/module_manifest.py +469 -265
  100. ansible/executor/powershell/module_wrapper.ps1 +195 -186
  101. ansible/executor/powershell/powershell_expand_user.ps1 +20 -0
  102. ansible/executor/powershell/powershell_mkdtemp.ps1 +17 -0
  103. ansible/executor/powershell/psrp_fetch_file.ps1 +41 -0
  104. ansible/executor/powershell/psrp_put_file.ps1 +122 -0
  105. ansible/executor/powershell/winrm_fetch_file.ps1 +46 -0
  106. ansible/executor/powershell/winrm_put_file.ps1 +36 -0
  107. ansible/executor/process/worker.py +139 -149
  108. ansible/executor/stats.py +5 -5
  109. ansible/executor/task_executor.py +270 -297
  110. ansible/executor/task_queue_manager.py +135 -137
  111. ansible/executor/task_result.py +182 -79
  112. ansible/galaxy/__init__.py +2 -2
  113. ansible/galaxy/api.py +26 -25
  114. ansible/galaxy/collection/__init__.py +6 -14
  115. ansible/galaxy/collection/concrete_artifact_manager.py +12 -21
  116. ansible/galaxy/dependency_resolution/dataclasses.py +14 -4
  117. ansible/galaxy/dependency_resolution/providers.py +4 -4
  118. ansible/galaxy/dependency_resolution/reporters.py +81 -0
  119. ansible/galaxy/role.py +6 -10
  120. ansible/galaxy/token.py +28 -21
  121. ansible/inventory/data.py +47 -57
  122. ansible/inventory/group.py +50 -73
  123. ansible/inventory/helpers.py +9 -0
  124. ansible/inventory/host.py +37 -54
  125. ansible/inventory/manager.py +79 -34
  126. ansible/keyword_desc.yml +1 -1
  127. ansible/module_utils/_internal/__init__.py +55 -0
  128. ansible/module_utils/_internal/_ambient_context.py +58 -0
  129. ansible/module_utils/_internal/_ansiballz/__init__.py +0 -0
  130. ansible/module_utils/_internal/_ansiballz/_extensions/__init__.py +0 -0
  131. ansible/module_utils/_internal/_ansiballz/_extensions/_coverage.py +45 -0
  132. ansible/module_utils/_internal/_ansiballz/_extensions/_pydevd.py +62 -0
  133. ansible/module_utils/_internal/_ansiballz/_loader.py +81 -0
  134. ansible/module_utils/_internal/_ansiballz/_respawn.py +32 -0
  135. ansible/module_utils/_internal/_ansiballz/_respawn_wrapper.py +23 -0
  136. ansible/module_utils/_internal/_concurrent/_daemon_threading.py +1 -0
  137. ansible/module_utils/_internal/_dataclass_validation.py +217 -0
  138. ansible/module_utils/_internal/_datatag/__init__.py +961 -0
  139. ansible/module_utils/_internal/_datatag/_tags.py +16 -0
  140. ansible/module_utils/_internal/_debugging.py +31 -0
  141. ansible/module_utils/_internal/_deprecator.py +157 -0
  142. ansible/module_utils/_internal/_errors.py +101 -0
  143. ansible/module_utils/_internal/_event_utils.py +61 -0
  144. ansible/module_utils/_internal/_json/__init__.py +63 -0
  145. ansible/module_utils/_internal/_json/_legacy_encoder.py +26 -0
  146. ansible/module_utils/_internal/_json/_profiles/__init__.py +428 -0
  147. ansible/module_utils/_internal/_json/_profiles/_fallback_to_str.py +73 -0
  148. ansible/module_utils/_internal/_json/_profiles/_module_legacy_c2m.py +33 -0
  149. ansible/module_utils/_internal/_json/_profiles/_module_legacy_m2c.py +37 -0
  150. ansible/module_utils/_internal/_json/_profiles/_module_modern_c2m.py +35 -0
  151. ansible/module_utils/_internal/_json/_profiles/_module_modern_m2c.py +33 -0
  152. ansible/module_utils/_internal/_json/_profiles/_tagless.py +52 -0
  153. ansible/module_utils/_internal/_messages.py +130 -0
  154. ansible/module_utils/_internal/_patches/__init__.py +66 -0
  155. ansible/module_utils/_internal/_patches/_dataclass_annotation_patch.py +53 -0
  156. ansible/module_utils/_internal/_patches/_socket_patch.py +34 -0
  157. ansible/module_utils/_internal/_patches/_sys_intern_patch.py +34 -0
  158. ansible/module_utils/_internal/_plugin_info.py +38 -0
  159. ansible/module_utils/_internal/_stack.py +22 -0
  160. ansible/module_utils/_internal/_testing.py +0 -0
  161. ansible/module_utils/_internal/_text_utils.py +6 -0
  162. ansible/module_utils/_internal/_traceback.py +92 -0
  163. ansible/module_utils/_internal/_validation.py +14 -0
  164. ansible/module_utils/ansible_release.py +2 -2
  165. ansible/module_utils/api.py +1 -2
  166. ansible/module_utils/basic.py +303 -202
  167. ansible/module_utils/common/_utils.py +24 -28
  168. ansible/module_utils/common/arg_spec.py +8 -3
  169. ansible/module_utils/common/collections.py +7 -2
  170. ansible/module_utils/common/dict_transformations.py +2 -2
  171. ansible/module_utils/common/file.py +2 -2
  172. ansible/module_utils/common/json.py +90 -84
  173. ansible/module_utils/common/locale.py +2 -2
  174. ansible/module_utils/common/parameters.py +27 -24
  175. ansible/module_utils/common/process.py +2 -3
  176. ansible/module_utils/common/respawn.py +11 -33
  177. ansible/module_utils/common/sentinel.py +66 -0
  178. ansible/module_utils/common/sys_info.py +8 -8
  179. ansible/module_utils/common/text/converters.py +16 -37
  180. ansible/module_utils/common/validation.py +35 -24
  181. ansible/module_utils/common/warnings.py +143 -25
  182. ansible/module_utils/common/yaml.py +29 -3
  183. ansible/module_utils/compat/datetime.py +33 -21
  184. ansible/module_utils/compat/paramiko.py +21 -10
  185. ansible/module_utils/compat/typing.py +6 -5
  186. ansible/module_utils/connection.py +10 -13
  187. ansible/module_utils/csharp/Ansible.Basic.cs +15 -12
  188. ansible/module_utils/csharp/Ansible.Become.cs +1 -0
  189. ansible/module_utils/csharp/Ansible.Privilege.cs +2 -2
  190. ansible/module_utils/csharp/Ansible._Async.cs +517 -0
  191. ansible/module_utils/datatag.py +49 -0
  192. ansible/module_utils/distro/__init__.py +2 -2
  193. ansible/module_utils/facts/ansible_collector.py +4 -5
  194. ansible/module_utils/facts/collector.py +13 -14
  195. ansible/module_utils/facts/compat.py +4 -4
  196. ansible/module_utils/facts/default_collectors.py +1 -1
  197. ansible/module_utils/facts/hardware/aix.py +34 -0
  198. ansible/module_utils/facts/hardware/base.py +2 -2
  199. ansible/module_utils/facts/hardware/darwin.py +1 -3
  200. ansible/module_utils/facts/hardware/freebsd.py +2 -2
  201. ansible/module_utils/facts/hardware/linux.py +5 -5
  202. ansible/module_utils/facts/namespace.py +1 -1
  203. ansible/module_utils/facts/network/base.py +1 -1
  204. ansible/module_utils/facts/network/fc_wwn.py +1 -2
  205. ansible/module_utils/facts/network/iscsi.py +1 -2
  206. ansible/module_utils/facts/network/nvme.py +1 -2
  207. ansible/module_utils/facts/other/facter.py +2 -3
  208. ansible/module_utils/facts/other/ohai.py +2 -3
  209. ansible/module_utils/facts/sysctl.py +4 -6
  210. ansible/module_utils/facts/system/apparmor.py +1 -2
  211. ansible/module_utils/facts/system/caps.py +3 -3
  212. ansible/module_utils/facts/system/chroot.py +1 -2
  213. ansible/module_utils/facts/system/cmdline.py +1 -2
  214. ansible/module_utils/facts/system/date_time.py +5 -3
  215. ansible/module_utils/facts/system/distribution.py +27 -13
  216. ansible/module_utils/facts/system/dns.py +1 -1
  217. ansible/module_utils/facts/system/env.py +1 -2
  218. ansible/module_utils/facts/system/fips.py +7 -20
  219. ansible/module_utils/facts/system/loadavg.py +1 -2
  220. ansible/module_utils/facts/system/local.py +2 -3
  221. ansible/module_utils/facts/system/lsb.py +1 -2
  222. ansible/module_utils/facts/system/pkg_mgr.py +1 -2
  223. ansible/module_utils/facts/system/platform.py +1 -2
  224. ansible/module_utils/facts/system/python.py +1 -2
  225. ansible/module_utils/facts/system/selinux.py +1 -1
  226. ansible/module_utils/facts/system/service_mgr.py +1 -2
  227. ansible/module_utils/facts/system/ssh_pub_keys.py +1 -1
  228. ansible/module_utils/facts/system/systemd.py +1 -1
  229. ansible/module_utils/facts/system/user.py +1 -2
  230. ansible/module_utils/facts/utils.py +3 -3
  231. ansible/module_utils/facts/virtual/base.py +1 -1
  232. ansible/module_utils/facts/virtual/linux.py +3 -3
  233. ansible/module_utils/facts/virtual/sunos.py +3 -15
  234. ansible/module_utils/facts/virtual/sysctl.py +3 -16
  235. ansible/module_utils/json_utils.py +2 -2
  236. ansible/module_utils/parsing/convert_bool.py +7 -1
  237. ansible/module_utils/powershell/Ansible.ModuleUtils.AddType.psm1 +1 -1
  238. ansible/module_utils/powershell/Ansible.ModuleUtils.CamelConversion.psm1 +1 -1
  239. ansible/module_utils/powershell/Ansible.ModuleUtils.CommandUtil.psm1 +1 -1
  240. ansible/module_utils/powershell/Ansible.ModuleUtils.WebRequest.psm1 +1 -1
  241. ansible/module_utils/service.py +21 -31
  242. ansible/module_utils/splitter.py +7 -7
  243. ansible/module_utils/testing.py +31 -0
  244. ansible/module_utils/urls.py +64 -35
  245. ansible/modules/add_host.py +4 -4
  246. ansible/modules/apt.py +69 -49
  247. ansible/modules/apt_key.py +19 -12
  248. ansible/modules/apt_repository.py +32 -51
  249. ansible/modules/assemble.py +16 -14
  250. ansible/modules/assert.py +4 -4
  251. ansible/modules/async_status.py +24 -24
  252. ansible/modules/async_wrapper.py +20 -25
  253. ansible/modules/blockinfile.py +6 -7
  254. ansible/modules/command.py +13 -20
  255. ansible/modules/copy.py +60 -147
  256. ansible/modules/cron.py +24 -21
  257. ansible/modules/deb822_repository.py +8 -9
  258. ansible/modules/debconf.py +5 -5
  259. ansible/modules/debug.py +4 -4
  260. ansible/modules/dnf.py +8 -8
  261. ansible/modules/dnf5.py +39 -13
  262. ansible/modules/dpkg_selections.py +4 -4
  263. ansible/modules/expect.py +13 -15
  264. ansible/modules/fail.py +4 -4
  265. ansible/modules/fetch.py +4 -4
  266. ansible/modules/file.py +184 -144
  267. ansible/modules/find.py +22 -20
  268. ansible/modules/gather_facts.py +3 -3
  269. ansible/modules/get_url.py +77 -54
  270. ansible/modules/getent.py +7 -9
  271. ansible/modules/git.py +38 -38
  272. ansible/modules/group.py +6 -6
  273. ansible/modules/group_by.py +4 -4
  274. ansible/modules/hostname.py +15 -32
  275. ansible/modules/import_playbook.py +6 -6
  276. ansible/modules/import_role.py +6 -6
  277. ansible/modules/import_tasks.py +6 -6
  278. ansible/modules/include_role.py +6 -6
  279. ansible/modules/include_tasks.py +6 -6
  280. ansible/modules/include_vars.py +6 -6
  281. ansible/modules/iptables.py +86 -73
  282. ansible/modules/known_hosts.py +22 -24
  283. ansible/modules/lineinfile.py +5 -5
  284. ansible/modules/meta.py +4 -4
  285. ansible/modules/mount_facts.py +2 -2
  286. ansible/modules/package.py +10 -4
  287. ansible/modules/package_facts.py +22 -10
  288. ansible/modules/pause.py +6 -6
  289. ansible/modules/ping.py +6 -6
  290. ansible/modules/pip.py +21 -26
  291. ansible/modules/raw.py +6 -6
  292. ansible/modules/reboot.py +6 -6
  293. ansible/modules/replace.py +10 -14
  294. ansible/modules/rpm_key.py +7 -8
  295. ansible/modules/script.py +4 -4
  296. ansible/modules/service.py +10 -17
  297. ansible/modules/service_facts.py +87 -10
  298. ansible/modules/set_fact.py +5 -5
  299. ansible/modules/set_stats.py +4 -4
  300. ansible/modules/setup.py +2 -2
  301. ansible/modules/shell.py +6 -6
  302. ansible/modules/slurp.py +16 -19
  303. ansible/modules/stat.py +15 -31
  304. ansible/modules/subversion.py +15 -15
  305. ansible/modules/systemd.py +7 -7
  306. ansible/modules/systemd_service.py +7 -7
  307. ansible/modules/sysvinit.py +9 -9
  308. ansible/modules/tempfile.py +5 -6
  309. ansible/modules/template.py +6 -6
  310. ansible/modules/unarchive.py +38 -17
  311. ansible/modules/uri.py +33 -26
  312. ansible/modules/user.py +45 -32
  313. ansible/modules/validate_argument_spec.py +10 -7
  314. ansible/modules/wait_for.py +70 -60
  315. ansible/modules/wait_for_connection.py +6 -6
  316. ansible/modules/yum_repository.py +10 -9
  317. ansible/parsing/ajson.py +17 -37
  318. ansible/parsing/dataloader.py +99 -54
  319. ansible/parsing/mod_args.py +62 -60
  320. ansible/parsing/plugin_docs.py +21 -86
  321. ansible/parsing/quoting.py +1 -1
  322. ansible/parsing/splitter.py +27 -12
  323. ansible/parsing/utils/addresses.py +24 -24
  324. ansible/parsing/utils/jsonify.py +5 -1
  325. ansible/parsing/utils/yaml.py +32 -61
  326. ansible/parsing/vault/__init__.py +327 -99
  327. ansible/parsing/yaml/__init__.py +0 -18
  328. ansible/parsing/yaml/dumper.py +6 -120
  329. ansible/parsing/yaml/loader.py +6 -39
  330. ansible/parsing/yaml/objects.py +43 -335
  331. ansible/playbook/__init__.py +1 -1
  332. ansible/playbook/attribute.py +8 -3
  333. ansible/playbook/base.py +187 -134
  334. ansible/playbook/block.py +26 -24
  335. ansible/playbook/collectionsearch.py +1 -15
  336. ansible/playbook/conditional.py +3 -77
  337. ansible/playbook/handler.py +8 -2
  338. ansible/playbook/helpers.py +41 -53
  339. ansible/playbook/included_file.py +32 -26
  340. ansible/playbook/loop_control.py +2 -2
  341. ansible/playbook/play.py +85 -44
  342. ansible/playbook/play_context.py +14 -17
  343. ansible/playbook/playbook_include.py +27 -62
  344. ansible/playbook/role/__init__.py +64 -49
  345. ansible/playbook/role/definition.py +15 -17
  346. ansible/playbook/role/include.py +2 -4
  347. ansible/playbook/role/metadata.py +10 -11
  348. ansible/playbook/role_include.py +3 -3
  349. ansible/playbook/taggable.py +28 -12
  350. ansible/playbook/task.py +192 -121
  351. ansible/playbook/task_include.py +5 -5
  352. ansible/plugins/__init__.py +58 -26
  353. ansible/plugins/action/__init__.py +188 -186
  354. ansible/plugins/action/add_host.py +2 -2
  355. ansible/plugins/action/assemble.py +11 -18
  356. ansible/plugins/action/assert.py +55 -67
  357. ansible/plugins/action/async_status.py +7 -2
  358. ansible/plugins/action/copy.py +14 -17
  359. ansible/plugins/action/debug.py +37 -31
  360. ansible/plugins/action/dnf.py +3 -4
  361. ansible/plugins/action/fail.py +1 -1
  362. ansible/plugins/action/fetch.py +7 -8
  363. ansible/plugins/action/gather_facts.py +13 -14
  364. ansible/plugins/action/group_by.py +1 -1
  365. ansible/plugins/action/include_vars.py +10 -11
  366. ansible/plugins/action/package.py +8 -14
  367. ansible/plugins/action/pause.py +2 -2
  368. ansible/plugins/action/script.py +27 -38
  369. ansible/plugins/action/service.py +9 -18
  370. ansible/plugins/action/set_fact.py +3 -12
  371. ansible/plugins/action/set_stats.py +3 -8
  372. ansible/plugins/action/template.py +47 -67
  373. ansible/plugins/action/unarchive.py +6 -16
  374. ansible/plugins/action/uri.py +9 -20
  375. ansible/plugins/action/validate_argument_spec.py +5 -5
  376. ansible/plugins/action/wait_for_connection.py +1 -1
  377. ansible/plugins/become/__init__.py +31 -8
  378. ansible/plugins/become/runas.py +71 -0
  379. ansible/plugins/become/su.py +13 -8
  380. ansible/plugins/become/sudo.py +19 -0
  381. ansible/plugins/cache/__init__.py +52 -63
  382. ansible/plugins/cache/base.py +8 -0
  383. ansible/plugins/cache/jsonfile.py +10 -16
  384. ansible/plugins/cache/memory.py +6 -12
  385. ansible/plugins/callback/__init__.py +294 -201
  386. ansible/plugins/callback/default.py +99 -95
  387. ansible/plugins/callback/junit.py +44 -43
  388. ansible/plugins/callback/minimal.py +28 -25
  389. ansible/plugins/callback/oneline.py +34 -21
  390. ansible/plugins/callback/tree.py +27 -16
  391. ansible/plugins/connection/__init__.py +47 -34
  392. ansible/plugins/connection/local.py +156 -60
  393. ansible/plugins/connection/paramiko_ssh.py +34 -24
  394. ansible/plugins/connection/psrp.py +76 -165
  395. ansible/plugins/connection/ssh.py +326 -86
  396. ansible/plugins/connection/winrm.py +62 -141
  397. ansible/plugins/doc_fragments/action_common_attributes.py +14 -14
  398. ansible/plugins/doc_fragments/action_core.py +6 -6
  399. ansible/plugins/doc_fragments/backup.py +2 -2
  400. ansible/plugins/doc_fragments/checksum_common.py +27 -0
  401. ansible/plugins/doc_fragments/constructed.py +8 -4
  402. ansible/plugins/doc_fragments/decrypt.py +2 -2
  403. ansible/plugins/doc_fragments/default_callback.py +2 -2
  404. ansible/plugins/doc_fragments/files.py +2 -2
  405. ansible/plugins/doc_fragments/inventory_cache.py +2 -2
  406. ansible/plugins/doc_fragments/result_format_callback.py +2 -2
  407. ansible/plugins/doc_fragments/return_common.py +2 -2
  408. ansible/plugins/doc_fragments/template_common.py +4 -4
  409. ansible/plugins/doc_fragments/url.py +17 -1
  410. ansible/plugins/doc_fragments/url_windows.py +2 -2
  411. ansible/plugins/doc_fragments/validate.py +2 -2
  412. ansible/plugins/doc_fragments/vars_plugin_staging.py +2 -2
  413. ansible/plugins/filter/__init__.py +6 -2
  414. ansible/plugins/filter/b64decode.yml +22 -0
  415. ansible/plugins/filter/b64encode.yml +22 -0
  416. ansible/plugins/filter/bool.yml +11 -4
  417. ansible/plugins/filter/core.py +245 -120
  418. ansible/plugins/filter/encryption.py +42 -34
  419. ansible/plugins/filter/flatten.yml +3 -2
  420. ansible/plugins/filter/human_to_bytes.yml +1 -1
  421. ansible/plugins/filter/mathstuff.py +30 -37
  422. ansible/plugins/filter/password_hash.yml +8 -0
  423. ansible/plugins/filter/pow.yml +1 -1
  424. ansible/plugins/filter/regex_search.yml +1 -4
  425. ansible/plugins/filter/root.yml +1 -1
  426. ansible/plugins/filter/split.yml +1 -1
  427. ansible/plugins/filter/strftime.yml +3 -3
  428. ansible/plugins/filter/to_nice_yaml.yml +0 -4
  429. ansible/plugins/filter/to_uuid.yml +1 -1
  430. ansible/plugins/filter/to_yaml.yml +0 -4
  431. ansible/plugins/filter/unvault.yml +1 -1
  432. ansible/plugins/filter/urls.py +1 -1
  433. ansible/plugins/filter/urlsplit.py +8 -9
  434. ansible/plugins/filter/vault.yml +14 -9
  435. ansible/plugins/filter/win_basename.yml +6 -1
  436. ansible/plugins/filter/win_dirname.yml +5 -0
  437. ansible/plugins/inventory/__init__.py +107 -86
  438. ansible/plugins/inventory/advanced_host_list.py +7 -5
  439. ansible/plugins/inventory/auto.py +11 -4
  440. ansible/plugins/inventory/constructed.py +21 -24
  441. ansible/plugins/inventory/generator.py +16 -11
  442. ansible/plugins/inventory/host_list.py +7 -5
  443. ansible/plugins/inventory/ini.py +78 -44
  444. ansible/plugins/inventory/script.py +190 -120
  445. ansible/plugins/inventory/toml.py +16 -126
  446. ansible/plugins/inventory/yaml.py +10 -8
  447. ansible/plugins/list.py +72 -19
  448. ansible/plugins/loader.py +383 -198
  449. ansible/plugins/lookup/__init__.py +21 -4
  450. ansible/plugins/lookup/config.py +21 -35
  451. ansible/plugins/lookup/csvfile.py +19 -73
  452. ansible/plugins/lookup/dict.py +1 -6
  453. ansible/plugins/lookup/env.py +12 -9
  454. ansible/plugins/lookup/file.py +5 -8
  455. ansible/plugins/lookup/first_found.py +87 -55
  456. ansible/plugins/lookup/indexed_items.py +1 -10
  457. ansible/plugins/lookup/ini.py +14 -13
  458. ansible/plugins/lookup/items.py +1 -1
  459. ansible/plugins/lookup/lines.py +8 -1
  460. ansible/plugins/lookup/list.py +1 -1
  461. ansible/plugins/lookup/nested.py +2 -18
  462. ansible/plugins/lookup/password.py +5 -5
  463. ansible/plugins/lookup/pipe.py +5 -7
  464. ansible/plugins/lookup/sequence.py +18 -8
  465. ansible/plugins/lookup/subelements.py +1 -4
  466. ansible/plugins/lookup/template.py +47 -36
  467. ansible/plugins/lookup/together.py +0 -12
  468. ansible/plugins/lookup/unvault.py +1 -5
  469. ansible/plugins/lookup/url.py +4 -10
  470. ansible/plugins/lookup/vars.py +16 -24
  471. ansible/plugins/shell/__init__.py +58 -4
  472. ansible/plugins/shell/cmd.py +2 -2
  473. ansible/plugins/shell/powershell.py +106 -31
  474. ansible/plugins/shell/sh.py +13 -7
  475. ansible/plugins/strategy/__init__.py +168 -193
  476. ansible/plugins/strategy/debug.py +2 -2
  477. ansible/plugins/strategy/free.py +16 -31
  478. ansible/plugins/strategy/host_pinned.py +2 -2
  479. ansible/plugins/strategy/linear.py +41 -41
  480. ansible/plugins/terminal/__init__.py +4 -4
  481. ansible/plugins/test/__init__.py +7 -2
  482. ansible/plugins/test/core.py +75 -35
  483. ansible/plugins/test/files.py +1 -1
  484. ansible/plugins/test/finished.yml +1 -1
  485. ansible/plugins/test/mathstuff.py +3 -3
  486. ansible/plugins/test/uri.py +5 -8
  487. ansible/plugins/vars/host_group_vars.py +7 -14
  488. ansible/release.py +2 -2
  489. ansible/template/__init__.py +353 -943
  490. ansible/utils/__init__.py +0 -18
  491. ansible/utils/collection_loader/__init__.py +54 -5
  492. ansible/utils/collection_loader/_collection_config.py +5 -6
  493. ansible/utils/collection_loader/_collection_finder.py +82 -96
  494. ansible/utils/collection_loader/_collection_meta.py +15 -8
  495. ansible/utils/display.py +485 -73
  496. ansible/utils/encrypt.py +27 -19
  497. ansible/utils/fqcn.py +2 -2
  498. ansible/utils/galaxy.py +2 -2
  499. ansible/utils/hashing.py +8 -10
  500. ansible/utils/helpers.py +2 -2
  501. ansible/utils/listify.py +10 -8
  502. ansible/utils/lock.py +2 -2
  503. ansible/utils/path.py +10 -12
  504. ansible/utils/plugin_docs.py +16 -14
  505. ansible/utils/py3compat.py +2 -7
  506. ansible/utils/sentinel.py +4 -62
  507. ansible/utils/singleton.py +2 -0
  508. ansible/utils/ssh_functions.py +6 -2
  509. ansible/utils/unsafe_proxy.py +23 -332
  510. ansible/utils/vars.py +55 -8
  511. ansible/utils/version.py +2 -2
  512. ansible/vars/clean.py +5 -5
  513. ansible/vars/hostvars.py +60 -90
  514. ansible/vars/manager.py +220 -285
  515. ansible/vars/plugins.py +4 -4
  516. ansible/vars/reserved.py +13 -12
  517. {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/METADATA +4 -3
  518. ansible_core-2.19.0.dist-info/RECORD +1097 -0
  519. ansible_core-2.19.0.dist-info/licenses/licenses/BSD-3-Clause.txt +28 -0
  520. ansible_test/_data/completion/docker.txt +7 -7
  521. ansible_test/_data/completion/remote.txt +6 -6
  522. ansible_test/_data/completion/windows.txt +1 -0
  523. ansible_test/_data/requirements/ansible.txt +2 -2
  524. ansible_test/_data/requirements/sanity.ansible-doc.txt +3 -3
  525. ansible_test/_data/requirements/sanity.changelog.txt +2 -2
  526. ansible_test/_data/requirements/sanity.import.plugin.txt +2 -2
  527. ansible_test/_data/requirements/sanity.pep8.txt +1 -1
  528. ansible_test/_data/requirements/sanity.pylint.txt +5 -5
  529. ansible_test/_data/requirements/sanity.validate-modules.txt +2 -2
  530. ansible_test/_data/requirements/sanity.yamllint.txt +1 -1
  531. ansible_test/_data/requirements/units.txt +1 -0
  532. ansible_test/_internal/__init__.py +6 -0
  533. ansible_test/_internal/ansible_util.py +3 -1
  534. ansible_test/_internal/become.py +1 -0
  535. ansible_test/_internal/bootstrap.py +1 -0
  536. ansible_test/_internal/cache.py +1 -0
  537. ansible_test/_internal/cgroup.py +1 -0
  538. ansible_test/_internal/ci/__init__.py +1 -0
  539. ansible_test/_internal/ci/azp.py +1 -0
  540. ansible_test/_internal/ci/local.py +1 -0
  541. ansible_test/_internal/classification/__init__.py +1 -0
  542. ansible_test/_internal/classification/common.py +1 -0
  543. ansible_test/_internal/classification/csharp.py +1 -0
  544. ansible_test/_internal/classification/powershell.py +1 -0
  545. ansible_test/_internal/classification/python.py +1 -0
  546. ansible_test/_internal/cli/__init__.py +1 -0
  547. ansible_test/_internal/cli/actions.py +1 -0
  548. ansible_test/_internal/cli/argparsing/__init__.py +1 -0
  549. ansible_test/_internal/cli/argparsing/actions.py +1 -0
  550. ansible_test/_internal/cli/argparsing/argcompletion.py +1 -0
  551. ansible_test/_internal/cli/argparsing/parsers.py +1 -0
  552. ansible_test/_internal/cli/commands/__init__.py +11 -5
  553. ansible_test/_internal/cli/commands/coverage/__init__.py +1 -0
  554. ansible_test/_internal/cli/commands/coverage/analyze/__init__.py +1 -0
  555. ansible_test/_internal/cli/commands/coverage/analyze/targets/__init__.py +1 -0
  556. ansible_test/_internal/cli/commands/coverage/analyze/targets/combine.py +1 -0
  557. ansible_test/_internal/cli/commands/coverage/analyze/targets/expand.py +1 -0
  558. ansible_test/_internal/cli/commands/coverage/analyze/targets/filter.py +1 -0
  559. ansible_test/_internal/cli/commands/coverage/analyze/targets/generate.py +1 -0
  560. ansible_test/_internal/cli/commands/coverage/analyze/targets/missing.py +1 -0
  561. ansible_test/_internal/cli/commands/coverage/combine.py +1 -0
  562. ansible_test/_internal/cli/commands/coverage/erase.py +1 -0
  563. ansible_test/_internal/cli/commands/coverage/html.py +1 -0
  564. ansible_test/_internal/cli/commands/coverage/report.py +1 -0
  565. ansible_test/_internal/cli/commands/coverage/xml.py +1 -0
  566. ansible_test/_internal/cli/commands/env.py +1 -0
  567. ansible_test/_internal/cli/commands/integration/__init__.py +1 -0
  568. ansible_test/_internal/cli/commands/integration/network.py +1 -0
  569. ansible_test/_internal/cli/commands/integration/posix.py +1 -0
  570. ansible_test/_internal/cli/commands/integration/windows.py +1 -0
  571. ansible_test/_internal/cli/commands/sanity.py +9 -0
  572. ansible_test/_internal/cli/commands/shell.py +1 -0
  573. ansible_test/_internal/cli/commands/units.py +1 -0
  574. ansible_test/_internal/cli/compat.py +1 -0
  575. ansible_test/_internal/cli/completers.py +1 -0
  576. ansible_test/_internal/cli/converters.py +1 -0
  577. ansible_test/_internal/cli/environments.py +52 -5
  578. ansible_test/_internal/cli/epilog.py +1 -0
  579. ansible_test/_internal/cli/parsers/__init__.py +1 -0
  580. ansible_test/_internal/cli/parsers/base_argument_parsers.py +1 -0
  581. ansible_test/_internal/cli/parsers/helpers.py +1 -0
  582. ansible_test/_internal/cli/parsers/host_config_parsers.py +1 -0
  583. ansible_test/_internal/cli/parsers/key_value_parsers.py +1 -0
  584. ansible_test/_internal/cli/parsers/value_parsers.py +1 -0
  585. ansible_test/_internal/commands/__init__.py +1 -0
  586. ansible_test/_internal/commands/coverage/__init__.py +3 -2
  587. ansible_test/_internal/commands/coverage/analyze/__init__.py +1 -0
  588. ansible_test/_internal/commands/coverage/analyze/targets/__init__.py +1 -0
  589. ansible_test/_internal/commands/coverage/analyze/targets/combine.py +1 -0
  590. ansible_test/_internal/commands/coverage/analyze/targets/expand.py +1 -0
  591. ansible_test/_internal/commands/coverage/analyze/targets/filter.py +1 -0
  592. ansible_test/_internal/commands/coverage/analyze/targets/generate.py +1 -0
  593. ansible_test/_internal/commands/coverage/analyze/targets/missing.py +1 -0
  594. ansible_test/_internal/commands/coverage/combine.py +2 -1
  595. ansible_test/_internal/commands/coverage/erase.py +1 -0
  596. ansible_test/_internal/commands/coverage/html.py +1 -0
  597. ansible_test/_internal/commands/coverage/report.py +1 -0
  598. ansible_test/_internal/commands/coverage/xml.py +1 -0
  599. ansible_test/_internal/commands/env/__init__.py +2 -0
  600. ansible_test/_internal/commands/integration/__init__.py +22 -5
  601. ansible_test/_internal/commands/integration/cloud/__init__.py +1 -0
  602. ansible_test/_internal/commands/integration/cloud/acme.py +2 -1
  603. ansible_test/_internal/commands/integration/cloud/aws.py +1 -0
  604. ansible_test/_internal/commands/integration/cloud/azure.py +1 -0
  605. ansible_test/_internal/commands/integration/cloud/cs.py +1 -0
  606. ansible_test/_internal/commands/integration/cloud/digitalocean.py +1 -0
  607. ansible_test/_internal/commands/integration/cloud/galaxy.py +3 -2
  608. ansible_test/_internal/commands/integration/cloud/hcloud.py +1 -0
  609. ansible_test/_internal/commands/integration/cloud/httptester.py +3 -2
  610. ansible_test/_internal/commands/integration/cloud/nios.py +2 -1
  611. ansible_test/_internal/commands/integration/cloud/opennebula.py +1 -0
  612. ansible_test/_internal/commands/integration/cloud/openshift.py +1 -0
  613. ansible_test/_internal/commands/integration/cloud/scaleway.py +1 -0
  614. ansible_test/_internal/commands/integration/cloud/vcenter.py +1 -0
  615. ansible_test/_internal/commands/integration/cloud/vultr.py +1 -0
  616. ansible_test/_internal/commands/integration/coverage.py +8 -2
  617. ansible_test/_internal/commands/integration/filters.py +1 -0
  618. ansible_test/_internal/commands/integration/network.py +1 -0
  619. ansible_test/_internal/commands/integration/posix.py +1 -0
  620. ansible_test/_internal/commands/integration/windows.py +1 -0
  621. ansible_test/_internal/commands/sanity/__init__.py +19 -2
  622. ansible_test/_internal/commands/sanity/ansible_doc.py +1 -0
  623. ansible_test/_internal/commands/sanity/bin_symlinks.py +1 -0
  624. ansible_test/_internal/commands/sanity/compile.py +1 -0
  625. ansible_test/_internal/commands/sanity/ignores.py +1 -0
  626. ansible_test/_internal/commands/sanity/import.py +1 -0
  627. ansible_test/_internal/commands/sanity/integration_aliases.py +12 -0
  628. ansible_test/_internal/commands/sanity/pep8.py +1 -0
  629. ansible_test/_internal/commands/sanity/pslint.py +1 -0
  630. ansible_test/_internal/commands/sanity/pylint.py +25 -26
  631. ansible_test/_internal/commands/sanity/shellcheck.py +1 -0
  632. ansible_test/_internal/commands/sanity/validate_modules.py +1 -0
  633. ansible_test/_internal/commands/sanity/yamllint.py +1 -0
  634. ansible_test/_internal/commands/shell/__init__.py +44 -4
  635. ansible_test/_internal/commands/units/__init__.py +5 -1
  636. ansible_test/_internal/compat/__init__.py +1 -0
  637. ansible_test/_internal/compat/packaging.py +1 -0
  638. ansible_test/_internal/compat/yaml.py +1 -0
  639. ansible_test/_internal/completion.py +1 -0
  640. ansible_test/_internal/config.py +23 -13
  641. ansible_test/_internal/connections.py +1 -0
  642. ansible_test/_internal/constants.py +1 -0
  643. ansible_test/_internal/containers.py +1 -0
  644. ansible_test/_internal/content_config.py +1 -0
  645. ansible_test/_internal/core_ci.py +1 -0
  646. ansible_test/_internal/coverage_util.py +11 -10
  647. ansible_test/_internal/data.py +1 -0
  648. ansible_test/_internal/debugging.py +166 -0
  649. ansible_test/_internal/delegation.py +22 -13
  650. ansible_test/_internal/dev/__init__.py +1 -0
  651. ansible_test/_internal/dev/container_probe.py +1 -0
  652. ansible_test/_internal/diff.py +3 -2
  653. ansible_test/_internal/docker_util.py +2 -1
  654. ansible_test/_internal/encoding.py +1 -0
  655. ansible_test/_internal/executor.py +1 -0
  656. ansible_test/_internal/git.py +1 -0
  657. ansible_test/_internal/host_configs.py +1 -0
  658. ansible_test/_internal/host_profiles.py +260 -16
  659. ansible_test/_internal/http.py +1 -0
  660. ansible_test/_internal/init.py +1 -0
  661. ansible_test/_internal/inventory.py +39 -3
  662. ansible_test/_internal/io.py +1 -0
  663. ansible_test/_internal/metadata.py +95 -4
  664. ansible_test/_internal/payload.py +1 -0
  665. ansible_test/_internal/processes.py +80 -0
  666. ansible_test/_internal/provider/__init__.py +1 -0
  667. ansible_test/_internal/provider/layout/__init__.py +1 -0
  668. ansible_test/_internal/provider/layout/ansible.py +1 -0
  669. ansible_test/_internal/provider/layout/collection.py +1 -0
  670. ansible_test/_internal/provider/layout/unsupported.py +1 -0
  671. ansible_test/_internal/provider/source/__init__.py +1 -0
  672. ansible_test/_internal/provider/source/git.py +1 -0
  673. ansible_test/_internal/provider/source/installed.py +1 -0
  674. ansible_test/_internal/provider/source/unsupported.py +1 -0
  675. ansible_test/_internal/provider/source/unversioned.py +1 -0
  676. ansible_test/_internal/provisioning.py +11 -4
  677. ansible_test/_internal/pypi_proxy.py +6 -5
  678. ansible_test/_internal/python_requirements.py +28 -0
  679. ansible_test/_internal/ssh.py +2 -5
  680. ansible_test/_internal/target.py +9 -0
  681. ansible_test/_internal/test.py +3 -2
  682. ansible_test/_internal/thread.py +3 -1
  683. ansible_test/_internal/timeout.py +2 -1
  684. ansible_test/_internal/util.py +41 -12
  685. ansible_test/_internal/util_common.py +18 -5
  686. ansible_test/_internal/venv.py +1 -0
  687. ansible_test/_util/controller/sanity/code-smell/action-plugin-docs.py +1 -0
  688. ansible_test/_util/controller/sanity/code-smell/changelog/sphinx.py +1 -0
  689. ansible_test/_util/controller/sanity/code-smell/changelog.py +1 -0
  690. ansible_test/_util/controller/sanity/code-smell/empty-init.py +1 -0
  691. ansible_test/_util/controller/sanity/code-smell/line-endings.py +1 -0
  692. ansible_test/_util/controller/sanity/code-smell/no-assert.py +1 -0
  693. ansible_test/_util/controller/sanity/code-smell/no-get-exception.py +1 -0
  694. ansible_test/_util/controller/sanity/code-smell/no-illegal-filenames.py +1 -0
  695. ansible_test/_util/controller/sanity/code-smell/no-smart-quotes.py +1 -0
  696. ansible_test/_util/controller/sanity/code-smell/replace-urlopen.py +1 -0
  697. ansible_test/_util/controller/sanity/code-smell/runtime-metadata.py +28 -1
  698. ansible_test/_util/controller/sanity/code-smell/shebang.py +1 -0
  699. ansible_test/_util/controller/sanity/code-smell/symlinks.py +1 -0
  700. ansible_test/_util/controller/sanity/code-smell/use-argspec-type-path.py +1 -0
  701. ansible_test/_util/controller/sanity/code-smell/use-compat-six.py +1 -0
  702. ansible_test/_util/controller/sanity/integration-aliases/yaml_to_json.py +2 -1
  703. ansible_test/_util/controller/sanity/pep8/current-ignore.txt +4 -0
  704. ansible_test/_util/controller/sanity/pylint/config/ansible-test-target.cfg +8 -5
  705. ansible_test/_util/controller/sanity/pylint/config/ansible-test.cfg +8 -5
  706. ansible_test/_util/controller/sanity/pylint/config/code-smell.cfg +8 -5
  707. ansible_test/_util/controller/sanity/pylint/config/collection.cfg +4 -5
  708. ansible_test/_util/controller/sanity/pylint/config/default.cfg +8 -7
  709. ansible_test/_util/controller/sanity/pylint/plugins/deprecated_calls.py +541 -0
  710. ansible_test/_util/controller/sanity/pylint/plugins/deprecated_comment.py +137 -0
  711. ansible_test/_util/controller/sanity/pylint/plugins/hide_unraisable.py +1 -0
  712. ansible_test/_util/controller/sanity/pylint/plugins/string_format.py +1 -8
  713. ansible_test/_util/controller/sanity/pylint/plugins/unwanted.py +1 -8
  714. ansible_test/_util/controller/sanity/validate-modules/validate_modules/main.py +55 -28
  715. ansible_test/_util/controller/sanity/validate-modules/validate_modules/module_args.py +12 -5
  716. ansible_test/_util/controller/sanity/validate-modules/validate_modules/schema.py +13 -2
  717. ansible_test/_util/controller/sanity/validate-modules/validate_modules/utils.py +1 -0
  718. ansible_test/_util/controller/sanity/yamllint/yamllinter.py +35 -17
  719. ansible_test/_util/controller/tools/collection_detail.py +1 -0
  720. ansible_test/_util/controller/tools/yaml_to_json.py +2 -1
  721. ansible_test/_util/target/injector/python.py +8 -0
  722. ansible_test/_util/target/pytest/plugins/ansible_forked.py +6 -1
  723. ansible_test/_util/target/pytest/plugins/ansible_pytest_collections.py +2 -1
  724. ansible_test/_util/target/pytest/plugins/ansible_pytest_coverage.py +1 -0
  725. ansible_test/_util/target/sanity/compile/compile.py +1 -0
  726. ansible_test/_util/target/sanity/import/importer.py +15 -16
  727. ansible_test/_util/target/setup/bootstrap.sh +9 -20
  728. ansible_test/_util/target/setup/probe_cgroups.py +1 -0
  729. ansible_test/_util/target/setup/quiet_pip.py +1 -0
  730. ansible_test/_util/target/setup/requirements.py +38 -36
  731. ansible_test/_util/target/tools/virtualenvcheck.py +2 -1
  732. ansible_test/_util/target/tools/yamlcheck.py +2 -1
  733. ansible/compat/selectors.py +0 -32
  734. ansible/errors/yaml_strings.py +0 -138
  735. ansible/executor/action_write_locks.py +0 -44
  736. ansible/executor/discovery/python_target.py +0 -47
  737. ansible/executor/powershell/module_powershell_wrapper.ps1 +0 -86
  738. ansible/executor/powershell/module_script_wrapper.ps1 +0 -22
  739. ansible/module_utils/compat/importlib.py +0 -26
  740. ansible/module_utils/compat/selectors.py +0 -32
  741. ansible/module_utils/pycompat24.py +0 -73
  742. ansible/parsing/yaml/constructor.py +0 -178
  743. ansible/template/native_helpers.py +0 -251
  744. ansible/template/template.py +0 -43
  745. ansible/template/vars.py +0 -77
  746. ansible/utils/native_jinja.py +0 -11
  747. ansible/vars/fact_cache.py +0 -71
  748. ansible_core-2.18.7rc1.dist-info/RECORD +0 -992
  749. ansible_test/_util/controller/sanity/pylint/plugins/deprecated.py +0 -411
  750. {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/WHEEL +0 -0
  751. {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/entry_points.txt +0 -0
  752. {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/licenses/COPYING +0 -0
  753. {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/Apache-License.txt +0 -0
  754. {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/MIT-license.txt +0 -0
  755. {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/PSF-license.txt +0 -0
  756. {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/simplified_bsd.txt +0 -0
  757. {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/top_level.txt +0 -0
@@ -31,7 +31,7 @@ display = Display()
31
31
 
32
32
 
33
33
  class ActionModule(ActionBase):
34
- ''' Create inventory hosts and groups in the memory inventory'''
34
+ """ Create inventory hosts and groups in the memory inventory"""
35
35
 
36
36
  # We need to be able to modify the inventory
37
37
  BYPASS_HOST_LOOP = True
@@ -77,7 +77,7 @@ class ActionModule(ActionBase):
77
77
  elif isinstance(groups, string_types):
78
78
  group_list = groups.split(",")
79
79
  else:
80
- raise AnsibleActionFail("Groups must be specified as a list.", obj=self._task)
80
+ raise AnsibleActionFail("Groups must be specified as a list.", obj=groups)
81
81
 
82
82
  for group_name in group_list:
83
83
  if group_name not in new_groups:
@@ -25,8 +25,8 @@ import re
25
25
  import tempfile
26
26
 
27
27
  from ansible import constants as C
28
- from ansible.errors import AnsibleError, AnsibleAction, _AnsibleActionDone, AnsibleActionFail
29
- from ansible.module_utils.common.text.converters import to_native, to_text
28
+ from ansible.errors import AnsibleActionFail
29
+ from ansible.module_utils.common.text.converters import to_text
30
30
  from ansible.module_utils.parsing.convert_bool import boolean
31
31
  from ansible.plugins.action import ActionBase
32
32
  from ansible.utils.hashing import checksum_s
@@ -37,7 +37,7 @@ class ActionModule(ActionBase):
37
37
  TRANSFERS_FILES = True
38
38
 
39
39
  def _assemble_from_fragments(self, src_path, delimiter=None, compiled_regexp=None, ignore_hidden=False, decrypt=True):
40
- ''' assemble a file from a directory of fragments '''
40
+ """ assemble a file from a directory of fragments """
41
41
 
42
42
  tmpfd, temp_path = tempfile.mkstemp(dir=C.DEFAULT_LOCAL_TMP)
43
43
  tmp = os.fdopen(tmpfd, 'wb')
@@ -81,9 +81,10 @@ class ActionModule(ActionBase):
81
81
 
82
82
  def run(self, tmp=None, task_vars=None):
83
83
 
84
- self._supports_check_mode = False
84
+ self._supports_check_mode = True
85
+
86
+ super(ActionModule, self).run(tmp, task_vars)
85
87
 
86
- result = super(ActionModule, self).run(tmp, task_vars)
87
88
  del tmp # tmp no longer has any effect
88
89
 
89
90
  if task_vars is None:
@@ -104,13 +105,9 @@ class ActionModule(ActionBase):
104
105
 
105
106
  if boolean(remote_src, strict=False):
106
107
  # call assemble via ansible.legacy to allow library/ overrides of the module without collection search
107
- result.update(self._execute_module(module_name='ansible.legacy.assemble', task_vars=task_vars))
108
- raise _AnsibleActionDone()
109
- else:
110
- try:
111
- src = self._find_needle('files', src)
112
- except AnsibleError as e:
113
- raise AnsibleActionFail(to_native(e))
108
+ return self._execute_module(module_name='ansible.legacy.assemble', task_vars=task_vars)
109
+
110
+ src = self._find_needle('files', src)
114
111
 
115
112
  if not os.path.isdir(src):
116
113
  raise AnsibleActionFail(u"Source (%s) is not a directory" % src)
@@ -153,13 +150,9 @@ class ActionModule(ActionBase):
153
150
  res = self._execute_module(module_name='ansible.legacy.copy', module_args=new_module_args, task_vars=task_vars)
154
151
  if diff:
155
152
  res['diff'] = diff
156
- result.update(res)
153
+ return res
157
154
  else:
158
- result.update(self._execute_module(module_name='ansible.legacy.file', module_args=new_module_args, task_vars=task_vars))
155
+ return self._execute_module(module_name='ansible.legacy.file', module_args=new_module_args, task_vars=task_vars)
159
156
 
160
- except AnsibleAction as e:
161
- result.update(e.result)
162
157
  finally:
163
158
  self._remove_tmp_path(self._connection._shell.tmpdir)
164
-
165
- return result
@@ -16,19 +16,41 @@
16
16
  # along with Ansible. If not, see <http://www.gnu.org/licenses/>.
17
17
  from __future__ import annotations
18
18
 
19
- from ansible.errors import AnsibleError
20
- from ansible.playbook.conditional import Conditional
19
+ import typing as t
20
+
21
+ from ansible._internal._templating import _jinja_bits
22
+ from ansible.errors import AnsibleTemplateError
23
+ from ansible.module_utils.common.validation import _check_type_list_strict
21
24
  from ansible.plugins.action import ActionBase
22
- from ansible.module_utils.six import string_types
23
- from ansible.module_utils.parsing.convert_bool import boolean
25
+ from ansible._internal._templating._engine import TemplateEngine
24
26
 
25
27
 
26
28
  class ActionModule(ActionBase):
27
- ''' Fail with custom message '''
29
+ """Assert that one or more conditional expressions evaluate to true."""
28
30
 
29
31
  _requires_connection = False
30
32
 
31
- _VALID_ARGS = frozenset(('fail_msg', 'msg', 'quiet', 'success_msg', 'that'))
33
+ @classmethod
34
+ def finalize_task_arg(cls, name: str, value: t.Any, templar: TemplateEngine, context: t.Any) -> t.Any:
35
+ if name != 'that':
36
+ # `that` is the only key requiring special handling; delegate to base handling otherwise
37
+ return super().finalize_task_arg(name, value, templar, context)
38
+
39
+ if not isinstance(value, str):
40
+ # if `that` is not a string, we don't need to attempt to resolve it as a template before validation (which will also listify it)
41
+ return value
42
+
43
+ # if `that` is entirely a string template, we only want to resolve to the container and avoid templating the container contents
44
+ if _jinja_bits.is_possibly_all_template(value):
45
+ try:
46
+ templated_that = templar.resolve_to_container(value)
47
+ except AnsibleTemplateError:
48
+ pass
49
+ else:
50
+ if isinstance(templated_that, list): # only use `templated_that` if it is a list
51
+ return templated_that
52
+
53
+ return value
32
54
 
33
55
  def run(self, tmp=None, task_vars=None):
34
56
  if task_vars is None:
@@ -37,70 +59,26 @@ class ActionModule(ActionBase):
37
59
  result = super(ActionModule, self).run(tmp, task_vars)
38
60
  del tmp # tmp no longer has any effect
39
61
 
40
- if 'that' not in self._task.args:
41
- raise AnsibleError('conditional required in "that" string')
42
-
43
- fail_msg = None
44
- success_msg = None
45
-
46
- fail_msg = self._task.args.get('fail_msg', self._task.args.get('msg'))
47
- if fail_msg is None:
48
- fail_msg = 'Assertion failed'
49
- elif isinstance(fail_msg, list):
50
- if not all(isinstance(x, string_types) for x in fail_msg):
51
- raise AnsibleError('Type of one of the elements in fail_msg or msg list is not string type')
52
- elif not isinstance(fail_msg, (string_types, list)):
53
- raise AnsibleError('Incorrect type for fail_msg or msg, expected a string or list and got %s' % type(fail_msg))
54
-
55
- success_msg = self._task.args.get('success_msg')
56
- if success_msg is None:
57
- success_msg = 'All assertions passed'
58
- elif isinstance(success_msg, list):
59
- if not all(isinstance(x, string_types) for x in success_msg):
60
- raise AnsibleError('Type of one of the elements in success_msg list is not string type')
61
- elif not isinstance(success_msg, (string_types, list)):
62
- raise AnsibleError('Incorrect type for success_msg, expected a string or list and got %s' % type(success_msg))
63
-
64
- quiet = boolean(self._task.args.get('quiet', False), strict=False)
65
-
66
- # directly access 'that' via untemplated args from the task so we can intelligently trust embedded
67
- # templates and preserve the original inputs/locations for better messaging on assert failures and
68
- # errors.
69
- # FIXME: even in devel, things like `that: item` don't always work properly (truthy string value
70
- # is not really an embedded expression)
71
- # we could fix that by doing direct var lookups on the inputs
72
- # FIXME: some form of this code should probably be shared between debug, assert, and
73
- # Task.post_validate, since they
74
- # have a lot of overlapping needs
75
- try:
76
- thats = self._task.untemplated_args['that']
77
- except KeyError:
78
- # in the case of "we got our entire args dict from a template", we can just consult the
79
- # post-templated dict (the damage has likely already been done for embedded templates anyway)
80
- thats = self._task.args['that']
81
-
82
- # FIXME: this is a case where we only want to resolve indirections, NOT recurse containers
83
- # (and even then, the leaf-most expression being wrapped is at least suboptimal
84
- # (since its expression will be "eaten").
85
- if isinstance(thats, str):
86
- thats = self._templar.template(thats)
87
-
88
- # make sure the 'that' items are a list
89
- if not isinstance(thats, list):
90
- thats = [thats]
91
-
92
- # Now we iterate over the that items, temporarily assigning them
93
- # to the task's when value so we can evaluate the conditional using
94
- # the built in evaluate function. The when has already been evaluated
95
- # by this point, and is not used again, so we don't care about mangling
96
- # that value now
97
- cond = Conditional(loader=self._loader)
62
+ validation_result, new_module_args = self.validate_argument_spec(
63
+ argument_spec=dict(
64
+ fail_msg=dict(type=str_or_list_of_str, aliases=['msg'], default='Assertion failed'),
65
+ success_msg=dict(type=str_or_list_of_str, default='All assertions passed'),
66
+ quiet=dict(type='bool', default=False),
67
+ # explicitly not validating types `elements` here to let type rules for conditionals apply
68
+ that=dict(type=_check_type_list_strict, required=True),
69
+ ),
70
+ )
71
+
72
+ fail_msg = new_module_args['fail_msg']
73
+ success_msg = new_module_args['success_msg']
74
+ quiet = new_module_args['quiet']
75
+ that_list = new_module_args['that']
76
+
98
77
  if not quiet:
99
78
  result['_ansible_verbose_always'] = True
100
79
 
101
- for that in thats:
102
- cond.when = [that]
103
- test_result = cond.evaluate_conditional(templar=self._templar, all_vars=task_vars)
80
+ for that in that_list:
81
+ test_result = self._templar.evaluate_conditional(conditional=that)
104
82
  if not test_result:
105
83
  result['failed'] = True
106
84
  result['evaluated_to'] = test_result
@@ -113,3 +91,13 @@ class ActionModule(ActionBase):
113
91
  result['changed'] = False
114
92
  result['msg'] = success_msg
115
93
  return result
94
+
95
+
96
+ def str_or_list_of_str(value: t.Any) -> str | list[str]:
97
+ if isinstance(value, str):
98
+ return value
99
+
100
+ if not isinstance(value, list) or any(not isinstance(item, str) for item in value):
101
+ raise TypeError("a string or list of strings is required")
102
+
103
+ return value
@@ -28,7 +28,7 @@ class ActionModule(ActionBase):
28
28
  )
29
29
 
30
30
  # initialize response
31
- results['started'] = results['finished'] = 0
31
+ results['started'] = results['finished'] = False
32
32
  results['stdout'] = results['stderr'] = ''
33
33
  results['stdout_lines'] = results['stderr_lines'] = []
34
34
 
@@ -43,9 +43,14 @@ class ActionModule(ActionBase):
43
43
  results['erased'] = log_path
44
44
  else:
45
45
  results['results_file'] = log_path
46
- results['started'] = 1
46
+ results['started'] = True
47
47
 
48
48
  new_module_args['_async_dir'] = async_dir
49
49
  results = merge_hash(results, self._execute_module(module_name='ansible.legacy.async_status', task_vars=task_vars, module_args=new_module_args))
50
50
 
51
+ # Backwards compat shim for when started/finished were ints,
52
+ # mostly to work with ansible.windows.async_status
53
+ for convert in ('started', 'finished'):
54
+ results[convert] = bool(results[convert])
55
+
51
56
  return results
@@ -23,12 +23,11 @@ import os
23
23
  import os.path
24
24
  import stat
25
25
  import tempfile
26
- import traceback
27
26
 
28
27
  from ansible import constants as C
29
28
  from ansible.errors import AnsibleError, AnsibleActionFail, AnsibleFileNotFound
30
29
  from ansible.module_utils.basic import FILE_COMMON_ARGUMENTS
31
- from ansible.module_utils.common.text.converters import to_bytes, to_native, to_text
30
+ from ansible.module_utils.common.text.converters import to_bytes, to_text
32
31
  from ansible.module_utils.parsing.convert_bool import boolean
33
32
  from ansible.plugins.action import ActionBase
34
33
  from ansible.utils.hashing import checksum
@@ -389,17 +388,15 @@ class ActionModule(ActionBase):
389
388
  return result
390
389
 
391
390
  def _create_content_tempfile(self, content):
392
- ''' Create a tempfile containing defined content '''
391
+ """ Create a tempfile containing defined content """
393
392
  fd, content_tempfile = tempfile.mkstemp(dir=C.DEFAULT_LOCAL_TMP, prefix='.')
394
- f = os.fdopen(fd, 'wb')
395
393
  content = to_bytes(content)
396
394
  try:
397
- f.write(content)
395
+ with os.fdopen(fd, 'wb') as f:
396
+ f.write(content)
398
397
  except Exception as err:
399
398
  os.remove(content_tempfile)
400
399
  raise Exception(err)
401
- finally:
402
- f.close()
403
400
  return content_tempfile
404
401
 
405
402
  def _remove_tempfile_if_content_defined(self, content, content_tempfile):
@@ -407,11 +404,12 @@ class ActionModule(ActionBase):
407
404
  os.remove(content_tempfile)
408
405
 
409
406
  def run(self, tmp=None, task_vars=None):
410
- ''' handler for file transfer operations '''
407
+ """ handler for file transfer operations """
411
408
  if task_vars is None:
412
409
  task_vars = dict()
413
410
 
414
411
  result = super(ActionModule, self).run(tmp, task_vars)
412
+
415
413
  del tmp # tmp no longer has any effect
416
414
 
417
415
  # ensure user is not setting internal parameters
@@ -453,10 +451,10 @@ class ActionModule(ActionBase):
453
451
  else:
454
452
  content_tempfile = self._create_content_tempfile(content)
455
453
  source = content_tempfile
456
- except Exception as err:
457
- result['failed'] = True
458
- result['msg'] = "could not write content temp file: %s" % to_native(err)
459
- return self._ensure_invocation(result)
454
+ except Exception as ex:
455
+ self._ensure_invocation(result)
456
+
457
+ raise AnsibleActionFail(message="could not write content temp file", result=result) from ex
460
458
 
461
459
  # if we have first_available_file in our vars
462
460
  # look up the files and use the first one we find as src
@@ -472,11 +470,10 @@ class ActionModule(ActionBase):
472
470
  try:
473
471
  # find in expected paths
474
472
  source = self._find_needle('files', source)
475
- except AnsibleError as e:
476
- result['failed'] = True
477
- result['msg'] = to_text(e)
478
- result['exception'] = traceback.format_exc()
479
- return self._ensure_invocation(result)
473
+ except AnsibleError as ex:
474
+ self._ensure_invocation(result)
475
+
476
+ raise AnsibleActionFail(result=result) from ex
480
477
 
481
478
  if trailing_slash != source.endswith(os.path.sep):
482
479
  if source[-1] == os.path.sep:
@@ -17,29 +17,32 @@
17
17
  # along with Ansible. If not, see <http://www.gnu.org/licenses/>.
18
18
  from __future__ import annotations
19
19
 
20
- from ansible.errors import AnsibleUndefinedVariable
21
- from ansible.module_utils.six import string_types
22
- from ansible.module_utils.common.text.converters import to_text
20
+ from ansible.errors import AnsibleValueOmittedError, AnsibleError
21
+ from ansible.module_utils.common.validation import _check_type_str_no_conversion
23
22
  from ansible.plugins.action import ActionBase
23
+ from ansible._internal._templating._jinja_common import UndefinedMarker, TruncationMarker
24
+ from ansible._internal._templating._utils import Omit
25
+ from ansible._internal._templating._marker_behaviors import ReplacingMarkerBehavior, RoutingMarkerBehavior
26
+ from ansible.utils.display import Display
27
+
28
+ display = Display()
24
29
 
25
30
 
26
31
  class ActionModule(ActionBase):
27
- ''' Print statements during execution '''
32
+ """
33
+ Emits informational messages, with special diagnostic handling of some templating failures.
34
+ """
28
35
 
29
36
  TRANSFERS_FILES = False
30
- _VALID_ARGS = frozenset(('msg', 'var', 'verbosity'))
31
37
  _requires_connection = False
32
38
 
33
39
  def run(self, tmp=None, task_vars=None):
34
- if task_vars is None:
35
- task_vars = dict()
36
-
37
40
  validation_result, new_module_args = self.validate_argument_spec(
38
- argument_spec={
39
- 'msg': {'type': 'raw', 'default': 'Hello world!'},
40
- 'var': {'type': 'raw'},
41
- 'verbosity': {'type': 'int', 'default': 0},
42
- },
41
+ argument_spec=dict(
42
+ msg=dict(type='raw', default='Hello world!'),
43
+ var=dict(type=_check_type_str_no_conversion),
44
+ verbosity=dict(type='int', default=0),
45
+ ),
43
46
  mutually_exclusive=(
44
47
  ('msg', 'var'),
45
48
  ),
@@ -51,31 +54,34 @@ class ActionModule(ActionBase):
51
54
  # get task verbosity
52
55
  verbosity = new_module_args['verbosity']
53
56
 
57
+ replacing_behavior = ReplacingMarkerBehavior()
58
+
59
+ var_behavior = RoutingMarkerBehavior({
60
+ UndefinedMarker: replacing_behavior,
61
+ TruncationMarker: replacing_behavior,
62
+ })
63
+
54
64
  if verbosity <= self._display.verbosity:
55
- if new_module_args['var']:
65
+ if raw_var_arg := new_module_args['var']:
66
+ # If var name is same as result, try to template it
56
67
  try:
57
- results = self._templar.template(new_module_args['var'], convert_bare=True, fail_on_undefined=True)
58
- if results == new_module_args['var']:
59
- # if results is not str/unicode type, raise an exception
60
- if not isinstance(results, string_types):
61
- raise AnsibleUndefinedVariable
62
- # If var name is same as result, try to template it
63
- results = self._templar.template("{{" + results + "}}", convert_bare=True, fail_on_undefined=True)
64
- except AnsibleUndefinedVariable as e:
65
- results = u"VARIABLE IS NOT DEFINED!"
66
- if self._display.verbosity > 0:
67
- results += u": %s" % to_text(e)
68
-
69
- if isinstance(new_module_args['var'], (list, dict)):
70
- # If var is a list or dict, use the type as key to display
71
- result[to_text(type(new_module_args['var']))] = results
72
- else:
73
- result[new_module_args['var']] = results
68
+ results = self._templar._engine.extend(marker_behavior=var_behavior).evaluate_expression(raw_var_arg)
69
+ except AnsibleValueOmittedError as ex:
70
+ results = repr(Omit)
71
+ display.warning("The result of the `var` expression could not be omitted; a placeholder was used instead.", obj=ex.obj)
72
+ except Exception as ex:
73
+ raise AnsibleError('Error while resolving `var` expression.', obj=raw_var_arg) from ex
74
+
75
+ result[raw_var_arg] = results
74
76
  else:
75
77
  result['msg'] = new_module_args['msg']
76
78
 
77
79
  # force flag to make debug output module always verbose
78
80
  result['_ansible_verbose_always'] = True
81
+
82
+ # propagate any warnings in the task result unless we're skipping the task
83
+ replacing_behavior.emit_warnings()
84
+
79
85
  else:
80
86
  result['skipped_reason'] = "Verbosity threshold not met."
81
87
  result['skipped'] = True
@@ -30,10 +30,9 @@ class ActionModule(ActionBase):
30
30
 
31
31
  if module in {'yum', 'auto'}:
32
32
  try:
33
- if self._task.delegate_to: # if we delegate, we should use delegated host's facts
34
- module = self._templar.template("{{hostvars['%s']['ansible_facts']['pkg_mgr']}}" % self._task.delegate_to)
35
- else:
36
- module = self._templar.template("{{ansible_facts.pkg_mgr}}")
33
+ # if we delegate, we should use delegated host's facts
34
+ expr = "hostvars[delegate_to].ansible_facts.pkg_mgr" if self._task.delegate_to else "ansible_facts.pkg_mgr"
35
+ module = self._templar.resolve_variable_expression(expr, local_variables=dict(delegate_to=self._task.delegate_to))
37
36
  except Exception:
38
37
  pass # could not get it from template!
39
38
 
@@ -21,7 +21,7 @@ from ansible.plugins.action import ActionBase
21
21
 
22
22
 
23
23
  class ActionModule(ActionBase):
24
- ''' Fail with custom message '''
24
+ """ Fail with custom message """
25
25
 
26
26
  TRANSFERS_FILES = False
27
27
  _VALID_ARGS = frozenset(('msg',))
@@ -33,7 +33,7 @@ display = Display()
33
33
  class ActionModule(ActionBase):
34
34
 
35
35
  def run(self, tmp=None, task_vars=None):
36
- ''' handler for fetch operations '''
36
+ """ handler for fetch operations """
37
37
  if task_vars is None:
38
38
  task_vars = dict()
39
39
 
@@ -51,7 +51,7 @@ class ActionModule(ActionBase):
51
51
  validate_checksum = boolean(self._task.args.get('validate_checksum', True), strict=False)
52
52
 
53
53
  msg = ''
54
- # validate source and dest are strings FIXME: use basic.py and module specs
54
+ # FIXME: validate source and dest are strings; use basic.py and module specs
55
55
  if not isinstance(source, string_types):
56
56
  msg = "Invalid type supplied for source option, it must be a string"
57
57
 
@@ -119,7 +119,7 @@ class ActionModule(ActionBase):
119
119
 
120
120
  if 'not found' in slurpres.get('msg', ''):
121
121
  result['msg'] = "the remote file does not exist, not transferring, ignored"
122
- elif slurpres.get('msg', '').startswith('source is a directory'):
122
+ elif slurpres.get('msg', '').lower().startswith('source is a directory'):
123
123
  result['msg'] = "remote file is a directory, fetch cannot work on directories"
124
124
 
125
125
  return result
@@ -178,11 +178,10 @@ class ActionModule(ActionBase):
178
178
  self._connection.fetch_file(source, dest)
179
179
  else:
180
180
  try:
181
- f = open(to_bytes(dest, errors='surrogate_or_strict'), 'wb')
182
- f.write(remote_data)
183
- f.close()
184
- except (IOError, OSError) as e:
185
- raise AnsibleActionFail("Failed to fetch the file: %s" % e)
181
+ with open(to_bytes(dest, errors='surrogate_or_strict'), 'wb') as f:
182
+ f.write(remote_data)
183
+ except OSError as ex:
184
+ raise AnsibleActionFail("Failed to fetch the file.") from ex
186
185
  new_checksum = secure_hash(dest)
187
186
  # For backwards compatibility. We'll return None on FIPS enabled systems
188
187
  try:
@@ -9,10 +9,11 @@ import typing as t
9
9
 
10
10
  from ansible import constants as C
11
11
  from ansible.errors import AnsibleActionFail
12
- from ansible.executor.module_common import get_action_args_with_defaults
12
+ from ansible.executor.module_common import _apply_action_arg_defaults
13
13
  from ansible.module_utils.parsing.convert_bool import boolean
14
14
  from ansible.plugins.action import ActionBase
15
15
  from ansible.utils.vars import merge_hash
16
+ from ansible._internal._errors import _error_utils
16
17
 
17
18
 
18
19
  class ActionModule(ActionBase):
@@ -28,10 +29,8 @@ class ActionModule(ActionBase):
28
29
 
29
30
  # TODO: remove in favor of controller side argspec detecting valid arguments
30
31
  # network facts modules must support gather_subset
31
- try:
32
- name = self._connection.ansible_name.removeprefix('ansible.netcommon.')
33
- except AttributeError:
34
- name = self._connection._load_name.split('.')[-1]
32
+ name = self._connection.ansible_name.removeprefix('ansible.netcommon.')
33
+
35
34
  if name not in ('network_cli', 'httpapi', 'netconf'):
36
35
  subset = mod_args.pop('gather_subset', None)
37
36
  if subset not in ('all', ['all'], None):
@@ -54,10 +53,7 @@ class ActionModule(ActionBase):
54
53
  fact_module, collection_list=self._task.collections
55
54
  ).resolved_fqcn
56
55
 
57
- mod_args = get_action_args_with_defaults(
58
- resolved_fact_module, mod_args, self._task.module_defaults, self._templar,
59
- action_groups=self._task._parent._play._action_groups
60
- )
56
+ mod_args = _apply_action_arg_defaults(resolved_fact_module, self._task, mod_args, self._templar)
61
57
 
62
58
  return mod_args
63
59
 
@@ -93,7 +89,7 @@ class ActionModule(ActionBase):
93
89
  if set(modules).intersection(set(C._ACTION_SETUP)):
94
90
  # most don't realize how setup works with networking connection plugins (forced_local)
95
91
  self._display.warning("Detected 'setup' module and a network OS is set, the output when running it will reflect 'localhost'"
96
- " and not the target when a netwoking connection plugin is used.")
92
+ " and not the target when a networking connection plugin is used.")
97
93
 
98
94
  elif not set(modules).intersection(set(C._ACTION_SETUP)):
99
95
  # no network OS and setup not in list, add setup by default since 'smart'
@@ -162,7 +158,7 @@ class ActionModule(ActionBase):
162
158
  for module in jobs:
163
159
  poll_args = {'jid': jobs[module]['ansible_job_id'], '_async_dir': os.path.dirname(jobs[module]['results_file'])}
164
160
  res = self._execute_module(module_name='ansible.legacy.async_status', module_args=poll_args, task_vars=task_vars, wrap_async=False)
165
- if res.get('finished', 0) == 1:
161
+ if res.get('finished', False):
166
162
  if res.get('failed', False):
167
163
  failed[module] = res
168
164
  elif res.get('skipped', False):
@@ -181,16 +177,19 @@ class ActionModule(ActionBase):
181
177
  self._task.async_val = async_val
182
178
 
183
179
  if skipped:
184
- result['msg'] = "The following modules were skipped: %s\n" % (', '.join(skipped.keys()))
180
+ result['msg'] = f"The following modules were skipped: {', '.join(skipped.keys())}."
185
181
  result['skipped_modules'] = skipped
186
182
  if len(skipped) == len(modules):
187
183
  result['skipped'] = True
188
184
 
189
185
  if failed:
190
- result['failed'] = True
191
- result['msg'] = "The following modules failed to execute: %s\n" % (', '.join(failed.keys()))
192
186
  result['failed_modules'] = failed
193
187
 
188
+ result.update(_error_utils.result_dict_from_captured_errors(
189
+ msg=f"The following modules failed to execute: {', '.join(failed.keys())}.",
190
+ errors=[r['exception'] for r in failed.values()],
191
+ ))
192
+
194
193
  # tell executor facts were gathered
195
194
  result['ansible_facts']['_ansible_facts_gathered'] = True
196
195
 
@@ -21,7 +21,7 @@ from ansible.module_utils.six import string_types
21
21
 
22
22
 
23
23
  class ActionModule(ActionBase):
24
- ''' Create inventory groups based on variables '''
24
+ """ Create inventory groups based on variables """
25
25
 
26
26
  # We need to be able to modify the inventory
27
27
  TRANSFERS_FILES = False
@@ -9,8 +9,9 @@ import pathlib
9
9
 
10
10
  import ansible.constants as C
11
11
  from ansible.errors import AnsibleError
12
+ from ansible._internal._datatag._tags import SourceWasEncrypted
12
13
  from ansible.module_utils.six import string_types
13
- from ansible.module_utils.common.text.converters import to_native, to_text
14
+ from ansible.module_utils.common.text.converters import to_native
14
15
  from ansible.plugins.action import ActionBase
15
16
  from ansible.utils.vars import combine_vars
16
17
 
@@ -142,9 +143,8 @@ class ActionModule(ActionBase):
142
143
  result['message'] = err_msg
143
144
  elif self.hash_behaviour is not None and self.hash_behaviour != C.DEFAULT_HASH_BEHAVIOUR:
144
145
  merge_hashes = self.hash_behaviour == 'merge'
145
- for key, value in results.items():
146
- old_value = task_vars.get(key, None)
147
- results[key] = combine_vars(old_value, value, merge=merge_hashes)
146
+ existing_variables = {k: v for k, v in task_vars.items() if k in results}
147
+ results = combine_vars(existing_variables, results, merge=merge_hashes)
148
148
 
149
149
  result['ansible_included_var_files'] = self.included_files
150
150
  result['ansible_facts'] = results
@@ -168,9 +168,9 @@ class ActionModule(ActionBase):
168
168
  )
169
169
  self.source_dir = path_to_use
170
170
  else:
171
- if hasattr(self._task._ds, '_data_source'):
171
+ if (origin := self._task._origin) and origin.path: # origin.path is not present for ad-hoc tasks
172
172
  current_dir = (
173
- "/".join(self._task._ds._data_source.split('/')[:-1])
173
+ "/".join(origin.path.split('/')[:-1])
174
174
  )
175
175
  self.source_dir = path.join(current_dir, self.source_dir)
176
176
 
@@ -234,14 +234,13 @@ class ActionModule(ActionBase):
234
234
  failed = True
235
235
  err_msg = ('{0} does not have a valid extension: {1}'.format(to_native(filename), ', '.join(self.valid_extensions)))
236
236
  else:
237
- b_data, show_content = self._loader._get_file_contents(filename)
238
- data = to_text(b_data, errors='surrogate_or_strict')
237
+ data = self._loader.load_from_file(filename, cache='none', trusted_as_template=True)
239
238
 
240
- self.show_content &= show_content # mask all results if any file was encrypted
239
+ self.show_content &= not SourceWasEncrypted.is_tagged_on(data)
241
240
 
242
- data = self._loader.load(data, file_name=filename, show_content=show_content)
243
- if not data:
241
+ if data is None: # support empty files, but not falsey values
244
242
  data = dict()
243
+
245
244
  if not isinstance(data, dict):
246
245
  failed = True
247
246
  err_msg = ('{0} must be stored as a dictionary/hash'.format(to_native(filename)))