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
@@ -1,11 +1,11 @@
1
1
  # -*- coding: utf-8 -*-
2
- # Copyright (c) 2017 Ansible Project
2
+ # Copyright: Contributors to the Ansible project
3
3
  # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
4
4
 
5
5
  from __future__ import annotations
6
6
 
7
7
 
8
- DOCUMENTATION = '''
8
+ DOCUMENTATION = """
9
9
  ---
10
10
  module: gather_facts
11
11
  version_added: 2.8
@@ -57,7 +57,7 @@ notes:
57
57
  Order is not guaranteed, when doing parallel gathering on multiple modules.
58
58
  author:
59
59
  - "Ansible Core Team"
60
- '''
60
+ """
61
61
 
62
62
  RETURN = """
63
63
  # depends on the fact module called
@@ -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: get_url
12
12
  short_description: Downloads files from HTTP, HTTPS, or FTP to node
@@ -219,9 +219,9 @@ seealso:
219
219
  - module: ansible.windows.win_get_url
220
220
  author:
221
221
  - Jan-Piet Mens (@jpmens)
222
- '''
222
+ """
223
223
 
224
- EXAMPLES = r'''
224
+ EXAMPLES = r"""
225
225
  - name: Download foo.conf
226
226
  ansible.builtin.get_url:
227
227
  url: http://example.com/path/file.conf
@@ -272,9 +272,9 @@ EXAMPLES = r'''
272
272
  dest: /etc/foo.conf
273
273
  username: bar
274
274
  password: '{{ mysecret }}'
275
- '''
275
+ """
276
276
 
277
- RETURN = r'''
277
+ RETURN = r"""
278
278
  backup_file:
279
279
  description: name of backup file created after download
280
280
  returned: changed and if backup=yes
@@ -365,17 +365,18 @@ url:
365
365
  returned: always
366
366
  type: str
367
367
  sample: https://www.ansible.com/
368
- '''
368
+ """
369
369
 
370
+ import email.message
370
371
  import os
371
372
  import re
372
373
  import shutil
373
374
  import tempfile
374
- import traceback
375
+
376
+ from datetime import datetime, timezone
375
377
 
376
378
  from ansible.module_utils.basic import AnsibleModule
377
379
  from ansible.module_utils.six.moves.urllib.parse import urlsplit
378
- from ansible.module_utils.compat.datetime import utcnow, utcfromtimestamp
379
380
  from ansible.module_utils.common.text.converters import to_native
380
381
  from ansible.module_utils.urls import fetch_url, url_argument_spec
381
382
 
@@ -398,10 +399,10 @@ def url_get(module, url, dest, use_proxy, last_mod_time, force, timeout=10, head
398
399
  Return (tempfile, info about the request)
399
400
  """
400
401
 
401
- start = utcnow()
402
+ start = datetime.now(timezone.utc)
402
403
  rsp, info = fetch_url(module, url, use_proxy=use_proxy, force=force, last_mod_time=last_mod_time, timeout=timeout, headers=headers, method=method,
403
404
  unredirected_headers=unredirected_headers, decompress=decompress, ciphers=ciphers, use_netrc=use_netrc)
404
- elapsed = (utcnow() - start).seconds
405
+ elapsed = (datetime.now(timezone.utc) - start).seconds
405
406
 
406
407
  if info['status'] == 304:
407
408
  module.exit_json(url=url, dest=dest, changed=False, msg=info.get('msg', ''), status_code=info['status'], elapsed=elapsed)
@@ -432,30 +433,23 @@ def url_get(module, url, dest, use_proxy, last_mod_time, force, timeout=10, head
432
433
  shutil.copyfileobj(rsp, f)
433
434
  except Exception as e:
434
435
  os.remove(tempname)
435
- module.fail_json(msg="failed to create temporary content file: %s" % to_native(e), elapsed=elapsed, exception=traceback.format_exc())
436
+ module.fail_json(msg="failed to create temporary content file: %s" % to_native(e), elapsed=elapsed)
436
437
  f.close()
437
438
  rsp.close()
438
439
  return tempname, info
439
440
 
440
441
 
441
442
  def extract_filename_from_headers(headers):
442
- """
443
- Extracts a filename from the given dict of HTTP headers.
443
+ """Extracts a filename from the given dict of HTTP headers.
444
444
 
445
- Looks for the content-disposition header and applies a regex.
446
- Returns the filename if successful, else None."""
447
- cont_disp_regex = 'attachment; ?filename="?([^"]+)'
448
- res = None
449
-
450
- if 'content-disposition' in headers:
451
- cont_disp = headers['content-disposition']
452
- match = re.match(cont_disp_regex, cont_disp)
453
- if match:
454
- res = match.group(1)
455
- # Try preventing any funny business.
456
- res = os.path.basename(res)
457
-
458
- return res
445
+ Returns the filename if successful, else None.
446
+ """
447
+ msg = email.message.Message()
448
+ msg['content-disposition'] = headers.get('content-disposition', '')
449
+ if filename := msg.get_param('filename', header='content-disposition'):
450
+ # Avoid directory traversal
451
+ filename = os.path.basename(filename)
452
+ return filename
459
453
 
460
454
 
461
455
  def is_url(checksum):
@@ -466,6 +460,37 @@ def is_url(checksum):
466
460
  return urlsplit(checksum).scheme in supported_schemes
467
461
 
468
462
 
463
+ def parse_digest_lines(filename, lines):
464
+ """Returns a list of tuple containing the filename and digest depending upon
465
+ the lines provided
466
+
467
+ Args:
468
+ filename (str): Name of the filename, used only when the digest is one-liner
469
+ lines (list): A list of lines containing filenames and checksums
470
+ """
471
+ checksum_map = []
472
+ BSD_DIGEST_LINE = re.compile(r'^(\w+) ?\((?P<path>.+)\) ?= (?P<digest>[\w.]+)$')
473
+ GNU_DIGEST_LINE = re.compile(r'^(?P<digest>[\w.]+) ([ *])(?P<path>.+)$')
474
+
475
+ if len(lines) == 1 and len(lines[0].split()) == 1:
476
+ # Only a single line with a single string
477
+ # treat it as a checksum only file
478
+ checksum_map.append((lines[0], filename))
479
+ return checksum_map
480
+ # The assumption here is the file is in the format of
481
+ # checksum filename
482
+ for line in lines:
483
+ match = BSD_DIGEST_LINE.match(line)
484
+ if match:
485
+ checksum_map.append((match.group('digest'), match.group('path')))
486
+ else:
487
+ match = GNU_DIGEST_LINE.match(line)
488
+ if match:
489
+ checksum_map.append((match.group('digest'), match.group('path').lstrip("./")))
490
+
491
+ return checksum_map
492
+
493
+
469
494
  # ==============================================================
470
495
  # main
471
496
 
@@ -533,31 +558,13 @@ def main():
533
558
  if is_url(checksum):
534
559
  checksum_url = checksum
535
560
  # download checksum file to checksum_tmpsrc
536
- checksum_tmpsrc, checksum_info = url_get(module, checksum_url, dest, use_proxy, last_mod_time, force, timeout, headers, tmp_dest,
537
- unredirected_headers=unredirected_headers, ciphers=ciphers, use_netrc=use_netrc)
561
+ checksum_tmpsrc, _dummy = url_get(module, checksum_url, dest, use_proxy, last_mod_time, force, timeout, headers, tmp_dest,
562
+ unredirected_headers=unredirected_headers, ciphers=ciphers, use_netrc=use_netrc)
538
563
  with open(checksum_tmpsrc) as f:
539
564
  lines = [line.rstrip('\n') for line in f]
540
565
  os.remove(checksum_tmpsrc)
541
- checksum_map = []
542
566
  filename = url_filename(url)
543
- if len(lines) == 1 and len(lines[0].split()) == 1:
544
- # Only a single line with a single string
545
- # treat it as a checksum only file
546
- checksum_map.append((lines[0], filename))
547
- else:
548
- # The assumption here is the file is in the format of
549
- # checksum filename
550
- for line in lines:
551
- # Split by one whitespace to keep the leading type char ' ' (whitespace) for text and '*' for binary
552
- parts = line.split(" ", 1)
553
- if len(parts) == 2:
554
- # Remove the leading type char, we expect
555
- if parts[1].startswith((" ", "*",)):
556
- parts[1] = parts[1][1:]
557
-
558
- # Append checksum and path without potential leading './'
559
- checksum_map.append((parts[0], parts[1].lstrip("./")))
560
-
567
+ checksum_map = parse_digest_lines(filename=filename, lines=lines)
561
568
  # Look through each line in the checksum file for a hash corresponding to
562
569
  # the filename in the url, returning the first hash that is found.
563
570
  for cksum in (s for (s, f) in checksum_map if f == filename):
@@ -601,7 +608,7 @@ def main():
601
608
  # If the file already exists, prepare the last modified time for the
602
609
  # request.
603
610
  mtime = os.path.getmtime(dest)
604
- last_mod_time = utcfromtimestamp(mtime)
611
+ last_mod_time = datetime.fromtimestamp(mtime, timezone.utc)
605
612
 
606
613
  # If the checksum does not match we have to force the download
607
614
  # because last_mod_time may be newer than on remote
@@ -609,11 +616,11 @@ def main():
609
616
  force = True
610
617
 
611
618
  # download to tmpsrc
612
- start = utcnow()
619
+ start = datetime.now(timezone.utc)
613
620
  method = 'HEAD' if module.check_mode else 'GET'
614
621
  tmpsrc, info = url_get(module, url, dest, use_proxy, last_mod_time, force, timeout, headers, tmp_dest, method,
615
622
  unredirected_headers=unredirected_headers, decompress=decompress, ciphers=ciphers, use_netrc=use_netrc)
616
- result['elapsed'] = (utcnow() - start).seconds
623
+ result['elapsed'] = (datetime.now(timezone.utc) - start).seconds
617
624
  result['src'] = tmpsrc
618
625
 
619
626
  # Now the request has completed, we can finally generate the final
@@ -683,8 +690,7 @@ def main():
683
690
  except Exception as e:
684
691
  if os.path.exists(tmpsrc):
685
692
  os.remove(tmpsrc)
686
- module.fail_json(msg="failed to copy %s to %s: %s" % (tmpsrc, dest, to_native(e)),
687
- exception=traceback.format_exc(), **result)
693
+ module.fail_json(msg="failed to copy %s to %s: %s" % (tmpsrc, dest, to_native(e)), **result)
688
694
  result['changed'] = True
689
695
  else:
690
696
  result['changed'] = False
ansible/modules/getent.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: getent
12
12
  short_description: A wrapper to the unix getent utility
@@ -58,9 +58,9 @@ notes:
58
58
  - Not all databases support enumeration, check system documentation for details.
59
59
  author:
60
60
  - Brian Coca (@bcoca)
61
- '''
61
+ """
62
62
 
63
- EXAMPLES = '''
63
+ EXAMPLES = """
64
64
  - name: Get root user info
65
65
  ansible.builtin.getent:
66
66
  database: passwd
@@ -97,9 +97,9 @@ EXAMPLES = '''
97
97
  - ansible.builtin.debug:
98
98
  var: ansible_facts.getent_shadow
99
99
 
100
- '''
100
+ """
101
101
 
102
- RETURN = '''
102
+ RETURN = """
103
103
  ansible_facts:
104
104
  description: Facts to add to ansible_facts.
105
105
  returned: always
@@ -112,9 +112,7 @@ ansible_facts:
112
112
  - Starting at 2.11 it now returns multiple duplicate entries, previously it only returned the last one
113
113
  returned: always
114
114
  type: list
115
- '''
116
-
117
- import traceback
115
+ """
118
116
 
119
117
  from ansible.module_utils.basic import AnsibleModule
120
118
  from ansible.module_utils.common.text.converters import to_native
@@ -156,7 +154,7 @@ def main():
156
154
  try:
157
155
  rc, out, err = module.run_command(cmd)
158
156
  except Exception as e:
159
- module.fail_json(msg=to_native(e), exception=traceback.format_exc())
157
+ module.fail_json(msg=to_native(e))
160
158
 
161
159
  msg = "Unexpected failure!"
162
160
  dbtree = 'getent_%s' % database
ansible/modules/git.py CHANGED
@@ -6,7 +6,7 @@
6
6
  from __future__ import annotations
7
7
 
8
8
 
9
- DOCUMENTATION = '''
9
+ DOCUMENTATION = """
10
10
  ---
11
11
  module: git
12
12
  author:
@@ -21,6 +21,10 @@ options:
21
21
  repo:
22
22
  description:
23
23
  - git, SSH, or HTTP(S) protocol address of the git repository.
24
+ - Avoid embedding usernames and passwords within Git repository URLs.
25
+ This practice is insecure and can lead to unauthorized access to your repositories.
26
+ For secure authentication, configure SSH keys (recommended) or use a credential helper.
27
+ See Git documentation on SSH keys/credential helpers for instructions.
24
28
  type: str
25
29
  required: true
26
30
  aliases: [ name ]
@@ -236,9 +240,9 @@ notes:
236
240
  one solution is to use the option accept_hostkey. Another solution is to
237
241
  add the remote host public key in C(/etc/ssh/ssh_known_hosts) before calling
238
242
  the git module, with the following command: C(ssh-keyscan -H remote_host.com >> /etc/ssh/ssh_known_hosts)."
239
- '''
243
+ """
240
244
 
241
- EXAMPLES = '''
245
+ EXAMPLES = """
242
246
  - name: Git checkout
243
247
  ansible.builtin.git:
244
248
  repo: 'https://github.com/ansible/ansible.git'
@@ -295,9 +299,9 @@ EXAMPLES = '''
295
299
  environment:
296
300
  GIT_TERMINAL_PROMPT: 0 # reports "terminal prompts disabled" on missing password
297
301
  # or GIT_ASKPASS: /bin/true # for git before version 2.3.0, reports "Authentication failed" on missing password
298
- '''
302
+ """
299
303
 
300
- RETURN = '''
304
+ RETURN = """
301
305
  after:
302
306
  description: Last commit revision of the repository retrieved during the update.
303
307
  returned: success
@@ -328,7 +332,7 @@ git_dir_before:
328
332
  returned: success
329
333
  type: str
330
334
  sample: /path/to/old/git/dir
331
- '''
335
+ """
332
336
 
333
337
  import filecmp
334
338
  import os
@@ -366,16 +370,15 @@ def relocate_repo(module, result, repo_dir, old_repo_dir, worktree_dir):
366
370
 
367
371
 
368
372
  def head_splitter(headfile, remote, module=None, fail_on_error=False):
369
- '''Extract the head reference'''
373
+ """Extract the head reference"""
370
374
  # https://github.com/ansible/ansible-modules-core/pull/907
371
375
 
372
376
  res = None
373
377
  if os.path.exists(headfile):
374
378
  rawdata = None
375
379
  try:
376
- f = open(headfile, 'r')
377
- rawdata = f.readline()
378
- f.close()
380
+ with open(headfile, 'r') as f:
381
+ rawdata = f.readline()
379
382
  except Exception:
380
383
  if fail_on_error and module:
381
384
  module.fail_json(msg="Unable to read %s" % headfile)
@@ -429,11 +432,11 @@ def get_submodule_update_params(module, git_path, cwd):
429
432
 
430
433
 
431
434
  def write_ssh_wrapper(module):
432
- '''
435
+ """
433
436
  This writes an shell wrapper for ssh options to be used with git
434
437
  this is only relevant for older versions of gitthat cannot
435
438
  handle the options themselves. Returns path to the script
436
- '''
439
+ """
437
440
  try:
438
441
  # make sure we have full permission to the module_dir, which
439
442
  # may not be the case if we're sudo'ing to a non-root user
@@ -466,10 +469,10 @@ def write_ssh_wrapper(module):
466
469
 
467
470
 
468
471
  def set_git_ssh_env(key_file, ssh_opts, git_version, module):
469
- '''
472
+ """
470
473
  use environment variables to configure git's ssh execution,
471
474
  which varies by version but this function should handle all.
472
- '''
475
+ """
473
476
 
474
477
  # initialise to existing ssh opts and/or append user provided
475
478
  if ssh_opts is None:
@@ -519,7 +522,7 @@ def set_git_ssh_env(key_file, ssh_opts, git_version, module):
519
522
 
520
523
 
521
524
  def get_version(module, git_path, dest, ref="HEAD"):
522
- ''' samples the version of the git repo '''
525
+ """ samples the version of the git repo """
523
526
 
524
527
  cmd = "%s rev-parse %s" % (git_path, ref)
525
528
  rc, stdout, stderr = module.run_command(cmd, cwd=dest)
@@ -571,7 +574,7 @@ def get_submodule_versions(git_path, module, dest, version='HEAD'):
571
574
 
572
575
  def clone(git_path, module, repo, dest, remote, depth, version, bare,
573
576
  reference, refspec, git_version_used, verify_commit, separate_git_dir, result, gpg_allowlist, single_branch):
574
- ''' makes a new git repo if it does not already exist '''
577
+ """ makes a new git repo if it does not already exist """
575
578
  dest_dirname = os.path.dirname(dest)
576
579
  try:
577
580
  os.makedirs(dest_dirname)
@@ -653,17 +656,17 @@ def has_local_mods(module, git_path, dest, bare):
653
656
 
654
657
 
655
658
  def reset(git_path, module, dest):
656
- '''
659
+ """
657
660
  Resets the index and working tree to HEAD.
658
661
  Discards any changes to tracked files in working
659
662
  tree since that commit.
660
- '''
663
+ """
661
664
  cmd = "%s reset --hard HEAD" % (git_path,)
662
665
  return module.run_command(cmd, check_rc=True, cwd=dest)
663
666
 
664
667
 
665
668
  def get_diff(module, git_path, dest, repo, remote, depth, bare, before, after):
666
- ''' Return the difference between 2 versions '''
669
+ """ Return the difference between 2 versions """
667
670
  if before is None:
668
671
  return {'prepared': '>> Newly checked out %s' % after}
669
672
  elif before != after:
@@ -817,13 +820,13 @@ def get_repo_path(dest, bare):
817
820
 
818
821
 
819
822
  def get_head_branch(git_path, module, dest, remote, bare=False):
820
- '''
823
+ """
821
824
  Determine what branch HEAD is associated with. This is partly
822
825
  taken from lib/ansible/utils/__init__.py. It finds the correct
823
826
  path to .git/HEAD and reads from that file the branch that HEAD is
824
827
  associated with. In the case of a detached HEAD, this will look
825
828
  up the branch in .git/refs/remotes/<remote>/HEAD.
826
- '''
829
+ """
827
830
  try:
828
831
  repo_path = get_repo_path(dest, bare)
829
832
  except (IOError, ValueError) as err:
@@ -845,7 +848,7 @@ def get_head_branch(git_path, module, dest, remote, bare=False):
845
848
 
846
849
 
847
850
  def get_remote_url(git_path, module, dest, remote):
848
- '''Return URL of remote source for repo.'''
851
+ """Return URL of remote source for repo."""
849
852
  command = [git_path, 'ls-remote', '--get-url', remote]
850
853
  (rc, out, err) = module.run_command(command, cwd=dest)
851
854
  if rc != 0:
@@ -856,7 +859,7 @@ def get_remote_url(git_path, module, dest, remote):
856
859
 
857
860
 
858
861
  def set_remote_url(git_path, module, repo, dest, remote):
859
- ''' updates repo from remote sources '''
862
+ """ updates repo from remote sources """
860
863
  # Return if remote URL isn't changing.
861
864
  remote_url = get_remote_url(git_path, module, dest, remote)
862
865
  if remote_url == repo or unfrackgitpath(remote_url) == unfrackgitpath(repo):
@@ -874,7 +877,7 @@ def set_remote_url(git_path, module, repo, dest, remote):
874
877
 
875
878
 
876
879
  def fetch(git_path, module, repo, dest, version, remote, depth, bare, refspec, git_version_used, force=False):
877
- ''' updates repo from remote sources '''
880
+ """ updates repo from remote sources """
878
881
  set_remote_url(git_path, module, repo, dest, remote)
879
882
  commands = []
880
883
 
@@ -981,7 +984,7 @@ def submodules_fetch(git_path, module, remote, track_submodules, dest):
981
984
 
982
985
 
983
986
  def submodule_update(git_path, module, dest, track_submodules, force=False):
984
- ''' init and update any submodules '''
987
+ """ init and update any submodules """
985
988
 
986
989
  # get the valid submodule params
987
990
  params = get_submodule_update_params(module, git_path, dest)
ansible/modules/group.py CHANGED
@@ -6,7 +6,7 @@
6
6
  from __future__ import annotations
7
7
 
8
8
 
9
- DOCUMENTATION = '''
9
+ DOCUMENTATION = """
10
10
  ---
11
11
  module: group
12
12
  version_added: "0.0.2"
@@ -91,9 +91,9 @@ seealso:
91
91
  - module: ansible.windows.win_group
92
92
  author:
93
93
  - Stephen Fromm (@sfromm)
94
- '''
94
+ """
95
95
 
96
- EXAMPLES = '''
96
+ EXAMPLES = """
97
97
  - name: Ensure group "somegroup" exists
98
98
  ansible.builtin.group:
99
99
  name: somegroup
@@ -104,9 +104,9 @@ EXAMPLES = '''
104
104
  name: docker
105
105
  state: present
106
106
  gid: 1750
107
- '''
107
+ """
108
108
 
109
- RETURN = r'''
109
+ RETURN = r"""
110
110
  gid:
111
111
  description: Group ID of the group.
112
112
  returned: When O(state) is C(present)
@@ -127,7 +127,7 @@ system:
127
127
  returned: When O(state) is C(present)
128
128
  type: bool
129
129
  sample: False
130
- '''
130
+ """
131
131
 
132
132
  import grp
133
133
  import os
@@ -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: group_by
13
13
  short_description: Create Ansible groups based on facts
@@ -65,9 +65,9 @@ seealso:
65
65
  - module: ansible.builtin.add_host
66
66
  author:
67
67
  - Jeroen Hoekx (@jhoekx)
68
- '''
68
+ """
69
69
 
70
- EXAMPLES = r'''
70
+ EXAMPLES = r"""
71
71
  - name: Create groups based on the machine architecture
72
72
  ansible.builtin.group_by:
73
73
  key: machine_{{ ansible_machine }}
@@ -85,4 +85,4 @@ EXAMPLES = r'''
85
85
  - name: Add all active hosts to a static group
86
86
  ansible.builtin.group_by:
87
87
  key: done
88
- '''
88
+ """
@@ -7,7 +7,7 @@
7
7
  from __future__ import annotations
8
8
 
9
9
 
10
- DOCUMENTATION = '''
10
+ DOCUMENTATION = """
11
11
  ---
12
12
  module: hostname
13
13
  author:
@@ -52,9 +52,9 @@ attributes:
52
52
  support: full
53
53
  platform:
54
54
  platforms: posix
55
- '''
55
+ """
56
56
 
57
- EXAMPLES = '''
57
+ EXAMPLES = """
58
58
  - name: Set a hostname
59
59
  ansible.builtin.hostname:
60
60
  name: web01
@@ -63,14 +63,12 @@ EXAMPLES = '''
63
63
  ansible.builtin.hostname:
64
64
  name: web01
65
65
  use: systemd
66
- '''
66
+ """
67
67
 
68
68
  import os
69
69
  import platform
70
70
  import socket
71
- import traceback
72
-
73
- import ansible.module_utils.compat.typing as t
71
+ import typing as t
74
72
 
75
73
  from ansible.module_utils.basic import (
76
74
  AnsibleModule,
@@ -209,17 +207,14 @@ class FileStrategy(BaseStrategy):
209
207
  return get_file_content(self.FILE, default='', strip=True)
210
208
  except Exception as e:
211
209
  self.module.fail_json(
212
- msg="failed to read hostname: %s" % to_native(e),
213
- exception=traceback.format_exc())
210
+ msg="failed to read hostname: %s" % to_native(e))
214
211
 
215
212
  def set_permanent_hostname(self, name):
216
213
  try:
217
214
  with open(self.FILE, 'w+') as f:
218
215
  f.write("%s\n" % name)
219
216
  except Exception as e:
220
- self.module.fail_json(
221
- msg="failed to update hostname: %s" % to_native(e),
222
- exception=traceback.format_exc())
217
+ self.module.fail_json(msg="failed to update hostname: %s" % to_native(e))
223
218
 
224
219
 
225
220
  class SLESStrategy(FileStrategy):
@@ -249,8 +244,7 @@ class RedHatStrategy(BaseStrategy):
249
244
  )
250
245
  except Exception as e:
251
246
  self.module.fail_json(
252
- msg="failed to read hostname: %s" % to_native(e),
253
- exception=traceback.format_exc())
247
+ msg="failed to read hostname: %s" % to_native(e))
254
248
 
255
249
  def set_permanent_hostname(self, name):
256
250
  try:
@@ -269,9 +263,7 @@ class RedHatStrategy(BaseStrategy):
269
263
  with open(self.NETWORK_FILE, 'w+') as f:
270
264
  f.writelines(lines)
271
265
  except Exception as e:
272
- self.module.fail_json(
273
- msg="failed to update hostname: %s" % to_native(e),
274
- exception=traceback.format_exc())
266
+ self.module.fail_json(msg="failed to update hostname: %s" % to_native(e))
275
267
 
276
268
 
277
269
  class AlpineStrategy(FileStrategy):
@@ -361,9 +353,7 @@ class OpenRCStrategy(BaseStrategy):
361
353
  if line.startswith('hostname='):
362
354
  return line[10:].strip('"')
363
355
  except Exception as e:
364
- self.module.fail_json(
365
- msg="failed to read hostname: %s" % to_native(e),
366
- exception=traceback.format_exc())
356
+ self.module.fail_json(msg="failed to read hostname: %s" % to_native(e))
367
357
 
368
358
  def set_permanent_hostname(self, name):
369
359
  try:
@@ -377,9 +367,7 @@ class OpenRCStrategy(BaseStrategy):
377
367
  with open(self.FILE, 'w') as f:
378
368
  f.write('\n'.join(lines) + '\n')
379
369
  except Exception as e:
380
- self.module.fail_json(
381
- msg="failed to update hostname: %s" % to_native(e),
382
- exception=traceback.format_exc())
370
+ self.module.fail_json(msg="failed to update hostname: %s" % to_native(e))
383
371
 
384
372
 
385
373
  class OpenBSDStrategy(FileStrategy):
@@ -481,9 +469,7 @@ class FreeBSDStrategy(BaseStrategy):
481
469
  if line.startswith('hostname='):
482
470
  return line[10:].strip('"')
483
471
  except Exception as e:
484
- self.module.fail_json(
485
- msg="failed to read hostname: %s" % to_native(e),
486
- exception=traceback.format_exc())
472
+ self.module.fail_json(msg="failed to read hostname: %s" % to_native(e))
487
473
 
488
474
  def set_permanent_hostname(self, name):
489
475
  try:
@@ -500,9 +486,7 @@ class FreeBSDStrategy(BaseStrategy):
500
486
  with open(self.FILE, 'w') as f:
501
487
  f.write('\n'.join(lines) + '\n')
502
488
  except Exception as e:
503
- self.module.fail_json(
504
- msg="failed to update hostname: %s" % to_native(e),
505
- exception=traceback.format_exc())
489
+ self.module.fail_json(msg="failed to update hostname: %s" % to_native(e))
506
490
 
507
491
 
508
492
  class DarwinStrategy(BaseStrategy):