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
@@ -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
@@ -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')
@@ -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
+ thats = new_module_args['that']
76
+
98
77
  if not quiet:
99
78
  result['_ansible_verbose_always'] = True
100
79
 
101
80
  for that in thats:
102
- cond.when = [that]
103
- test_result = cond.evaluate_conditional(templar=self._templar, all_vars=task_vars)
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
@@ -23,7 +23,6 @@ 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
@@ -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,7 +404,7 @@ 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
 
@@ -472,10 +469,9 @@ class ActionModule(ActionBase):
472
469
  try:
473
470
  # find in expected paths
474
471
  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()
472
+ except AnsibleError as ex:
473
+ result.update(self.result_dict_from_exception(ex))
474
+
479
475
  return self._ensure_invocation(result)
480
476
 
481
477
  if trailing_slash != source.endswith(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
 
@@ -178,9 +178,8 @@ 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()
181
+ with open(to_bytes(dest, errors='surrogate_or_strict'), 'wb') as f:
182
+ f.write(remote_data)
184
183
  except (IOError, OSError) as e:
185
184
  raise AnsibleActionFail("Failed to fetch the file: %s" % e)
186
185
  new_checksum = secure_hash(dest)
@@ -9,7 +9,7 @@ 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
@@ -54,10 +54,7 @@ class ActionModule(ActionBase):
54
54
  fact_module, collection_list=self._task.collections
55
55
  ).resolved_fqcn
56
56
 
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
- )
57
+ mod_args = _apply_action_arg_defaults(resolved_fact_module, self._task, mod_args, self._templar)
61
58
 
62
59
  return mod_args
63
60
 
@@ -93,7 +90,7 @@ class ActionModule(ActionBase):
93
90
  if set(modules).intersection(set(C._ACTION_SETUP)):
94
91
  # most don't realize how setup works with networking connection plugins (forced_local)
95
92
  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.")
93
+ " and not the target when a networking connection plugin is used.")
97
94
 
98
95
  elif not set(modules).intersection(set(C._ACTION_SETUP)):
99
96
  # no network OS and setup not in list, add setup by default since 'smart'
@@ -132,6 +129,8 @@ class ActionModule(ActionBase):
132
129
  # TODO: use gather_timeout to cut module execution if module itself does not support gather_timeout
133
130
  res = self._execute_module(module_name=fact_module, module_args=mod_args, task_vars=task_vars, wrap_async=False)
134
131
  if res.get('failed', False):
132
+ # DTFIX-RELEASE: this trashes the individual failure details and does not work with the new error handling; need to do something to
133
+ # invoke per-item error handling- perhaps returning this as a synthetic loop result?
135
134
  failed[fact_module] = res
136
135
  elif res.get('skipped', False):
137
136
  skipped[fact_module] = res
@@ -164,6 +163,8 @@ class ActionModule(ActionBase):
164
163
  res = self._execute_module(module_name='ansible.legacy.async_status', module_args=poll_args, task_vars=task_vars, wrap_async=False)
165
164
  if res.get('finished', 0) == 1:
166
165
  if res.get('failed', False):
166
+ # DTFIX-RELEASE: this trashes the individual failure details and does not work with the new error handling; need to do something to
167
+ # invoke per-item error handling- perhaps returning this as a synthetic loop result?
167
168
  failed[module] = res
168
169
  elif res.get('skipped', False):
169
170
  skipped[module] = res
@@ -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)))
@@ -17,7 +17,7 @@
17
17
  from __future__ import annotations
18
18
 
19
19
  from ansible.errors import AnsibleAction, AnsibleActionFail
20
- from ansible.executor.module_common import get_action_args_with_defaults
20
+ from ansible.executor.module_common import _apply_action_arg_defaults
21
21
  from ansible.module_utils.facts.system.pkg_mgr import PKG_MGRS
22
22
  from ansible.plugins.action import ActionBase
23
23
  from ansible.utils.display import Display
@@ -33,7 +33,7 @@ class ActionModule(ActionBase):
33
33
  BUILTIN_PKG_MGR_MODULES = {manager['name'] for manager in PKG_MGRS}
34
34
 
35
35
  def run(self, tmp=None, task_vars=None):
36
- ''' handler for package operations '''
36
+ """ handler for package operations """
37
37
 
38
38
  self._supports_check_mode = True
39
39
  self._supports_async = True
@@ -92,10 +92,7 @@ class ActionModule(ActionBase):
92
92
 
93
93
  # get defaults for specific module
94
94
  context = self._shared_loader_obj.module_loader.find_plugin_with_context(module, collection_list=self._task.collections)
95
- new_module_args = get_action_args_with_defaults(
96
- context.resolved_fqcn, new_module_args, self._task.module_defaults, self._templar,
97
- action_groups=self._task._parent._play._action_groups
98
- )
95
+ new_module_args = _apply_action_arg_defaults(context.resolved_fqcn, self._task, new_module_args, self._templar)
99
96
 
100
97
  if module in self.BUILTIN_PKG_MGR_MODULES:
101
98
  # prefix with ansible.legacy to eliminate external collisions while still allowing library/ override
@@ -28,12 +28,12 @@ display = Display()
28
28
 
29
29
 
30
30
  class ActionModule(ActionBase):
31
- ''' pauses execution for a length or time, or until input is received '''
31
+ """ pauses execution for a length or time, or until input is received """
32
32
 
33
33
  BYPASS_HOST_LOOP = True
34
34
 
35
35
  def run(self, tmp=None, task_vars=None):
36
- ''' run the pause action module '''
36
+ """ run the pause action module """
37
37
  if task_vars is None:
38
38
  task_vars = dict()
39
39
 
@@ -17,6 +17,7 @@
17
17
  from __future__ import annotations
18
18
 
19
19
  import os
20
+ import pathlib
20
21
  import re
21
22
  import shlex
22
23
 
@@ -35,7 +36,7 @@ class ActionModule(ActionBase):
35
36
  windows_absolute_path_detection = re.compile(r'^(?:[a-zA-Z]\:)?(\\|\/)')
36
37
 
37
38
  def run(self, tmp=None, task_vars=None):
38
- ''' handler for file transfer operations '''
39
+ """ handler for file transfer operations """
39
40
  if task_vars is None:
40
41
  task_vars = dict()
41
42
 
@@ -48,9 +49,8 @@ class ActionModule(ActionBase):
48
49
  'chdir': {'type': 'str'},
49
50
  'executable': {'type': 'str'},
50
51
  },
51
- required_one_of=[
52
- ['_raw_params', 'cmd']
53
- ]
52
+ required_one_of=[['_raw_params', 'cmd']],
53
+ mutually_exclusive=[['_raw_params', 'cmd']],
54
54
  )
55
55
 
56
56
  result = super(ActionModule, self).run(tmp, task_vars)
@@ -88,7 +88,7 @@ class ActionModule(ActionBase):
88
88
  # Split out the script as the first item in raw_params using
89
89
  # shlex.split() in order to support paths and files with spaces in the name.
90
90
  # Any arguments passed to the script will be added back later.
91
- raw_params = to_native(new_module_args.get('_raw_params', ''), errors='surrogate_or_strict')
91
+ raw_params = new_module_args['_raw_params'] or new_module_args['cmd']
92
92
  parts = [to_text(s, errors='surrogate_or_strict') for s in shlex.split(raw_params.strip())]
93
93
  source = parts[0]
94
94
 
@@ -152,9 +152,16 @@ class ActionModule(ActionBase):
152
152
  # FUTURE: use a more public method to get the exec payload
153
153
  pc = self._task
154
154
  exec_data = ps_manifest._create_powershell_wrapper(
155
- to_bytes(script_cmd), source, {}, env_dict, self._task.async_val,
156
- pc.become, pc.become_method, pc.become_user,
157
- self._play_context.become_pass, pc.become_flags, "script", task_vars, None
155
+ name=f"ansible.builtin.script.{pathlib.Path(source).stem}",
156
+ module_data=to_bytes(script_cmd),
157
+ module_path=source,
158
+ module_args={},
159
+ environment=env_dict,
160
+ async_timeout=self._task.async_val,
161
+ become_plugin=self._connection.become,
162
+ substyle="script",
163
+ task_vars=task_vars,
164
+ profile='legacy', # the profile doesn't really matter since the module args dict is empty
158
165
  )
159
166
  # build the necessary exec wrapper command
160
167
  # FUTURE: this still doesn't let script work on Windows with non-pipelined connections or
@@ -16,9 +16,8 @@
16
16
  # along with Ansible. If not, see <http://www.gnu.org/licenses/>.
17
17
  from __future__ import annotations
18
18
 
19
-
20
19
  from ansible.errors import AnsibleAction, AnsibleActionFail
21
- from ansible.executor.module_common import get_action_args_with_defaults
20
+ from ansible.executor.module_common import _apply_action_arg_defaults
22
21
  from ansible.plugins.action import ActionBase
23
22
 
24
23
 
@@ -35,7 +34,7 @@ class ActionModule(ActionBase):
35
34
  BUILTIN_SVC_MGR_MODULES = set(['openwrt_init', 'service', 'systemd', 'sysvinit'])
36
35
 
37
36
  def run(self, tmp=None, task_vars=None):
38
- ''' handler for package operations '''
37
+ """ handler for package operations """
39
38
 
40
39
  self._supports_check_mode = True
41
40
  self._supports_async = True
@@ -47,10 +46,9 @@ class ActionModule(ActionBase):
47
46
 
48
47
  if module == 'auto':
49
48
  try:
50
- if self._task.delegate_to: # if we delegate, we should use delegated host's facts
51
- module = self._templar.template("{{hostvars['%s']['ansible_facts']['service_mgr']}}" % self._task.delegate_to)
52
- else:
53
- module = self._templar.template('{{ansible_facts.service_mgr}}')
49
+ # if we delegate, we should use delegated host's facts
50
+ expr = "hostvars[delegate_to].ansible_facts.service_mgr" if self._task.delegate_to else "ansible_facts.service_mgr"
51
+ module = self._templar.resolve_variable_expression(expr, local_variables=dict(delegate_to=self._task.delegate_to))
54
52
  except Exception:
55
53
  pass # could not get it from template!
56
54
 
@@ -79,10 +77,7 @@ class ActionModule(ActionBase):
79
77
 
80
78
  # get defaults for specific module
81
79
  context = self._shared_loader_obj.module_loader.find_plugin_with_context(module, collection_list=self._task.collections)
82
- new_module_args = get_action_args_with_defaults(
83
- context.resolved_fqcn, new_module_args, self._task.module_defaults, self._templar,
84
- action_groups=self._task._parent._play._action_groups
85
- )
80
+ new_module_args = _apply_action_arg_defaults(context.resolved_fqcn, self._task, new_module_args, self._templar)
86
81
 
87
82
  # collection prefix known internal modules to avoid collisions from collections search, while still allowing library/ overrides
88
83
  if module in self.BUILTIN_SVC_MGR_MODULES: