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
ansible/modules/copy.py CHANGED
@@ -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: copy
13
13
  version_added: historical
@@ -109,7 +109,6 @@ options:
109
109
  description:
110
110
  - This flag indicates that filesystem links in the source tree, if they exist, should be followed.
111
111
  type: bool
112
- default: yes
113
112
  version_added: '2.4'
114
113
  checksum:
115
114
  description:
@@ -155,9 +154,9 @@ attributes:
155
154
  vault:
156
155
  support: full
157
156
  version_added: '2.2'
158
- '''
157
+ """
159
158
 
160
- EXAMPLES = r'''
159
+ EXAMPLES = r"""
161
160
  - name: Copy file with owner and permissions
162
161
  ansible.builtin.copy:
163
162
  src: /srv/myfiles/foo.conf
@@ -220,9 +219,9 @@ EXAMPLES = r'''
220
219
  src: /etc/foo.conf
221
220
  dest: /path/to/link # link to /path/to/file
222
221
  follow: no
223
- '''
222
+ """
224
223
 
225
- RETURN = r'''
224
+ RETURN = r"""
226
225
  dest:
227
226
  description: Destination file/path.
228
227
  returned: success
@@ -283,18 +282,15 @@ state:
283
282
  returned: success
284
283
  type: str
285
284
  sample: file
286
- '''
285
+ """
287
286
 
288
287
  import errno
289
288
  import filecmp
290
- import grp
291
289
  import os
292
290
  import os.path
293
- import pwd
294
291
  import shutil
295
292
  import stat
296
293
  import tempfile
297
- import traceback
298
294
 
299
295
  from ansible.module_utils.common.text.converters import to_bytes, to_native
300
296
  from ansible.module_utils.basic import AnsibleModule
@@ -306,9 +302,9 @@ class AnsibleModuleError(Exception):
306
302
 
307
303
 
308
304
  def split_pre_existing_dir(dirname):
309
- '''
305
+ """
310
306
  Return the first pre-existing directory and a list of the new directories that will be created.
311
- '''
307
+ """
312
308
  head, tail = os.path.split(dirname)
313
309
  b_head = to_bytes(head, errors='surrogate_or_strict')
314
310
  if head == '':
@@ -324,9 +320,9 @@ def split_pre_existing_dir(dirname):
324
320
 
325
321
 
326
322
  def adjust_recursive_directory_permissions(pre_existing_dir, new_directory_list, module, directory_args, changed):
327
- '''
323
+ """
328
324
  Walk the new directories list and make sure that permissions are as we would expect
329
- '''
325
+ """
330
326
 
331
327
  if new_directory_list:
332
328
  working_dir = os.path.join(pre_existing_dir, new_directory_list.pop(0))
@@ -336,67 +332,24 @@ def adjust_recursive_directory_permissions(pre_existing_dir, new_directory_list,
336
332
  return changed
337
333
 
338
334
 
335
+ def chown_path(module, path, owner, group):
336
+ """Update the owner/group if specified and different from the current owner/group."""
337
+ changed = module.set_owner_if_different(path, owner, False)
338
+ return module.set_group_if_different(path, group, changed)
339
+
340
+
339
341
  def chown_recursive(path, module):
340
342
  changed = False
341
343
  owner = module.params['owner']
342
344
  group = module.params['group']
343
345
 
344
- if owner is not None:
345
- if not module.check_mode:
346
- for dirpath, dirnames, filenames in os.walk(path):
347
- owner_changed = module.set_owner_if_different(dirpath, owner, False)
348
- if owner_changed is True:
349
- changed = owner_changed
350
- for dir in [os.path.join(dirpath, d) for d in dirnames]:
351
- owner_changed = module.set_owner_if_different(dir, owner, False)
352
- if owner_changed is True:
353
- changed = owner_changed
354
- for file in [os.path.join(dirpath, f) for f in filenames]:
355
- owner_changed = module.set_owner_if_different(file, owner, False)
356
- if owner_changed is True:
357
- changed = owner_changed
358
- else:
359
- uid = pwd.getpwnam(owner).pw_uid
360
- for dirpath, dirnames, filenames in os.walk(path):
361
- owner_changed = (os.stat(dirpath).st_uid != uid)
362
- if owner_changed is True:
363
- changed = owner_changed
364
- for dir in [os.path.join(dirpath, d) for d in dirnames]:
365
- owner_changed = (os.stat(dir).st_uid != uid)
366
- if owner_changed is True:
367
- changed = owner_changed
368
- for file in [os.path.join(dirpath, f) for f in filenames]:
369
- owner_changed = (os.stat(file).st_uid != uid)
370
- if owner_changed is True:
371
- changed = owner_changed
372
- if group is not None:
373
- if not module.check_mode:
374
- for dirpath, dirnames, filenames in os.walk(path):
375
- group_changed = module.set_group_if_different(dirpath, group, False)
376
- if group_changed is True:
377
- changed = group_changed
378
- for dir in [os.path.join(dirpath, d) for d in dirnames]:
379
- group_changed = module.set_group_if_different(dir, group, False)
380
- if group_changed is True:
381
- changed = group_changed
382
- for file in [os.path.join(dirpath, f) for f in filenames]:
383
- group_changed = module.set_group_if_different(file, group, False)
384
- if group_changed is True:
385
- changed = group_changed
386
- else:
387
- gid = grp.getgrnam(group).gr_gid
388
- for dirpath, dirnames, filenames in os.walk(path):
389
- group_changed = (os.stat(dirpath).st_gid != gid)
390
- if group_changed is True:
391
- changed = group_changed
392
- for dir in [os.path.join(dirpath, d) for d in dirnames]:
393
- group_changed = (os.stat(dir).st_gid != gid)
394
- if group_changed is True:
395
- changed = group_changed
396
- for file in [os.path.join(dirpath, f) for f in filenames]:
397
- group_changed = (os.stat(file).st_gid != gid)
398
- if group_changed is True:
399
- changed = group_changed
346
+ # TODO: Consolidate with the other methods calling set_*_if_different method, this is inefficient.
347
+ for dirpath, dirnames, filenames in os.walk(path):
348
+ changed |= chown_path(module, dirpath, owner, group)
349
+ for subdir in [os.path.join(dirpath, d) for d in dirnames]:
350
+ changed |= chown_path(module, subdir, owner, group)
351
+ for filepath in [os.path.join(dirpath, f) for f in filenames]:
352
+ changed |= chown_path(module, filepath, owner, group)
400
353
 
401
354
  return changed
402
355
 
@@ -424,10 +377,7 @@ def copy_diff_files(src, dest, module):
424
377
  shutil.copyfile(b_src_item_path, b_dest_item_path)
425
378
  shutil.copymode(b_src_item_path, b_dest_item_path)
426
379
 
427
- if owner is not None:
428
- module.set_owner_if_different(b_dest_item_path, owner, False)
429
- if group is not None:
430
- module.set_group_if_different(b_dest_item_path, group, False)
380
+ chown_path(module, b_dest_item_path, owner, group)
431
381
  changed = True
432
382
  return changed
433
383
 
@@ -459,10 +409,7 @@ def copy_left_only(src, dest, module):
459
409
 
460
410
  if os.path.islink(b_src_item_path) and os.path.isfile(b_src_item_path) and local_follow is True:
461
411
  shutil.copyfile(b_src_item_path, b_dest_item_path)
462
- if owner is not None:
463
- module.set_owner_if_different(b_dest_item_path, owner, False)
464
- if group is not None:
465
- module.set_group_if_different(b_dest_item_path, group, False)
412
+ chown_path(module, b_dest_item_path, owner, group)
466
413
 
467
414
  if os.path.islink(b_src_item_path) and os.path.isfile(b_src_item_path) and local_follow is False:
468
415
  linkto = os.readlink(b_src_item_path)
@@ -471,11 +418,7 @@ def copy_left_only(src, dest, module):
471
418
  if not os.path.islink(b_src_item_path) and os.path.isfile(b_src_item_path):
472
419
  shutil.copyfile(b_src_item_path, b_dest_item_path)
473
420
  shutil.copymode(b_src_item_path, b_dest_item_path)
474
-
475
- if owner is not None:
476
- module.set_owner_if_different(b_dest_item_path, owner, False)
477
- if group is not None:
478
- module.set_group_if_different(b_dest_item_path, group, False)
421
+ chown_path(module, b_dest_item_path, owner, group)
479
422
 
480
423
  if not os.path.islink(b_src_item_path) and os.path.isdir(b_src_item_path):
481
424
  shutil.copytree(b_src_item_path, b_dest_item_path, symlinks=not local_follow)
@@ -503,6 +446,21 @@ def copy_common_dirs(src, dest, module):
503
446
  return changed
504
447
 
505
448
 
449
+ def copy_directory(src, dest, module):
450
+ if not os.path.exists(dest):
451
+ if not module.check_mode:
452
+ shutil.copytree(src, dest, symlinks=not module.params['local_follow'])
453
+ chown_recursive(dest, module)
454
+ changed = True
455
+ else:
456
+ diff_files_changed = copy_diff_files(src, dest, module)
457
+ left_only_changed = copy_left_only(src, dest, module)
458
+ common_dirs_changed = copy_common_dirs(src, dest, module)
459
+ owner_group_changed = chown_recursive(dest, module)
460
+ changed = any([diff_files_changed, left_only_changed, common_dirs_changed, owner_group_changed])
461
+ return changed
462
+
463
+
506
464
  def main():
507
465
 
508
466
  module = AnsibleModule(
@@ -516,7 +474,7 @@ def main():
516
474
  force=dict(type='bool', default=True),
517
475
  validate=dict(type='str'),
518
476
  directory_mode=dict(type='raw'),
519
- remote_src=dict(type='bool'),
477
+ remote_src=dict(type='bool', default=False),
520
478
  local_follow=dict(type='bool'),
521
479
  checksum=dict(type='str'),
522
480
  follow=dict(type='bool', default=False),
@@ -564,8 +522,8 @@ def main():
564
522
  if os.path.isfile(src):
565
523
  try:
566
524
  checksum_src = module.sha1(src)
567
- except (OSError, IOError) as e:
568
- module.warn("Unable to calculate src checksum, assuming change: %s" % to_native(e))
525
+ except OSError as ex:
526
+ module.error_as_warning("Unable to calculate src checksum, assuming change.", exception=ex)
569
527
  try:
570
528
  # Backwards compat only. This will be None in FIPS mode
571
529
  md5sum_src = module.md5(src)
@@ -653,12 +611,8 @@ def main():
653
611
  if validate:
654
612
  # if we have a mode, make sure we set it on the temporary
655
613
  # file source as some validations may require it
656
- if mode is not None:
657
- module.set_mode_if_different(src, mode, False)
658
- if owner is not None:
659
- module.set_owner_if_different(src, owner, False)
660
- if group is not None:
661
- module.set_group_if_different(src, group, False)
614
+ module.set_mode_if_different(src, mode, False)
615
+ chown_path(module, src, owner, group)
662
616
  if "%s" not in validate:
663
617
  module.fail_json(msg="validate must contain %%s: %s" % (validate))
664
618
  (rc, out, err) = module.run_command(validate % src)
@@ -682,64 +636,23 @@ def main():
682
636
  # at this point we should always have tmp file
683
637
  module.atomic_move(b_mysrc, dest, unsafe_writes=module.params['unsafe_writes'], keep_dest_attrs=not remote_src)
684
638
 
685
- except (IOError, OSError):
686
- module.fail_json(msg="failed to copy: %s to %s" % (src, dest), traceback=traceback.format_exc())
639
+ except OSError as ex:
640
+ raise Exception(f"Failed to copy {src!r} to {dest!r}.") from ex
687
641
  changed = True
688
642
 
689
643
  # If neither have checksums, both src and dest are directories.
690
- if checksum_src is None and checksum_dest is None:
691
- if remote_src and os.path.isdir(module.params['src']):
692
- b_src = to_bytes(module.params['src'], errors='surrogate_or_strict')
693
- b_dest = to_bytes(module.params['dest'], errors='surrogate_or_strict')
694
-
695
- if src.endswith(os.path.sep) and os.path.isdir(module.params['dest']):
696
- diff_files_changed = copy_diff_files(b_src, b_dest, module)
697
- left_only_changed = copy_left_only(b_src, b_dest, module)
698
- common_dirs_changed = copy_common_dirs(b_src, b_dest, module)
699
- owner_group_changed = chown_recursive(b_dest, module)
700
- if diff_files_changed or left_only_changed or common_dirs_changed or owner_group_changed:
701
- changed = True
702
-
703
- if src.endswith(os.path.sep) and not os.path.exists(module.params['dest']):
704
- b_basename = to_bytes(os.path.basename(src), errors='surrogate_or_strict')
705
- b_dest = to_bytes(os.path.join(b_dest, b_basename), errors='surrogate_or_strict')
706
- b_src = to_bytes(os.path.join(module.params['src'], ""), errors='surrogate_or_strict')
707
- if not module.check_mode:
708
- shutil.copytree(b_src, b_dest, symlinks=not local_follow)
709
- chown_recursive(dest, module)
710
- changed = True
711
-
712
- if not src.endswith(os.path.sep) and os.path.isdir(module.params['dest']):
713
- b_basename = to_bytes(os.path.basename(src), errors='surrogate_or_strict')
714
- b_dest = to_bytes(os.path.join(b_dest, b_basename), errors='surrogate_or_strict')
715
- b_src = to_bytes(os.path.join(module.params['src'], ""), errors='surrogate_or_strict')
716
- if not module.check_mode and not os.path.exists(b_dest):
717
- shutil.copytree(b_src, b_dest, symlinks=not local_follow)
718
- changed = True
719
- chown_recursive(dest, module)
720
- if module.check_mode and not os.path.exists(b_dest):
721
- changed = True
722
- if os.path.exists(b_dest):
723
- diff_files_changed = copy_diff_files(b_src, b_dest, module)
724
- left_only_changed = copy_left_only(b_src, b_dest, module)
725
- common_dirs_changed = copy_common_dirs(b_src, b_dest, module)
726
- owner_group_changed = chown_recursive(b_dest, module)
727
- if diff_files_changed or left_only_changed or common_dirs_changed or owner_group_changed:
728
- changed = True
729
-
730
- if not src.endswith(os.path.sep) and not os.path.exists(module.params['dest']):
731
- b_basename = to_bytes(os.path.basename(module.params['src']), errors='surrogate_or_strict')
732
- b_dest = to_bytes(os.path.join(b_dest, b_basename), errors='surrogate_or_strict')
733
- if not module.check_mode and not os.path.exists(b_dest):
734
- os.makedirs(b_dest)
735
- changed = True
736
- b_src = to_bytes(os.path.join(module.params['src'], ""), errors='surrogate_or_strict')
737
- diff_files_changed = copy_diff_files(b_src, b_dest, module)
738
- left_only_changed = copy_left_only(b_src, b_dest, module)
739
- common_dirs_changed = copy_common_dirs(b_src, b_dest, module)
740
- owner_group_changed = chown_recursive(b_dest, module)
741
- if module.check_mode and not os.path.exists(b_dest):
742
- changed = True
644
+ checksums_none = checksum_src is None and checksum_dest is None
645
+ both_directories = os.path.isdir(module.params['src']) and (os.path.isdir(module.params['dest']) or not os.path.exists(module.params['dest']))
646
+ if checksums_none and remote_src and both_directories:
647
+ b_src = to_bytes(module.params['src'], errors='surrogate_or_strict')
648
+ b_dest = to_bytes(module.params['dest'], errors='surrogate_or_strict')
649
+
650
+ if not b_src.endswith(to_bytes(os.path.sep)):
651
+ b_basename = os.path.basename(b_src)
652
+ b_dest = os.path.join(b_dest, b_basename)
653
+ b_src = os.path.join(b_src, b'')
654
+
655
+ changed |= copy_directory(b_src, b_dest, module)
743
656
 
744
657
  res_args = dict(
745
658
  dest=dest, src=src, md5sum=md5sum_src, checksum=checksum_src, changed=changed
ansible/modules/cron.py CHANGED
@@ -10,7 +10,7 @@
10
10
  from __future__ import annotations
11
11
 
12
12
 
13
- DOCUMENTATION = r'''
13
+ DOCUMENTATION = r"""
14
14
  ---
15
15
  module: cron
16
16
  short_description: Manage cron.d and crontab entries
@@ -72,33 +72,39 @@ options:
72
72
  minute:
73
73
  description:
74
74
  - Minute when the job should run (V(0-59), V(*), V(*/2), and so on).
75
+ - Cannot be combined with O(special_time).
75
76
  type: str
76
77
  default: "*"
77
78
  hour:
78
79
  description:
79
80
  - Hour when the job should run (V(0-23), V(*), V(*/2), and so on).
81
+ - Cannot be combined with O(special_time).
80
82
  type: str
81
83
  default: "*"
82
84
  day:
83
85
  description:
84
86
  - Day of the month the job should run (V(1-31), V(*), V(*/2), and so on).
87
+ - Cannot be combined with O(special_time).
85
88
  type: str
86
89
  default: "*"
87
90
  aliases: [ dom ]
88
91
  month:
89
92
  description:
90
- - Month of the year the job should run (V(1-12), V(*), V(*/2), and so on).
93
+ - Month of the year the job should run (V(JAN-DEC) or V(1-12), V(*), V(*/2), and so on).
94
+ - Cannot be combined with O(special_time).
91
95
  type: str
92
96
  default: "*"
93
97
  weekday:
94
98
  description:
95
- - Day of the week that the job should run (V(0-6) for Sunday-Saturday, V(*), and so on).
99
+ - Day of the week that the job should run (V(SUN-SAT) or V(0-6), V(*), and so on).
100
+ - Cannot be combined with O(special_time).
96
101
  type: str
97
102
  default: "*"
98
103
  aliases: [ dow ]
99
104
  special_time:
100
105
  description:
101
106
  - Special time specification nickname.
107
+ - Cannot be combined with O(minute), O(hour), O(day), O(month) or O(weekday).
102
108
  type: str
103
109
  choices: [ annually, daily, hourly, monthly, reboot, weekly, yearly ]
104
110
  version_added: "1.3"
@@ -150,9 +156,9 @@ attributes:
150
156
  platform:
151
157
  support: full
152
158
  platforms: posix
153
- '''
159
+ """
154
160
 
155
- EXAMPLES = r'''
161
+ EXAMPLES = r"""
156
162
  - name: Ensure a job that runs at 2 and 5 exists. Creates an entry like "0 5,2 * * ls -alh > /dev/null"
157
163
  ansible.builtin.cron:
158
164
  name: "check dirs"
@@ -205,9 +211,9 @@ EXAMPLES = r'''
205
211
  name: APP_HOME
206
212
  env: yes
207
213
  state: absent
208
- '''
214
+ """
209
215
 
210
- RETURN = r'''#'''
216
+ RETURN = r"""#"""
211
217
 
212
218
  import os
213
219
  import platform
@@ -262,17 +268,16 @@ class CronTab(object):
262
268
  if self.cron_file:
263
269
  # read the cronfile
264
270
  try:
265
- f = open(self.b_cron_file, 'rb')
266
- self.n_existing = to_native(f.read(), errors='surrogate_or_strict')
267
- self.lines = self.n_existing.splitlines()
268
- f.close()
269
- except IOError:
271
+ with open(self.b_cron_file, 'rb') as f:
272
+ self.n_existing = to_native(f.read(), errors='surrogate_or_strict')
273
+ self.lines = self.n_existing.splitlines()
274
+ except OSError:
270
275
  # cron file does not exist
271
276
  return
272
277
  except Exception:
273
278
  raise CronTabError("Unexpected error:", sys.exc_info()[0])
274
279
  else:
275
- # using safely quoted shell for now, but this really should be two non-shell calls instead. FIXME
280
+ # FIXME: using safely quoted shell for now, but this really should be two non-shell calls instead.
276
281
  (rc, out, err) = self.module.run_command(self._read_user_execute(), use_unsafe_shell=True)
277
282
 
278
283
  if rc != 0 and rc != 1: # 1 can mean that there are no jobs.
@@ -323,12 +328,12 @@ class CronTab(object):
323
328
 
324
329
  # Add the entire crontab back to the user crontab
325
330
  if not self.cron_file:
326
- # quoting shell args for now but really this should be two non-shell calls. FIXME
331
+ # FIXME: quoting shell args for now but really this should be two non-shell calls.
327
332
  (rc, out, err) = self.module.run_command(self._write_execute(path), use_unsafe_shell=True)
328
333
  os.unlink(path)
329
334
 
330
335
  if rc != 0:
331
- self.module.fail_json(msg=err)
336
+ self.module.fail_json(msg=f"Failed to install new cronfile: {path}", stderr=err, stdout=out, rc=rc)
332
337
 
333
338
  # set SELinux permissions
334
339
  if self.module.selinux_enabled() and self.cron_file:
@@ -613,7 +618,6 @@ def main():
613
618
 
614
619
  changed = False
615
620
  res_args = dict()
616
- warnings = list()
617
621
 
618
622
  if cron_file:
619
623
 
@@ -622,8 +626,8 @@ def main():
622
626
 
623
627
  cron_file_basename = os.path.basename(cron_file)
624
628
  if not re.search(r'^[A-Z0-9_-]+$', cron_file_basename, re.I):
625
- warnings.append('Filename portion of cron_file ("%s") should consist' % cron_file_basename +
626
- ' solely of upper- and lower-case letters, digits, underscores, and hyphens')
629
+ module.warn('Filename portion of cron_file ("%s") should consist' % cron_file_basename +
630
+ ' solely of upper- and lower-case letters, digits, underscores, and hyphens')
627
631
 
628
632
  # Ensure all files generated are only writable by the owning user. Primarily relevant for the cron_file option.
629
633
  os.umask(int('022', 8))
@@ -646,7 +650,7 @@ def main():
646
650
 
647
651
  if special_time and \
648
652
  (True in [(x != '*') for x in [minute, hour, day, month, weekday]]):
649
- module.fail_json(msg="You must specify time and date fields or special time.")
653
+ module.fail_json(msg="You cannot combine special_time with any of the time or day/date parameters.")
650
654
 
651
655
  # cannot support special_time on solaris
652
656
  if special_time and platform.system() == 'SunOS':
@@ -688,7 +692,7 @@ def main():
688
692
  if do_install:
689
693
  for char in ['\r', '\n']:
690
694
  if char in job.strip('\r\n'):
691
- warnings.append('Job should not contain line breaks')
695
+ module.warn('Job should not contain line breaks')
692
696
  break
693
697
 
694
698
  job = crontab.get_cron_job(minute, hour, day, month, weekday, job, special_time, disabled)
@@ -729,7 +733,6 @@ def main():
729
733
  res_args = dict(
730
734
  jobs=crontab.get_jobnames(),
731
735
  envs=crontab.get_envnames(),
732
- warnings=warnings,
733
736
  changed=changed
734
737
  )
735
738
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  from __future__ import annotations
6
6
 
7
- DOCUMENTATION = '''
7
+ DOCUMENTATION = """
8
8
  author: 'Ansible Core Team (@ansible)'
9
9
  short_description: 'Add and remove deb822 formatted repositories'
10
10
  description:
@@ -145,9 +145,9 @@ options:
145
145
  requirements:
146
146
  - python3-debian / python-debian
147
147
  version_added: '2.15'
148
- '''
148
+ """
149
149
 
150
- EXAMPLES = '''
150
+ EXAMPLES = """
151
151
  - name: Add debian repo
152
152
  deb822_repository:
153
153
  name: debian
@@ -189,9 +189,9 @@ EXAMPLES = '''
189
189
  components: stable
190
190
  architectures: amd64
191
191
  signed_by: https://download.example.com/linux/ubuntu/gpg
192
- '''
192
+ """
193
193
 
194
- RETURN = '''
194
+ RETURN = """
195
195
  repo:
196
196
  description: A source string for the repository
197
197
  returned: always
@@ -224,13 +224,12 @@ key_filename:
224
224
  returned: always
225
225
  type: str
226
226
  sample: /etc/apt/keyrings/debian.gpg
227
- '''
227
+ """
228
228
 
229
229
  import os
230
230
  import re
231
231
  import tempfile
232
232
  import textwrap
233
- import traceback
234
233
 
235
234
  from ansible.module_utils.basic import AnsibleModule
236
235
  from ansible.module_utils.basic import missing_required_lib
@@ -248,9 +247,9 @@ HAS_DEBIAN = True
248
247
  DEBIAN_IMP_ERR = None
249
248
  try:
250
249
  from debian.deb822 import Deb822 # type: ignore[import]
251
- except ImportError:
250
+ except ImportError as ex:
252
251
  HAS_DEBIAN = False
253
- DEBIAN_IMP_ERR = traceback.format_exc()
252
+ DEBIAN_IMP_ERR = ex
254
253
 
255
254
  KEYRINGS_DIR = '/etc/apt/keyrings'
256
255
 
@@ -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: debconf
12
12
  short_description: Configure a .deb package
@@ -86,9 +86,9 @@ options:
86
86
  default: false
87
87
  author:
88
88
  - Brian Coca (@bcoca)
89
- '''
89
+ """
90
90
 
91
- EXAMPLES = r'''
91
+ EXAMPLES = r"""
92
92
  - name: Set default locale to fr_FR.UTF-8
93
93
  ansible.builtin.debconf:
94
94
  name: locales
@@ -121,9 +121,9 @@ EXAMPLES = r'''
121
121
  value: "{{ site_passphrase }}"
122
122
  vtype: password
123
123
  no_log: True
124
- '''
124
+ """
125
125
 
126
- RETURN = r'''#'''
126
+ RETURN = r"""#"""
127
127
 
128
128
  from ansible.module_utils.common.text.converters import to_text, to_native
129
129
  from ansible.module_utils.basic import AnsibleModule
ansible/modules/debug.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: debug
12
12
  short_description: Print statements during execution
@@ -68,9 +68,9 @@ seealso:
68
68
  author:
69
69
  - Dag Wieers (@dagwieers)
70
70
  - Michael DeHaan
71
- '''
71
+ """
72
72
 
73
- EXAMPLES = r'''
73
+ EXAMPLES = r"""
74
74
  - name: Print the gateway for each host when defined
75
75
  ansible.builtin.debug:
76
76
  msg: System {{ inventory_hostname }} has gateway {{ ansible_default_ipv4.gateway }}
@@ -95,4 +95,4 @@ EXAMPLES = r'''
95
95
  msg:
96
96
  - "Provisioning based on YOUR_KEY which is: {{ lookup('ansible.builtin.env', 'YOUR_KEY') }}"
97
97
  - "These servers were built using the password of '{{ password_used }}'. Please retain this for later use."
98
- '''
98
+ """
ansible/modules/dnf.py CHANGED
@@ -9,7 +9,7 @@
9
9
  from __future__ import annotations
10
10
 
11
11
 
12
- DOCUMENTATION = '''
12
+ DOCUMENTATION = """
13
13
  ---
14
14
  module: dnf
15
15
  version_added: 1.9
@@ -306,9 +306,9 @@ author:
306
306
  - Cristian van Ee (@DJMuggs) <cristian at cvee.org>
307
307
  - Berend De Schouwer (@berenddeschouwer)
308
308
  - Adam Miller (@maxamillion) <admiller@redhat.com>
309
- '''
309
+ """
310
310
 
311
- EXAMPLES = '''
311
+ EXAMPLES = """
312
312
  - name: Install the latest version of Apache
313
313
  ansible.builtin.dnf:
314
314
  name: httpd
@@ -394,7 +394,7 @@ EXAMPLES = '''
394
394
  ansible.builtin.dnf:
395
395
  name: '@postgresql/client'
396
396
  state: present
397
- '''
397
+ """
398
398
 
399
399
  import os
400
400
  import sys
@@ -408,10 +408,10 @@ from ansible.module_utils.common.respawn import has_respawned, probe_interpreter
408
408
  from ansible.module_utils.yumdnf import YumDnf, yumdnf_argument_spec
409
409
 
410
410
 
411
- # NOTE dnf Python bindings import is postponed, see DnfModule._ensure_dnf(),
412
- # because we need AnsibleModule object to use get_best_parsable_locale()
413
- # to set proper locale before importing dnf to be able to scrape
414
- # the output in some cases (FIXME?).
411
+ # FIXME: NOTE dnf Python bindings import is postponed, see DnfModule._ensure_dnf(),
412
+ # because we need AnsibleModule object to use get_best_parsable_locale()
413
+ # to set proper locale before importing dnf to be able to scrape
414
+ # the output in some cases.
415
415
  dnf = None
416
416
 
417
417