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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (710) hide show
  1. ansible/_internal/__init__.py +53 -0
  2. ansible/_internal/_ansiballz.py +265 -0
  3. ansible/_internal/_collection_proxy.py +47 -0
  4. ansible/_internal/_datatag/__init__.py +0 -0
  5. ansible/_internal/_datatag/_tags.py +130 -0
  6. ansible/_internal/_datatag/_utils.py +19 -0
  7. ansible/_internal/_datatag/_wrappers.py +33 -0
  8. ansible/_internal/_errors/__init__.py +0 -0
  9. ansible/_internal/_errors/_captured.py +128 -0
  10. ansible/_internal/_errors/_handler.py +91 -0
  11. ansible/_internal/_errors/_utils.py +310 -0
  12. ansible/_internal/_json/__init__.py +203 -0
  13. ansible/_internal/_json/_legacy_encoder.py +34 -0
  14. ansible/_internal/_json/_profiles/__init__.py +0 -0
  15. ansible/_internal/_json/_profiles/_cache_persistence.py +55 -0
  16. ansible/_internal/_json/_profiles/_inventory_legacy.py +40 -0
  17. ansible/_internal/_json/_profiles/_legacy.py +197 -0
  18. ansible/_internal/_locking.py +21 -0
  19. ansible/_internal/_plugins/__init__.py +0 -0
  20. ansible/_internal/_plugins/_cache.py +57 -0
  21. ansible/_internal/_task.py +78 -0
  22. ansible/_internal/_templating/__init__.py +10 -0
  23. ansible/_internal/_templating/_access.py +86 -0
  24. ansible/_internal/_templating/_chain_templar.py +63 -0
  25. ansible/_internal/_templating/_datatag.py +95 -0
  26. ansible/_internal/_templating/_engine.py +588 -0
  27. ansible/_internal/_templating/_errors.py +28 -0
  28. ansible/_internal/_templating/_jinja_bits.py +1066 -0
  29. ansible/_internal/_templating/_jinja_common.py +332 -0
  30. ansible/_internal/_templating/_jinja_patches.py +44 -0
  31. ansible/_internal/_templating/_jinja_plugins.py +345 -0
  32. ansible/_internal/_templating/_lazy_containers.py +633 -0
  33. ansible/_internal/_templating/_marker_behaviors.py +103 -0
  34. ansible/_internal/_templating/_transform.py +63 -0
  35. ansible/_internal/_templating/_utils.py +107 -0
  36. ansible/_internal/_wrapt.py +1052 -0
  37. ansible/_internal/_yaml/__init__.py +0 -0
  38. ansible/_internal/_yaml/_constructor.py +240 -0
  39. ansible/_internal/_yaml/_dumper.py +62 -0
  40. ansible/_internal/_yaml/_errors.py +166 -0
  41. ansible/_internal/_yaml/_loader.py +66 -0
  42. ansible/_internal/ansible_collections/ansible/_protomatter/README.md +11 -0
  43. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/action/debug.py +36 -0
  44. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/apply_trust.py +19 -0
  45. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/dump_object.py +18 -0
  46. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/finalize.py +16 -0
  47. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/origin.py +18 -0
  48. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.py +24 -0
  49. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.yml +33 -0
  50. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/tag_names.py +16 -0
  51. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/true_type.py +17 -0
  52. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/unmask.py +49 -0
  53. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.py +21 -0
  54. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.yml +2 -0
  55. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.py +15 -0
  56. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.yml +19 -0
  57. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.py +18 -0
  58. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.yml +19 -0
  59. ansible/cli/__init__.py +159 -89
  60. ansible/cli/_ssh_askpass.py +47 -0
  61. ansible/cli/adhoc.py +14 -7
  62. ansible/cli/arguments/option_helpers.py +154 -7
  63. ansible/cli/config.py +43 -68
  64. ansible/cli/console.py +10 -8
  65. ansible/cli/doc.py +62 -53
  66. ansible/cli/galaxy.py +27 -20
  67. ansible/cli/inventory.py +28 -26
  68. ansible/cli/playbook.py +4 -12
  69. ansible/cli/pull.py +51 -11
  70. ansible/cli/scripts/ansible_connection_cli_stub.py +7 -7
  71. ansible/cli/vault.py +12 -11
  72. ansible/compat/__init__.py +2 -2
  73. ansible/config/base.yml +166 -112
  74. ansible/config/manager.py +52 -49
  75. ansible/constants.py +3 -4
  76. ansible/errors/__init__.py +277 -235
  77. ansible/executor/interpreter_discovery.py +28 -149
  78. ansible/executor/module_common.py +426 -493
  79. ansible/executor/play_iterator.py +22 -27
  80. ansible/executor/playbook_executor.py +11 -11
  81. ansible/executor/powershell/async_watchdog.ps1 +97 -102
  82. ansible/executor/powershell/async_wrapper.ps1 +202 -151
  83. ansible/executor/powershell/become_wrapper.ps1 +89 -144
  84. ansible/executor/powershell/bootstrap_wrapper.ps1 +24 -9
  85. ansible/executor/powershell/coverage_wrapper.ps1 +82 -135
  86. ansible/executor/powershell/exec_wrapper.ps1 +462 -196
  87. ansible/executor/powershell/module_manifest.py +417 -265
  88. ansible/executor/powershell/module_wrapper.ps1 +169 -186
  89. ansible/executor/powershell/psrp_fetch_file.ps1 +41 -0
  90. ansible/executor/powershell/psrp_put_file.ps1 +122 -0
  91. ansible/executor/powershell/winrm_fetch_file.ps1 +46 -0
  92. ansible/executor/powershell/winrm_put_file.ps1 +36 -0
  93. ansible/executor/process/worker.py +161 -96
  94. ansible/executor/stats.py +5 -5
  95. ansible/executor/task_executor.py +268 -258
  96. ansible/executor/task_queue_manager.py +124 -90
  97. ansible/executor/task_result.py +183 -78
  98. ansible/galaxy/__init__.py +2 -2
  99. ansible/galaxy/api.py +22 -18
  100. ansible/galaxy/collection/__init__.py +1 -1
  101. ansible/galaxy/collection/concrete_artifact_manager.py +8 -11
  102. ansible/galaxy/dependency_resolution/dataclasses.py +14 -4
  103. ansible/galaxy/dependency_resolution/providers.py +1 -1
  104. ansible/galaxy/dependency_resolution/reporters.py +81 -0
  105. ansible/galaxy/role.py +4 -8
  106. ansible/galaxy/token.py +28 -21
  107. ansible/inventory/data.py +47 -57
  108. ansible/inventory/group.py +44 -72
  109. ansible/inventory/helpers.py +9 -0
  110. ansible/inventory/host.py +32 -54
  111. ansible/inventory/manager.py +78 -34
  112. ansible/keyword_desc.yml +1 -1
  113. ansible/module_utils/_internal/__init__.py +55 -0
  114. ansible/module_utils/_internal/_ambient_context.py +58 -0
  115. ansible/module_utils/_internal/_ansiballz.py +133 -0
  116. ansible/module_utils/_internal/_concurrent/_daemon_threading.py +1 -0
  117. ansible/module_utils/_internal/_dataclass_annotation_patch.py +64 -0
  118. ansible/module_utils/_internal/_dataclass_validation.py +217 -0
  119. ansible/module_utils/_internal/_datatag/__init__.py +928 -0
  120. ansible/module_utils/_internal/_datatag/_tags.py +38 -0
  121. ansible/module_utils/_internal/_debugging.py +31 -0
  122. ansible/module_utils/_internal/_errors.py +30 -0
  123. ansible/module_utils/_internal/_json/__init__.py +63 -0
  124. ansible/module_utils/_internal/_json/_legacy_encoder.py +26 -0
  125. ansible/module_utils/_internal/_json/_profiles/__init__.py +410 -0
  126. ansible/module_utils/_internal/_json/_profiles/_fallback_to_str.py +73 -0
  127. ansible/module_utils/_internal/_json/_profiles/_module_legacy_c2m.py +31 -0
  128. ansible/module_utils/_internal/_json/_profiles/_module_legacy_m2c.py +35 -0
  129. ansible/module_utils/_internal/_json/_profiles/_module_modern_c2m.py +35 -0
  130. ansible/module_utils/_internal/_json/_profiles/_module_modern_m2c.py +33 -0
  131. ansible/module_utils/_internal/_json/_profiles/_tagless.py +50 -0
  132. ansible/module_utils/_internal/_patches/__init__.py +66 -0
  133. ansible/module_utils/_internal/_patches/_dataclass_annotation_patch.py +55 -0
  134. ansible/module_utils/_internal/_patches/_socket_patch.py +34 -0
  135. ansible/module_utils/_internal/_patches/_sys_intern_patch.py +34 -0
  136. ansible/module_utils/_internal/_plugin_exec_context.py +49 -0
  137. ansible/module_utils/_internal/_testing.py +0 -0
  138. ansible/module_utils/_internal/_traceback.py +89 -0
  139. ansible/module_utils/ansible_release.py +2 -2
  140. ansible/module_utils/api.py +1 -2
  141. ansible/module_utils/basic.py +152 -120
  142. ansible/module_utils/common/_utils.py +24 -28
  143. ansible/module_utils/common/collections.py +1 -2
  144. ansible/module_utils/common/dict_transformations.py +2 -2
  145. ansible/module_utils/common/file.py +2 -2
  146. ansible/module_utils/common/json.py +90 -84
  147. ansible/module_utils/common/locale.py +2 -2
  148. ansible/module_utils/common/messages.py +108 -0
  149. ansible/module_utils/common/parameters.py +27 -24
  150. ansible/module_utils/common/process.py +2 -2
  151. ansible/module_utils/common/respawn.py +41 -19
  152. ansible/module_utils/common/sentinel.py +66 -0
  153. ansible/module_utils/common/sys_info.py +8 -8
  154. ansible/module_utils/common/text/converters.py +16 -37
  155. ansible/module_utils/common/validation.py +35 -24
  156. ansible/module_utils/common/warnings.py +86 -25
  157. ansible/module_utils/common/yaml.py +29 -3
  158. ansible/module_utils/compat/datetime.py +33 -21
  159. ansible/module_utils/compat/paramiko.py +21 -10
  160. ansible/module_utils/compat/typing.py +6 -5
  161. ansible/module_utils/connection.py +2 -2
  162. ansible/module_utils/csharp/Ansible.Basic.cs +14 -11
  163. ansible/module_utils/csharp/Ansible.Become.cs +1 -0
  164. ansible/module_utils/csharp/Ansible._Async.cs +517 -0
  165. ansible/module_utils/datatag.py +46 -0
  166. ansible/module_utils/distro/__init__.py +2 -2
  167. ansible/module_utils/facts/ansible_collector.py +4 -5
  168. ansible/module_utils/facts/collector.py +13 -14
  169. ansible/module_utils/facts/compat.py +4 -4
  170. ansible/module_utils/facts/default_collectors.py +1 -1
  171. ansible/module_utils/facts/hardware/aix.py +34 -0
  172. ansible/module_utils/facts/hardware/base.py +1 -1
  173. ansible/module_utils/facts/hardware/darwin.py +1 -3
  174. ansible/module_utils/facts/hardware/freebsd.py +2 -2
  175. ansible/module_utils/facts/hardware/linux.py +4 -4
  176. ansible/module_utils/facts/namespace.py +1 -1
  177. ansible/module_utils/facts/network/base.py +1 -1
  178. ansible/module_utils/facts/network/fc_wwn.py +1 -2
  179. ansible/module_utils/facts/network/iscsi.py +1 -2
  180. ansible/module_utils/facts/network/nvme.py +1 -2
  181. ansible/module_utils/facts/other/facter.py +1 -2
  182. ansible/module_utils/facts/other/ohai.py +2 -3
  183. ansible/module_utils/facts/system/apparmor.py +1 -2
  184. ansible/module_utils/facts/system/caps.py +1 -1
  185. ansible/module_utils/facts/system/chroot.py +1 -2
  186. ansible/module_utils/facts/system/cmdline.py +1 -2
  187. ansible/module_utils/facts/system/date_time.py +5 -3
  188. ansible/module_utils/facts/system/distribution.py +9 -8
  189. ansible/module_utils/facts/system/dns.py +1 -1
  190. ansible/module_utils/facts/system/env.py +1 -2
  191. ansible/module_utils/facts/system/fips.py +7 -20
  192. ansible/module_utils/facts/system/loadavg.py +1 -2
  193. ansible/module_utils/facts/system/local.py +1 -2
  194. ansible/module_utils/facts/system/lsb.py +1 -2
  195. ansible/module_utils/facts/system/pkg_mgr.py +1 -2
  196. ansible/module_utils/facts/system/platform.py +1 -2
  197. ansible/module_utils/facts/system/python.py +1 -2
  198. ansible/module_utils/facts/system/selinux.py +1 -1
  199. ansible/module_utils/facts/system/service_mgr.py +1 -2
  200. ansible/module_utils/facts/system/ssh_pub_keys.py +1 -1
  201. ansible/module_utils/facts/system/systemd.py +1 -1
  202. ansible/module_utils/facts/system/user.py +1 -2
  203. ansible/module_utils/facts/utils.py +3 -3
  204. ansible/module_utils/facts/virtual/base.py +1 -1
  205. ansible/module_utils/facts/virtual/sunos.py +3 -15
  206. ansible/module_utils/facts/virtual/sysctl.py +3 -16
  207. ansible/module_utils/json_utils.py +2 -2
  208. ansible/module_utils/parsing/convert_bool.py +1 -1
  209. ansible/module_utils/service.py +18 -21
  210. ansible/module_utils/splitter.py +7 -7
  211. ansible/module_utils/testing.py +31 -0
  212. ansible/module_utils/urls.py +60 -31
  213. ansible/modules/add_host.py +4 -4
  214. ansible/modules/apt.py +60 -46
  215. ansible/modules/apt_key.py +19 -12
  216. ansible/modules/apt_repository.py +19 -16
  217. ansible/modules/assemble.py +6 -6
  218. ansible/modules/assert.py +4 -4
  219. ansible/modules/async_status.py +10 -12
  220. ansible/modules/async_wrapper.py +8 -3
  221. ansible/modules/blockinfile.py +6 -7
  222. ansible/modules/command.py +10 -17
  223. ansible/modules/copy.py +57 -144
  224. ansible/modules/cron.py +20 -15
  225. ansible/modules/deb822_repository.py +8 -9
  226. ansible/modules/debconf.py +5 -5
  227. ansible/modules/debug.py +4 -4
  228. ansible/modules/dnf.py +8 -8
  229. ansible/modules/dnf5.py +39 -13
  230. ansible/modules/dpkg_selections.py +4 -4
  231. ansible/modules/expect.py +8 -10
  232. ansible/modules/fail.py +4 -4
  233. ansible/modules/fetch.py +4 -4
  234. ansible/modules/file.py +174 -133
  235. ansible/modules/find.py +19 -17
  236. ansible/modules/gather_facts.py +3 -3
  237. ansible/modules/get_url.py +59 -53
  238. ansible/modules/getent.py +7 -9
  239. ansible/modules/git.py +28 -25
  240. ansible/modules/group.py +6 -6
  241. ansible/modules/group_by.py +4 -4
  242. ansible/modules/hostname.py +13 -29
  243. ansible/modules/import_playbook.py +6 -6
  244. ansible/modules/import_role.py +6 -6
  245. ansible/modules/import_tasks.py +6 -6
  246. ansible/modules/include_role.py +6 -6
  247. ansible/modules/include_tasks.py +6 -6
  248. ansible/modules/include_vars.py +6 -6
  249. ansible/modules/iptables.py +86 -73
  250. ansible/modules/known_hosts.py +10 -10
  251. ansible/modules/lineinfile.py +5 -5
  252. ansible/modules/meta.py +4 -4
  253. ansible/modules/mount_facts.py +2 -2
  254. ansible/modules/package.py +4 -4
  255. ansible/modules/package_facts.py +22 -10
  256. ansible/modules/pause.py +6 -6
  257. ansible/modules/ping.py +6 -6
  258. ansible/modules/pip.py +10 -11
  259. ansible/modules/raw.py +4 -4
  260. ansible/modules/reboot.py +6 -6
  261. ansible/modules/replace.py +9 -13
  262. ansible/modules/rpm_key.py +7 -8
  263. ansible/modules/script.py +4 -4
  264. ansible/modules/service.py +7 -8
  265. ansible/modules/service_facts.py +87 -10
  266. ansible/modules/set_fact.py +5 -5
  267. ansible/modules/set_stats.py +4 -4
  268. ansible/modules/setup.py +2 -2
  269. ansible/modules/shell.py +6 -6
  270. ansible/modules/slurp.py +6 -6
  271. ansible/modules/stat.py +9 -23
  272. ansible/modules/subversion.py +15 -15
  273. ansible/modules/systemd.py +6 -6
  274. ansible/modules/systemd_service.py +6 -6
  275. ansible/modules/sysvinit.py +6 -6
  276. ansible/modules/tempfile.py +5 -6
  277. ansible/modules/template.py +6 -6
  278. ansible/modules/unarchive.py +32 -11
  279. ansible/modules/uri.py +33 -26
  280. ansible/modules/user.py +53 -34
  281. ansible/modules/validate_argument_spec.py +10 -7
  282. ansible/modules/wait_for.py +32 -27
  283. ansible/modules/wait_for_connection.py +6 -6
  284. ansible/modules/yum_repository.py +6 -6
  285. ansible/parsing/ajson.py +14 -32
  286. ansible/parsing/dataloader.py +99 -54
  287. ansible/parsing/mod_args.py +28 -44
  288. ansible/parsing/plugin_docs.py +21 -86
  289. ansible/parsing/quoting.py +1 -1
  290. ansible/parsing/splitter.py +27 -12
  291. ansible/parsing/utils/addresses.py +24 -24
  292. ansible/parsing/utils/jsonify.py +5 -1
  293. ansible/parsing/utils/yaml.py +32 -61
  294. ansible/parsing/vault/__init__.py +319 -87
  295. ansible/parsing/yaml/__init__.py +0 -18
  296. ansible/parsing/yaml/dumper.py +6 -120
  297. ansible/parsing/yaml/loader.py +6 -39
  298. ansible/parsing/yaml/objects.py +43 -335
  299. ansible/playbook/__init__.py +1 -1
  300. ansible/playbook/attribute.py +8 -3
  301. ansible/playbook/base.py +182 -132
  302. ansible/playbook/block.py +26 -24
  303. ansible/playbook/collectionsearch.py +1 -15
  304. ansible/playbook/conditional.py +3 -77
  305. ansible/playbook/handler.py +8 -2
  306. ansible/playbook/helpers.py +41 -53
  307. ansible/playbook/included_file.py +31 -27
  308. ansible/playbook/loop_control.py +2 -2
  309. ansible/playbook/play.py +85 -44
  310. ansible/playbook/play_context.py +12 -17
  311. ansible/playbook/playbook_include.py +14 -15
  312. ansible/playbook/role/__init__.py +24 -26
  313. ansible/playbook/role/definition.py +15 -17
  314. ansible/playbook/role/include.py +2 -4
  315. ansible/playbook/role/metadata.py +10 -11
  316. ansible/playbook/role_include.py +3 -3
  317. ansible/playbook/taggable.py +13 -8
  318. ansible/playbook/task.py +188 -118
  319. ansible/playbook/task_include.py +5 -5
  320. ansible/plugins/__init__.py +68 -21
  321. ansible/plugins/action/__init__.py +209 -176
  322. ansible/plugins/action/add_host.py +1 -1
  323. ansible/plugins/action/assemble.py +1 -1
  324. ansible/plugins/action/assert.py +54 -66
  325. ansible/plugins/action/copy.py +7 -11
  326. ansible/plugins/action/debug.py +37 -31
  327. ansible/plugins/action/dnf.py +3 -4
  328. ansible/plugins/action/fail.py +1 -1
  329. ansible/plugins/action/fetch.py +4 -5
  330. ansible/plugins/action/gather_facts.py +7 -6
  331. ansible/plugins/action/group_by.py +1 -1
  332. ansible/plugins/action/include_vars.py +10 -11
  333. ansible/plugins/action/package.py +3 -6
  334. ansible/plugins/action/pause.py +2 -2
  335. ansible/plugins/action/script.py +15 -8
  336. ansible/plugins/action/service.py +6 -11
  337. ansible/plugins/action/set_fact.py +3 -12
  338. ansible/plugins/action/set_stats.py +3 -8
  339. ansible/plugins/action/template.py +35 -59
  340. ansible/plugins/action/unarchive.py +1 -1
  341. ansible/plugins/action/validate_argument_spec.py +5 -5
  342. ansible/plugins/action/wait_for_connection.py +1 -1
  343. ansible/plugins/become/__init__.py +31 -8
  344. ansible/plugins/become/runas.py +71 -0
  345. ansible/plugins/become/su.py +13 -8
  346. ansible/plugins/become/sudo.py +19 -0
  347. ansible/plugins/cache/__init__.py +35 -44
  348. ansible/plugins/cache/base.py +8 -0
  349. ansible/plugins/cache/jsonfile.py +10 -16
  350. ansible/plugins/cache/memory.py +6 -12
  351. ansible/plugins/callback/__init__.py +284 -179
  352. ansible/plugins/callback/default.py +99 -92
  353. ansible/plugins/callback/junit.py +44 -39
  354. ansible/plugins/callback/minimal.py +28 -25
  355. ansible/plugins/callback/oneline.py +28 -21
  356. ansible/plugins/callback/tree.py +16 -11
  357. ansible/plugins/connection/__init__.py +47 -34
  358. ansible/plugins/connection/local.py +150 -54
  359. ansible/plugins/connection/paramiko_ssh.py +21 -18
  360. ansible/plugins/connection/psrp.py +76 -165
  361. ansible/plugins/connection/ssh.py +301 -78
  362. ansible/plugins/connection/winrm.py +58 -140
  363. ansible/plugins/doc_fragments/action_common_attributes.py +14 -14
  364. ansible/plugins/doc_fragments/action_core.py +6 -6
  365. ansible/plugins/doc_fragments/backup.py +2 -2
  366. ansible/plugins/doc_fragments/checksum_common.py +27 -0
  367. ansible/plugins/doc_fragments/constructed.py +6 -2
  368. ansible/plugins/doc_fragments/decrypt.py +2 -2
  369. ansible/plugins/doc_fragments/default_callback.py +2 -2
  370. ansible/plugins/doc_fragments/files.py +2 -2
  371. ansible/plugins/doc_fragments/inventory_cache.py +2 -2
  372. ansible/plugins/doc_fragments/result_format_callback.py +2 -2
  373. ansible/plugins/doc_fragments/return_common.py +2 -2
  374. ansible/plugins/doc_fragments/template_common.py +4 -4
  375. ansible/plugins/doc_fragments/url.py +17 -1
  376. ansible/plugins/doc_fragments/url_windows.py +2 -2
  377. ansible/plugins/doc_fragments/validate.py +2 -2
  378. ansible/plugins/doc_fragments/vars_plugin_staging.py +2 -2
  379. ansible/plugins/filter/__init__.py +6 -2
  380. ansible/plugins/filter/b64decode.yml +22 -0
  381. ansible/plugins/filter/b64encode.yml +22 -0
  382. ansible/plugins/filter/bool.yml +11 -4
  383. ansible/plugins/filter/core.py +225 -108
  384. ansible/plugins/filter/encryption.py +32 -32
  385. ansible/plugins/filter/flatten.yml +3 -2
  386. ansible/plugins/filter/human_to_bytes.yml +1 -1
  387. ansible/plugins/filter/mathstuff.py +30 -37
  388. ansible/plugins/filter/password_hash.yml +8 -0
  389. ansible/plugins/filter/regex_search.yml +1 -4
  390. ansible/plugins/filter/split.yml +1 -1
  391. ansible/plugins/filter/to_nice_yaml.yml +0 -4
  392. ansible/plugins/filter/to_yaml.yml +0 -4
  393. ansible/plugins/filter/unvault.yml +1 -1
  394. ansible/plugins/filter/urls.py +1 -1
  395. ansible/plugins/filter/urlsplit.py +8 -9
  396. ansible/plugins/filter/vault.yml +14 -9
  397. ansible/plugins/filter/win_basename.yml +6 -1
  398. ansible/plugins/filter/win_dirname.yml +5 -0
  399. ansible/plugins/inventory/__init__.py +97 -77
  400. ansible/plugins/inventory/advanced_host_list.py +7 -5
  401. ansible/plugins/inventory/auto.py +11 -4
  402. ansible/plugins/inventory/constructed.py +21 -24
  403. ansible/plugins/inventory/generator.py +16 -11
  404. ansible/plugins/inventory/host_list.py +7 -5
  405. ansible/plugins/inventory/ini.py +78 -44
  406. ansible/plugins/inventory/script.py +189 -119
  407. ansible/plugins/inventory/toml.py +16 -126
  408. ansible/plugins/inventory/yaml.py +10 -8
  409. ansible/plugins/list.py +3 -3
  410. ansible/plugins/loader.py +197 -82
  411. ansible/plugins/lookup/__init__.py +21 -4
  412. ansible/plugins/lookup/config.py +21 -35
  413. ansible/plugins/lookup/csvfile.py +3 -2
  414. ansible/plugins/lookup/dict.py +1 -6
  415. ansible/plugins/lookup/env.py +12 -9
  416. ansible/plugins/lookup/file.py +5 -8
  417. ansible/plugins/lookup/first_found.py +86 -55
  418. ansible/plugins/lookup/indexed_items.py +1 -10
  419. ansible/plugins/lookup/ini.py +14 -13
  420. ansible/plugins/lookup/items.py +1 -1
  421. ansible/plugins/lookup/lines.py +8 -1
  422. ansible/plugins/lookup/list.py +1 -1
  423. ansible/plugins/lookup/nested.py +2 -18
  424. ansible/plugins/lookup/password.py +5 -5
  425. ansible/plugins/lookup/pipe.py +5 -7
  426. ansible/plugins/lookup/sequence.py +18 -8
  427. ansible/plugins/lookup/subelements.py +1 -4
  428. ansible/plugins/lookup/template.py +42 -36
  429. ansible/plugins/lookup/together.py +0 -12
  430. ansible/plugins/lookup/unvault.py +1 -5
  431. ansible/plugins/lookup/url.py +2 -8
  432. ansible/plugins/lookup/vars.py +16 -24
  433. ansible/plugins/shell/__init__.py +2 -2
  434. ansible/plugins/shell/cmd.py +2 -2
  435. ansible/plugins/shell/powershell.py +39 -22
  436. ansible/plugins/shell/sh.py +3 -2
  437. ansible/plugins/strategy/__init__.py +159 -184
  438. ansible/plugins/strategy/debug.py +2 -2
  439. ansible/plugins/strategy/free.py +16 -31
  440. ansible/plugins/strategy/host_pinned.py +2 -2
  441. ansible/plugins/strategy/linear.py +41 -41
  442. ansible/plugins/terminal/__init__.py +4 -4
  443. ansible/plugins/test/__init__.py +7 -2
  444. ansible/plugins/test/core.py +55 -21
  445. ansible/plugins/test/files.py +1 -1
  446. ansible/plugins/test/mathstuff.py +3 -3
  447. ansible/plugins/test/uri.py +3 -3
  448. ansible/plugins/vars/host_group_vars.py +7 -14
  449. ansible/release.py +2 -2
  450. ansible/template/__init__.py +370 -944
  451. ansible/utils/__init__.py +0 -18
  452. ansible/utils/_ssh_agent.py +657 -0
  453. ansible/utils/collection_loader/__init__.py +52 -5
  454. ansible/utils/collection_loader/_collection_config.py +5 -6
  455. ansible/utils/collection_loader/_collection_finder.py +79 -93
  456. ansible/utils/collection_loader/_collection_meta.py +13 -8
  457. ansible/utils/display.py +433 -63
  458. ansible/utils/encrypt.py +27 -19
  459. ansible/utils/fqcn.py +2 -2
  460. ansible/utils/hashing.py +2 -2
  461. ansible/utils/helpers.py +2 -2
  462. ansible/utils/listify.py +8 -8
  463. ansible/utils/lock.py +2 -2
  464. ansible/utils/path.py +4 -4
  465. ansible/utils/plugin_docs.py +14 -13
  466. ansible/utils/sentinel.py +4 -62
  467. ansible/utils/singleton.py +2 -0
  468. ansible/utils/ssh_functions.py +1 -1
  469. ansible/utils/unsafe_proxy.py +23 -332
  470. ansible/utils/vars.py +51 -8
  471. ansible/utils/version.py +2 -2
  472. ansible/vars/clean.py +5 -5
  473. ansible/vars/hostvars.py +60 -90
  474. ansible/vars/manager.py +206 -282
  475. ansible/vars/reserved.py +8 -9
  476. ansible_core-2.19.0b2.dist-info/BSD-3-Clause.txt +28 -0
  477. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/METADATA +5 -4
  478. ansible_core-2.19.0b2.dist-info/RECORD +1072 -0
  479. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/WHEEL +1 -1
  480. ansible_test/_data/completion/docker.txt +7 -7
  481. ansible_test/_data/completion/remote.txt +6 -6
  482. ansible_test/_data/completion/windows.txt +1 -0
  483. ansible_test/_data/requirements/ansible.txt +2 -2
  484. ansible_test/_data/requirements/sanity.ansible-doc.txt +3 -3
  485. ansible_test/_data/requirements/sanity.changelog.txt +1 -1
  486. ansible_test/_data/requirements/sanity.import.plugin.txt +2 -2
  487. ansible_test/_data/requirements/sanity.pylint.txt +4 -4
  488. ansible_test/_data/requirements/sanity.validate-modules.txt +2 -2
  489. ansible_test/_data/requirements/sanity.yamllint.txt +1 -1
  490. ansible_test/_data/requirements/units.txt +1 -0
  491. ansible_test/_internal/__init__.py +1 -0
  492. ansible_test/_internal/ansible_util.py +2 -0
  493. ansible_test/_internal/become.py +1 -0
  494. ansible_test/_internal/bootstrap.py +1 -0
  495. ansible_test/_internal/cache.py +1 -0
  496. ansible_test/_internal/cgroup.py +1 -0
  497. ansible_test/_internal/ci/__init__.py +1 -0
  498. ansible_test/_internal/ci/azp.py +1 -0
  499. ansible_test/_internal/ci/local.py +1 -0
  500. ansible_test/_internal/classification/__init__.py +1 -0
  501. ansible_test/_internal/classification/common.py +1 -0
  502. ansible_test/_internal/classification/csharp.py +1 -0
  503. ansible_test/_internal/classification/powershell.py +1 -0
  504. ansible_test/_internal/classification/python.py +1 -0
  505. ansible_test/_internal/cli/__init__.py +1 -0
  506. ansible_test/_internal/cli/actions.py +1 -0
  507. ansible_test/_internal/cli/argparsing/__init__.py +1 -0
  508. ansible_test/_internal/cli/argparsing/actions.py +1 -0
  509. ansible_test/_internal/cli/argparsing/argcompletion.py +1 -0
  510. ansible_test/_internal/cli/argparsing/parsers.py +1 -0
  511. ansible_test/_internal/cli/commands/__init__.py +11 -0
  512. ansible_test/_internal/cli/commands/coverage/__init__.py +1 -0
  513. ansible_test/_internal/cli/commands/coverage/analyze/__init__.py +1 -0
  514. ansible_test/_internal/cli/commands/coverage/analyze/targets/__init__.py +1 -0
  515. ansible_test/_internal/cli/commands/coverage/analyze/targets/combine.py +1 -0
  516. ansible_test/_internal/cli/commands/coverage/analyze/targets/expand.py +1 -0
  517. ansible_test/_internal/cli/commands/coverage/analyze/targets/filter.py +1 -0
  518. ansible_test/_internal/cli/commands/coverage/analyze/targets/generate.py +1 -0
  519. ansible_test/_internal/cli/commands/coverage/analyze/targets/missing.py +1 -0
  520. ansible_test/_internal/cli/commands/coverage/combine.py +1 -0
  521. ansible_test/_internal/cli/commands/coverage/erase.py +1 -0
  522. ansible_test/_internal/cli/commands/coverage/html.py +1 -0
  523. ansible_test/_internal/cli/commands/coverage/report.py +1 -0
  524. ansible_test/_internal/cli/commands/coverage/xml.py +1 -0
  525. ansible_test/_internal/cli/commands/env.py +1 -0
  526. ansible_test/_internal/cli/commands/integration/__init__.py +1 -0
  527. ansible_test/_internal/cli/commands/integration/network.py +1 -0
  528. ansible_test/_internal/cli/commands/integration/posix.py +1 -0
  529. ansible_test/_internal/cli/commands/integration/windows.py +1 -0
  530. ansible_test/_internal/cli/commands/sanity.py +9 -0
  531. ansible_test/_internal/cli/commands/shell.py +1 -0
  532. ansible_test/_internal/cli/commands/units.py +1 -0
  533. ansible_test/_internal/cli/compat.py +1 -0
  534. ansible_test/_internal/cli/completers.py +1 -0
  535. ansible_test/_internal/cli/converters.py +1 -0
  536. ansible_test/_internal/cli/environments.py +1 -0
  537. ansible_test/_internal/cli/epilog.py +1 -0
  538. ansible_test/_internal/cli/parsers/__init__.py +1 -0
  539. ansible_test/_internal/cli/parsers/base_argument_parsers.py +1 -0
  540. ansible_test/_internal/cli/parsers/helpers.py +1 -0
  541. ansible_test/_internal/cli/parsers/host_config_parsers.py +1 -0
  542. ansible_test/_internal/cli/parsers/key_value_parsers.py +1 -0
  543. ansible_test/_internal/cli/parsers/value_parsers.py +1 -0
  544. ansible_test/_internal/commands/__init__.py +1 -0
  545. ansible_test/_internal/commands/coverage/__init__.py +2 -1
  546. ansible_test/_internal/commands/coverage/analyze/__init__.py +1 -0
  547. ansible_test/_internal/commands/coverage/analyze/targets/__init__.py +1 -0
  548. ansible_test/_internal/commands/coverage/analyze/targets/combine.py +1 -0
  549. ansible_test/_internal/commands/coverage/analyze/targets/expand.py +1 -0
  550. ansible_test/_internal/commands/coverage/analyze/targets/filter.py +1 -0
  551. ansible_test/_internal/commands/coverage/analyze/targets/generate.py +1 -0
  552. ansible_test/_internal/commands/coverage/analyze/targets/missing.py +1 -0
  553. ansible_test/_internal/commands/coverage/combine.py +2 -1
  554. ansible_test/_internal/commands/coverage/erase.py +1 -0
  555. ansible_test/_internal/commands/coverage/html.py +1 -0
  556. ansible_test/_internal/commands/coverage/report.py +1 -0
  557. ansible_test/_internal/commands/coverage/xml.py +1 -0
  558. ansible_test/_internal/commands/env/__init__.py +2 -0
  559. ansible_test/_internal/commands/integration/__init__.py +4 -0
  560. ansible_test/_internal/commands/integration/cloud/__init__.py +1 -0
  561. ansible_test/_internal/commands/integration/cloud/acme.py +2 -1
  562. ansible_test/_internal/commands/integration/cloud/aws.py +1 -0
  563. ansible_test/_internal/commands/integration/cloud/azure.py +1 -0
  564. ansible_test/_internal/commands/integration/cloud/cs.py +1 -0
  565. ansible_test/_internal/commands/integration/cloud/digitalocean.py +1 -0
  566. ansible_test/_internal/commands/integration/cloud/galaxy.py +3 -2
  567. ansible_test/_internal/commands/integration/cloud/hcloud.py +1 -0
  568. ansible_test/_internal/commands/integration/cloud/httptester.py +2 -1
  569. ansible_test/_internal/commands/integration/cloud/nios.py +2 -1
  570. ansible_test/_internal/commands/integration/cloud/opennebula.py +1 -0
  571. ansible_test/_internal/commands/integration/cloud/openshift.py +1 -0
  572. ansible_test/_internal/commands/integration/cloud/scaleway.py +1 -0
  573. ansible_test/_internal/commands/integration/cloud/vcenter.py +1 -0
  574. ansible_test/_internal/commands/integration/cloud/vultr.py +1 -0
  575. ansible_test/_internal/commands/integration/coverage.py +1 -0
  576. ansible_test/_internal/commands/integration/filters.py +1 -0
  577. ansible_test/_internal/commands/integration/network.py +1 -0
  578. ansible_test/_internal/commands/integration/posix.py +1 -0
  579. ansible_test/_internal/commands/integration/windows.py +1 -0
  580. ansible_test/_internal/commands/sanity/__init__.py +16 -1
  581. ansible_test/_internal/commands/sanity/ansible_doc.py +1 -0
  582. ansible_test/_internal/commands/sanity/bin_symlinks.py +1 -0
  583. ansible_test/_internal/commands/sanity/compile.py +1 -0
  584. ansible_test/_internal/commands/sanity/ignores.py +1 -0
  585. ansible_test/_internal/commands/sanity/import.py +1 -0
  586. ansible_test/_internal/commands/sanity/integration_aliases.py +1 -0
  587. ansible_test/_internal/commands/sanity/pep8.py +1 -0
  588. ansible_test/_internal/commands/sanity/pslint.py +1 -0
  589. ansible_test/_internal/commands/sanity/pylint.py +24 -26
  590. ansible_test/_internal/commands/sanity/shellcheck.py +1 -0
  591. ansible_test/_internal/commands/sanity/validate_modules.py +1 -0
  592. ansible_test/_internal/commands/sanity/yamllint.py +1 -0
  593. ansible_test/_internal/commands/shell/__init__.py +1 -0
  594. ansible_test/_internal/commands/units/__init__.py +1 -0
  595. ansible_test/_internal/compat/__init__.py +1 -0
  596. ansible_test/_internal/compat/packaging.py +1 -0
  597. ansible_test/_internal/compat/yaml.py +1 -0
  598. ansible_test/_internal/completion.py +1 -0
  599. ansible_test/_internal/config.py +2 -0
  600. ansible_test/_internal/connections.py +1 -0
  601. ansible_test/_internal/constants.py +1 -0
  602. ansible_test/_internal/containers.py +1 -0
  603. ansible_test/_internal/content_config.py +1 -0
  604. ansible_test/_internal/core_ci.py +1 -0
  605. ansible_test/_internal/coverage_util.py +11 -10
  606. ansible_test/_internal/data.py +1 -0
  607. ansible_test/_internal/delegation.py +1 -0
  608. ansible_test/_internal/dev/__init__.py +1 -0
  609. ansible_test/_internal/dev/container_probe.py +1 -0
  610. ansible_test/_internal/diff.py +3 -2
  611. ansible_test/_internal/docker_util.py +2 -1
  612. ansible_test/_internal/encoding.py +1 -0
  613. ansible_test/_internal/executor.py +1 -0
  614. ansible_test/_internal/git.py +1 -0
  615. ansible_test/_internal/host_configs.py +1 -0
  616. ansible_test/_internal/host_profiles.py +1 -0
  617. ansible_test/_internal/http.py +1 -0
  618. ansible_test/_internal/init.py +1 -0
  619. ansible_test/_internal/inventory.py +35 -3
  620. ansible_test/_internal/io.py +1 -0
  621. ansible_test/_internal/metadata.py +1 -0
  622. ansible_test/_internal/payload.py +1 -0
  623. ansible_test/_internal/provider/__init__.py +1 -0
  624. ansible_test/_internal/provider/layout/__init__.py +1 -0
  625. ansible_test/_internal/provider/layout/ansible.py +1 -0
  626. ansible_test/_internal/provider/layout/collection.py +1 -0
  627. ansible_test/_internal/provider/layout/unsupported.py +1 -0
  628. ansible_test/_internal/provider/source/__init__.py +1 -0
  629. ansible_test/_internal/provider/source/git.py +1 -0
  630. ansible_test/_internal/provider/source/installed.py +1 -0
  631. ansible_test/_internal/provider/source/unsupported.py +1 -0
  632. ansible_test/_internal/provider/source/unversioned.py +1 -0
  633. ansible_test/_internal/provisioning.py +1 -0
  634. ansible_test/_internal/pypi_proxy.py +6 -5
  635. ansible_test/_internal/python_requirements.py +1 -0
  636. ansible_test/_internal/ssh.py +1 -0
  637. ansible_test/_internal/target.py +1 -0
  638. ansible_test/_internal/test.py +3 -2
  639. ansible_test/_internal/thread.py +1 -0
  640. ansible_test/_internal/timeout.py +1 -0
  641. ansible_test/_internal/util.py +1 -0
  642. ansible_test/_internal/util_common.py +5 -2
  643. ansible_test/_internal/venv.py +1 -0
  644. ansible_test/_util/controller/sanity/code-smell/action-plugin-docs.py +1 -0
  645. ansible_test/_util/controller/sanity/code-smell/changelog/sphinx.py +1 -0
  646. ansible_test/_util/controller/sanity/code-smell/changelog.py +1 -0
  647. ansible_test/_util/controller/sanity/code-smell/empty-init.py +1 -0
  648. ansible_test/_util/controller/sanity/code-smell/line-endings.py +1 -0
  649. ansible_test/_util/controller/sanity/code-smell/no-assert.py +1 -0
  650. ansible_test/_util/controller/sanity/code-smell/no-get-exception.py +1 -0
  651. ansible_test/_util/controller/sanity/code-smell/no-illegal-filenames.py +1 -0
  652. ansible_test/_util/controller/sanity/code-smell/no-smart-quotes.py +1 -0
  653. ansible_test/_util/controller/sanity/code-smell/replace-urlopen.py +1 -0
  654. ansible_test/_util/controller/sanity/code-smell/runtime-metadata.py +28 -1
  655. ansible_test/_util/controller/sanity/code-smell/shebang.py +1 -0
  656. ansible_test/_util/controller/sanity/code-smell/symlinks.py +1 -0
  657. ansible_test/_util/controller/sanity/code-smell/use-argspec-type-path.py +1 -0
  658. ansible_test/_util/controller/sanity/code-smell/use-compat-six.py +1 -0
  659. ansible_test/_util/controller/sanity/integration-aliases/yaml_to_json.py +2 -1
  660. ansible_test/_util/controller/sanity/pep8/current-ignore.txt +4 -0
  661. ansible_test/_util/controller/sanity/pylint/config/ansible-test-target.cfg +7 -5
  662. ansible_test/_util/controller/sanity/pylint/config/ansible-test.cfg +7 -5
  663. ansible_test/_util/controller/sanity/pylint/config/code-smell.cfg +7 -5
  664. ansible_test/_util/controller/sanity/pylint/config/collection.cfg +3 -5
  665. ansible_test/_util/controller/sanity/pylint/config/default.cfg +7 -7
  666. ansible_test/_util/controller/sanity/pylint/plugins/deprecated.py +1 -13
  667. ansible_test/_util/controller/sanity/pylint/plugins/hide_unraisable.py +1 -0
  668. ansible_test/_util/controller/sanity/pylint/plugins/string_format.py +1 -8
  669. ansible_test/_util/controller/sanity/pylint/plugins/unwanted.py +1 -8
  670. ansible_test/_util/controller/sanity/validate-modules/validate_modules/main.py +55 -28
  671. ansible_test/_util/controller/sanity/validate-modules/validate_modules/module_args.py +12 -5
  672. ansible_test/_util/controller/sanity/validate-modules/validate_modules/schema.py +13 -2
  673. ansible_test/_util/controller/sanity/validate-modules/validate_modules/utils.py +1 -0
  674. ansible_test/_util/controller/sanity/yamllint/yamllinter.py +35 -17
  675. ansible_test/_util/controller/tools/collection_detail.py +1 -0
  676. ansible_test/_util/controller/tools/yaml_to_json.py +2 -1
  677. ansible_test/_util/target/pytest/plugins/ansible_forked.py +6 -1
  678. ansible_test/_util/target/pytest/plugins/ansible_pytest_collections.py +2 -1
  679. ansible_test/_util/target/pytest/plugins/ansible_pytest_coverage.py +1 -0
  680. ansible_test/_util/target/sanity/compile/compile.py +1 -0
  681. ansible_test/_util/target/sanity/import/importer.py +15 -16
  682. ansible_test/_util/target/setup/bootstrap.sh +9 -20
  683. ansible_test/_util/target/setup/probe_cgroups.py +1 -0
  684. ansible_test/_util/target/setup/quiet_pip.py +1 -0
  685. ansible_test/_util/target/setup/requirements.py +35 -27
  686. ansible_test/_util/target/tools/virtualenvcheck.py +2 -1
  687. ansible_test/_util/target/tools/yamlcheck.py +2 -1
  688. ansible/compat/selectors.py +0 -32
  689. ansible/errors/yaml_strings.py +0 -138
  690. ansible/executor/action_write_locks.py +0 -44
  691. ansible/executor/discovery/python_target.py +0 -47
  692. ansible/executor/powershell/module_powershell_wrapper.ps1 +0 -86
  693. ansible/executor/powershell/module_script_wrapper.ps1 +0 -22
  694. ansible/module_utils/compat/importlib.py +0 -26
  695. ansible/module_utils/compat/selectors.py +0 -32
  696. ansible/module_utils/pycompat24.py +0 -73
  697. ansible/parsing/yaml/constructor.py +0 -178
  698. ansible/template/native_helpers.py +0 -251
  699. ansible/template/template.py +0 -43
  700. ansible/template/vars.py +0 -77
  701. ansible/utils/native_jinja.py +0 -11
  702. ansible/vars/fact_cache.py +0 -71
  703. ansible_core-2.18.5rc1.dist-info/RECORD +0 -992
  704. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/Apache-License.txt +0 -0
  705. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/COPYING +0 -0
  706. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/MIT-license.txt +0 -0
  707. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/PSF-license.txt +0 -0
  708. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/entry_points.txt +0 -0
  709. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/simplified_bsd.txt +0 -0
  710. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/top_level.txt +0 -0
@@ -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
 
ansible/modules/pip.py CHANGED
@@ -6,7 +6,7 @@
6
6
  from __future__ import annotations
7
7
 
8
8
 
9
- DOCUMENTATION = '''
9
+ DOCUMENTATION = """
10
10
  ---
11
11
  module: pip
12
12
  short_description: Manages Python library dependencies
@@ -145,9 +145,9 @@ requirements:
145
145
  - setuptools or packaging
146
146
  author:
147
147
  - Matt Wright (@mattupstate)
148
- '''
148
+ """
149
149
 
150
- EXAMPLES = '''
150
+ EXAMPLES = """
151
151
  - name: Install bottle python package
152
152
  ansible.builtin.pip:
153
153
  name: bottle
@@ -262,9 +262,9 @@ EXAMPLES = '''
262
262
  vars:
263
263
  venv_dir: /tmp/pick-a-better-venv-path
264
264
  venv_python: "{{ venv_dir }}/bin/python"
265
- '''
265
+ """
266
266
 
267
- RETURN = '''
267
+ RETURN = """
268
268
  cmd:
269
269
  description: pip command used by the module
270
270
  returned: success
@@ -290,7 +290,7 @@ virtualenv:
290
290
  returned: success, if a virtualenv path was provided
291
291
  type: str
292
292
  sample: "/tmp/virtualenv"
293
- '''
293
+ """
294
294
 
295
295
  import argparse
296
296
  import os
@@ -299,7 +299,6 @@ import sys
299
299
  import tempfile
300
300
  import operator
301
301
  import shlex
302
- import traceback
303
302
 
304
303
  from ansible.module_utils.compat.version import LooseVersion
305
304
 
@@ -309,10 +308,10 @@ HAS_SETUPTOOLS = False
309
308
  try:
310
309
  from packaging.requirements import Requirement as parse_requirement
311
310
  HAS_PACKAGING = True
312
- except Exception:
311
+ except Exception as ex:
313
312
  # This is catching a generic Exception, due to packaging on EL7 raising a TypeError on import
314
313
  HAS_PACKAGING = False
315
- PACKAGING_IMP_ERR = traceback.format_exc()
314
+ PACKAGING_IMP_ERR = ex
316
315
  try:
317
316
  from pkg_resources import Requirement
318
317
  parse_requirement = Requirement.parse # type: ignore[misc,assignment]
@@ -417,7 +416,7 @@ def _get_cmd_options(module, cmd):
417
416
 
418
417
 
419
418
  def _get_packages(module, pip, chdir):
420
- '''Return results of pip command to get packages.'''
419
+ """Return results of pip command to get packages."""
421
420
  # Try 'pip list' command first.
422
421
  command = pip + ['list', '--format=freeze']
423
422
  locale = get_best_parsable_locale(module)
@@ -435,7 +434,7 @@ def _get_packages(module, pip, chdir):
435
434
 
436
435
 
437
436
  def _is_present(module, req, installed_pkgs, pkg_command):
438
- '''Return whether or not package is installed.'''
437
+ """Return whether or not package is installed."""
439
438
  for pkg in installed_pkgs:
440
439
  if '==' in pkg:
441
440
  pkg_name, pkg_version = pkg.split('==')
ansible/modules/raw.py CHANGED
@@ -6,7 +6,7 @@
6
6
  from __future__ import annotations
7
7
 
8
8
 
9
- DOCUMENTATION = r'''
9
+ DOCUMENTATION = r"""
10
10
  ---
11
11
  module: raw
12
12
  short_description: Executes a low-down and dirty command
@@ -70,9 +70,9 @@ seealso:
70
70
  author:
71
71
  - Ansible Core Team
72
72
  - Michael DeHaan
73
- '''
73
+ """
74
74
 
75
- EXAMPLES = r'''
75
+ EXAMPLES = r"""
76
76
  - name: Bootstrap a host without python2 installed
77
77
  ansible.builtin.raw: dnf install -y python2 python2-dnf libselinux-python
78
78
 
@@ -86,4 +86,4 @@ EXAMPLES = r'''
86
86
 
87
87
  - name: List user accounts on a Windows system
88
88
  ansible.builtin.raw: Get-WmiObject -Class Win32_UserAccount
89
- '''
89
+ """
ansible/modules/reboot.py CHANGED
@@ -5,7 +5,7 @@
5
5
  from __future__ import annotations
6
6
 
7
7
 
8
- DOCUMENTATION = r'''
8
+ DOCUMENTATION = r"""
9
9
  module: reboot
10
10
  short_description: Reboot a machine
11
11
  notes:
@@ -100,9 +100,9 @@ seealso:
100
100
  author:
101
101
  - Matt Davis (@nitzmahone)
102
102
  - Sam Doran (@samdoran)
103
- '''
103
+ """
104
104
 
105
- EXAMPLES = r'''
105
+ EXAMPLES = r"""
106
106
  - name: Unconditionally reboot the machine with all defaults
107
107
  ansible.builtin.reboot:
108
108
 
@@ -124,9 +124,9 @@ EXAMPLES = r'''
124
124
  ansible.builtin.reboot:
125
125
  msg: "Rebooting machine in 5 seconds"
126
126
 
127
- '''
127
+ """
128
128
 
129
- RETURN = r'''
129
+ RETURN = r"""
130
130
  rebooted:
131
131
  description: true if the machine was rebooted
132
132
  returned: always
@@ -137,4 +137,4 @@ elapsed:
137
137
  returned: always
138
138
  type: int
139
139
  sample: 23
140
- '''
140
+ """
@@ -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: replace
13
13
  author: Evan Kaufman (@EvanK)
@@ -106,9 +106,9 @@ notes:
106
106
  See U(https://github.com/ansible/ansible/issues/31354) for details.
107
107
  - Option O(ignore:follow) has been removed in Ansible 2.5, because this module modifies the contents of the file
108
108
  so O(ignore:follow=no) does not make sense.
109
- '''
109
+ """
110
110
 
111
- EXAMPLES = r'''
111
+ EXAMPLES = r"""
112
112
  - name: Replace old hostname with new hostname (requires Ansible >= 2.4)
113
113
  ansible.builtin.replace:
114
114
  path: /etc/hosts
@@ -175,14 +175,13 @@ EXAMPLES = r'''
175
175
  path: /etc/ssh/sshd_config
176
176
  regexp: '^(?P<dctv>ListenAddress[ ]+)(?P<host>[^\n]+)$'
177
177
  replace: '#\g<dctv>\g<host>\n\g<dctv>0.0.0.0'
178
- '''
178
+ """
179
179
 
180
- RETURN = r'''#'''
180
+ RETURN = r"""#"""
181
181
 
182
182
  import os
183
183
  import re
184
184
  import tempfile
185
- from traceback import format_exc
186
185
 
187
186
  from ansible.module_utils.common.text.converters import to_text, to_bytes
188
187
  from ansible.module_utils.basic import AnsibleModule
@@ -191,9 +190,8 @@ from ansible.module_utils.basic import AnsibleModule
191
190
  def write_changes(module, contents, path):
192
191
 
193
192
  tmpfd, tmpfile = tempfile.mkstemp(dir=module.tmpdir)
194
- f = os.fdopen(tmpfd, 'wb')
195
- f.write(contents)
196
- f.close()
193
+ with os.fdopen(tmpfd, 'wb') as f:
194
+ f.write(contents)
197
195
 
198
196
  validate = module.params.get('validate', None)
199
197
  valid = not validate
@@ -259,8 +257,7 @@ def main():
259
257
  with open(path, 'rb') as f:
260
258
  contents = to_text(f.read(), errors='surrogate_or_strict', encoding=encoding)
261
259
  except (OSError, IOError) as e:
262
- module.fail_json(msg='Unable to read the contents of %s: %s' % (path, to_text(e)),
263
- exception=format_exc())
260
+ module.fail_json(msg='Unable to read the contents of %s: %s' % (path, to_text(e)))
264
261
 
265
262
  pattern = u''
266
263
  if params['after'] and params['before']:
@@ -287,8 +284,7 @@ def main():
287
284
  try:
288
285
  result = re.subn(mre, params['replace'], section, 0)
289
286
  except re.error as e:
290
- module.fail_json(msg="Unable to process replace due to error: %s" % to_text(e),
291
- exception=format_exc())
287
+ module.fail_json(msg="Unable to process replace due to error: %s" % to_text(e))
292
288
 
293
289
  if result[1] > 0 and section != result[0]:
294
290
  if pattern:
@@ -8,7 +8,7 @@
8
8
  from __future__ import annotations
9
9
 
10
10
 
11
- DOCUMENTATION = '''
11
+ DOCUMENTATION = """
12
12
  ---
13
13
  module: rpm_key
14
14
  author:
@@ -52,9 +52,9 @@ attributes:
52
52
  support: none
53
53
  platform:
54
54
  platforms: rhel
55
- '''
55
+ """
56
56
 
57
- EXAMPLES = '''
57
+ EXAMPLES = """
58
58
  - name: Import a key from a url
59
59
  ansible.builtin.rpm_key:
60
60
  state: present
@@ -81,9 +81,9 @@ EXAMPLES = '''
81
81
  fingerprint:
82
82
  - EBC6 E12C 62B1 C734 026B 2122 A20E 5214 6B8D 79E6
83
83
  - 19B7 913E 6284 8E3F 4D78 D6B4 ECD9 1AB2 2EB6 8D86
84
- '''
84
+ """
85
85
 
86
- RETURN = r'''#'''
86
+ RETURN = r"""#"""
87
87
 
88
88
  import re
89
89
  import os.path
@@ -172,9 +172,8 @@ class RpmKey(object):
172
172
  self.module.fail_json(msg="Not a public key: %s" % url)
173
173
  tmpfd, tmpname = tempfile.mkstemp()
174
174
  self.module.add_cleanup_file(tmpname)
175
- tmpfile = os.fdopen(tmpfd, "w+b")
176
- tmpfile.write(key)
177
- tmpfile.close()
175
+ with os.fdopen(tmpfd, "w+b") as tmpfile:
176
+ tmpfile.write(key)
178
177
  return tmpname
179
178
 
180
179
  def normalize_keyid(self, keyid):
ansible/modules/script.py CHANGED
@@ -4,7 +4,7 @@
4
4
  from __future__ import annotations
5
5
 
6
6
 
7
- DOCUMENTATION = r'''
7
+ DOCUMENTATION = r"""
8
8
  ---
9
9
  module: script
10
10
  version_added: "0.9"
@@ -80,9 +80,9 @@ attributes:
80
80
  support: none
81
81
  vault:
82
82
  support: full
83
- '''
83
+ """
84
84
 
85
- EXAMPLES = r'''
85
+ EXAMPLES = r"""
86
86
  - name: Run a script with arguments (free form)
87
87
  ansible.builtin.script: /some/local/script.sh --some-argument 1234
88
88
 
@@ -112,4 +112,4 @@ EXAMPLES = r'''
112
112
 
113
113
  - name: Run a Powershell script on a Windows host
114
114
  script: subdirectories/under/path/with/your/playbook/script.ps1
115
- '''
115
+ """
@@ -6,7 +6,7 @@
6
6
  from __future__ import annotations
7
7
 
8
8
 
9
- DOCUMENTATION = r'''
9
+ DOCUMENTATION = r"""
10
10
  ---
11
11
  module: service
12
12
  version_added: "0.1"
@@ -114,9 +114,9 @@ seealso:
114
114
  author:
115
115
  - Ansible Core Team
116
116
  - Michael DeHaan
117
- '''
117
+ """
118
118
 
119
- EXAMPLES = r'''
119
+ EXAMPLES = r"""
120
120
  - name: Start service httpd, if not started
121
121
  ansible.builtin.service:
122
122
  name: httpd
@@ -153,9 +153,9 @@ EXAMPLES = r'''
153
153
  name: network
154
154
  state: restarted
155
155
  args: eth0
156
- '''
156
+ """
157
157
 
158
- RETURN = r'''#'''
158
+ RETURN = r"""#"""
159
159
 
160
160
  import glob
161
161
  import json
@@ -695,9 +695,8 @@ class LinuxService(Service):
695
695
  #
696
696
  if self.enable_cmd.endswith("initctl"):
697
697
  def write_to_override_file(file_name, file_contents, ):
698
- override_file = open(file_name, 'w')
699
- override_file.write(file_contents)
700
- override_file.close()
698
+ with open(file_name, 'w') as override_file:
699
+ override_file.write(file_contents)
701
700
 
702
701
  initpath = '/etc/init'
703
702
  if self.upstart_version >= LooseVersion('0.6.7'):
@@ -6,7 +6,7 @@
6
6
  from __future__ import annotations
7
7
 
8
8
 
9
- DOCUMENTATION = r'''
9
+ DOCUMENTATION = r"""
10
10
  ---
11
11
  module: service_facts
12
12
  short_description: Return service state information as fact data
@@ -36,9 +36,9 @@ notes:
36
36
  - AIX SRC was added in version 2.11.
37
37
  author:
38
38
  - Adam Miller (@maxamillion)
39
- '''
39
+ """
40
40
 
41
- EXAMPLES = r'''
41
+ EXAMPLES = r"""
42
42
  - name: Populate service facts
43
43
  ansible.builtin.service_facts:
44
44
 
@@ -58,9 +58,9 @@ EXAMPLES = r'''
58
58
  name: ntpd.service
59
59
  when: ansible_facts['services']['ntpd.service']['status'] | default('not-found') != 'not-found'
60
60
 
61
- '''
61
+ """
62
62
 
63
- RETURN = r'''
63
+ RETURN = r"""
64
64
  ansible_facts:
65
65
  description: Facts to add to ansible_facts about the services on the system
66
66
  returned: always
@@ -99,12 +99,14 @@ ansible_facts:
99
99
  returned: always
100
100
  type: str
101
101
  sample: arp-ethers.service
102
- '''
102
+ """
103
103
 
104
104
 
105
105
  import os
106
106
  import platform
107
107
  import re
108
+ import sys
109
+
108
110
  from ansible.module_utils.basic import AnsibleModule
109
111
  from ansible.module_utils.common.locale import get_best_parsable_locale
110
112
  from ansible.module_utils.service import is_systemd_managed
@@ -209,8 +211,8 @@ class ServiceScanService(BaseService):
209
211
 
210
212
  def _list_openrc(self, services):
211
213
  all_services_runlevels = {}
212
- rc, stdout, stderr = self.module.run_command("%s -a -s -m 2>&1 | grep '^ ' | tr -d '[]'" % self.rc_status_path, use_unsafe_shell=True)
213
- rc_u, stdout_u, stderr_u = self.module.run_command("%s show -v 2>&1 | grep '|'" % self.rc_update_path, use_unsafe_shell=True)
214
+ dummy, stdout, dummy = self.module.run_command("%s -a -s -m 2>&1 | grep '^ ' | tr -d '[]'" % self.rc_status_path, use_unsafe_shell=True)
215
+ dummy, stdout_u, dummy = self.module.run_command("%s show -v 2>&1 | grep '|'" % self.rc_update_path, use_unsafe_shell=True)
214
216
  for line in stdout_u.split('\n'):
215
217
  line_data = line.split('|')
216
218
  if len(line_data) < 2:
@@ -226,6 +228,9 @@ class ServiceScanService(BaseService):
226
228
  if len(line_data) < 2:
227
229
  continue
228
230
  service_name = line_data[0]
231
+ # Skip lines which are not service names
232
+ if service_name == "*":
233
+ continue
229
234
  service_state = line_data[1]
230
235
  service_runlevels = all_services_runlevels[service_name]
231
236
  service_data = {"name": service_name, "runlevels": service_runlevels, "state": service_state, "source": "openrc"}
@@ -241,15 +246,17 @@ class ServiceScanService(BaseService):
241
246
  self.rc_status_path = self.module.get_bin_path("rc-status")
242
247
  self.rc_update_path = self.module.get_bin_path("rc-update")
243
248
 
244
- # TODO: review conditionals ... they should not be this 'exclusive'
245
249
  if self.service_path and self.chkconfig_path is None and self.rc_status_path is None:
246
250
  self._list_sysvinit(services)
251
+
252
+ # TODO: review conditionals ... they should not be this 'exclusive'
247
253
  if self.initctl_path and self.chkconfig_path is None:
248
254
  self._list_upstart(services)
249
255
  elif self.chkconfig_path:
250
256
  self._list_rh(services)
251
257
  elif self.rc_status_path is not None and self.rc_update_path is not None:
252
258
  self._list_openrc(services)
259
+
253
260
  return services
254
261
 
255
262
 
@@ -419,11 +426,81 @@ class OpenBSDScanService(BaseService):
419
426
  return services
420
427
 
421
428
 
429
+ class FreeBSDScanService(BaseService):
430
+
431
+ _pid_regex = r'.+ is running as pid (\d+)\.'
432
+
433
+ def get_info(self, service):
434
+
435
+ service_info = {'status': 'unknown'}
436
+ rc, stdout, stderr = self.module.run_command("%s %s describe" % (self.service, service))
437
+ if rc == 0:
438
+ service_info['description'] = stdout
439
+ rc, stdout, stderr = self.module.run_command("%s %s status" % (self.service, service))
440
+ if rc == 0:
441
+ service_info['status'] = 'running'
442
+ p = re.compile(r'^\s?%s is running as pid (\d+).' % service)
443
+ matches = p.match(stdout[0])
444
+ if matches:
445
+ # does not always get pid output
446
+ service_info['pid'] = matches[0]
447
+ else:
448
+ service_info['pid'] = 'N/A'
449
+ elif rc == 1:
450
+ if stdout and 'is not running' in stdout.splitlines()[0]:
451
+ service_info['status'] = 'stopped'
452
+ elif stderr and 'unknown directive' in stderr.splitlines()[0]:
453
+ service_info['status'] = 'unknown'
454
+ self.module.warn('Status query not supported for %s' % service)
455
+ else:
456
+ service_info['status'] = 'unknown'
457
+ out = stderr if stderr else stdout
458
+ self.module.warn('Could not retrieve status for %s: %s' % (service, out))
459
+ else:
460
+ out = stderr if stderr else stdout
461
+ self.module.warn("Failed to get info for %s, no system message (rc=%s): %s" % (service, rc, out))
462
+
463
+ return service_info
464
+
465
+ def get_enabled(self):
466
+
467
+ services = []
468
+ rc, stdout, stderr = self.module.run_command("%s -e" % (self.service))
469
+ if rc == 0:
470
+ for line in stdout.splitlines():
471
+ if line.startswith('/'):
472
+ services.append(os.path.basename(line))
473
+ elif stderr:
474
+ self.module.warn("Failed to get services: %s" % stderr)
475
+ elif stdout:
476
+ self.module.warn("Failed to get services: %s" % stdout)
477
+ else:
478
+ self.module.warn("Failed to get services, no system message: rc=%s" % rc)
479
+
480
+ return services
481
+
482
+ def gather_services(self):
483
+
484
+ services = {}
485
+ if sys.platform.startswith('freebsd'):
486
+ self.service = self.module.get_bin_path("service")
487
+ if self.service:
488
+ for svc in self.get_enabled():
489
+ services[svc] = self.get_info(svc)
490
+ return services
491
+
492
+
422
493
  def main():
423
494
  module = AnsibleModule(argument_spec=dict(), supports_check_mode=True)
424
495
  locale = get_best_parsable_locale(module)
425
496
  module.run_command_environ_update = dict(LANG=locale, LC_ALL=locale)
426
- service_modules = (ServiceScanService, SystemctlScanService, AIXScanService, OpenBSDScanService)
497
+
498
+ if sys.platform.startswith('freebsd'):
499
+ # frebsd is not compatible but will match other classes
500
+ service_modules = (FreeBSDScanService,)
501
+ else:
502
+ service_modules = (ServiceScanService, SystemctlScanService, AIXScanService, OpenBSDScanService)
503
+
427
504
  all_services = {}
428
505
  for svc_module in service_modules:
429
506
  svcmod = svc_module(module)