ansible-core 2.18.7rc1__py3-none-any.whl → 2.19.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of ansible-core might be problematic. Click here for more details.

Files changed (757) hide show
  1. ansible/_internal/__init__.py +53 -0
  2. ansible/_internal/_ansiballz/__init__.py +0 -0
  3. ansible/_internal/_ansiballz/_builder.py +101 -0
  4. ansible/_internal/_ansiballz/_wrapper.py +262 -0
  5. ansible/_internal/_collection_proxy.py +47 -0
  6. ansible/_internal/_datatag/__init__.py +0 -0
  7. ansible/_internal/_datatag/_tags.py +130 -0
  8. ansible/_internal/_datatag/_utils.py +19 -0
  9. ansible/_internal/_datatag/_wrappers.py +33 -0
  10. ansible/_internal/_errors/__init__.py +0 -0
  11. ansible/_internal/_errors/_alarm_timeout.py +66 -0
  12. ansible/_internal/_errors/_captured.py +123 -0
  13. ansible/_internal/_errors/_error_factory.py +89 -0
  14. ansible/_internal/_errors/_error_utils.py +240 -0
  15. ansible/_internal/_errors/_handler.py +91 -0
  16. ansible/_internal/_errors/_task_timeout.py +28 -0
  17. ansible/_internal/_event_formatting.py +127 -0
  18. ansible/_internal/_json/__init__.py +214 -0
  19. ansible/_internal/_json/_legacy_encoder.py +34 -0
  20. ansible/_internal/_json/_profiles/__init__.py +0 -0
  21. ansible/_internal/_json/_profiles/_cache_persistence.py +57 -0
  22. ansible/_internal/_json/_profiles/_inventory_legacy.py +40 -0
  23. ansible/_internal/_json/_profiles/_legacy.py +189 -0
  24. ansible/_internal/_locking.py +21 -0
  25. ansible/_internal/_plugins/__init__.py +0 -0
  26. ansible/_internal/_plugins/_cache.py +57 -0
  27. ansible/_internal/_ssh/__init__.py +0 -0
  28. ansible/_internal/_ssh/_agent_launch.py +91 -0
  29. ansible/_internal/_ssh/_ssh_agent.py +619 -0
  30. ansible/_internal/_task.py +78 -0
  31. ansible/_internal/_templating/__init__.py +12 -0
  32. ansible/_internal/_templating/_access.py +86 -0
  33. ansible/_internal/_templating/_chain_templar.py +63 -0
  34. ansible/_internal/_templating/_datatag.py +95 -0
  35. ansible/_internal/_templating/_engine.py +592 -0
  36. ansible/_internal/_templating/_errors.py +28 -0
  37. ansible/_internal/_templating/_jinja_bits.py +1106 -0
  38. ansible/_internal/_templating/_jinja_common.py +323 -0
  39. ansible/_internal/_templating/_jinja_patches.py +44 -0
  40. ansible/_internal/_templating/_jinja_plugins.py +375 -0
  41. ansible/_internal/_templating/_lazy_containers.py +633 -0
  42. ansible/_internal/_templating/_marker_behaviors.py +103 -0
  43. ansible/_internal/_templating/_template_vars.py +72 -0
  44. ansible/_internal/_templating/_transform.py +70 -0
  45. ansible/_internal/_templating/_utils.py +108 -0
  46. ansible/_internal/_testing.py +26 -0
  47. ansible/_internal/_wrapt.py +1052 -0
  48. ansible/_internal/_yaml/__init__.py +0 -0
  49. ansible/_internal/_yaml/_constructor.py +240 -0
  50. ansible/_internal/_yaml/_dumper.py +70 -0
  51. ansible/_internal/_yaml/_errors.py +166 -0
  52. ansible/_internal/_yaml/_loader.py +66 -0
  53. ansible/_internal/ansible_collections/ansible/_protomatter/README.md +11 -0
  54. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/action/debug.py +36 -0
  55. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/apply_trust.py +19 -0
  56. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/dump_object.py +27 -0
  57. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/finalize.py +16 -0
  58. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/origin.py +18 -0
  59. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.py +24 -0
  60. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.yml +33 -0
  61. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/tag_names.py +16 -0
  62. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/true_type.py +17 -0
  63. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/unmask.py +49 -0
  64. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.py +21 -0
  65. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.yml +2 -0
  66. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.py +15 -0
  67. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.yml +19 -0
  68. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.py +18 -0
  69. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.yml +19 -0
  70. ansible/cli/__init__.py +93 -104
  71. ansible/cli/_ssh_askpass.py +54 -0
  72. ansible/cli/adhoc.py +20 -10
  73. ansible/cli/arguments/option_helpers.py +163 -10
  74. ansible/cli/config.py +43 -68
  75. ansible/cli/console.py +13 -11
  76. ansible/cli/doc.py +134 -77
  77. ansible/cli/galaxy.py +27 -20
  78. ansible/cli/inventory.py +28 -28
  79. ansible/cli/playbook.py +4 -12
  80. ansible/cli/pull.py +6 -3
  81. ansible/cli/scripts/ansible_connection_cli_stub.py +7 -7
  82. ansible/cli/vault.py +12 -11
  83. ansible/compat/__init__.py +2 -2
  84. ansible/compat/importlib_resources.py +9 -12
  85. ansible/config/base.yml +218 -133
  86. ansible/config/manager.py +220 -159
  87. ansible/constants.py +2 -65
  88. ansible/errors/__init__.py +350 -256
  89. ansible/executor/interpreter_discovery.py +28 -149
  90. ansible/executor/module_common.py +480 -514
  91. ansible/executor/play_iterator.py +22 -27
  92. ansible/executor/playbook_executor.py +11 -11
  93. ansible/executor/powershell/async_watchdog.ps1 +97 -102
  94. ansible/executor/powershell/async_wrapper.ps1 +204 -153
  95. ansible/executor/powershell/become_wrapper.ps1 +107 -144
  96. ansible/executor/powershell/bootstrap_wrapper.ps1 +46 -9
  97. ansible/executor/powershell/coverage_wrapper.ps1 +91 -135
  98. ansible/executor/powershell/exec_wrapper.ps1 +675 -196
  99. ansible/executor/powershell/module_manifest.py +469 -265
  100. ansible/executor/powershell/module_wrapper.ps1 +195 -186
  101. ansible/executor/powershell/powershell_expand_user.ps1 +20 -0
  102. ansible/executor/powershell/powershell_mkdtemp.ps1 +17 -0
  103. ansible/executor/powershell/psrp_fetch_file.ps1 +41 -0
  104. ansible/executor/powershell/psrp_put_file.ps1 +122 -0
  105. ansible/executor/powershell/winrm_fetch_file.ps1 +46 -0
  106. ansible/executor/powershell/winrm_put_file.ps1 +36 -0
  107. ansible/executor/process/worker.py +139 -149
  108. ansible/executor/stats.py +5 -5
  109. ansible/executor/task_executor.py +270 -297
  110. ansible/executor/task_queue_manager.py +135 -137
  111. ansible/executor/task_result.py +182 -79
  112. ansible/galaxy/__init__.py +2 -2
  113. ansible/galaxy/api.py +26 -25
  114. ansible/galaxy/collection/__init__.py +6 -14
  115. ansible/galaxy/collection/concrete_artifact_manager.py +12 -21
  116. ansible/galaxy/dependency_resolution/dataclasses.py +14 -4
  117. ansible/galaxy/dependency_resolution/providers.py +4 -4
  118. ansible/galaxy/dependency_resolution/reporters.py +81 -0
  119. ansible/galaxy/role.py +6 -10
  120. ansible/galaxy/token.py +28 -21
  121. ansible/inventory/data.py +47 -57
  122. ansible/inventory/group.py +50 -73
  123. ansible/inventory/helpers.py +9 -0
  124. ansible/inventory/host.py +37 -54
  125. ansible/inventory/manager.py +79 -34
  126. ansible/keyword_desc.yml +1 -1
  127. ansible/module_utils/_internal/__init__.py +55 -0
  128. ansible/module_utils/_internal/_ambient_context.py +58 -0
  129. ansible/module_utils/_internal/_ansiballz/__init__.py +0 -0
  130. ansible/module_utils/_internal/_ansiballz/_extensions/__init__.py +0 -0
  131. ansible/module_utils/_internal/_ansiballz/_extensions/_coverage.py +45 -0
  132. ansible/module_utils/_internal/_ansiballz/_extensions/_pydevd.py +62 -0
  133. ansible/module_utils/_internal/_ansiballz/_loader.py +81 -0
  134. ansible/module_utils/_internal/_ansiballz/_respawn.py +32 -0
  135. ansible/module_utils/_internal/_ansiballz/_respawn_wrapper.py +23 -0
  136. ansible/module_utils/_internal/_concurrent/_daemon_threading.py +1 -0
  137. ansible/module_utils/_internal/_dataclass_validation.py +217 -0
  138. ansible/module_utils/_internal/_datatag/__init__.py +961 -0
  139. ansible/module_utils/_internal/_datatag/_tags.py +16 -0
  140. ansible/module_utils/_internal/_debugging.py +31 -0
  141. ansible/module_utils/_internal/_deprecator.py +157 -0
  142. ansible/module_utils/_internal/_errors.py +101 -0
  143. ansible/module_utils/_internal/_event_utils.py +61 -0
  144. ansible/module_utils/_internal/_json/__init__.py +63 -0
  145. ansible/module_utils/_internal/_json/_legacy_encoder.py +26 -0
  146. ansible/module_utils/_internal/_json/_profiles/__init__.py +428 -0
  147. ansible/module_utils/_internal/_json/_profiles/_fallback_to_str.py +73 -0
  148. ansible/module_utils/_internal/_json/_profiles/_module_legacy_c2m.py +33 -0
  149. ansible/module_utils/_internal/_json/_profiles/_module_legacy_m2c.py +37 -0
  150. ansible/module_utils/_internal/_json/_profiles/_module_modern_c2m.py +35 -0
  151. ansible/module_utils/_internal/_json/_profiles/_module_modern_m2c.py +33 -0
  152. ansible/module_utils/_internal/_json/_profiles/_tagless.py +52 -0
  153. ansible/module_utils/_internal/_messages.py +130 -0
  154. ansible/module_utils/_internal/_patches/__init__.py +66 -0
  155. ansible/module_utils/_internal/_patches/_dataclass_annotation_patch.py +53 -0
  156. ansible/module_utils/_internal/_patches/_socket_patch.py +34 -0
  157. ansible/module_utils/_internal/_patches/_sys_intern_patch.py +34 -0
  158. ansible/module_utils/_internal/_plugin_info.py +38 -0
  159. ansible/module_utils/_internal/_stack.py +22 -0
  160. ansible/module_utils/_internal/_testing.py +0 -0
  161. ansible/module_utils/_internal/_text_utils.py +6 -0
  162. ansible/module_utils/_internal/_traceback.py +92 -0
  163. ansible/module_utils/_internal/_validation.py +14 -0
  164. ansible/module_utils/ansible_release.py +2 -2
  165. ansible/module_utils/api.py +1 -2
  166. ansible/module_utils/basic.py +303 -202
  167. ansible/module_utils/common/_utils.py +24 -28
  168. ansible/module_utils/common/arg_spec.py +8 -3
  169. ansible/module_utils/common/collections.py +7 -2
  170. ansible/module_utils/common/dict_transformations.py +2 -2
  171. ansible/module_utils/common/file.py +2 -2
  172. ansible/module_utils/common/json.py +90 -84
  173. ansible/module_utils/common/locale.py +2 -2
  174. ansible/module_utils/common/parameters.py +27 -24
  175. ansible/module_utils/common/process.py +2 -3
  176. ansible/module_utils/common/respawn.py +11 -33
  177. ansible/module_utils/common/sentinel.py +66 -0
  178. ansible/module_utils/common/sys_info.py +8 -8
  179. ansible/module_utils/common/text/converters.py +16 -37
  180. ansible/module_utils/common/validation.py +35 -24
  181. ansible/module_utils/common/warnings.py +143 -25
  182. ansible/module_utils/common/yaml.py +29 -3
  183. ansible/module_utils/compat/datetime.py +33 -21
  184. ansible/module_utils/compat/paramiko.py +21 -10
  185. ansible/module_utils/compat/typing.py +6 -5
  186. ansible/module_utils/connection.py +10 -13
  187. ansible/module_utils/csharp/Ansible.Basic.cs +15 -12
  188. ansible/module_utils/csharp/Ansible.Become.cs +1 -0
  189. ansible/module_utils/csharp/Ansible.Privilege.cs +2 -2
  190. ansible/module_utils/csharp/Ansible._Async.cs +517 -0
  191. ansible/module_utils/datatag.py +49 -0
  192. ansible/module_utils/distro/__init__.py +2 -2
  193. ansible/module_utils/facts/ansible_collector.py +4 -5
  194. ansible/module_utils/facts/collector.py +13 -14
  195. ansible/module_utils/facts/compat.py +4 -4
  196. ansible/module_utils/facts/default_collectors.py +1 -1
  197. ansible/module_utils/facts/hardware/aix.py +34 -0
  198. ansible/module_utils/facts/hardware/base.py +2 -2
  199. ansible/module_utils/facts/hardware/darwin.py +1 -3
  200. ansible/module_utils/facts/hardware/freebsd.py +2 -2
  201. ansible/module_utils/facts/hardware/linux.py +5 -5
  202. ansible/module_utils/facts/namespace.py +1 -1
  203. ansible/module_utils/facts/network/base.py +1 -1
  204. ansible/module_utils/facts/network/fc_wwn.py +1 -2
  205. ansible/module_utils/facts/network/iscsi.py +1 -2
  206. ansible/module_utils/facts/network/nvme.py +1 -2
  207. ansible/module_utils/facts/other/facter.py +2 -3
  208. ansible/module_utils/facts/other/ohai.py +2 -3
  209. ansible/module_utils/facts/sysctl.py +4 -6
  210. ansible/module_utils/facts/system/apparmor.py +1 -2
  211. ansible/module_utils/facts/system/caps.py +3 -3
  212. ansible/module_utils/facts/system/chroot.py +1 -2
  213. ansible/module_utils/facts/system/cmdline.py +1 -2
  214. ansible/module_utils/facts/system/date_time.py +5 -3
  215. ansible/module_utils/facts/system/distribution.py +27 -13
  216. ansible/module_utils/facts/system/dns.py +1 -1
  217. ansible/module_utils/facts/system/env.py +1 -2
  218. ansible/module_utils/facts/system/fips.py +7 -20
  219. ansible/module_utils/facts/system/loadavg.py +1 -2
  220. ansible/module_utils/facts/system/local.py +2 -3
  221. ansible/module_utils/facts/system/lsb.py +1 -2
  222. ansible/module_utils/facts/system/pkg_mgr.py +1 -2
  223. ansible/module_utils/facts/system/platform.py +1 -2
  224. ansible/module_utils/facts/system/python.py +1 -2
  225. ansible/module_utils/facts/system/selinux.py +1 -1
  226. ansible/module_utils/facts/system/service_mgr.py +1 -2
  227. ansible/module_utils/facts/system/ssh_pub_keys.py +1 -1
  228. ansible/module_utils/facts/system/systemd.py +1 -1
  229. ansible/module_utils/facts/system/user.py +1 -2
  230. ansible/module_utils/facts/utils.py +3 -3
  231. ansible/module_utils/facts/virtual/base.py +1 -1
  232. ansible/module_utils/facts/virtual/linux.py +3 -3
  233. ansible/module_utils/facts/virtual/sunos.py +3 -15
  234. ansible/module_utils/facts/virtual/sysctl.py +3 -16
  235. ansible/module_utils/json_utils.py +2 -2
  236. ansible/module_utils/parsing/convert_bool.py +7 -1
  237. ansible/module_utils/powershell/Ansible.ModuleUtils.AddType.psm1 +1 -1
  238. ansible/module_utils/powershell/Ansible.ModuleUtils.CamelConversion.psm1 +1 -1
  239. ansible/module_utils/powershell/Ansible.ModuleUtils.CommandUtil.psm1 +1 -1
  240. ansible/module_utils/powershell/Ansible.ModuleUtils.WebRequest.psm1 +1 -1
  241. ansible/module_utils/service.py +21 -31
  242. ansible/module_utils/splitter.py +7 -7
  243. ansible/module_utils/testing.py +31 -0
  244. ansible/module_utils/urls.py +64 -35
  245. ansible/modules/add_host.py +4 -4
  246. ansible/modules/apt.py +69 -49
  247. ansible/modules/apt_key.py +19 -12
  248. ansible/modules/apt_repository.py +32 -51
  249. ansible/modules/assemble.py +16 -14
  250. ansible/modules/assert.py +4 -4
  251. ansible/modules/async_status.py +24 -24
  252. ansible/modules/async_wrapper.py +20 -25
  253. ansible/modules/blockinfile.py +6 -7
  254. ansible/modules/command.py +13 -20
  255. ansible/modules/copy.py +60 -147
  256. ansible/modules/cron.py +24 -21
  257. ansible/modules/deb822_repository.py +8 -9
  258. ansible/modules/debconf.py +5 -5
  259. ansible/modules/debug.py +4 -4
  260. ansible/modules/dnf.py +8 -8
  261. ansible/modules/dnf5.py +39 -13
  262. ansible/modules/dpkg_selections.py +4 -4
  263. ansible/modules/expect.py +13 -15
  264. ansible/modules/fail.py +4 -4
  265. ansible/modules/fetch.py +4 -4
  266. ansible/modules/file.py +184 -144
  267. ansible/modules/find.py +22 -20
  268. ansible/modules/gather_facts.py +3 -3
  269. ansible/modules/get_url.py +77 -54
  270. ansible/modules/getent.py +7 -9
  271. ansible/modules/git.py +38 -38
  272. ansible/modules/group.py +6 -6
  273. ansible/modules/group_by.py +4 -4
  274. ansible/modules/hostname.py +15 -32
  275. ansible/modules/import_playbook.py +6 -6
  276. ansible/modules/import_role.py +6 -6
  277. ansible/modules/import_tasks.py +6 -6
  278. ansible/modules/include_role.py +6 -6
  279. ansible/modules/include_tasks.py +6 -6
  280. ansible/modules/include_vars.py +6 -6
  281. ansible/modules/iptables.py +86 -73
  282. ansible/modules/known_hosts.py +22 -24
  283. ansible/modules/lineinfile.py +5 -5
  284. ansible/modules/meta.py +4 -4
  285. ansible/modules/mount_facts.py +2 -2
  286. ansible/modules/package.py +10 -4
  287. ansible/modules/package_facts.py +22 -10
  288. ansible/modules/pause.py +6 -6
  289. ansible/modules/ping.py +6 -6
  290. ansible/modules/pip.py +21 -26
  291. ansible/modules/raw.py +6 -6
  292. ansible/modules/reboot.py +6 -6
  293. ansible/modules/replace.py +10 -14
  294. ansible/modules/rpm_key.py +7 -8
  295. ansible/modules/script.py +4 -4
  296. ansible/modules/service.py +10 -17
  297. ansible/modules/service_facts.py +87 -10
  298. ansible/modules/set_fact.py +5 -5
  299. ansible/modules/set_stats.py +4 -4
  300. ansible/modules/setup.py +2 -2
  301. ansible/modules/shell.py +6 -6
  302. ansible/modules/slurp.py +16 -19
  303. ansible/modules/stat.py +15 -31
  304. ansible/modules/subversion.py +15 -15
  305. ansible/modules/systemd.py +7 -7
  306. ansible/modules/systemd_service.py +7 -7
  307. ansible/modules/sysvinit.py +9 -9
  308. ansible/modules/tempfile.py +5 -6
  309. ansible/modules/template.py +6 -6
  310. ansible/modules/unarchive.py +38 -17
  311. ansible/modules/uri.py +33 -26
  312. ansible/modules/user.py +45 -32
  313. ansible/modules/validate_argument_spec.py +10 -7
  314. ansible/modules/wait_for.py +70 -60
  315. ansible/modules/wait_for_connection.py +6 -6
  316. ansible/modules/yum_repository.py +10 -9
  317. ansible/parsing/ajson.py +17 -37
  318. ansible/parsing/dataloader.py +99 -54
  319. ansible/parsing/mod_args.py +62 -60
  320. ansible/parsing/plugin_docs.py +21 -86
  321. ansible/parsing/quoting.py +1 -1
  322. ansible/parsing/splitter.py +27 -12
  323. ansible/parsing/utils/addresses.py +24 -24
  324. ansible/parsing/utils/jsonify.py +5 -1
  325. ansible/parsing/utils/yaml.py +32 -61
  326. ansible/parsing/vault/__init__.py +327 -99
  327. ansible/parsing/yaml/__init__.py +0 -18
  328. ansible/parsing/yaml/dumper.py +6 -120
  329. ansible/parsing/yaml/loader.py +6 -39
  330. ansible/parsing/yaml/objects.py +43 -335
  331. ansible/playbook/__init__.py +1 -1
  332. ansible/playbook/attribute.py +8 -3
  333. ansible/playbook/base.py +187 -134
  334. ansible/playbook/block.py +26 -24
  335. ansible/playbook/collectionsearch.py +1 -15
  336. ansible/playbook/conditional.py +3 -77
  337. ansible/playbook/handler.py +8 -2
  338. ansible/playbook/helpers.py +41 -53
  339. ansible/playbook/included_file.py +32 -26
  340. ansible/playbook/loop_control.py +2 -2
  341. ansible/playbook/play.py +85 -44
  342. ansible/playbook/play_context.py +14 -17
  343. ansible/playbook/playbook_include.py +27 -62
  344. ansible/playbook/role/__init__.py +64 -49
  345. ansible/playbook/role/definition.py +15 -17
  346. ansible/playbook/role/include.py +2 -4
  347. ansible/playbook/role/metadata.py +10 -11
  348. ansible/playbook/role_include.py +3 -3
  349. ansible/playbook/taggable.py +28 -12
  350. ansible/playbook/task.py +192 -121
  351. ansible/playbook/task_include.py +5 -5
  352. ansible/plugins/__init__.py +58 -26
  353. ansible/plugins/action/__init__.py +188 -186
  354. ansible/plugins/action/add_host.py +2 -2
  355. ansible/plugins/action/assemble.py +11 -18
  356. ansible/plugins/action/assert.py +55 -67
  357. ansible/plugins/action/async_status.py +7 -2
  358. ansible/plugins/action/copy.py +14 -17
  359. ansible/plugins/action/debug.py +37 -31
  360. ansible/plugins/action/dnf.py +3 -4
  361. ansible/plugins/action/fail.py +1 -1
  362. ansible/plugins/action/fetch.py +7 -8
  363. ansible/plugins/action/gather_facts.py +13 -14
  364. ansible/plugins/action/group_by.py +1 -1
  365. ansible/plugins/action/include_vars.py +10 -11
  366. ansible/plugins/action/package.py +8 -14
  367. ansible/plugins/action/pause.py +2 -2
  368. ansible/plugins/action/script.py +27 -38
  369. ansible/plugins/action/service.py +9 -18
  370. ansible/plugins/action/set_fact.py +3 -12
  371. ansible/plugins/action/set_stats.py +3 -8
  372. ansible/plugins/action/template.py +47 -67
  373. ansible/plugins/action/unarchive.py +6 -16
  374. ansible/plugins/action/uri.py +9 -20
  375. ansible/plugins/action/validate_argument_spec.py +5 -5
  376. ansible/plugins/action/wait_for_connection.py +1 -1
  377. ansible/plugins/become/__init__.py +31 -8
  378. ansible/plugins/become/runas.py +71 -0
  379. ansible/plugins/become/su.py +13 -8
  380. ansible/plugins/become/sudo.py +19 -0
  381. ansible/plugins/cache/__init__.py +52 -63
  382. ansible/plugins/cache/base.py +8 -0
  383. ansible/plugins/cache/jsonfile.py +10 -16
  384. ansible/plugins/cache/memory.py +6 -12
  385. ansible/plugins/callback/__init__.py +294 -201
  386. ansible/plugins/callback/default.py +99 -95
  387. ansible/plugins/callback/junit.py +44 -43
  388. ansible/plugins/callback/minimal.py +28 -25
  389. ansible/plugins/callback/oneline.py +34 -21
  390. ansible/plugins/callback/tree.py +27 -16
  391. ansible/plugins/connection/__init__.py +47 -34
  392. ansible/plugins/connection/local.py +156 -60
  393. ansible/plugins/connection/paramiko_ssh.py +34 -24
  394. ansible/plugins/connection/psrp.py +76 -165
  395. ansible/plugins/connection/ssh.py +326 -86
  396. ansible/plugins/connection/winrm.py +62 -141
  397. ansible/plugins/doc_fragments/action_common_attributes.py +14 -14
  398. ansible/plugins/doc_fragments/action_core.py +6 -6
  399. ansible/plugins/doc_fragments/backup.py +2 -2
  400. ansible/plugins/doc_fragments/checksum_common.py +27 -0
  401. ansible/plugins/doc_fragments/constructed.py +8 -4
  402. ansible/plugins/doc_fragments/decrypt.py +2 -2
  403. ansible/plugins/doc_fragments/default_callback.py +2 -2
  404. ansible/plugins/doc_fragments/files.py +2 -2
  405. ansible/plugins/doc_fragments/inventory_cache.py +2 -2
  406. ansible/plugins/doc_fragments/result_format_callback.py +2 -2
  407. ansible/plugins/doc_fragments/return_common.py +2 -2
  408. ansible/plugins/doc_fragments/template_common.py +4 -4
  409. ansible/plugins/doc_fragments/url.py +17 -1
  410. ansible/plugins/doc_fragments/url_windows.py +2 -2
  411. ansible/plugins/doc_fragments/validate.py +2 -2
  412. ansible/plugins/doc_fragments/vars_plugin_staging.py +2 -2
  413. ansible/plugins/filter/__init__.py +6 -2
  414. ansible/plugins/filter/b64decode.yml +22 -0
  415. ansible/plugins/filter/b64encode.yml +22 -0
  416. ansible/plugins/filter/bool.yml +11 -4
  417. ansible/plugins/filter/core.py +245 -120
  418. ansible/plugins/filter/encryption.py +42 -34
  419. ansible/plugins/filter/flatten.yml +3 -2
  420. ansible/plugins/filter/human_to_bytes.yml +1 -1
  421. ansible/plugins/filter/mathstuff.py +30 -37
  422. ansible/plugins/filter/password_hash.yml +8 -0
  423. ansible/plugins/filter/pow.yml +1 -1
  424. ansible/plugins/filter/regex_search.yml +1 -4
  425. ansible/plugins/filter/root.yml +1 -1
  426. ansible/plugins/filter/split.yml +1 -1
  427. ansible/plugins/filter/strftime.yml +3 -3
  428. ansible/plugins/filter/to_nice_yaml.yml +0 -4
  429. ansible/plugins/filter/to_uuid.yml +1 -1
  430. ansible/plugins/filter/to_yaml.yml +0 -4
  431. ansible/plugins/filter/unvault.yml +1 -1
  432. ansible/plugins/filter/urls.py +1 -1
  433. ansible/plugins/filter/urlsplit.py +8 -9
  434. ansible/plugins/filter/vault.yml +14 -9
  435. ansible/plugins/filter/win_basename.yml +6 -1
  436. ansible/plugins/filter/win_dirname.yml +5 -0
  437. ansible/plugins/inventory/__init__.py +107 -86
  438. ansible/plugins/inventory/advanced_host_list.py +7 -5
  439. ansible/plugins/inventory/auto.py +11 -4
  440. ansible/plugins/inventory/constructed.py +21 -24
  441. ansible/plugins/inventory/generator.py +16 -11
  442. ansible/plugins/inventory/host_list.py +7 -5
  443. ansible/plugins/inventory/ini.py +78 -44
  444. ansible/plugins/inventory/script.py +190 -120
  445. ansible/plugins/inventory/toml.py +16 -126
  446. ansible/plugins/inventory/yaml.py +10 -8
  447. ansible/plugins/list.py +72 -19
  448. ansible/plugins/loader.py +383 -198
  449. ansible/plugins/lookup/__init__.py +21 -4
  450. ansible/plugins/lookup/config.py +21 -35
  451. ansible/plugins/lookup/csvfile.py +19 -73
  452. ansible/plugins/lookup/dict.py +1 -6
  453. ansible/plugins/lookup/env.py +12 -9
  454. ansible/plugins/lookup/file.py +5 -8
  455. ansible/plugins/lookup/first_found.py +87 -55
  456. ansible/plugins/lookup/indexed_items.py +1 -10
  457. ansible/plugins/lookup/ini.py +14 -13
  458. ansible/plugins/lookup/items.py +1 -1
  459. ansible/plugins/lookup/lines.py +8 -1
  460. ansible/plugins/lookup/list.py +1 -1
  461. ansible/plugins/lookup/nested.py +2 -18
  462. ansible/plugins/lookup/password.py +5 -5
  463. ansible/plugins/lookup/pipe.py +5 -7
  464. ansible/plugins/lookup/sequence.py +18 -8
  465. ansible/plugins/lookup/subelements.py +1 -4
  466. ansible/plugins/lookup/template.py +47 -36
  467. ansible/plugins/lookup/together.py +0 -12
  468. ansible/plugins/lookup/unvault.py +1 -5
  469. ansible/plugins/lookup/url.py +4 -10
  470. ansible/plugins/lookup/vars.py +16 -24
  471. ansible/plugins/shell/__init__.py +58 -4
  472. ansible/plugins/shell/cmd.py +2 -2
  473. ansible/plugins/shell/powershell.py +106 -31
  474. ansible/plugins/shell/sh.py +13 -7
  475. ansible/plugins/strategy/__init__.py +168 -193
  476. ansible/plugins/strategy/debug.py +2 -2
  477. ansible/plugins/strategy/free.py +16 -31
  478. ansible/plugins/strategy/host_pinned.py +2 -2
  479. ansible/plugins/strategy/linear.py +41 -41
  480. ansible/plugins/terminal/__init__.py +4 -4
  481. ansible/plugins/test/__init__.py +7 -2
  482. ansible/plugins/test/core.py +75 -35
  483. ansible/plugins/test/files.py +1 -1
  484. ansible/plugins/test/finished.yml +1 -1
  485. ansible/plugins/test/mathstuff.py +3 -3
  486. ansible/plugins/test/uri.py +5 -8
  487. ansible/plugins/vars/host_group_vars.py +7 -14
  488. ansible/release.py +2 -2
  489. ansible/template/__init__.py +353 -943
  490. ansible/utils/__init__.py +0 -18
  491. ansible/utils/collection_loader/__init__.py +54 -5
  492. ansible/utils/collection_loader/_collection_config.py +5 -6
  493. ansible/utils/collection_loader/_collection_finder.py +82 -96
  494. ansible/utils/collection_loader/_collection_meta.py +15 -8
  495. ansible/utils/display.py +485 -73
  496. ansible/utils/encrypt.py +27 -19
  497. ansible/utils/fqcn.py +2 -2
  498. ansible/utils/galaxy.py +2 -2
  499. ansible/utils/hashing.py +8 -10
  500. ansible/utils/helpers.py +2 -2
  501. ansible/utils/listify.py +10 -8
  502. ansible/utils/lock.py +2 -2
  503. ansible/utils/path.py +10 -12
  504. ansible/utils/plugin_docs.py +16 -14
  505. ansible/utils/py3compat.py +2 -7
  506. ansible/utils/sentinel.py +4 -62
  507. ansible/utils/singleton.py +2 -0
  508. ansible/utils/ssh_functions.py +6 -2
  509. ansible/utils/unsafe_proxy.py +23 -332
  510. ansible/utils/vars.py +55 -8
  511. ansible/utils/version.py +2 -2
  512. ansible/vars/clean.py +5 -5
  513. ansible/vars/hostvars.py +60 -90
  514. ansible/vars/manager.py +220 -285
  515. ansible/vars/plugins.py +4 -4
  516. ansible/vars/reserved.py +13 -12
  517. {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/METADATA +4 -3
  518. ansible_core-2.19.0.dist-info/RECORD +1097 -0
  519. ansible_core-2.19.0.dist-info/licenses/licenses/BSD-3-Clause.txt +28 -0
  520. ansible_test/_data/completion/docker.txt +7 -7
  521. ansible_test/_data/completion/remote.txt +6 -6
  522. ansible_test/_data/completion/windows.txt +1 -0
  523. ansible_test/_data/requirements/ansible.txt +2 -2
  524. ansible_test/_data/requirements/sanity.ansible-doc.txt +3 -3
  525. ansible_test/_data/requirements/sanity.changelog.txt +2 -2
  526. ansible_test/_data/requirements/sanity.import.plugin.txt +2 -2
  527. ansible_test/_data/requirements/sanity.pep8.txt +1 -1
  528. ansible_test/_data/requirements/sanity.pylint.txt +5 -5
  529. ansible_test/_data/requirements/sanity.validate-modules.txt +2 -2
  530. ansible_test/_data/requirements/sanity.yamllint.txt +1 -1
  531. ansible_test/_data/requirements/units.txt +1 -0
  532. ansible_test/_internal/__init__.py +6 -0
  533. ansible_test/_internal/ansible_util.py +3 -1
  534. ansible_test/_internal/become.py +1 -0
  535. ansible_test/_internal/bootstrap.py +1 -0
  536. ansible_test/_internal/cache.py +1 -0
  537. ansible_test/_internal/cgroup.py +1 -0
  538. ansible_test/_internal/ci/__init__.py +1 -0
  539. ansible_test/_internal/ci/azp.py +1 -0
  540. ansible_test/_internal/ci/local.py +1 -0
  541. ansible_test/_internal/classification/__init__.py +1 -0
  542. ansible_test/_internal/classification/common.py +1 -0
  543. ansible_test/_internal/classification/csharp.py +1 -0
  544. ansible_test/_internal/classification/powershell.py +1 -0
  545. ansible_test/_internal/classification/python.py +1 -0
  546. ansible_test/_internal/cli/__init__.py +1 -0
  547. ansible_test/_internal/cli/actions.py +1 -0
  548. ansible_test/_internal/cli/argparsing/__init__.py +1 -0
  549. ansible_test/_internal/cli/argparsing/actions.py +1 -0
  550. ansible_test/_internal/cli/argparsing/argcompletion.py +1 -0
  551. ansible_test/_internal/cli/argparsing/parsers.py +1 -0
  552. ansible_test/_internal/cli/commands/__init__.py +11 -5
  553. ansible_test/_internal/cli/commands/coverage/__init__.py +1 -0
  554. ansible_test/_internal/cli/commands/coverage/analyze/__init__.py +1 -0
  555. ansible_test/_internal/cli/commands/coverage/analyze/targets/__init__.py +1 -0
  556. ansible_test/_internal/cli/commands/coverage/analyze/targets/combine.py +1 -0
  557. ansible_test/_internal/cli/commands/coverage/analyze/targets/expand.py +1 -0
  558. ansible_test/_internal/cli/commands/coverage/analyze/targets/filter.py +1 -0
  559. ansible_test/_internal/cli/commands/coverage/analyze/targets/generate.py +1 -0
  560. ansible_test/_internal/cli/commands/coverage/analyze/targets/missing.py +1 -0
  561. ansible_test/_internal/cli/commands/coverage/combine.py +1 -0
  562. ansible_test/_internal/cli/commands/coverage/erase.py +1 -0
  563. ansible_test/_internal/cli/commands/coverage/html.py +1 -0
  564. ansible_test/_internal/cli/commands/coverage/report.py +1 -0
  565. ansible_test/_internal/cli/commands/coverage/xml.py +1 -0
  566. ansible_test/_internal/cli/commands/env.py +1 -0
  567. ansible_test/_internal/cli/commands/integration/__init__.py +1 -0
  568. ansible_test/_internal/cli/commands/integration/network.py +1 -0
  569. ansible_test/_internal/cli/commands/integration/posix.py +1 -0
  570. ansible_test/_internal/cli/commands/integration/windows.py +1 -0
  571. ansible_test/_internal/cli/commands/sanity.py +9 -0
  572. ansible_test/_internal/cli/commands/shell.py +1 -0
  573. ansible_test/_internal/cli/commands/units.py +1 -0
  574. ansible_test/_internal/cli/compat.py +1 -0
  575. ansible_test/_internal/cli/completers.py +1 -0
  576. ansible_test/_internal/cli/converters.py +1 -0
  577. ansible_test/_internal/cli/environments.py +52 -5
  578. ansible_test/_internal/cli/epilog.py +1 -0
  579. ansible_test/_internal/cli/parsers/__init__.py +1 -0
  580. ansible_test/_internal/cli/parsers/base_argument_parsers.py +1 -0
  581. ansible_test/_internal/cli/parsers/helpers.py +1 -0
  582. ansible_test/_internal/cli/parsers/host_config_parsers.py +1 -0
  583. ansible_test/_internal/cli/parsers/key_value_parsers.py +1 -0
  584. ansible_test/_internal/cli/parsers/value_parsers.py +1 -0
  585. ansible_test/_internal/commands/__init__.py +1 -0
  586. ansible_test/_internal/commands/coverage/__init__.py +3 -2
  587. ansible_test/_internal/commands/coverage/analyze/__init__.py +1 -0
  588. ansible_test/_internal/commands/coverage/analyze/targets/__init__.py +1 -0
  589. ansible_test/_internal/commands/coverage/analyze/targets/combine.py +1 -0
  590. ansible_test/_internal/commands/coverage/analyze/targets/expand.py +1 -0
  591. ansible_test/_internal/commands/coverage/analyze/targets/filter.py +1 -0
  592. ansible_test/_internal/commands/coverage/analyze/targets/generate.py +1 -0
  593. ansible_test/_internal/commands/coverage/analyze/targets/missing.py +1 -0
  594. ansible_test/_internal/commands/coverage/combine.py +2 -1
  595. ansible_test/_internal/commands/coverage/erase.py +1 -0
  596. ansible_test/_internal/commands/coverage/html.py +1 -0
  597. ansible_test/_internal/commands/coverage/report.py +1 -0
  598. ansible_test/_internal/commands/coverage/xml.py +1 -0
  599. ansible_test/_internal/commands/env/__init__.py +2 -0
  600. ansible_test/_internal/commands/integration/__init__.py +22 -5
  601. ansible_test/_internal/commands/integration/cloud/__init__.py +1 -0
  602. ansible_test/_internal/commands/integration/cloud/acme.py +2 -1
  603. ansible_test/_internal/commands/integration/cloud/aws.py +1 -0
  604. ansible_test/_internal/commands/integration/cloud/azure.py +1 -0
  605. ansible_test/_internal/commands/integration/cloud/cs.py +1 -0
  606. ansible_test/_internal/commands/integration/cloud/digitalocean.py +1 -0
  607. ansible_test/_internal/commands/integration/cloud/galaxy.py +3 -2
  608. ansible_test/_internal/commands/integration/cloud/hcloud.py +1 -0
  609. ansible_test/_internal/commands/integration/cloud/httptester.py +3 -2
  610. ansible_test/_internal/commands/integration/cloud/nios.py +2 -1
  611. ansible_test/_internal/commands/integration/cloud/opennebula.py +1 -0
  612. ansible_test/_internal/commands/integration/cloud/openshift.py +1 -0
  613. ansible_test/_internal/commands/integration/cloud/scaleway.py +1 -0
  614. ansible_test/_internal/commands/integration/cloud/vcenter.py +1 -0
  615. ansible_test/_internal/commands/integration/cloud/vultr.py +1 -0
  616. ansible_test/_internal/commands/integration/coverage.py +8 -2
  617. ansible_test/_internal/commands/integration/filters.py +1 -0
  618. ansible_test/_internal/commands/integration/network.py +1 -0
  619. ansible_test/_internal/commands/integration/posix.py +1 -0
  620. ansible_test/_internal/commands/integration/windows.py +1 -0
  621. ansible_test/_internal/commands/sanity/__init__.py +19 -2
  622. ansible_test/_internal/commands/sanity/ansible_doc.py +1 -0
  623. ansible_test/_internal/commands/sanity/bin_symlinks.py +1 -0
  624. ansible_test/_internal/commands/sanity/compile.py +1 -0
  625. ansible_test/_internal/commands/sanity/ignores.py +1 -0
  626. ansible_test/_internal/commands/sanity/import.py +1 -0
  627. ansible_test/_internal/commands/sanity/integration_aliases.py +12 -0
  628. ansible_test/_internal/commands/sanity/pep8.py +1 -0
  629. ansible_test/_internal/commands/sanity/pslint.py +1 -0
  630. ansible_test/_internal/commands/sanity/pylint.py +25 -26
  631. ansible_test/_internal/commands/sanity/shellcheck.py +1 -0
  632. ansible_test/_internal/commands/sanity/validate_modules.py +1 -0
  633. ansible_test/_internal/commands/sanity/yamllint.py +1 -0
  634. ansible_test/_internal/commands/shell/__init__.py +44 -4
  635. ansible_test/_internal/commands/units/__init__.py +5 -1
  636. ansible_test/_internal/compat/__init__.py +1 -0
  637. ansible_test/_internal/compat/packaging.py +1 -0
  638. ansible_test/_internal/compat/yaml.py +1 -0
  639. ansible_test/_internal/completion.py +1 -0
  640. ansible_test/_internal/config.py +23 -13
  641. ansible_test/_internal/connections.py +1 -0
  642. ansible_test/_internal/constants.py +1 -0
  643. ansible_test/_internal/containers.py +1 -0
  644. ansible_test/_internal/content_config.py +1 -0
  645. ansible_test/_internal/core_ci.py +1 -0
  646. ansible_test/_internal/coverage_util.py +11 -10
  647. ansible_test/_internal/data.py +1 -0
  648. ansible_test/_internal/debugging.py +166 -0
  649. ansible_test/_internal/delegation.py +22 -13
  650. ansible_test/_internal/dev/__init__.py +1 -0
  651. ansible_test/_internal/dev/container_probe.py +1 -0
  652. ansible_test/_internal/diff.py +3 -2
  653. ansible_test/_internal/docker_util.py +2 -1
  654. ansible_test/_internal/encoding.py +1 -0
  655. ansible_test/_internal/executor.py +1 -0
  656. ansible_test/_internal/git.py +1 -0
  657. ansible_test/_internal/host_configs.py +1 -0
  658. ansible_test/_internal/host_profiles.py +260 -16
  659. ansible_test/_internal/http.py +1 -0
  660. ansible_test/_internal/init.py +1 -0
  661. ansible_test/_internal/inventory.py +39 -3
  662. ansible_test/_internal/io.py +1 -0
  663. ansible_test/_internal/metadata.py +95 -4
  664. ansible_test/_internal/payload.py +1 -0
  665. ansible_test/_internal/processes.py +80 -0
  666. ansible_test/_internal/provider/__init__.py +1 -0
  667. ansible_test/_internal/provider/layout/__init__.py +1 -0
  668. ansible_test/_internal/provider/layout/ansible.py +1 -0
  669. ansible_test/_internal/provider/layout/collection.py +1 -0
  670. ansible_test/_internal/provider/layout/unsupported.py +1 -0
  671. ansible_test/_internal/provider/source/__init__.py +1 -0
  672. ansible_test/_internal/provider/source/git.py +1 -0
  673. ansible_test/_internal/provider/source/installed.py +1 -0
  674. ansible_test/_internal/provider/source/unsupported.py +1 -0
  675. ansible_test/_internal/provider/source/unversioned.py +1 -0
  676. ansible_test/_internal/provisioning.py +11 -4
  677. ansible_test/_internal/pypi_proxy.py +6 -5
  678. ansible_test/_internal/python_requirements.py +28 -0
  679. ansible_test/_internal/ssh.py +2 -5
  680. ansible_test/_internal/target.py +9 -0
  681. ansible_test/_internal/test.py +3 -2
  682. ansible_test/_internal/thread.py +3 -1
  683. ansible_test/_internal/timeout.py +2 -1
  684. ansible_test/_internal/util.py +41 -12
  685. ansible_test/_internal/util_common.py +18 -5
  686. ansible_test/_internal/venv.py +1 -0
  687. ansible_test/_util/controller/sanity/code-smell/action-plugin-docs.py +1 -0
  688. ansible_test/_util/controller/sanity/code-smell/changelog/sphinx.py +1 -0
  689. ansible_test/_util/controller/sanity/code-smell/changelog.py +1 -0
  690. ansible_test/_util/controller/sanity/code-smell/empty-init.py +1 -0
  691. ansible_test/_util/controller/sanity/code-smell/line-endings.py +1 -0
  692. ansible_test/_util/controller/sanity/code-smell/no-assert.py +1 -0
  693. ansible_test/_util/controller/sanity/code-smell/no-get-exception.py +1 -0
  694. ansible_test/_util/controller/sanity/code-smell/no-illegal-filenames.py +1 -0
  695. ansible_test/_util/controller/sanity/code-smell/no-smart-quotes.py +1 -0
  696. ansible_test/_util/controller/sanity/code-smell/replace-urlopen.py +1 -0
  697. ansible_test/_util/controller/sanity/code-smell/runtime-metadata.py +28 -1
  698. ansible_test/_util/controller/sanity/code-smell/shebang.py +1 -0
  699. ansible_test/_util/controller/sanity/code-smell/symlinks.py +1 -0
  700. ansible_test/_util/controller/sanity/code-smell/use-argspec-type-path.py +1 -0
  701. ansible_test/_util/controller/sanity/code-smell/use-compat-six.py +1 -0
  702. ansible_test/_util/controller/sanity/integration-aliases/yaml_to_json.py +2 -1
  703. ansible_test/_util/controller/sanity/pep8/current-ignore.txt +4 -0
  704. ansible_test/_util/controller/sanity/pylint/config/ansible-test-target.cfg +8 -5
  705. ansible_test/_util/controller/sanity/pylint/config/ansible-test.cfg +8 -5
  706. ansible_test/_util/controller/sanity/pylint/config/code-smell.cfg +8 -5
  707. ansible_test/_util/controller/sanity/pylint/config/collection.cfg +4 -5
  708. ansible_test/_util/controller/sanity/pylint/config/default.cfg +8 -7
  709. ansible_test/_util/controller/sanity/pylint/plugins/deprecated_calls.py +541 -0
  710. ansible_test/_util/controller/sanity/pylint/plugins/deprecated_comment.py +137 -0
  711. ansible_test/_util/controller/sanity/pylint/plugins/hide_unraisable.py +1 -0
  712. ansible_test/_util/controller/sanity/pylint/plugins/string_format.py +1 -8
  713. ansible_test/_util/controller/sanity/pylint/plugins/unwanted.py +1 -8
  714. ansible_test/_util/controller/sanity/validate-modules/validate_modules/main.py +55 -28
  715. ansible_test/_util/controller/sanity/validate-modules/validate_modules/module_args.py +12 -5
  716. ansible_test/_util/controller/sanity/validate-modules/validate_modules/schema.py +13 -2
  717. ansible_test/_util/controller/sanity/validate-modules/validate_modules/utils.py +1 -0
  718. ansible_test/_util/controller/sanity/yamllint/yamllinter.py +35 -17
  719. ansible_test/_util/controller/tools/collection_detail.py +1 -0
  720. ansible_test/_util/controller/tools/yaml_to_json.py +2 -1
  721. ansible_test/_util/target/injector/python.py +8 -0
  722. ansible_test/_util/target/pytest/plugins/ansible_forked.py +6 -1
  723. ansible_test/_util/target/pytest/plugins/ansible_pytest_collections.py +2 -1
  724. ansible_test/_util/target/pytest/plugins/ansible_pytest_coverage.py +1 -0
  725. ansible_test/_util/target/sanity/compile/compile.py +1 -0
  726. ansible_test/_util/target/sanity/import/importer.py +15 -16
  727. ansible_test/_util/target/setup/bootstrap.sh +9 -20
  728. ansible_test/_util/target/setup/probe_cgroups.py +1 -0
  729. ansible_test/_util/target/setup/quiet_pip.py +1 -0
  730. ansible_test/_util/target/setup/requirements.py +38 -36
  731. ansible_test/_util/target/tools/virtualenvcheck.py +2 -1
  732. ansible_test/_util/target/tools/yamlcheck.py +2 -1
  733. ansible/compat/selectors.py +0 -32
  734. ansible/errors/yaml_strings.py +0 -138
  735. ansible/executor/action_write_locks.py +0 -44
  736. ansible/executor/discovery/python_target.py +0 -47
  737. ansible/executor/powershell/module_powershell_wrapper.ps1 +0 -86
  738. ansible/executor/powershell/module_script_wrapper.ps1 +0 -22
  739. ansible/module_utils/compat/importlib.py +0 -26
  740. ansible/module_utils/compat/selectors.py +0 -32
  741. ansible/module_utils/pycompat24.py +0 -73
  742. ansible/parsing/yaml/constructor.py +0 -178
  743. ansible/template/native_helpers.py +0 -251
  744. ansible/template/template.py +0 -43
  745. ansible/template/vars.py +0 -77
  746. ansible/utils/native_jinja.py +0 -11
  747. ansible/vars/fact_cache.py +0 -71
  748. ansible_core-2.18.7rc1.dist-info/RECORD +0 -992
  749. ansible_test/_util/controller/sanity/pylint/plugins/deprecated.py +0 -411
  750. {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/WHEEL +0 -0
  751. {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/entry_points.txt +0 -0
  752. {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/licenses/COPYING +0 -0
  753. {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/Apache-License.txt +0 -0
  754. {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/MIT-license.txt +0 -0
  755. {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/PSF-license.txt +0 -0
  756. {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/simplified_bsd.txt +0 -0
  757. {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/top_level.txt +0 -0
ansible/modules/file.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: file
13
13
  version_added: historical
@@ -123,9 +123,9 @@ attributes:
123
123
  author:
124
124
  - Ansible Core Team
125
125
  - Michael DeHaan
126
- '''
126
+ """
127
127
 
128
- EXAMPLES = r'''
128
+ EXAMPLES = r"""
129
129
  - name: Change file ownership, group and permissions
130
130
  ansible.builtin.file:
131
131
  path: /etc/foo.conf
@@ -214,8 +214,8 @@ EXAMPLES = r'''
214
214
  path: /etc/foo
215
215
  state: absent
216
216
 
217
- '''
218
- RETURN = r'''
217
+ """
218
+ RETURN = r"""
219
219
  dest:
220
220
  description: Destination file/path, equal to the value passed to O(path).
221
221
  returned: O(state=touch), O(state=hard), O(state=link)
@@ -226,12 +226,11 @@ path:
226
226
  returned: O(state=absent), O(state=directory), O(state=file)
227
227
  type: str
228
228
  sample: /path/to/file.txt
229
- '''
229
+ """
230
230
 
231
231
  import errno
232
232
  import os
233
233
  import shutil
234
- import sys
235
234
  import time
236
235
 
237
236
  from pwd import getpwnam, getpwuid
@@ -239,7 +238,7 @@ from grp import getgrnam, getgrgid
239
238
 
240
239
  from ansible.module_utils.basic import AnsibleModule
241
240
  from ansible.module_utils.common.text.converters import to_bytes, to_native
242
-
241
+ from ansible.module_utils.common.sentinel import Sentinel
243
242
 
244
243
  # There will only be a single AnsibleModule object per module
245
244
  module = None
@@ -257,19 +256,6 @@ class ParameterError(AnsibleModuleError):
257
256
  pass
258
257
 
259
258
 
260
- class Sentinel(object):
261
- def __new__(cls, *args, **kwargs):
262
- return cls
263
-
264
-
265
- def _ansible_excepthook(exc_type, exc_value, tb):
266
- # Using an exception allows us to catch it if the calling code knows it can recover
267
- if issubclass(exc_type, AnsibleModuleError):
268
- module.fail_json(**exc_value.results)
269
- else:
270
- sys.__excepthook__(exc_type, exc_value, tb)
271
-
272
-
273
259
  def additional_parameter_handling(params):
274
260
  """Additional parameter validation and reformatting"""
275
261
  # When path is a directory, rewrite the pathname to be the file inside of the directory
@@ -307,17 +293,21 @@ def additional_parameter_handling(params):
307
293
 
308
294
  # make sure the target path is a directory when we're doing a recursive operation
309
295
  if params['recurse'] and params['state'] != 'directory':
310
- raise ParameterError(results={"msg": "recurse option requires state to be 'directory'",
311
- "path": params["path"]})
296
+ module.fail_json(
297
+ msg="recurse option requires state to be 'directory'",
298
+ path=params["path"]
299
+ )
312
300
 
313
301
  # Fail if 'src' but no 'state' is specified
314
302
  if params['src'] and params['state'] not in ('link', 'hard'):
315
- raise ParameterError(results={'msg': "src option requires state to be 'link' or 'hard'",
316
- 'path': params['path']})
303
+ module.fail_json(
304
+ msg="src option requires state to be 'link' or 'hard'",
305
+ path=params['path']
306
+ )
317
307
 
318
308
 
319
309
  def get_state(path):
320
- ''' Find out current state '''
310
+ """ Find out current state """
321
311
 
322
312
  b_path = to_bytes(path, errors='surrogate_or_strict')
323
313
  try:
@@ -333,11 +323,8 @@ def get_state(path):
333
323
  return 'file'
334
324
 
335
325
  return 'absent'
336
- except OSError as e:
337
- if e.errno == errno.ENOENT: # It may already have been removed
338
- return 'absent'
339
- else:
340
- raise
326
+ except FileNotFoundError:
327
+ return 'absent'
341
328
 
342
329
 
343
330
  # This should be moved into the common file utilities
@@ -377,8 +364,8 @@ def recursive_set_attributes(b_path, follow, file_args, mtime, atime):
377
364
  except RuntimeError as e:
378
365
  # on Python3 "RecursionError" is raised which is derived from "RuntimeError"
379
366
  # TODO once this function is moved into the common file utilities, this should probably raise more general exception
380
- raise AnsibleModuleError(
381
- results={'msg': "Could not recursively set attributes on %s. Original error was: '%s'" % (to_native(b_path), to_native(e))}
367
+ module.fail_json(
368
+ msg=f"Could not recursively set attributes on {to_native(b_path)}. Original error was: '{to_native(e)}'"
382
369
  )
383
370
 
384
371
  return changed
@@ -419,17 +406,17 @@ def initial_diff(path, state, prev_state):
419
406
  def get_timestamp_for_time(formatted_time, time_format):
420
407
  if formatted_time == 'preserve':
421
408
  return None
422
- elif formatted_time == 'now':
409
+ if formatted_time == 'now':
423
410
  return Sentinel
424
- else:
425
- try:
426
- struct = time.strptime(formatted_time, time_format)
427
- struct_time = time.mktime(struct)
428
- except (ValueError, OverflowError) as e:
429
- raise AnsibleModuleError(results={'msg': 'Error while obtaining timestamp for time %s using format %s: %s'
430
- % (formatted_time, time_format, to_native(e, nonstring='simplerepr'))})
411
+ try:
412
+ struct = time.strptime(formatted_time, time_format)
413
+ struct_time = time.mktime(struct)
414
+ except (ValueError, OverflowError) as e:
415
+ module.fail_json(
416
+ msg=f"Error while obtaining timestamp for time {formatted_time} using format {time_format}: {to_native(e, nonstring='simplerepr')}",
417
+ )
431
418
 
432
- return struct_time
419
+ return struct_time
433
420
 
434
421
 
435
422
  def update_timestamp_for_file(path, mtime, atime, diff=None):
@@ -486,18 +473,19 @@ def update_timestamp_for_file(path, mtime, atime, diff=None):
486
473
  diff['before']['atime'] = previous_atime
487
474
  diff['after']['atime'] = atime
488
475
  except OSError as e:
489
- raise AnsibleModuleError(results={'msg': 'Error while updating modification or access time: %s'
490
- % to_native(e, nonstring='simplerepr'), 'path': path})
476
+ module.fail_json(
477
+ msg=f"Error while updating modification or access time: {to_native(e, nonstring='simplerepr')}",
478
+ path=path
479
+ )
491
480
  return True
492
481
 
493
482
 
494
483
  def keep_backward_compatibility_on_timestamps(parameter, state):
495
484
  if state in ['file', 'hard', 'directory', 'link'] and parameter is None:
496
485
  return 'preserve'
497
- elif state == 'touch' and parameter is None:
486
+ if state == 'touch' and parameter is None:
498
487
  return 'now'
499
- else:
500
- return parameter
488
+ return parameter
501
489
 
502
490
 
503
491
  def execute_diff_peek(path):
@@ -530,14 +518,20 @@ def ensure_absent(path):
530
518
  try:
531
519
  shutil.rmtree(b_path, ignore_errors=False)
532
520
  except Exception as e:
533
- raise AnsibleModuleError(results={'msg': "rmtree failed: %s" % to_native(e)})
521
+ module.fail_json(
522
+ msg=f"rmtree failed: {to_native(e)}"
523
+ )
534
524
  else:
535
525
  try:
536
526
  os.unlink(b_path)
537
- except OSError as e:
538
- if e.errno != errno.ENOENT: # It may already have been removed
539
- raise AnsibleModuleError(results={'msg': "unlinking failed: %s " % to_native(e),
540
- 'path': path})
527
+ except FileNotFoundError:
528
+ pass
529
+ except OSError as ex:
530
+ module.fail_json(
531
+ msg="Unlinking failed.",
532
+ path=path,
533
+ exception=ex,
534
+ )
541
535
 
542
536
  result.update({'path': path, 'changed': True, 'diff': diff, 'state': 'absent'})
543
537
  else:
@@ -565,10 +559,12 @@ def execute_touch(path, follow, timestamps):
565
559
  try:
566
560
  open(b_path, 'wb').close()
567
561
  changed = True
568
- except (OSError, IOError) as e:
569
- raise AnsibleModuleError(results={'msg': 'Error, could not touch target: %s'
570
- % to_native(e, nonstring='simplerepr'),
571
- 'path': path})
562
+ except OSError as ex:
563
+ module.fail_json(
564
+ msg="Error, could not touch target.",
565
+ path=path,
566
+ exception=ex,
567
+ )
572
568
  # Update the attributes on the file
573
569
  diff = initial_diff(path, 'touch', prev_state)
574
570
  file_args = module.load_file_common_arguments(module.params)
@@ -606,8 +602,11 @@ def ensure_file_attributes(path, follow, timestamps):
606
602
 
607
603
  if prev_state not in ('file', 'hard'):
608
604
  # file is not absent and any other state is a conflict
609
- raise AnsibleModuleError(results={'msg': 'file (%s) is %s, cannot continue' % (path, prev_state),
610
- 'path': path, 'state': prev_state})
605
+ module.fail_json(
606
+ msg=f"file ({path}) is {prev_state}, cannot continue",
607
+ path=path,
608
+ state=prev_state
609
+ )
611
610
 
612
611
  diff = initial_diff(path, 'file', prev_state)
613
612
  changed = module.set_fs_attributes_if_different(file_args, False, diff, expand=False)
@@ -664,15 +663,18 @@ def ensure_directory(path, follow, recurse, timestamps):
664
663
  changed = module.set_fs_attributes_if_different(tmp_file_args, changed, diff, expand=False)
665
664
  changed |= update_timestamp_for_file(file_args['path'], mtime, atime, diff)
666
665
  except Exception as e:
667
- raise AnsibleModuleError(results={'msg': 'There was an issue creating %s as requested:'
668
- ' %s' % (curpath, to_native(e)),
669
- 'path': path})
666
+ module.fail_json(
667
+ msg=f"There was an issue creating {curpath} as requested: {to_native(e)}",
668
+ path=path
669
+ )
670
670
  return {'path': path, 'changed': changed, 'diff': diff}
671
671
 
672
672
  elif prev_state != 'directory':
673
673
  # We already know prev_state is not 'absent', therefore it exists in some form.
674
- raise AnsibleModuleError(results={'msg': '%s already exists as a %s' % (path, prev_state),
675
- 'path': path})
674
+ module.fail_json(
675
+ msg=f"{path} already exists as a {prev_state}",
676
+ path=path
677
+ )
676
678
 
677
679
  #
678
680
  # previous state == directory
@@ -714,31 +716,39 @@ def ensure_symlink(path, src, follow, force, timestamps):
714
716
 
715
717
  b_absrc = to_bytes(absrc, errors='surrogate_or_strict')
716
718
  if not force and src is not None and not os.path.exists(b_absrc):
717
- raise AnsibleModuleError(results={'msg': 'src file does not exist, use "force=yes" if you'
718
- ' really want to create the link: %s' % absrc,
719
- 'path': path, 'src': src})
719
+ module.fail_json(
720
+ msg="src file does not exist, use 'force=yes' if you"
721
+ f" really want to create the link: {absrc}",
722
+ path=path,
723
+ src=src
724
+ )
720
725
 
721
726
  if prev_state == 'directory':
722
727
  if not force:
723
- raise AnsibleModuleError(results={'msg': 'refusing to convert from %s to symlink for %s'
724
- % (prev_state, path),
725
- 'path': path})
728
+ module.fail_json(
729
+ msg=f'refusing to convert from {prev_state} to symlink for {path}',
730
+ path=path
731
+ )
726
732
  elif os.listdir(b_path):
727
733
  # refuse to replace a directory that has files in it
728
- raise AnsibleModuleError(results={'msg': 'the directory %s is not empty, refusing to'
729
- ' convert it' % path,
730
- 'path': path})
734
+ module.fail_json(
735
+ msg=f'the directory {path} is not empty, refusing to convert it',
736
+ path=path
737
+ )
731
738
  elif prev_state in ('file', 'hard') and not force:
732
- raise AnsibleModuleError(results={'msg': 'refusing to convert from %s to symlink for %s'
733
- % (prev_state, path),
734
- 'path': path})
739
+ module.fail_json(
740
+ msg=f'refusing to convert from {prev_state} to symlink for {path}',
741
+ path=path
742
+ )
735
743
 
736
744
  diff = initial_diff(path, 'link', prev_state)
737
745
  changed = False
738
746
 
739
747
  if prev_state in ('hard', 'file', 'directory', 'absent'):
740
748
  if src is None:
741
- raise AnsibleModuleError(results={'msg': 'src is required for creating new symlinks'})
749
+ module.fail_json(
750
+ msg='src is required for creating new symlinks',
751
+ )
742
752
  changed = True
743
753
  elif prev_state == 'link':
744
754
  if src is not None:
@@ -748,7 +758,11 @@ def ensure_symlink(path, src, follow, force, timestamps):
748
758
  diff['after']['src'] = src
749
759
  changed = True
750
760
  else:
751
- raise AnsibleModuleError(results={'msg': 'unexpected position reached', 'dest': path, 'src': src})
761
+ module.fail_json(
762
+ msg='unexpected position reached',
763
+ dest=path,
764
+ src=src
765
+ )
752
766
 
753
767
  if changed and not module.check_mode:
754
768
  if prev_state != 'absent':
@@ -764,16 +778,18 @@ def ensure_symlink(path, src, follow, force, timestamps):
764
778
  except OSError as e:
765
779
  if os.path.exists(b_tmppath):
766
780
  os.unlink(b_tmppath)
767
- raise AnsibleModuleError(results={'msg': 'Error while replacing: %s'
768
- % to_native(e, nonstring='simplerepr'),
769
- 'path': path})
781
+ module.fail_json(
782
+ msg=f"Error while replacing: {to_native(e, nonstring='simplerepr')}",
783
+ path=path
784
+ )
770
785
  else:
771
786
  try:
772
787
  os.symlink(b_src, b_path)
773
788
  except OSError as e:
774
- raise AnsibleModuleError(results={'msg': 'Error while linking: %s'
775
- % to_native(e, nonstring='simplerepr'),
776
- 'path': path})
789
+ module.fail_json(
790
+ msg=f"Error while linking: {to_native(e, nonstring='simplerepr')}",
791
+ path=path
792
+ )
777
793
 
778
794
  if module.check_mode and not os.path.exists(b_path):
779
795
  return {'dest': path, 'src': src, 'changed': changed, 'diff': diff}
@@ -808,12 +824,18 @@ def ensure_hardlink(path, src, follow, force, timestamps):
808
824
  # src is the source of a hardlink. We require it if we are creating a new hardlink.
809
825
  # We require path in the argument_spec so we know it is present at this point.
810
826
  if prev_state != 'hard' and src is None:
811
- raise AnsibleModuleError(results={'msg': 'src is required for creating new hardlinks'})
827
+ module.fail_json(
828
+ msg='src is required for creating new hardlinks'
829
+ )
812
830
 
813
831
  # Even if the link already exists, if src was specified it needs to exist.
814
832
  # The inode number will be compared to ensure the link has the correct target.
815
833
  if src is not None and not os.path.exists(b_src):
816
- raise AnsibleModuleError(results={'msg': 'src does not exist', 'dest': path, 'src': src})
834
+ module.fail_json(
835
+ msg='src does not exist',
836
+ dest=path,
837
+ src=src
838
+ )
817
839
 
818
840
  diff = initial_diff(path, 'hard', prev_state)
819
841
  changed = False
@@ -827,26 +849,39 @@ def ensure_hardlink(path, src, follow, force, timestamps):
827
849
  diff['after']['src'] = src
828
850
  changed = True
829
851
  elif prev_state == 'hard':
830
- if src is not None and not os.stat(b_path).st_ino == os.stat(b_src).st_ino:
852
+ if src is not None and os.stat(b_path).st_ino != os.stat(b_src).st_ino:
831
853
  changed = True
832
854
  if not force:
833
- raise AnsibleModuleError(results={'msg': 'Cannot link, different hard link exists at destination',
834
- 'dest': path, 'src': src})
855
+ module.fail_json(
856
+ msg='Cannot link, different hard link exists at destination',
857
+ dest=path,
858
+ src=src
859
+ )
835
860
  elif prev_state == 'file':
836
861
  changed = True
837
862
  if not force:
838
- raise AnsibleModuleError(results={'msg': 'Cannot link, %s exists at destination' % prev_state,
839
- 'dest': path, 'src': src})
863
+ module.fail_json(
864
+ msg=f'Cannot link, {prev_state} exists at destination',
865
+ dest=path,
866
+ src=src
867
+ )
840
868
  elif prev_state == 'directory':
841
869
  changed = True
842
870
  if os.path.exists(b_path):
843
871
  if os.stat(b_path).st_ino == os.stat(b_src).st_ino:
844
872
  return {'path': path, 'changed': False}
845
873
  elif not force:
846
- raise AnsibleModuleError(results={'msg': 'Cannot link: different hard link exists at destination',
847
- 'dest': path, 'src': src})
874
+ module.fail_json(
875
+ msg='Cannot link: different hard link exists at destination',
876
+ dest=path,
877
+ src=src
878
+ )
848
879
  else:
849
- raise AnsibleModuleError(results={'msg': 'unexpected position reached', 'dest': path, 'src': src})
880
+ module.fail_json(
881
+ msg='unexpected position reached',
882
+ dest=path,
883
+ src=src
884
+ )
850
885
 
851
886
  if changed and not module.check_mode:
852
887
  if prev_state != 'absent':
@@ -859,26 +894,27 @@ def ensure_hardlink(path, src, follow, force, timestamps):
859
894
  if os.path.exists(b_path):
860
895
  try:
861
896
  os.unlink(b_path)
862
- except OSError as e:
863
- if e.errno != errno.ENOENT: # It may already have been removed
864
- raise
897
+ except FileNotFoundError:
898
+ pass
865
899
  os.link(b_src, b_tmppath)
866
900
  os.rename(b_tmppath, b_path)
867
901
  except OSError as e:
868
902
  if os.path.exists(b_tmppath):
869
903
  os.unlink(b_tmppath)
870
- raise AnsibleModuleError(results={'msg': 'Error while replacing: %s'
871
- % to_native(e, nonstring='simplerepr'),
872
- 'path': path})
904
+ module.fail_json(
905
+ msg=f"Error while replacing: {to_native(e, nonstring='simplerepr')}",
906
+ path=path
907
+ )
873
908
  else:
874
909
  try:
875
910
  if follow and os.path.islink(b_src):
876
911
  b_src = os.readlink(b_src)
877
912
  os.link(b_src, b_path)
878
913
  except OSError as e:
879
- raise AnsibleModuleError(results={'msg': 'Error while linking: %s'
880
- % to_native(e, nonstring='simplerepr'),
881
- 'path': path})
914
+ module.fail_json(
915
+ msg=f"Error while linking: {to_native(e, nonstring='simplerepr')}",
916
+ path=path
917
+ )
882
918
 
883
919
  if module.check_mode and not os.path.exists(b_path):
884
920
  return {'dest': path, 'src': src, 'changed': changed, 'diff': diff}
@@ -940,48 +976,52 @@ def main():
940
976
  supports_check_mode=True,
941
977
  )
942
978
 
943
- # When we rewrite basic.py, we will do something similar to this on instantiating an AnsibleModule
944
- sys.excepthook = _ansible_excepthook
945
- additional_parameter_handling(module.params)
946
- params = module.params
947
-
948
- state = params['state']
949
- recurse = params['recurse']
950
- force = params['force']
951
- follow = params['follow']
952
- path = params['path']
953
- src = params['src']
954
-
955
- if module.check_mode and state != 'absent':
956
- file_args = module.load_file_common_arguments(module.params)
957
- if file_args['owner']:
958
- check_owner_exists(module, file_args['owner'])
959
- if file_args['group']:
960
- check_group_exists(module, file_args['group'])
961
-
962
- timestamps = {}
963
- timestamps['modification_time'] = keep_backward_compatibility_on_timestamps(params['modification_time'], state)
964
- timestamps['modification_time_format'] = params['modification_time_format']
965
- timestamps['access_time'] = keep_backward_compatibility_on_timestamps(params['access_time'], state)
966
- timestamps['access_time_format'] = params['access_time_format']
967
-
968
- # short-circuit for diff_peek
969
- if params['_diff_peek'] is not None:
970
- appears_binary = execute_diff_peek(to_bytes(path, errors='surrogate_or_strict'))
971
- module.exit_json(path=path, changed=False, appears_binary=appears_binary)
972
-
973
- if state == 'file':
974
- result = ensure_file_attributes(path, follow, timestamps)
975
- elif state == 'directory':
976
- result = ensure_directory(path, follow, recurse, timestamps)
977
- elif state == 'link':
978
- result = ensure_symlink(path, src, follow, force, timestamps)
979
- elif state == 'hard':
980
- result = ensure_hardlink(path, src, follow, force, timestamps)
981
- elif state == 'touch':
982
- result = execute_touch(path, follow, timestamps)
983
- elif state == 'absent':
984
- result = ensure_absent(path)
979
+ try:
980
+ additional_parameter_handling(module.params)
981
+ params = module.params
982
+
983
+ state = params['state']
984
+ recurse = params['recurse']
985
+ force = params['force']
986
+ follow = params['follow']
987
+ path = params['path']
988
+ src = params['src']
989
+
990
+ if module.check_mode and state != 'absent':
991
+ file_args = module.load_file_common_arguments(module.params)
992
+ if file_args['owner']:
993
+ check_owner_exists(module, file_args['owner'])
994
+ if file_args['group']:
995
+ check_group_exists(module, file_args['group'])
996
+
997
+ timestamps = {}
998
+ timestamps['modification_time'] = keep_backward_compatibility_on_timestamps(params['modification_time'], state)
999
+ timestamps['modification_time_format'] = params['modification_time_format']
1000
+ timestamps['access_time'] = keep_backward_compatibility_on_timestamps(params['access_time'], state)
1001
+ timestamps['access_time_format'] = params['access_time_format']
1002
+
1003
+ # short-circuit for diff_peek
1004
+ if params['_diff_peek'] is not None:
1005
+ appears_binary = execute_diff_peek(to_bytes(path, errors='surrogate_or_strict'))
1006
+ module.exit_json(path=path, changed=False, appears_binary=appears_binary)
1007
+
1008
+ if state == 'file':
1009
+ result = ensure_file_attributes(path, follow, timestamps)
1010
+ elif state == 'directory':
1011
+ result = ensure_directory(path, follow, recurse, timestamps)
1012
+ elif state == 'link':
1013
+ result = ensure_symlink(path, src, follow, force, timestamps)
1014
+ elif state == 'hard':
1015
+ result = ensure_hardlink(path, src, follow, force, timestamps)
1016
+ elif state == 'touch':
1017
+ result = execute_touch(path, follow, timestamps)
1018
+ elif state == 'absent':
1019
+ result = ensure_absent(path)
1020
+ except AnsibleModuleError as ex:
1021
+ module.fail_json(**ex.results)
1022
+
1023
+ if not module._diff:
1024
+ result.pop('diff', None)
985
1025
 
986
1026
  module.exit_json(**result)
987
1027