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
@@ -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: command
13
13
  short_description: Execute commands on targets
@@ -117,9 +117,9 @@ seealso:
117
117
  author:
118
118
  - Ansible Core Team
119
119
  - Michael DeHaan
120
- '''
120
+ """
121
121
 
122
- EXAMPLES = r'''
122
+ EXAMPLES = r"""
123
123
  - name: Return motd to registered var
124
124
  ansible.builtin.command: cat /etc/motd
125
125
  register: mymotd
@@ -173,9 +173,9 @@ EXAMPLES = r'''
173
173
  - name: Safely use templated variable to run command. Always use the quote filter to avoid injection issues
174
174
  ansible.builtin.command: cat {{ myfile|quote }}
175
175
  register: myoutput
176
- '''
176
+ """
177
177
 
178
- RETURN = r'''
178
+ RETURN = r"""
179
179
  msg:
180
180
  description: changed
181
181
  returned: always
@@ -228,7 +228,7 @@ stderr_lines:
228
228
  returned: always
229
229
  type: list
230
230
  sample: [u'ls cannot access foo: No such file or directory', u'ls …']
231
- '''
231
+ """
232
232
 
233
233
  import datetime
234
234
  import glob
@@ -249,6 +249,7 @@ def main():
249
249
  argument_spec=dict(
250
250
  _raw_params=dict(),
251
251
  _uses_shell=dict(type='bool', default=False),
252
+ cmd=dict(),
252
253
  argv=dict(type='list', elements='str'),
253
254
  chdir=dict(type='path'),
254
255
  executable=dict(),
@@ -260,12 +261,14 @@ def main():
260
261
  stdin_add_newline=dict(type='bool', default=True),
261
262
  strip_empty_ends=dict(type='bool', default=True),
262
263
  ),
264
+ required_one_of=[['_raw_params', 'cmd', 'argv']],
265
+ mutually_exclusive=[['_raw_params', 'cmd', 'argv']],
263
266
  supports_check_mode=True,
264
267
  )
265
268
  shell = module.params['_uses_shell']
266
269
  chdir = module.params['chdir']
267
270
  executable = module.params['executable']
268
- args = module.params['_raw_params']
271
+ args = module.params['_raw_params'] or module.params['cmd']
269
272
  argv = module.params['argv']
270
273
  creates = module.params['creates']
271
274
  removes = module.params['removes']
@@ -281,16 +284,6 @@ def main():
281
284
  module.warn("As of Ansible 2.4, the parameter 'executable' is no longer supported with the 'command' module. Not using '%s'." % executable)
282
285
  executable = None
283
286
 
284
- if (not args or args.strip() == '') and not argv:
285
- r['rc'] = 256
286
- r['msg'] = "no command given"
287
- module.fail_json(**r)
288
-
289
- if args and argv:
290
- r['rc'] = 256
291
- r['msg'] = "only command or argv can be given, not both"
292
- module.fail_json(**r)
293
-
294
287
  if not shell and args:
295
288
  args = shlex.split(args)
296
289
 
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),
@@ -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)
@@ -683,63 +637,22 @@ def main():
683
637
  module.atomic_move(b_mysrc, dest, unsafe_writes=module.params['unsafe_writes'], keep_dest_attrs=not remote_src)
684
638
 
685
639
  except (IOError, OSError):
686
- module.fail_json(msg="failed to copy: %s to %s" % (src, dest), traceback=traceback.format_exc())
640
+ module.fail_json(msg=f"Failed to copy {src!r} to {dest!r}.")
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()
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()
269
274
  except IOError:
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:
@@ -646,7 +651,7 @@ def main():
646
651
 
647
652
  if special_time and \
648
653
  (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.")
654
+ module.fail_json(msg="You cannot combine special_time with any of the time or day/date parameters.")
650
655
 
651
656
  # cannot support special_time on solaris
652
657
  if special_time and platform.system() == 'SunOS':
@@ -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
+ """