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
@@ -7,7 +7,7 @@
7
7
  from __future__ import annotations
8
8
 
9
9
 
10
- DOCUMENTATION = r'''
10
+ DOCUMENTATION = r"""
11
11
  ---
12
12
  module: iptables
13
13
  short_description: Modify iptables rules
@@ -67,7 +67,7 @@ options:
67
67
  description:
68
68
  - Which version of the IP protocol this rule should apply to.
69
69
  type: str
70
- choices: [ ipv4, ipv6 ]
70
+ choices: [ ipv4, ipv6, both ]
71
71
  default: ipv4
72
72
  chain:
73
73
  description:
@@ -394,9 +394,9 @@ options:
394
394
  type: bool
395
395
  default: false
396
396
  version_added: "2.15"
397
- '''
397
+ """
398
398
 
399
- EXAMPLES = r'''
399
+ EXAMPLES = r"""
400
400
  - name: Block specific IP
401
401
  ansible.builtin.iptables:
402
402
  chain: INPUT
@@ -543,7 +543,7 @@ EXAMPLES = r'''
543
543
  - "443"
544
544
  - "8081:8083"
545
545
  jump: ACCEPT
546
- '''
546
+ """
547
547
 
548
548
  import re
549
549
 
@@ -564,6 +564,7 @@ BINS = dict(
564
564
  ICMP_TYPE_OPTIONS = dict(
565
565
  ipv4='--icmp-type',
566
566
  ipv6='--icmpv6-type',
567
+ both='--icmp-type --icmpv6-type',
567
568
  )
568
569
 
569
570
 
@@ -614,7 +615,6 @@ def append_wait(rule, param, flag):
614
615
 
615
616
  def construct_rule(params):
616
617
  rule = []
617
- append_wait(rule, params['wait'], '-w')
618
618
  append_param(rule, params['protocol'], '-p', False)
619
619
  append_param(rule, params['source'], '-s', False)
620
620
  append_param(rule, params['destination'], '-d', False)
@@ -701,6 +701,8 @@ def push_arguments(iptables_path, action, params, make_rule=True):
701
701
  cmd.extend([action, params['chain']])
702
702
  if action == '-I' and params['rule_num']:
703
703
  cmd.extend([params['rule_num']])
704
+ if params['wait']:
705
+ cmd.extend(['-w', params['wait']])
704
706
  if make_rule:
705
707
  cmd.extend(construct_rule(params))
706
708
  return cmd
@@ -781,7 +783,7 @@ def main():
781
783
  table=dict(type='str', default='filter', choices=['filter', 'nat', 'mangle', 'raw', 'security']),
782
784
  state=dict(type='str', default='present', choices=['absent', 'present']),
783
785
  action=dict(type='str', default='append', choices=['append', 'insert']),
784
- ip_version=dict(type='str', default='ipv4', choices=['ipv4', 'ipv6']),
786
+ ip_version=dict(type='str', default='ipv4', choices=['ipv4', 'ipv6', 'both']),
785
787
  chain=dict(type='str'),
786
788
  rule_num=dict(type='str'),
787
789
  protocol=dict(type='str'),
@@ -861,86 +863,97 @@ def main():
861
863
  rule=' '.join(construct_rule(module.params)),
862
864
  state=module.params['state'],
863
865
  chain_management=module.params['chain_management'],
866
+ wait=module.params['wait'],
864
867
  )
865
868
 
866
- ip_version = module.params['ip_version']
867
- iptables_path = module.get_bin_path(BINS[ip_version], True)
869
+ ip_version = ['ipv4', 'ipv6'] if module.params['ip_version'] == 'both' else [module.params['ip_version']]
870
+ iptables_path = [module.get_bin_path('iptables', True) if ip_version == 'ipv4' else module.get_bin_path('ip6tables', True) for ip_version in ip_version]
868
871
 
869
- if module.params.get('log_prefix', None) or module.params.get('log_level', None):
870
- if module.params['jump'] is None:
871
- module.params['jump'] = 'LOG'
872
- elif module.params['jump'] != 'LOG':
873
- module.fail_json(msg="Logging options can only be used with the LOG jump target.")
872
+ both_changed = False
874
873
 
875
- # Check if wait option is supported
876
- iptables_version = LooseVersion(get_iptables_version(iptables_path, module))
874
+ for path in iptables_path:
875
+ if module.params.get('log_prefix', None) or module.params.get('log_level', None):
876
+ if module.params['jump'] is None:
877
+ module.params['jump'] = 'LOG'
878
+ elif module.params['jump'] != 'LOG':
879
+ module.fail_json(msg="Logging options can only be used with the LOG jump target.")
877
880
 
878
- if iptables_version >= LooseVersion(IPTABLES_WAIT_SUPPORT_ADDED):
879
- if iptables_version < LooseVersion(IPTABLES_WAIT_WITH_SECONDS_SUPPORT_ADDED):
880
- module.params['wait'] = ''
881
- else:
882
- module.params['wait'] = None
883
-
884
- # Flush the table
885
- if args['flush'] is True:
886
- args['changed'] = True
887
- if not module.check_mode:
888
- flush_table(iptables_path, module, module.params)
889
-
890
- # Set the policy
891
- elif module.params['policy']:
892
- current_policy = get_chain_policy(iptables_path, module, module.params)
893
- if not current_policy:
894
- module.fail_json(msg='Can\'t detect current policy')
895
-
896
- changed = current_policy != module.params['policy']
897
- args['changed'] = changed
898
- if changed and not module.check_mode:
899
- set_chain_policy(iptables_path, module, module.params)
900
-
901
- # Delete the chain if there is no rule in the arguments
902
- elif (args['state'] == 'absent') and not args['rule']:
903
- chain_is_present = check_chain_present(
904
- iptables_path, module, module.params
905
- )
906
- args['changed'] = chain_is_present
907
-
908
- if (chain_is_present and args['chain_management'] and not module.check_mode):
909
- delete_chain(iptables_path, module, module.params)
881
+ # Check if wait option is supported
882
+ iptables_version = LooseVersion(get_iptables_version(path, module))
910
883
 
911
- else:
912
- # Create the chain if there are no rule arguments
913
- if (args['state'] == 'present') and not args['rule']:
884
+ if iptables_version >= LooseVersion(IPTABLES_WAIT_SUPPORT_ADDED):
885
+ if iptables_version < LooseVersion(IPTABLES_WAIT_WITH_SECONDS_SUPPORT_ADDED):
886
+ module.params['wait'] = ''
887
+ else:
888
+ module.params['wait'] = None
889
+
890
+ # Flush the table
891
+ if args['flush'] is True:
892
+ args['changed'] = True
893
+ both_changed = True
894
+ if not module.check_mode:
895
+ flush_table(path, module, module.params)
896
+
897
+ # Set the policy
898
+ elif module.params['policy']:
899
+ current_policy = get_chain_policy(path, module, module.params)
900
+ if not current_policy:
901
+ module.fail_json(msg='Can\'t detect current policy')
902
+
903
+ changed = current_policy != module.params['policy']
904
+ args['changed'] = changed
905
+ both_changed = both_changed or changed
906
+ if changed and not module.check_mode:
907
+ set_chain_policy(path, module, module.params)
908
+
909
+ # Delete the chain if there is no rule in the arguments
910
+ elif (args['state'] == 'absent') and not args['rule']:
914
911
  chain_is_present = check_chain_present(
915
- iptables_path, module, module.params
912
+ path, module, module.params
916
913
  )
917
- args['changed'] = not chain_is_present
914
+ args['changed'] = chain_is_present
915
+ both_changed = both_changed or chain_is_present
918
916
 
919
- if (not chain_is_present and args['chain_management'] and not module.check_mode):
920
- create_chain(iptables_path, module, module.params)
917
+ if (chain_is_present and args['chain_management'] and not module.check_mode):
918
+ delete_chain(path, module, module.params)
921
919
 
922
920
  else:
923
- insert = (module.params['action'] == 'insert')
924
- rule_is_present = check_rule_present(
925
- iptables_path, module, module.params
926
- )
921
+ # Create the chain if there are no rule arguments
922
+ if (args['state'] == 'present') and not args['rule']:
923
+ chain_is_present = check_chain_present(
924
+ path, module, module.params
925
+ )
926
+ args['changed'] = not chain_is_present
927
+ both_changed = both_changed or not chain_is_present
927
928
 
928
- should_be_present = (args['state'] == 'present')
929
- # Check if target is up to date
930
- args['changed'] = (rule_is_present != should_be_present)
931
- if args['changed'] is False:
932
- # Target is already up to date
933
- module.exit_json(**args)
929
+ if (not chain_is_present and args['chain_management'] and not module.check_mode):
930
+ create_chain(path, module, module.params)
934
931
 
935
- # Modify if not check_mode
936
- if not module.check_mode:
937
- if should_be_present:
938
- if insert:
939
- insert_rule(iptables_path, module, module.params)
932
+ else:
933
+ insert = (module.params['action'] == 'insert')
934
+ rule_is_present = check_rule_present(
935
+ path, module, module.params
936
+ )
937
+
938
+ should_be_present = (args['state'] == 'present')
939
+ # Check if target is up to date
940
+ args['changed'] = (rule_is_present != should_be_present)
941
+ both_changed = both_changed or (rule_is_present != should_be_present)
942
+ if args['changed'] is False:
943
+ # Target is already up to date
944
+ continue
945
+
946
+ # Modify if not check_mode
947
+ if not module.check_mode:
948
+ if should_be_present:
949
+ if insert:
950
+ insert_rule(path, module, module.params)
951
+ else:
952
+ append_rule(path, module, module.params)
940
953
  else:
941
- append_rule(iptables_path, module, module.params)
942
- else:
943
- remove_rule(iptables_path, module, module.params)
954
+ remove_rule(path, module, module.params)
955
+
956
+ args['changed'] = both_changed
944
957
 
945
958
  module.exit_json(**args)
946
959
 
@@ -5,7 +5,7 @@
5
5
  from __future__ import annotations
6
6
 
7
7
 
8
- DOCUMENTATION = r'''
8
+ DOCUMENTATION = r"""
9
9
  ---
10
10
  module: known_hosts
11
11
  short_description: Add or remove a host from the C(known_hosts) file
@@ -65,9 +65,9 @@ extends_documentation_fragment:
65
65
  - action_common_attributes
66
66
  author:
67
67
  - Matthew Vernon (@mcv21)
68
- '''
68
+ """
69
69
 
70
- EXAMPLES = r'''
70
+ EXAMPLES = r"""
71
71
  - name: Tell the host about our servers it might want to ssh to
72
72
  ansible.builtin.known_hosts:
73
73
  path: /etc/ssh/ssh_known_hosts
@@ -87,7 +87,7 @@ EXAMPLES = r'''
87
87
  key: '[host1.example.com]:2222 ssh-rsa ASDeararAIUHI324324' # some key gibberish
88
88
  path: /etc/ssh/ssh_known_hosts
89
89
  state: present
90
- '''
90
+ """
91
91
 
92
92
  # Makes sure public host keys are present or absent in the given known_hosts
93
93
  # file.
@@ -102,7 +102,6 @@ EXAMPLES = r'''
102
102
 
103
103
  import base64
104
104
  import copy
105
- import errno
106
105
  import hashlib
107
106
  import hmac
108
107
  import os
@@ -169,11 +168,10 @@ def enforce_state(module, params):
169
168
  if replace_or_add or found != (state == "present"):
170
169
  try:
171
170
  inf = open(path, "r")
172
- except IOError as e:
173
- if e.errno == errno.ENOENT:
174
- inf = None
175
- else:
176
- module.fail_json(msg="Failed to read %s: %s" % (path, str(e)))
171
+ except FileNotFoundError:
172
+ inf = None
173
+ except OSError as ex:
174
+ raise Exception(f"Failed to read {path!r}.") from ex
177
175
  try:
178
176
  with tempfile.NamedTemporaryFile(mode='w+', dir=os.path.dirname(path), delete=False) as outf:
179
177
  if inf is not None:
@@ -184,8 +182,8 @@ def enforce_state(module, params):
184
182
  inf.close()
185
183
  if state == 'present':
186
184
  outf.write(key)
187
- except (IOError, OSError) as e:
188
- module.fail_json(msg="Failed to write to file %s: %s" % (path, to_native(e)))
185
+ except OSError as ex:
186
+ raise Exception(f"Failed to write to file {path!r}.") from ex
189
187
  else:
190
188
  module.atomic_move(outf.name, path)
191
189
 
@@ -195,13 +193,13 @@ def enforce_state(module, params):
195
193
 
196
194
 
197
195
  def sanity_check(module, host, key, sshkeygen):
198
- '''Check supplied key is sensible
196
+ """Check supplied key is sensible
199
197
 
200
198
  host and key are parameters provided by the user; If the host
201
199
  provided is inconsistent with the key supplied, then this function
202
200
  quits, providing an error to the user.
203
201
  sshkeygen is the path to ssh-keygen, found earlier with get_bin_path
204
- '''
202
+ """
205
203
  # If no key supplied, we're doing a removal, and have nothing to check here.
206
204
  if not key:
207
205
  return
@@ -220,9 +218,8 @@ def sanity_check(module, host, key, sshkeygen):
220
218
  try:
221
219
  outf.write(key)
222
220
  outf.flush()
223
- except IOError as e:
224
- module.fail_json(msg="Failed to write to temporary file %s: %s" %
225
- (outf.name, to_native(e)))
221
+ except OSError as ex:
222
+ raise Exception(f"Failed to write to temporary file {outf.name!r}.") from ex
226
223
 
227
224
  sshkeygen_command = [sshkeygen, '-F', host, '-f', outf.name]
228
225
  rc, stdout, stderr = module.run_command(sshkeygen_command)
@@ -232,7 +229,7 @@ def sanity_check(module, host, key, sshkeygen):
232
229
 
233
230
 
234
231
  def search_for_host_key(module, host, key, path, sshkeygen):
235
- '''search_for_host_key(module,host,key,path,sshkeygen) -> (found,replace_or_add,found_line)
232
+ """search_for_host_key(module,host,key,path,sshkeygen) -> (found,replace_or_add,found_line)
236
233
 
237
234
  Looks up host and keytype in the known_hosts file path; if it's there, looks to see
238
235
  if one of those entries matches key. Returns:
@@ -241,7 +238,7 @@ def search_for_host_key(module, host, key, path, sshkeygen):
241
238
  found_line (int or None): the line where a key of the same type was found
242
239
  if found=False, then replace is always False.
243
240
  sshkeygen is the path to ssh-keygen, found earlier with get_bin_path
244
- '''
241
+ """
245
242
  if os.path.exists(path) is False:
246
243
  return False, False, None
247
244
 
@@ -304,14 +301,14 @@ def hash_host_key(host, key):
304
301
 
305
302
 
306
303
  def normalize_known_hosts_key(key):
307
- '''
304
+ """
308
305
  Transform a key, either taken from a known_host file or provided by the
309
306
  user, into a normalized form.
310
307
  The host part (which might include multiple hostnames or be hashed) gets
311
308
  replaced by the provided host. Also, any spurious information gets removed
312
309
  from the end (like the username@host tag usually present in hostkeys, but
313
310
  absent in known_hosts files)
314
- '''
311
+ """
315
312
  key = key.strip() # trim trailing newline
316
313
  k = key.split()
317
314
  d = dict()
@@ -337,9 +334,10 @@ def compute_diff(path, found_line, replace_or_add, state, key):
337
334
  }
338
335
  try:
339
336
  inf = open(path, "r")
340
- except IOError as e:
341
- if e.errno == errno.ENOENT:
342
- diff['before_header'] = '/dev/null'
337
+ except FileNotFoundError:
338
+ diff['before_header'] = '/dev/null'
339
+ except OSError:
340
+ pass
343
341
  else:
344
342
  diff['before'] = inf.read()
345
343
  inf.close()
@@ -8,7 +8,7 @@
8
8
  from __future__ import annotations
9
9
 
10
10
 
11
- DOCUMENTATION = r'''
11
+ DOCUMENTATION = r"""
12
12
  ---
13
13
  module: lineinfile
14
14
  short_description: Manage lines in text files
@@ -152,9 +152,9 @@ author:
152
152
  - Daniel Hokka Zakrissoni (@dhozac)
153
153
  - Ahti Kitsik (@ahtik)
154
154
  - Jose Angel Munoz (@imjoseangel)
155
- '''
155
+ """
156
156
 
157
- EXAMPLES = r'''
157
+ EXAMPLES = r"""
158
158
  # NOTE: Before 2.3, option 'dest', 'destfile' or 'name' was used instead of 'path'
159
159
  - name: Ensure SELinux is set to enforcing mode
160
160
  ansible.builtin.lineinfile:
@@ -237,9 +237,9 @@ EXAMPLES = r'''
237
237
  regexp: ^(host=).*
238
238
  line: \g<1>{{ hostname }}
239
239
  backrefs: yes
240
- '''
240
+ """
241
241
 
242
- RETURN = r'''#'''
242
+ RETURN = r"""#"""
243
243
 
244
244
  import os
245
245
  import re
ansible/modules/meta.py CHANGED
@@ -6,7 +6,7 @@
6
6
  from __future__ import annotations
7
7
 
8
8
 
9
- DOCUMENTATION = r'''
9
+ DOCUMENTATION = r"""
10
10
  module: meta
11
11
  short_description: Execute Ansible 'actions'
12
12
  version_added: '1.2'
@@ -83,9 +83,9 @@ seealso:
83
83
  - module: ansible.builtin.fail
84
84
  author:
85
85
  - Ansible Core Team
86
- '''
86
+ """
87
87
 
88
- EXAMPLES = r'''
88
+ EXAMPLES = r"""
89
89
  # Example showing flushing handlers on demand, not at end of play
90
90
  - ansible.builtin.template:
91
91
  src: new.j2
@@ -131,4 +131,4 @@ EXAMPLES = r'''
131
131
  when:
132
132
  - ansible_distribution == 'CentOS'
133
133
  - ansible_distribution_major_version == '6'
134
- '''
134
+ """
@@ -1,5 +1,5 @@
1
1
  # -*- coding: utf-8 -*-
2
- # Copyright (c) 2024 Ansible Project
2
+ # Copyright: Contributors to the Ansible project
3
3
  # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
4
4
 
5
5
  from __future__ import annotations
@@ -359,7 +359,7 @@ def gen_mounts_from_stdout(stdout: str) -> t.Iterable[MountInfo]:
359
359
  elif pattern is BSD_MOUNT_RE:
360
360
  # the group containing fstype is comma separated, and may include whitespace
361
361
  mount_info = match.groupdict()
362
- parts = re.split(r"\s*,\s*", match.group("fstype"), 1)
362
+ parts = re.split(r"\s*,\s*", match.group("fstype"), maxsplit=1)
363
363
  if len(parts) == 1:
364
364
  mount_info["fstype"] = parts[0]
365
365
  else:
@@ -7,7 +7,7 @@
7
7
  from __future__ import annotations
8
8
 
9
9
 
10
- DOCUMENTATION = '''
10
+ DOCUMENTATION = """
11
11
  ---
12
12
  module: package
13
13
  version_added: 2.0
@@ -66,8 +66,8 @@ attributes:
66
66
  notes:
67
67
  - While M(ansible.builtin.package) abstracts package managers to ease dealing with multiple distributions, package name often differs for the same software.
68
68
 
69
- '''
70
- EXAMPLES = '''
69
+ """
70
+ EXAMPLES = """
71
71
  - name: Install ntpdate
72
72
  ansible.builtin.package:
73
73
  name: ntpdate
@@ -85,4 +85,10 @@ EXAMPLES = '''
85
85
  - httpd
86
86
  - mariadb-server
87
87
  state: latest
88
- '''
88
+
89
+ - name: Use the dnf package manager to install httpd
90
+ ansible.builtin.package:
91
+ name: httpd
92
+ state: present
93
+ use: dnf
94
+ """
@@ -6,7 +6,7 @@
6
6
  from __future__ import annotations
7
7
 
8
8
 
9
- DOCUMENTATION = '''
9
+ DOCUMENTATION = """
10
10
  module: package_facts
11
11
  short_description: Package information as facts
12
12
  description:
@@ -23,7 +23,7 @@ options:
23
23
  default: ['auto']
24
24
  choices:
25
25
  auto: Depending on O(strategy), will match the first or all package managers provided, in order
26
- rpm: For RPM based distros, requires RPM Python bindings, not installed by default on Suse (python3-rpm)
26
+ rpm: For RPM based distros, requires RPM Python bindings, not installed by default on Suse or Fedora 41+ (python3-rpm)
27
27
  yum: Alias to rpm
28
28
  dnf: Alias to rpm
29
29
  dnf5: Alias to rpm
@@ -67,9 +67,9 @@ attributes:
67
67
  support: full
68
68
  platform:
69
69
  platforms: posix
70
- '''
70
+ """
71
71
 
72
- EXAMPLES = '''
72
+ EXAMPLES = """
73
73
  - name: Gather the package facts
74
74
  ansible.builtin.package_facts:
75
75
  manager: auto
@@ -83,9 +83,9 @@ EXAMPLES = '''
83
83
  msg: "{{ ansible_facts.packages['foobar'] | length }} versions of foobar are installed!"
84
84
  when: "'foobar' in ansible_facts.packages"
85
85
 
86
- '''
86
+ """
87
87
 
88
- RETURN = '''
88
+ RETURN = """
89
89
  ansible_facts:
90
90
  description: Facts to add to ansible_facts.
91
91
  returned: always
@@ -248,7 +248,7 @@ ansible_facts:
248
248
  ],
249
249
  }
250
250
  }
251
- '''
251
+ """
252
252
 
253
253
  import re
254
254
 
@@ -460,7 +460,7 @@ def main():
460
460
 
461
461
  # get supported pkg managers
462
462
  PKG_MANAGERS = get_all_pkg_managers()
463
- PKG_MANAGER_NAMES = [x.lower() for x in PKG_MANAGERS.keys()]
463
+ PKG_MANAGER_NAMES = sorted([x.lower() for x in PKG_MANAGERS.keys()])
464
464
  # add aliases
465
465
  PKG_MANAGER_NAMES.extend([alias for alist in ALIASES.values() for alias in alist])
466
466
 
@@ -510,12 +510,24 @@ def main():
510
510
 
511
511
  manager = PKG_MANAGERS[pkgmgr]()
512
512
  try:
513
+ packages_found = {}
513
514
  if manager.is_available(handle_exceptions=False):
514
- found += 1
515
515
  try:
516
- packages.update(manager.get_packages())
516
+ packages_found = manager.get_packages()
517
517
  except Exception as e:
518
518
  module.warn('Failed to retrieve packages with %s: %s' % (pkgmgr, to_text(e)))
519
+
520
+ # only consider 'found' if it results in something
521
+ if packages_found:
522
+ found += 1
523
+ for k in packages_found.keys():
524
+ if k in packages:
525
+ packages[k].extend(packages_found[k])
526
+ else:
527
+ packages[k] = packages_found[k]
528
+ else:
529
+ module.warn('Found "%s" but no associated packages' % (pkgmgr))
530
+
519
531
  except Exception as e:
520
532
  if pkgmgr in module.params['manager']:
521
533
  module.warn('Requested package manager %s was not usable by this module: %s' % (pkgmgr, to_text(e)))
ansible/modules/pause.py CHANGED
@@ -4,7 +4,7 @@
4
4
  from __future__ import annotations
5
5
 
6
6
 
7
- DOCUMENTATION = '''
7
+ DOCUMENTATION = """
8
8
  ---
9
9
  module: pause
10
10
  short_description: Pause playbook execution
@@ -65,9 +65,9 @@ attributes:
65
65
  notes:
66
66
  - Starting in 2.2, if you specify 0 or negative for minutes or seconds, it will wait for 1 second, previously it would wait indefinitely.
67
67
  - User input is not captured or echoed, regardless of echo setting, when minutes or seconds is specified.
68
- '''
68
+ """
69
69
 
70
- EXAMPLES = '''
70
+ EXAMPLES = """
71
71
  - name: Pause for 5 minutes to build app cache
72
72
  ansible.builtin.pause:
73
73
  minutes: 5
@@ -83,9 +83,9 @@ EXAMPLES = '''
83
83
  ansible.builtin.pause:
84
84
  prompt: "Enter a secret"
85
85
  echo: no
86
- '''
86
+ """
87
87
 
88
- RETURN = '''
88
+ RETURN = """
89
89
  user_input:
90
90
  description: User input from interactive console
91
91
  returned: if no waiting time set
@@ -116,4 +116,4 @@ echo:
116
116
  returned: always
117
117
  type: bool
118
118
  sample: true
119
- '''
119
+ """
ansible/modules/ping.py CHANGED
@@ -7,7 +7,7 @@
7
7
  from __future__ import annotations
8
8
 
9
9
 
10
- DOCUMENTATION = '''
10
+ DOCUMENTATION = """
11
11
  ---
12
12
  module: ping
13
13
  version_added: historical
@@ -41,9 +41,9 @@ seealso:
41
41
  author:
42
42
  - Ansible Core Team
43
43
  - Michael DeHaan
44
- '''
44
+ """
45
45
 
46
- EXAMPLES = '''
46
+ EXAMPLES = """
47
47
  # Test we can logon to 'webservers' and execute python with json lib.
48
48
  # ansible webservers -m ansible.builtin.ping
49
49
 
@@ -53,15 +53,15 @@ EXAMPLES = '''
53
53
  - name: Induce an exception to see what happens
54
54
  ansible.builtin.ping:
55
55
  data: crash
56
- '''
56
+ """
57
57
 
58
- RETURN = '''
58
+ RETURN = """
59
59
  ping:
60
60
  description: Value provided with the O(data) parameter.
61
61
  returned: success
62
62
  type: str
63
63
  sample: pong
64
- '''
64
+ """
65
65
 
66
66
  from ansible.module_utils.basic import AnsibleModule
67
67