ansible-core 2.18.4rc1__py3-none-any.whl → 2.19.0b1__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 (709) hide show
  1. ansible/_internal/__init__.py +53 -0
  2. ansible/_internal/_ansiballz.py +265 -0
  3. ansible/_internal/_datatag/__init__.py +0 -0
  4. ansible/_internal/_datatag/_tags.py +130 -0
  5. ansible/_internal/_datatag/_utils.py +19 -0
  6. ansible/_internal/_datatag/_wrappers.py +33 -0
  7. ansible/_internal/_errors/__init__.py +0 -0
  8. ansible/_internal/_errors/_captured.py +128 -0
  9. ansible/_internal/_errors/_handler.py +91 -0
  10. ansible/_internal/_errors/_utils.py +310 -0
  11. ansible/_internal/_json/__init__.py +160 -0
  12. ansible/_internal/_json/_legacy_encoder.py +34 -0
  13. ansible/_internal/_json/_profiles/__init__.py +0 -0
  14. ansible/_internal/_json/_profiles/_cache_persistence.py +55 -0
  15. ansible/_internal/_json/_profiles/_inventory_legacy.py +40 -0
  16. ansible/_internal/_json/_profiles/_legacy.py +198 -0
  17. ansible/_internal/_locking.py +21 -0
  18. ansible/_internal/_plugins/__init__.py +0 -0
  19. ansible/_internal/_plugins/_cache.py +57 -0
  20. ansible/_internal/_task.py +78 -0
  21. ansible/_internal/_templating/__init__.py +10 -0
  22. ansible/_internal/_templating/_access.py +86 -0
  23. ansible/_internal/_templating/_chain_templar.py +63 -0
  24. ansible/_internal/_templating/_datatag.py +95 -0
  25. ansible/_internal/_templating/_engine.py +588 -0
  26. ansible/_internal/_templating/_errors.py +28 -0
  27. ansible/_internal/_templating/_jinja_bits.py +1066 -0
  28. ansible/_internal/_templating/_jinja_common.py +332 -0
  29. ansible/_internal/_templating/_jinja_patches.py +44 -0
  30. ansible/_internal/_templating/_jinja_plugins.py +351 -0
  31. ansible/_internal/_templating/_lazy_containers.py +633 -0
  32. ansible/_internal/_templating/_marker_behaviors.py +103 -0
  33. ansible/_internal/_templating/_transform.py +63 -0
  34. ansible/_internal/_templating/_utils.py +107 -0
  35. ansible/_internal/_wrapt.py +1052 -0
  36. ansible/_internal/_yaml/__init__.py +0 -0
  37. ansible/_internal/_yaml/_constructor.py +240 -0
  38. ansible/_internal/_yaml/_dumper.py +62 -0
  39. ansible/_internal/_yaml/_errors.py +166 -0
  40. ansible/_internal/_yaml/_loader.py +66 -0
  41. ansible/_internal/ansible_collections/ansible/_protomatter/README.md +11 -0
  42. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/action/debug.py +36 -0
  43. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/apply_trust.py +19 -0
  44. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/dump_object.py +18 -0
  45. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/finalize.py +16 -0
  46. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/origin.py +18 -0
  47. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.py +24 -0
  48. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.yml +33 -0
  49. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/tag_names.py +16 -0
  50. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/true_type.py +17 -0
  51. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/unmask.py +49 -0
  52. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.py +21 -0
  53. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.yml +2 -0
  54. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.py +15 -0
  55. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.yml +19 -0
  56. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.py +18 -0
  57. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.yml +19 -0
  58. ansible/cli/__init__.py +153 -89
  59. ansible/cli/_ssh_askpass.py +47 -0
  60. ansible/cli/adhoc.py +14 -7
  61. ansible/cli/arguments/option_helpers.py +154 -7
  62. ansible/cli/config.py +43 -68
  63. ansible/cli/console.py +10 -8
  64. ansible/cli/doc.py +48 -46
  65. ansible/cli/galaxy.py +27 -20
  66. ansible/cli/inventory.py +28 -26
  67. ansible/cli/playbook.py +4 -12
  68. ansible/cli/pull.py +51 -11
  69. ansible/cli/scripts/ansible_connection_cli_stub.py +7 -7
  70. ansible/cli/vault.py +12 -11
  71. ansible/compat/__init__.py +2 -2
  72. ansible/config/base.yml +165 -108
  73. ansible/config/manager.py +52 -49
  74. ansible/constants.py +3 -4
  75. ansible/errors/__init__.py +277 -235
  76. ansible/executor/interpreter_discovery.py +28 -149
  77. ansible/executor/module_common.py +426 -493
  78. ansible/executor/play_iterator.py +22 -27
  79. ansible/executor/playbook_executor.py +11 -11
  80. ansible/executor/powershell/async_watchdog.ps1 +97 -102
  81. ansible/executor/powershell/async_wrapper.ps1 +202 -151
  82. ansible/executor/powershell/become_wrapper.ps1 +89 -144
  83. ansible/executor/powershell/bootstrap_wrapper.ps1 +24 -9
  84. ansible/executor/powershell/coverage_wrapper.ps1 +82 -135
  85. ansible/executor/powershell/exec_wrapper.ps1 +462 -196
  86. ansible/executor/powershell/module_manifest.py +417 -265
  87. ansible/executor/powershell/module_wrapper.ps1 +169 -186
  88. ansible/executor/powershell/psrp_fetch_file.ps1 +41 -0
  89. ansible/executor/powershell/psrp_put_file.ps1 +122 -0
  90. ansible/executor/powershell/winrm_fetch_file.ps1 +46 -0
  91. ansible/executor/powershell/winrm_put_file.ps1 +36 -0
  92. ansible/executor/process/worker.py +136 -76
  93. ansible/executor/stats.py +5 -5
  94. ansible/executor/task_executor.py +237 -236
  95. ansible/executor/task_queue_manager.py +62 -38
  96. ansible/executor/task_result.py +21 -12
  97. ansible/galaxy/__init__.py +2 -2
  98. ansible/galaxy/api.py +22 -18
  99. ansible/galaxy/collection/__init__.py +1 -1
  100. ansible/galaxy/collection/concrete_artifact_manager.py +8 -11
  101. ansible/galaxy/dependency_resolution/dataclasses.py +14 -4
  102. ansible/galaxy/dependency_resolution/providers.py +1 -1
  103. ansible/galaxy/dependency_resolution/reporters.py +81 -0
  104. ansible/galaxy/role.py +4 -8
  105. ansible/galaxy/token.py +28 -21
  106. ansible/inventory/data.py +47 -57
  107. ansible/inventory/group.py +44 -72
  108. ansible/inventory/helpers.py +9 -0
  109. ansible/inventory/host.py +32 -54
  110. ansible/inventory/manager.py +77 -34
  111. ansible/keyword_desc.yml +1 -1
  112. ansible/module_utils/_internal/__init__.py +55 -0
  113. ansible/module_utils/_internal/_ambient_context.py +58 -0
  114. ansible/module_utils/_internal/_ansiballz.py +133 -0
  115. ansible/module_utils/_internal/_concurrent/_daemon_threading.py +1 -0
  116. ansible/module_utils/_internal/_dataclass_annotation_patch.py +64 -0
  117. ansible/module_utils/_internal/_dataclass_validation.py +217 -0
  118. ansible/module_utils/_internal/_datatag/__init__.py +928 -0
  119. ansible/module_utils/_internal/_datatag/_tags.py +38 -0
  120. ansible/module_utils/_internal/_debugging.py +31 -0
  121. ansible/module_utils/_internal/_errors.py +30 -0
  122. ansible/module_utils/_internal/_json/__init__.py +63 -0
  123. ansible/module_utils/_internal/_json/_legacy_encoder.py +26 -0
  124. ansible/module_utils/_internal/_json/_profiles/__init__.py +410 -0
  125. ansible/module_utils/_internal/_json/_profiles/_fallback_to_str.py +73 -0
  126. ansible/module_utils/_internal/_json/_profiles/_module_legacy_c2m.py +31 -0
  127. ansible/module_utils/_internal/_json/_profiles/_module_legacy_m2c.py +35 -0
  128. ansible/module_utils/_internal/_json/_profiles/_module_modern_c2m.py +35 -0
  129. ansible/module_utils/_internal/_json/_profiles/_module_modern_m2c.py +33 -0
  130. ansible/module_utils/_internal/_json/_profiles/_tagless.py +50 -0
  131. ansible/module_utils/_internal/_patches/__init__.py +66 -0
  132. ansible/module_utils/_internal/_patches/_dataclass_annotation_patch.py +55 -0
  133. ansible/module_utils/_internal/_patches/_socket_patch.py +34 -0
  134. ansible/module_utils/_internal/_patches/_sys_intern_patch.py +34 -0
  135. ansible/module_utils/_internal/_plugin_exec_context.py +49 -0
  136. ansible/module_utils/_internal/_testing.py +0 -0
  137. ansible/module_utils/_internal/_traceback.py +89 -0
  138. ansible/module_utils/ansible_release.py +2 -2
  139. ansible/module_utils/api.py +1 -2
  140. ansible/module_utils/basic.py +154 -120
  141. ansible/module_utils/common/_utils.py +24 -28
  142. ansible/module_utils/common/collections.py +1 -2
  143. ansible/module_utils/common/dict_transformations.py +2 -2
  144. ansible/module_utils/common/file.py +2 -2
  145. ansible/module_utils/common/json.py +90 -84
  146. ansible/module_utils/common/locale.py +2 -2
  147. ansible/module_utils/common/messages.py +108 -0
  148. ansible/module_utils/common/parameters.py +27 -24
  149. ansible/module_utils/common/process.py +2 -2
  150. ansible/module_utils/common/respawn.py +41 -19
  151. ansible/module_utils/common/sentinel.py +66 -0
  152. ansible/module_utils/common/sys_info.py +8 -8
  153. ansible/module_utils/common/text/converters.py +16 -37
  154. ansible/module_utils/common/validation.py +35 -24
  155. ansible/module_utils/common/warnings.py +86 -25
  156. ansible/module_utils/common/yaml.py +29 -3
  157. ansible/module_utils/compat/datetime.py +33 -21
  158. ansible/module_utils/compat/paramiko.py +21 -10
  159. ansible/module_utils/compat/typing.py +6 -5
  160. ansible/module_utils/connection.py +2 -2
  161. ansible/module_utils/csharp/Ansible.Basic.cs +14 -11
  162. ansible/module_utils/csharp/Ansible.Become.cs +1 -0
  163. ansible/module_utils/csharp/Ansible._Async.cs +517 -0
  164. ansible/module_utils/datatag.py +46 -0
  165. ansible/module_utils/distro/__init__.py +2 -2
  166. ansible/module_utils/facts/ansible_collector.py +4 -5
  167. ansible/module_utils/facts/collector.py +13 -14
  168. ansible/module_utils/facts/compat.py +4 -4
  169. ansible/module_utils/facts/default_collectors.py +1 -1
  170. ansible/module_utils/facts/hardware/aix.py +34 -0
  171. ansible/module_utils/facts/hardware/base.py +1 -1
  172. ansible/module_utils/facts/hardware/darwin.py +1 -3
  173. ansible/module_utils/facts/hardware/freebsd.py +2 -2
  174. ansible/module_utils/facts/hardware/linux.py +4 -4
  175. ansible/module_utils/facts/namespace.py +1 -1
  176. ansible/module_utils/facts/network/base.py +1 -1
  177. ansible/module_utils/facts/network/fc_wwn.py +1 -2
  178. ansible/module_utils/facts/network/iscsi.py +1 -2
  179. ansible/module_utils/facts/network/nvme.py +1 -2
  180. ansible/module_utils/facts/other/facter.py +1 -2
  181. ansible/module_utils/facts/other/ohai.py +2 -3
  182. ansible/module_utils/facts/system/apparmor.py +1 -2
  183. ansible/module_utils/facts/system/caps.py +1 -1
  184. ansible/module_utils/facts/system/chroot.py +1 -2
  185. ansible/module_utils/facts/system/cmdline.py +1 -2
  186. ansible/module_utils/facts/system/date_time.py +5 -3
  187. ansible/module_utils/facts/system/distribution.py +9 -8
  188. ansible/module_utils/facts/system/dns.py +1 -1
  189. ansible/module_utils/facts/system/env.py +1 -2
  190. ansible/module_utils/facts/system/fips.py +7 -20
  191. ansible/module_utils/facts/system/loadavg.py +1 -2
  192. ansible/module_utils/facts/system/local.py +1 -2
  193. ansible/module_utils/facts/system/lsb.py +1 -2
  194. ansible/module_utils/facts/system/pkg_mgr.py +1 -2
  195. ansible/module_utils/facts/system/platform.py +1 -2
  196. ansible/module_utils/facts/system/python.py +1 -2
  197. ansible/module_utils/facts/system/selinux.py +1 -1
  198. ansible/module_utils/facts/system/service_mgr.py +1 -2
  199. ansible/module_utils/facts/system/ssh_pub_keys.py +1 -1
  200. ansible/module_utils/facts/system/systemd.py +1 -1
  201. ansible/module_utils/facts/system/user.py +1 -2
  202. ansible/module_utils/facts/utils.py +3 -3
  203. ansible/module_utils/facts/virtual/base.py +1 -1
  204. ansible/module_utils/facts/virtual/sunos.py +3 -15
  205. ansible/module_utils/facts/virtual/sysctl.py +3 -16
  206. ansible/module_utils/json_utils.py +2 -2
  207. ansible/module_utils/parsing/convert_bool.py +1 -1
  208. ansible/module_utils/service.py +18 -21
  209. ansible/module_utils/splitter.py +7 -7
  210. ansible/module_utils/testing.py +31 -0
  211. ansible/module_utils/urls.py +60 -31
  212. ansible/modules/add_host.py +4 -4
  213. ansible/modules/apt.py +60 -46
  214. ansible/modules/apt_key.py +19 -12
  215. ansible/modules/apt_repository.py +19 -16
  216. ansible/modules/assemble.py +6 -6
  217. ansible/modules/assert.py +4 -4
  218. ansible/modules/async_status.py +10 -12
  219. ansible/modules/async_wrapper.py +8 -3
  220. ansible/modules/blockinfile.py +6 -7
  221. ansible/modules/command.py +10 -17
  222. ansible/modules/copy.py +57 -144
  223. ansible/modules/cron.py +20 -15
  224. ansible/modules/deb822_repository.py +8 -9
  225. ansible/modules/debconf.py +5 -5
  226. ansible/modules/debug.py +4 -4
  227. ansible/modules/dnf.py +8 -8
  228. ansible/modules/dnf5.py +52 -17
  229. ansible/modules/dpkg_selections.py +4 -4
  230. ansible/modules/expect.py +8 -10
  231. ansible/modules/fail.py +4 -4
  232. ansible/modules/fetch.py +4 -4
  233. ansible/modules/file.py +174 -133
  234. ansible/modules/find.py +20 -18
  235. ansible/modules/gather_facts.py +3 -3
  236. ansible/modules/get_url.py +59 -53
  237. ansible/modules/getent.py +7 -9
  238. ansible/modules/git.py +28 -25
  239. ansible/modules/group.py +6 -6
  240. ansible/modules/group_by.py +4 -4
  241. ansible/modules/hostname.py +13 -29
  242. ansible/modules/import_playbook.py +6 -6
  243. ansible/modules/import_role.py +7 -7
  244. ansible/modules/import_tasks.py +6 -6
  245. ansible/modules/include_role.py +6 -6
  246. ansible/modules/include_tasks.py +6 -6
  247. ansible/modules/include_vars.py +6 -6
  248. ansible/modules/iptables.py +86 -73
  249. ansible/modules/known_hosts.py +10 -10
  250. ansible/modules/lineinfile.py +5 -5
  251. ansible/modules/meta.py +4 -4
  252. ansible/modules/mount_facts.py +2 -2
  253. ansible/modules/package.py +4 -4
  254. ansible/modules/package_facts.py +22 -10
  255. ansible/modules/pause.py +6 -6
  256. ansible/modules/ping.py +6 -6
  257. ansible/modules/pip.py +10 -11
  258. ansible/modules/raw.py +4 -4
  259. ansible/modules/reboot.py +6 -6
  260. ansible/modules/replace.py +9 -13
  261. ansible/modules/rpm_key.py +7 -8
  262. ansible/modules/script.py +4 -4
  263. ansible/modules/service.py +7 -8
  264. ansible/modules/service_facts.py +87 -10
  265. ansible/modules/set_fact.py +5 -5
  266. ansible/modules/set_stats.py +4 -4
  267. ansible/modules/setup.py +2 -2
  268. ansible/modules/shell.py +6 -6
  269. ansible/modules/slurp.py +6 -6
  270. ansible/modules/stat.py +9 -23
  271. ansible/modules/subversion.py +15 -15
  272. ansible/modules/systemd.py +6 -6
  273. ansible/modules/systemd_service.py +6 -6
  274. ansible/modules/sysvinit.py +6 -6
  275. ansible/modules/tempfile.py +5 -6
  276. ansible/modules/template.py +6 -6
  277. ansible/modules/unarchive.py +32 -11
  278. ansible/modules/uri.py +35 -49
  279. ansible/modules/user.py +53 -34
  280. ansible/modules/validate_argument_spec.py +10 -7
  281. ansible/modules/wait_for.py +39 -32
  282. ansible/modules/wait_for_connection.py +6 -6
  283. ansible/modules/yum_repository.py +6 -6
  284. ansible/parsing/ajson.py +14 -32
  285. ansible/parsing/dataloader.py +99 -54
  286. ansible/parsing/mod_args.py +28 -44
  287. ansible/parsing/plugin_docs.py +21 -86
  288. ansible/parsing/quoting.py +1 -1
  289. ansible/parsing/splitter.py +27 -12
  290. ansible/parsing/utils/addresses.py +24 -24
  291. ansible/parsing/utils/yaml.py +32 -61
  292. ansible/parsing/vault/__init__.py +319 -87
  293. ansible/parsing/yaml/__init__.py +0 -18
  294. ansible/parsing/yaml/dumper.py +6 -120
  295. ansible/parsing/yaml/loader.py +6 -39
  296. ansible/parsing/yaml/objects.py +36 -339
  297. ansible/playbook/__init__.py +1 -1
  298. ansible/playbook/attribute.py +8 -3
  299. ansible/playbook/base.py +182 -132
  300. ansible/playbook/block.py +26 -24
  301. ansible/playbook/collectionsearch.py +1 -15
  302. ansible/playbook/conditional.py +3 -77
  303. ansible/playbook/handler.py +8 -2
  304. ansible/playbook/helpers.py +41 -53
  305. ansible/playbook/included_file.py +6 -15
  306. ansible/playbook/loop_control.py +2 -2
  307. ansible/playbook/play.py +85 -44
  308. ansible/playbook/play_context.py +12 -17
  309. ansible/playbook/playbook_include.py +14 -15
  310. ansible/playbook/role/__init__.py +24 -26
  311. ansible/playbook/role/definition.py +15 -17
  312. ansible/playbook/role/include.py +2 -4
  313. ansible/playbook/role/metadata.py +10 -11
  314. ansible/playbook/role_include.py +3 -3
  315. ansible/playbook/taggable.py +13 -8
  316. ansible/playbook/task.py +188 -118
  317. ansible/playbook/task_include.py +5 -5
  318. ansible/plugins/__init__.py +68 -21
  319. ansible/plugins/action/__init__.py +209 -176
  320. ansible/plugins/action/add_host.py +1 -1
  321. ansible/plugins/action/assemble.py +1 -1
  322. ansible/plugins/action/assert.py +54 -66
  323. ansible/plugins/action/copy.py +7 -11
  324. ansible/plugins/action/debug.py +37 -31
  325. ansible/plugins/action/dnf.py +3 -4
  326. ansible/plugins/action/fail.py +1 -1
  327. ansible/plugins/action/fetch.py +4 -5
  328. ansible/plugins/action/gather_facts.py +8 -7
  329. ansible/plugins/action/group_by.py +1 -1
  330. ansible/plugins/action/include_vars.py +10 -11
  331. ansible/plugins/action/package.py +3 -6
  332. ansible/plugins/action/pause.py +2 -2
  333. ansible/plugins/action/script.py +15 -8
  334. ansible/plugins/action/service.py +6 -11
  335. ansible/plugins/action/set_fact.py +3 -12
  336. ansible/plugins/action/set_stats.py +3 -8
  337. ansible/plugins/action/template.py +35 -59
  338. ansible/plugins/action/unarchive.py +1 -1
  339. ansible/plugins/action/validate_argument_spec.py +5 -5
  340. ansible/plugins/action/wait_for_connection.py +1 -1
  341. ansible/plugins/become/__init__.py +31 -8
  342. ansible/plugins/become/runas.py +71 -0
  343. ansible/plugins/become/su.py +13 -8
  344. ansible/plugins/become/sudo.py +19 -0
  345. ansible/plugins/cache/__init__.py +35 -44
  346. ansible/plugins/cache/base.py +8 -0
  347. ansible/plugins/cache/jsonfile.py +10 -16
  348. ansible/plugins/cache/memory.py +6 -12
  349. ansible/plugins/callback/__init__.py +141 -123
  350. ansible/plugins/callback/default.py +30 -23
  351. ansible/plugins/callback/junit.py +28 -24
  352. ansible/plugins/callback/minimal.py +17 -14
  353. ansible/plugins/callback/oneline.py +13 -7
  354. ansible/plugins/callback/tree.py +10 -6
  355. ansible/plugins/connection/__init__.py +47 -34
  356. ansible/plugins/connection/local.py +150 -54
  357. ansible/plugins/connection/paramiko_ssh.py +21 -18
  358. ansible/plugins/connection/psrp.py +76 -165
  359. ansible/plugins/connection/ssh.py +301 -78
  360. ansible/plugins/connection/winrm.py +58 -140
  361. ansible/plugins/doc_fragments/action_common_attributes.py +14 -14
  362. ansible/plugins/doc_fragments/action_core.py +6 -6
  363. ansible/plugins/doc_fragments/backup.py +2 -2
  364. ansible/plugins/doc_fragments/checksum_common.py +27 -0
  365. ansible/plugins/doc_fragments/constructed.py +6 -2
  366. ansible/plugins/doc_fragments/decrypt.py +2 -2
  367. ansible/plugins/doc_fragments/default_callback.py +2 -2
  368. ansible/plugins/doc_fragments/files.py +2 -2
  369. ansible/plugins/doc_fragments/inventory_cache.py +2 -2
  370. ansible/plugins/doc_fragments/result_format_callback.py +2 -2
  371. ansible/plugins/doc_fragments/return_common.py +2 -2
  372. ansible/plugins/doc_fragments/template_common.py +4 -4
  373. ansible/plugins/doc_fragments/url.py +17 -1
  374. ansible/plugins/doc_fragments/url_windows.py +2 -2
  375. ansible/plugins/doc_fragments/validate.py +2 -2
  376. ansible/plugins/doc_fragments/vars_plugin_staging.py +2 -2
  377. ansible/plugins/filter/__init__.py +6 -2
  378. ansible/plugins/filter/b64decode.yml +22 -0
  379. ansible/plugins/filter/b64encode.yml +22 -0
  380. ansible/plugins/filter/bool.yml +11 -4
  381. ansible/plugins/filter/core.py +218 -108
  382. ansible/plugins/filter/encryption.py +32 -32
  383. ansible/plugins/filter/flatten.yml +3 -2
  384. ansible/plugins/filter/human_to_bytes.yml +2 -2
  385. ansible/plugins/filter/mathstuff.py +30 -37
  386. ansible/plugins/filter/password_hash.yml +8 -0
  387. ansible/plugins/filter/regex_search.yml +1 -4
  388. ansible/plugins/filter/split.yml +1 -1
  389. ansible/plugins/filter/to_nice_yaml.yml +0 -4
  390. ansible/plugins/filter/to_yaml.yml +0 -4
  391. ansible/plugins/filter/unvault.yml +1 -1
  392. ansible/plugins/filter/urls.py +1 -1
  393. ansible/plugins/filter/urlsplit.py +8 -9
  394. ansible/plugins/filter/vault.yml +14 -9
  395. ansible/plugins/filter/win_basename.yml +6 -1
  396. ansible/plugins/filter/win_dirname.yml +5 -0
  397. ansible/plugins/inventory/__init__.py +97 -77
  398. ansible/plugins/inventory/advanced_host_list.py +7 -5
  399. ansible/plugins/inventory/auto.py +11 -4
  400. ansible/plugins/inventory/constructed.py +21 -24
  401. ansible/plugins/inventory/generator.py +16 -11
  402. ansible/plugins/inventory/host_list.py +7 -5
  403. ansible/plugins/inventory/ini.py +78 -44
  404. ansible/plugins/inventory/script.py +189 -119
  405. ansible/plugins/inventory/toml.py +16 -126
  406. ansible/plugins/inventory/yaml.py +10 -8
  407. ansible/plugins/list.py +3 -3
  408. ansible/plugins/loader.py +197 -82
  409. ansible/plugins/lookup/__init__.py +21 -4
  410. ansible/plugins/lookup/config.py +21 -35
  411. ansible/plugins/lookup/csvfile.py +3 -2
  412. ansible/plugins/lookup/dict.py +1 -6
  413. ansible/plugins/lookup/env.py +12 -9
  414. ansible/plugins/lookup/file.py +5 -8
  415. ansible/plugins/lookup/first_found.py +86 -55
  416. ansible/plugins/lookup/indexed_items.py +1 -10
  417. ansible/plugins/lookup/ini.py +14 -13
  418. ansible/plugins/lookup/items.py +1 -1
  419. ansible/plugins/lookup/lines.py +8 -1
  420. ansible/plugins/lookup/list.py +1 -1
  421. ansible/plugins/lookup/nested.py +2 -18
  422. ansible/plugins/lookup/password.py +5 -5
  423. ansible/plugins/lookup/pipe.py +5 -7
  424. ansible/plugins/lookup/sequence.py +18 -8
  425. ansible/plugins/lookup/subelements.py +1 -4
  426. ansible/plugins/lookup/template.py +42 -36
  427. ansible/plugins/lookup/together.py +0 -12
  428. ansible/plugins/lookup/unvault.py +1 -5
  429. ansible/plugins/lookup/url.py +2 -8
  430. ansible/plugins/lookup/vars.py +16 -24
  431. ansible/plugins/shell/__init__.py +2 -2
  432. ansible/plugins/shell/cmd.py +2 -2
  433. ansible/plugins/shell/powershell.py +39 -22
  434. ansible/plugins/shell/sh.py +3 -2
  435. ansible/plugins/strategy/__init__.py +94 -113
  436. ansible/plugins/strategy/debug.py +2 -2
  437. ansible/plugins/strategy/free.py +13 -28
  438. ansible/plugins/strategy/host_pinned.py +2 -2
  439. ansible/plugins/strategy/linear.py +31 -33
  440. ansible/plugins/terminal/__init__.py +4 -4
  441. ansible/plugins/test/__init__.py +7 -2
  442. ansible/plugins/test/core.py +54 -20
  443. ansible/plugins/test/files.py +1 -1
  444. ansible/plugins/test/mathstuff.py +3 -3
  445. ansible/plugins/test/uri.py +3 -3
  446. ansible/plugins/vars/host_group_vars.py +7 -14
  447. ansible/release.py +2 -2
  448. ansible/template/__init__.py +368 -944
  449. ansible/utils/__init__.py +0 -18
  450. ansible/utils/_ssh_agent.py +657 -0
  451. ansible/utils/collection_loader/__init__.py +52 -5
  452. ansible/utils/collection_loader/_collection_config.py +5 -6
  453. ansible/utils/collection_loader/_collection_finder.py +79 -93
  454. ansible/utils/collection_loader/_collection_meta.py +13 -8
  455. ansible/utils/display.py +428 -58
  456. ansible/utils/encrypt.py +27 -19
  457. ansible/utils/fqcn.py +2 -2
  458. ansible/utils/hashing.py +2 -2
  459. ansible/utils/helpers.py +2 -2
  460. ansible/utils/listify.py +8 -8
  461. ansible/utils/lock.py +2 -2
  462. ansible/utils/path.py +4 -4
  463. ansible/utils/plugin_docs.py +14 -13
  464. ansible/utils/sentinel.py +4 -62
  465. ansible/utils/singleton.py +2 -0
  466. ansible/utils/ssh_functions.py +1 -1
  467. ansible/utils/unsafe_proxy.py +23 -332
  468. ansible/utils/vars.py +28 -8
  469. ansible/utils/version.py +2 -2
  470. ansible/vars/clean.py +4 -4
  471. ansible/vars/hostvars.py +60 -90
  472. ansible/vars/manager.py +205 -264
  473. ansible/vars/reserved.py +8 -9
  474. ansible_core-2.19.0b1.dist-info/BSD-3-Clause.txt +28 -0
  475. {ansible_core-2.18.4rc1.dist-info → ansible_core-2.19.0b1.dist-info}/METADATA +5 -4
  476. ansible_core-2.19.0b1.dist-info/RECORD +1070 -0
  477. {ansible_core-2.18.4rc1.dist-info → ansible_core-2.19.0b1.dist-info}/WHEEL +1 -1
  478. ansible_test/_data/completion/docker.txt +7 -7
  479. ansible_test/_data/completion/remote.txt +6 -6
  480. ansible_test/_data/completion/windows.txt +1 -0
  481. ansible_test/_data/requirements/ansible.txt +2 -2
  482. ansible_test/_data/requirements/sanity.ansible-doc.txt +3 -3
  483. ansible_test/_data/requirements/sanity.changelog.txt +1 -1
  484. ansible_test/_data/requirements/sanity.import.plugin.txt +2 -2
  485. ansible_test/_data/requirements/sanity.pylint.txt +4 -4
  486. ansible_test/_data/requirements/sanity.validate-modules.txt +2 -2
  487. ansible_test/_data/requirements/sanity.yamllint.txt +1 -1
  488. ansible_test/_data/requirements/units.txt +1 -0
  489. ansible_test/_internal/__init__.py +1 -0
  490. ansible_test/_internal/ansible_util.py +2 -0
  491. ansible_test/_internal/become.py +1 -0
  492. ansible_test/_internal/bootstrap.py +1 -0
  493. ansible_test/_internal/cache.py +1 -0
  494. ansible_test/_internal/cgroup.py +1 -0
  495. ansible_test/_internal/ci/__init__.py +1 -0
  496. ansible_test/_internal/ci/azp.py +1 -0
  497. ansible_test/_internal/ci/local.py +1 -0
  498. ansible_test/_internal/classification/__init__.py +1 -0
  499. ansible_test/_internal/classification/common.py +1 -0
  500. ansible_test/_internal/classification/csharp.py +1 -0
  501. ansible_test/_internal/classification/powershell.py +1 -0
  502. ansible_test/_internal/classification/python.py +1 -0
  503. ansible_test/_internal/cli/__init__.py +1 -0
  504. ansible_test/_internal/cli/actions.py +1 -0
  505. ansible_test/_internal/cli/argparsing/__init__.py +1 -0
  506. ansible_test/_internal/cli/argparsing/actions.py +1 -0
  507. ansible_test/_internal/cli/argparsing/argcompletion.py +1 -0
  508. ansible_test/_internal/cli/argparsing/parsers.py +1 -0
  509. ansible_test/_internal/cli/commands/__init__.py +11 -0
  510. ansible_test/_internal/cli/commands/coverage/__init__.py +1 -0
  511. ansible_test/_internal/cli/commands/coverage/analyze/__init__.py +1 -0
  512. ansible_test/_internal/cli/commands/coverage/analyze/targets/__init__.py +1 -0
  513. ansible_test/_internal/cli/commands/coverage/analyze/targets/combine.py +1 -0
  514. ansible_test/_internal/cli/commands/coverage/analyze/targets/expand.py +1 -0
  515. ansible_test/_internal/cli/commands/coverage/analyze/targets/filter.py +1 -0
  516. ansible_test/_internal/cli/commands/coverage/analyze/targets/generate.py +1 -0
  517. ansible_test/_internal/cli/commands/coverage/analyze/targets/missing.py +1 -0
  518. ansible_test/_internal/cli/commands/coverage/combine.py +1 -0
  519. ansible_test/_internal/cli/commands/coverage/erase.py +1 -0
  520. ansible_test/_internal/cli/commands/coverage/html.py +1 -0
  521. ansible_test/_internal/cli/commands/coverage/report.py +1 -0
  522. ansible_test/_internal/cli/commands/coverage/xml.py +1 -0
  523. ansible_test/_internal/cli/commands/env.py +1 -0
  524. ansible_test/_internal/cli/commands/integration/__init__.py +1 -0
  525. ansible_test/_internal/cli/commands/integration/network.py +1 -0
  526. ansible_test/_internal/cli/commands/integration/posix.py +1 -0
  527. ansible_test/_internal/cli/commands/integration/windows.py +1 -0
  528. ansible_test/_internal/cli/commands/sanity.py +9 -0
  529. ansible_test/_internal/cli/commands/shell.py +1 -0
  530. ansible_test/_internal/cli/commands/units.py +1 -0
  531. ansible_test/_internal/cli/compat.py +1 -0
  532. ansible_test/_internal/cli/completers.py +1 -0
  533. ansible_test/_internal/cli/converters.py +1 -0
  534. ansible_test/_internal/cli/environments.py +1 -0
  535. ansible_test/_internal/cli/epilog.py +1 -0
  536. ansible_test/_internal/cli/parsers/__init__.py +1 -0
  537. ansible_test/_internal/cli/parsers/base_argument_parsers.py +1 -0
  538. ansible_test/_internal/cli/parsers/helpers.py +1 -0
  539. ansible_test/_internal/cli/parsers/host_config_parsers.py +1 -0
  540. ansible_test/_internal/cli/parsers/key_value_parsers.py +1 -0
  541. ansible_test/_internal/cli/parsers/value_parsers.py +1 -0
  542. ansible_test/_internal/commands/__init__.py +1 -0
  543. ansible_test/_internal/commands/coverage/__init__.py +2 -1
  544. ansible_test/_internal/commands/coverage/analyze/__init__.py +1 -0
  545. ansible_test/_internal/commands/coverage/analyze/targets/__init__.py +1 -0
  546. ansible_test/_internal/commands/coverage/analyze/targets/combine.py +1 -0
  547. ansible_test/_internal/commands/coverage/analyze/targets/expand.py +1 -0
  548. ansible_test/_internal/commands/coverage/analyze/targets/filter.py +1 -0
  549. ansible_test/_internal/commands/coverage/analyze/targets/generate.py +1 -0
  550. ansible_test/_internal/commands/coverage/analyze/targets/missing.py +1 -0
  551. ansible_test/_internal/commands/coverage/combine.py +2 -1
  552. ansible_test/_internal/commands/coverage/erase.py +1 -0
  553. ansible_test/_internal/commands/coverage/html.py +1 -0
  554. ansible_test/_internal/commands/coverage/report.py +1 -0
  555. ansible_test/_internal/commands/coverage/xml.py +1 -0
  556. ansible_test/_internal/commands/env/__init__.py +2 -0
  557. ansible_test/_internal/commands/integration/__init__.py +4 -0
  558. ansible_test/_internal/commands/integration/cloud/__init__.py +1 -0
  559. ansible_test/_internal/commands/integration/cloud/acme.py +2 -1
  560. ansible_test/_internal/commands/integration/cloud/aws.py +1 -0
  561. ansible_test/_internal/commands/integration/cloud/azure.py +1 -0
  562. ansible_test/_internal/commands/integration/cloud/cs.py +1 -0
  563. ansible_test/_internal/commands/integration/cloud/digitalocean.py +1 -0
  564. ansible_test/_internal/commands/integration/cloud/galaxy.py +3 -2
  565. ansible_test/_internal/commands/integration/cloud/hcloud.py +1 -0
  566. ansible_test/_internal/commands/integration/cloud/httptester.py +2 -1
  567. ansible_test/_internal/commands/integration/cloud/nios.py +2 -1
  568. ansible_test/_internal/commands/integration/cloud/opennebula.py +1 -0
  569. ansible_test/_internal/commands/integration/cloud/openshift.py +1 -0
  570. ansible_test/_internal/commands/integration/cloud/scaleway.py +1 -0
  571. ansible_test/_internal/commands/integration/cloud/vcenter.py +1 -0
  572. ansible_test/_internal/commands/integration/cloud/vultr.py +1 -0
  573. ansible_test/_internal/commands/integration/coverage.py +1 -0
  574. ansible_test/_internal/commands/integration/filters.py +1 -0
  575. ansible_test/_internal/commands/integration/network.py +1 -0
  576. ansible_test/_internal/commands/integration/posix.py +1 -0
  577. ansible_test/_internal/commands/integration/windows.py +1 -0
  578. ansible_test/_internal/commands/sanity/__init__.py +16 -1
  579. ansible_test/_internal/commands/sanity/ansible_doc.py +1 -0
  580. ansible_test/_internal/commands/sanity/bin_symlinks.py +1 -0
  581. ansible_test/_internal/commands/sanity/compile.py +1 -0
  582. ansible_test/_internal/commands/sanity/ignores.py +1 -0
  583. ansible_test/_internal/commands/sanity/import.py +1 -0
  584. ansible_test/_internal/commands/sanity/integration_aliases.py +1 -0
  585. ansible_test/_internal/commands/sanity/pep8.py +1 -0
  586. ansible_test/_internal/commands/sanity/pslint.py +1 -0
  587. ansible_test/_internal/commands/sanity/pylint.py +24 -26
  588. ansible_test/_internal/commands/sanity/shellcheck.py +1 -0
  589. ansible_test/_internal/commands/sanity/validate_modules.py +1 -0
  590. ansible_test/_internal/commands/sanity/yamllint.py +1 -0
  591. ansible_test/_internal/commands/shell/__init__.py +1 -0
  592. ansible_test/_internal/commands/units/__init__.py +1 -0
  593. ansible_test/_internal/compat/__init__.py +1 -0
  594. ansible_test/_internal/compat/packaging.py +1 -0
  595. ansible_test/_internal/compat/yaml.py +1 -0
  596. ansible_test/_internal/completion.py +1 -0
  597. ansible_test/_internal/config.py +2 -0
  598. ansible_test/_internal/connections.py +1 -0
  599. ansible_test/_internal/constants.py +1 -0
  600. ansible_test/_internal/containers.py +1 -0
  601. ansible_test/_internal/content_config.py +1 -0
  602. ansible_test/_internal/core_ci.py +1 -0
  603. ansible_test/_internal/coverage_util.py +11 -10
  604. ansible_test/_internal/data.py +1 -0
  605. ansible_test/_internal/delegation.py +1 -0
  606. ansible_test/_internal/dev/__init__.py +1 -0
  607. ansible_test/_internal/dev/container_probe.py +1 -0
  608. ansible_test/_internal/diff.py +3 -2
  609. ansible_test/_internal/docker_util.py +2 -1
  610. ansible_test/_internal/encoding.py +1 -0
  611. ansible_test/_internal/executor.py +1 -0
  612. ansible_test/_internal/git.py +1 -0
  613. ansible_test/_internal/host_configs.py +1 -0
  614. ansible_test/_internal/host_profiles.py +1 -0
  615. ansible_test/_internal/http.py +1 -0
  616. ansible_test/_internal/init.py +1 -0
  617. ansible_test/_internal/inventory.py +35 -3
  618. ansible_test/_internal/io.py +1 -0
  619. ansible_test/_internal/metadata.py +1 -0
  620. ansible_test/_internal/payload.py +1 -0
  621. ansible_test/_internal/provider/__init__.py +1 -0
  622. ansible_test/_internal/provider/layout/__init__.py +1 -0
  623. ansible_test/_internal/provider/layout/ansible.py +1 -0
  624. ansible_test/_internal/provider/layout/collection.py +1 -0
  625. ansible_test/_internal/provider/layout/unsupported.py +1 -0
  626. ansible_test/_internal/provider/source/__init__.py +1 -0
  627. ansible_test/_internal/provider/source/git.py +1 -0
  628. ansible_test/_internal/provider/source/installed.py +1 -0
  629. ansible_test/_internal/provider/source/unsupported.py +1 -0
  630. ansible_test/_internal/provider/source/unversioned.py +1 -0
  631. ansible_test/_internal/provisioning.py +1 -0
  632. ansible_test/_internal/pypi_proxy.py +6 -5
  633. ansible_test/_internal/python_requirements.py +1 -0
  634. ansible_test/_internal/ssh.py +1 -0
  635. ansible_test/_internal/target.py +1 -0
  636. ansible_test/_internal/test.py +3 -2
  637. ansible_test/_internal/thread.py +1 -0
  638. ansible_test/_internal/timeout.py +1 -0
  639. ansible_test/_internal/util.py +1 -0
  640. ansible_test/_internal/util_common.py +5 -2
  641. ansible_test/_internal/venv.py +1 -0
  642. ansible_test/_util/controller/sanity/code-smell/action-plugin-docs.py +1 -0
  643. ansible_test/_util/controller/sanity/code-smell/changelog/sphinx.py +1 -0
  644. ansible_test/_util/controller/sanity/code-smell/changelog.py +1 -0
  645. ansible_test/_util/controller/sanity/code-smell/empty-init.py +1 -0
  646. ansible_test/_util/controller/sanity/code-smell/line-endings.py +1 -0
  647. ansible_test/_util/controller/sanity/code-smell/no-assert.py +1 -0
  648. ansible_test/_util/controller/sanity/code-smell/no-get-exception.py +1 -0
  649. ansible_test/_util/controller/sanity/code-smell/no-illegal-filenames.py +1 -0
  650. ansible_test/_util/controller/sanity/code-smell/no-smart-quotes.py +1 -0
  651. ansible_test/_util/controller/sanity/code-smell/replace-urlopen.py +1 -0
  652. ansible_test/_util/controller/sanity/code-smell/runtime-metadata.py +28 -1
  653. ansible_test/_util/controller/sanity/code-smell/shebang.py +1 -0
  654. ansible_test/_util/controller/sanity/code-smell/symlinks.py +1 -0
  655. ansible_test/_util/controller/sanity/code-smell/use-argspec-type-path.py +1 -0
  656. ansible_test/_util/controller/sanity/code-smell/use-compat-six.py +1 -0
  657. ansible_test/_util/controller/sanity/integration-aliases/yaml_to_json.py +2 -1
  658. ansible_test/_util/controller/sanity/pep8/current-ignore.txt +4 -0
  659. ansible_test/_util/controller/sanity/pylint/config/ansible-test-target.cfg +7 -5
  660. ansible_test/_util/controller/sanity/pylint/config/ansible-test.cfg +7 -5
  661. ansible_test/_util/controller/sanity/pylint/config/code-smell.cfg +7 -5
  662. ansible_test/_util/controller/sanity/pylint/config/collection.cfg +3 -5
  663. ansible_test/_util/controller/sanity/pylint/config/default.cfg +7 -7
  664. ansible_test/_util/controller/sanity/pylint/plugins/deprecated.py +1 -13
  665. ansible_test/_util/controller/sanity/pylint/plugins/hide_unraisable.py +1 -0
  666. ansible_test/_util/controller/sanity/pylint/plugins/string_format.py +1 -8
  667. ansible_test/_util/controller/sanity/pylint/plugins/unwanted.py +1 -8
  668. ansible_test/_util/controller/sanity/validate-modules/validate_modules/main.py +55 -28
  669. ansible_test/_util/controller/sanity/validate-modules/validate_modules/module_args.py +12 -5
  670. ansible_test/_util/controller/sanity/validate-modules/validate_modules/schema.py +13 -2
  671. ansible_test/_util/controller/sanity/validate-modules/validate_modules/utils.py +1 -0
  672. ansible_test/_util/controller/sanity/yamllint/yamllinter.py +35 -17
  673. ansible_test/_util/controller/tools/collection_detail.py +1 -0
  674. ansible_test/_util/controller/tools/yaml_to_json.py +2 -1
  675. ansible_test/_util/target/pytest/plugins/ansible_forked.py +6 -1
  676. ansible_test/_util/target/pytest/plugins/ansible_pytest_collections.py +2 -1
  677. ansible_test/_util/target/pytest/plugins/ansible_pytest_coverage.py +1 -0
  678. ansible_test/_util/target/sanity/compile/compile.py +1 -0
  679. ansible_test/_util/target/sanity/import/importer.py +15 -16
  680. ansible_test/_util/target/setup/bootstrap.sh +9 -20
  681. ansible_test/_util/target/setup/probe_cgroups.py +1 -0
  682. ansible_test/_util/target/setup/quiet_pip.py +1 -0
  683. ansible_test/_util/target/setup/requirements.py +35 -27
  684. ansible_test/_util/target/tools/virtualenvcheck.py +2 -1
  685. ansible_test/_util/target/tools/yamlcheck.py +2 -1
  686. ansible/compat/selectors.py +0 -32
  687. ansible/errors/yaml_strings.py +0 -138
  688. ansible/executor/action_write_locks.py +0 -44
  689. ansible/executor/discovery/python_target.py +0 -47
  690. ansible/executor/powershell/module_powershell_wrapper.ps1 +0 -86
  691. ansible/executor/powershell/module_script_wrapper.ps1 +0 -22
  692. ansible/module_utils/compat/importlib.py +0 -26
  693. ansible/module_utils/compat/selectors.py +0 -32
  694. ansible/module_utils/pycompat24.py +0 -73
  695. ansible/parsing/utils/jsonify.py +0 -36
  696. ansible/parsing/yaml/constructor.py +0 -178
  697. ansible/template/native_helpers.py +0 -251
  698. ansible/template/template.py +0 -43
  699. ansible/template/vars.py +0 -77
  700. ansible/utils/native_jinja.py +0 -11
  701. ansible/vars/fact_cache.py +0 -71
  702. ansible_core-2.18.4rc1.dist-info/RECORD +0 -992
  703. {ansible_core-2.18.4rc1.dist-info → ansible_core-2.19.0b1.dist-info}/Apache-License.txt +0 -0
  704. {ansible_core-2.18.4rc1.dist-info → ansible_core-2.19.0b1.dist-info}/COPYING +0 -0
  705. {ansible_core-2.18.4rc1.dist-info → ansible_core-2.19.0b1.dist-info}/MIT-license.txt +0 -0
  706. {ansible_core-2.18.4rc1.dist-info → ansible_core-2.19.0b1.dist-info}/PSF-license.txt +0 -0
  707. {ansible_core-2.18.4rc1.dist-info → ansible_core-2.19.0b1.dist-info}/entry_points.txt +0 -0
  708. {ansible_core-2.18.4rc1.dist-info → ansible_core-2.19.0b1.dist-info}/simplified_bsd.txt +0 -0
  709. {ansible_core-2.18.4rc1.dist-info → ansible_core-2.19.0b1.dist-info}/top_level.txt +0 -0
@@ -117,10 +117,6 @@ DOCUMENTATION = """
117
117
  - kerberos usage mode.
118
118
  - The managed option means Ansible will obtain kerberos ticket.
119
119
  - While the manual one means a ticket must already have been obtained by the user.
120
- - If having issues with Ansible freezing when trying to obtain the
121
- Kerberos ticket, you can either set this to V(manual) and obtain
122
- it outside Ansible or install C(pexpect) through pip and try
123
- again.
124
120
  choices: [managed, manual]
125
121
  vars:
126
122
  - name: ansible_winrm_kinit_mode
@@ -186,6 +182,7 @@ except ImportError:
186
182
  from ansible import constants as C
187
183
  from ansible.errors import AnsibleError, AnsibleConnectionFailure
188
184
  from ansible.errors import AnsibleFileNotFound
185
+ from ansible.executor.powershell.module_manifest import _bootstrap_powershell_script
189
186
  from ansible.module_utils.json_utils import _filter_non_json_lines
190
187
  from ansible.module_utils.parsing.convert_bool import boolean
191
188
  from ansible.module_utils.common.text.converters import to_bytes, to_native, to_text
@@ -223,19 +220,6 @@ except ImportError as e:
223
220
  HAS_XMLTODICT = False
224
221
  XMLTODICT_IMPORT_ERR = e
225
222
 
226
- HAS_PEXPECT = False
227
- try:
228
- import pexpect
229
- # echo was added in pexpect 3.3+ which is newer than the RHEL package
230
- # we can only use pexpect for kerb auth if echo is a valid kwarg
231
- # https://github.com/ansible/ansible/issues/43462
232
- if hasattr(pexpect, 'spawn'):
233
- argspec = getfullargspec(pexpect.spawn.__init__)
234
- if 'echo' in argspec.args:
235
- HAS_PEXPECT = True
236
- except ImportError as e:
237
- pass
238
-
239
223
  # used to try and parse the hostname and detect if IPv6 is being used
240
224
  try:
241
225
  import ipaddress
@@ -247,7 +231,7 @@ display = Display()
247
231
 
248
232
 
249
233
  class Connection(ConnectionBase):
250
- '''WinRM connections over HTTP/HTTPS.'''
234
+ """WinRM connections over HTTP/HTTPS."""
251
235
 
252
236
  transport = 'winrm'
253
237
  module_implementation_preferences = ('.ps1', '.exe', '')
@@ -350,6 +334,7 @@ class Connection(ConnectionBase):
350
334
  def _kerb_auth(self, principal: str, password: str) -> None:
351
335
  if password is None:
352
336
  password = ""
337
+ b_password = to_bytes(password, encoding='utf-8', errors='surrogate_or_strict')
353
338
 
354
339
  self._kerb_ccache = tempfile.NamedTemporaryFile()
355
340
  display.vvvvv("creating Kerberos CC at %s" % self._kerb_ccache.name)
@@ -376,60 +361,28 @@ class Connection(ConnectionBase):
376
361
 
377
362
  kinit_cmdline.append(principal)
378
363
 
379
- # pexpect runs the process in its own pty so it can correctly send
380
- # the password as input even on MacOS which blocks subprocess from
381
- # doing so. Unfortunately it is not available on the built in Python
382
- # so we can only use it if someone has installed it
383
- if HAS_PEXPECT:
384
- proc_mechanism = "pexpect"
385
- command = kinit_cmdline.pop(0)
386
- password = to_text(password, encoding='utf-8',
387
- errors='surrogate_or_strict')
388
-
389
- display.vvvv("calling kinit with pexpect for principal %s"
390
- % principal)
391
- try:
392
- child = pexpect.spawn(command, kinit_cmdline, timeout=60,
393
- env=krb5env, echo=False)
394
- except pexpect.ExceptionPexpect as err:
395
- err_msg = "Kerberos auth failure when calling kinit cmd " \
396
- "'%s': %s" % (command, to_native(err))
397
- raise AnsibleConnectionFailure(err_msg)
398
-
399
- try:
400
- child.expect(".*:")
401
- child.sendline(password)
402
- except OSError as err:
403
- # child exited before the pass was sent, Ansible will raise
404
- # error based on the rc below, just display the error here
405
- display.vvvv("kinit with pexpect raised OSError: %s"
406
- % to_native(err))
407
-
408
- # technically this is the stdout + stderr but to match the
409
- # subprocess error checking behaviour, we will call it stderr
410
- stderr = child.read()
411
- child.wait()
412
- rc = child.exitstatus
413
- else:
414
- proc_mechanism = "subprocess"
415
- b_password = to_bytes(password, encoding='utf-8',
416
- errors='surrogate_or_strict')
364
+ display.vvvv(f"calling kinit for principal {principal}")
417
365
 
418
- display.vvvv("calling kinit with subprocess for principal %s"
419
- % principal)
420
- try:
421
- p = subprocess.Popen(kinit_cmdline, stdin=subprocess.PIPE,
422
- stdout=subprocess.PIPE,
423
- stderr=subprocess.PIPE,
424
- env=krb5env)
366
+ # It is important to use start_new_session which spawns the process
367
+ # with setsid() to avoid it inheriting the current tty. On macOS it
368
+ # will force it to read from stdin rather than the tty.
369
+ try:
370
+ p = subprocess.Popen(
371
+ kinit_cmdline,
372
+ start_new_session=True,
373
+ stdin=subprocess.PIPE,
374
+ stdout=subprocess.PIPE,
375
+ stderr=subprocess.PIPE,
376
+ env=krb5env,
377
+ )
425
378
 
426
- except OSError as err:
427
- err_msg = "Kerberos auth failure when calling kinit cmd " \
428
- "'%s': %s" % (self._kinit_cmd, to_native(err))
429
- raise AnsibleConnectionFailure(err_msg)
379
+ except OSError as err:
380
+ err_msg = "Kerberos auth failure when calling kinit cmd " \
381
+ "'%s': %s" % (self._kinit_cmd, to_native(err))
382
+ raise AnsibleConnectionFailure(err_msg)
430
383
 
431
- stdout, stderr = p.communicate(b_password + b'\n')
432
- rc = p.returncode != 0
384
+ stdout, stderr = p.communicate(b_password + b'\n')
385
+ rc = p.returncode
433
386
 
434
387
  if rc != 0:
435
388
  # one last attempt at making sure the password does not exist
@@ -437,16 +390,15 @@ class Connection(ConnectionBase):
437
390
  exp_msg = to_native(stderr.strip())
438
391
  exp_msg = exp_msg.replace(to_native(password), "<redacted>")
439
392
 
440
- err_msg = "Kerberos auth failure for principal %s with %s: %s" \
441
- % (principal, proc_mechanism, exp_msg)
393
+ err_msg = f"Kerberos auth failure for principal {principal}: {exp_msg}"
442
394
  raise AnsibleConnectionFailure(err_msg)
443
395
 
444
396
  display.vvvvv("kinit succeeded for principal %s" % principal)
445
397
 
446
398
  def _winrm_connect(self) -> winrm.Protocol:
447
- '''
399
+ """
448
400
  Establish a WinRM connection over HTTP/HTTPS.
449
- '''
401
+ """
450
402
  display.vvv("ESTABLISH WINRM CONNECTION FOR USER: %s on PORT %s TO %s" %
451
403
  (self._winrm_user, self._winrm_port, self._winrm_host), host=self._winrm_host)
452
404
 
@@ -627,7 +579,7 @@ class Connection(ConnectionBase):
627
579
  def _winrm_exec(
628
580
  self,
629
581
  command: str,
630
- args: t.Iterable[bytes] = (),
582
+ args: t.Iterable[bytes | str] = (),
631
583
  from_exec: bool = False,
632
584
  stdin_iterator: t.Iterable[tuple[bytes, bool]] = None,
633
585
  ) -> tuple[int, bytes, bytes]:
@@ -652,9 +604,7 @@ class Connection(ConnectionBase):
652
604
  self._winrm_write_stdin(command_id, stdin_iterator)
653
605
 
654
606
  except Exception as ex:
655
- display.warning("ERROR DURING WINRM SEND INPUT - attempting to recover: %s %s"
656
- % (type(ex).__name__, to_text(ex)))
657
- display.debug(traceback.format_exc())
607
+ display.error_as_warning("ERROR DURING WINRM SEND INPUT. Attempting to recover.", ex)
658
608
  stdin_push_failed = True
659
609
 
660
610
  # Even on a failure above we try at least once to get the output
@@ -771,7 +721,13 @@ class Connection(ConnectionBase):
771
721
 
772
722
  def exec_command(self, cmd: str, in_data: bytes | None = None, sudoable: bool = True) -> tuple[int, bytes, bytes]:
773
723
  super(Connection, self).exec_command(cmd, in_data=in_data, sudoable=sudoable)
774
- cmd_parts = self._shell._encode_script(cmd, as_list=True, strict_mode=False, preserve_rc=False)
724
+
725
+ encoded_prefix = self._shell._encode_script('', as_list=False, strict_mode=False, preserve_rc=False)
726
+ if cmd.startswith(encoded_prefix):
727
+ # Avoid double encoding the script
728
+ cmd_parts = cmd.split(" ")
729
+ else:
730
+ cmd_parts = self._shell._encode_script(cmd, as_list=True, strict_mode=False, preserve_rc=False)
775
731
 
776
732
  # TODO: display something meaningful here
777
733
  display.vvv("EXEC (via pipeline wrapper)")
@@ -784,7 +740,15 @@ class Connection(ConnectionBase):
784
740
  return self._winrm_exec(cmd_parts[0], cmd_parts[1:], from_exec=True, stdin_iterator=stdin_iterator)
785
741
 
786
742
  # FUTURE: determine buffer size at runtime via remote winrm config?
787
- def _put_file_stdin_iterator(self, in_path: str, out_path: str, buffer_size: int = 250000) -> t.Iterable[tuple[bytes, bool]]:
743
+ def _put_file_stdin_iterator(
744
+ self,
745
+ initial_stdin: bytes,
746
+ in_path: str,
747
+ out_path: str,
748
+ buffer_size: int = 250000,
749
+ ) -> t.Iterable[tuple[bytes, bool]]:
750
+ yield initial_stdin, False
751
+
788
752
  in_size = os.path.getsize(to_bytes(in_path, errors='surrogate_or_strict'))
789
753
  offset = 0
790
754
  with open(to_bytes(in_path, errors='surrogate_or_strict'), 'rb') as in_file:
@@ -806,40 +770,16 @@ class Connection(ConnectionBase):
806
770
  if not os.path.exists(to_bytes(in_path, errors='surrogate_or_strict')):
807
771
  raise AnsibleFileNotFound('file or module does not exist: "%s"' % to_native(in_path))
808
772
 
809
- script_template = u'''
810
- begin {{
811
- $path = '{0}'
812
-
813
- $DebugPreference = "Continue"
814
- $ErrorActionPreference = "Stop"
815
- Set-StrictMode -Version 2
816
-
817
- $fd = [System.IO.File]::Create($path)
818
-
819
- $sha1 = [System.Security.Cryptography.SHA1CryptoServiceProvider]::Create()
820
-
821
- $bytes = @() #initialize for empty file case
822
- }}
823
- process {{
824
- $bytes = [System.Convert]::FromBase64String($input)
825
- $sha1.TransformBlock($bytes, 0, $bytes.Length, $bytes, 0) | Out-Null
826
- $fd.Write($bytes, 0, $bytes.Length)
827
- }}
828
- end {{
829
- $sha1.TransformFinalBlock($bytes, 0, 0) | Out-Null
830
-
831
- $hash = [System.BitConverter]::ToString($sha1.Hash).Replace("-", "").ToLowerInvariant()
832
-
833
- $fd.Close()
834
-
835
- Write-Output "{{""sha1"":""$hash""}}"
836
- }}
837
- '''
838
-
839
- script = script_template.format(self._shell._escape(out_path))
840
- cmd_parts = self._shell._encode_script(script, as_list=True, strict_mode=False, preserve_rc=False)
773
+ copy_script, copy_script_stdin = _bootstrap_powershell_script('winrm_put_file.ps1', {
774
+ 'Path': out_path,
775
+ }, has_input=True)
776
+ cmd_parts = self._shell._encode_script(copy_script, as_list=True, strict_mode=False, preserve_rc=False)
841
777
 
842
- status_code, b_stdout, b_stderr = self._winrm_exec(cmd_parts[0], cmd_parts[1:], stdin_iterator=self._put_file_stdin_iterator(in_path, out_path))
778
+ status_code, b_stdout, b_stderr = self._winrm_exec(
779
+ cmd_parts[0],
780
+ cmd_parts[1:],
781
+ stdin_iterator=self._put_file_stdin_iterator(copy_script_stdin, in_path, out_path),
782
+ )
843
783
  stdout = to_text(b_stdout)
844
784
  stderr = to_text(b_stderr)
845
785
 
@@ -873,36 +813,14 @@ class Connection(ConnectionBase):
873
813
  offset = 0
874
814
  while True:
875
815
  try:
876
- script = '''
877
- $path = '%(path)s'
878
- If (Test-Path -LiteralPath $path -PathType Leaf)
879
- {
880
- $buffer_size = %(buffer_size)d
881
- $offset = %(offset)d
882
-
883
- $stream = New-Object -TypeName IO.FileStream($path, [IO.FileMode]::Open, [IO.FileAccess]::Read, [IO.FileShare]::ReadWrite)
884
- $stream.Seek($offset, [System.IO.SeekOrigin]::Begin) > $null
885
- $buffer = New-Object -TypeName byte[] $buffer_size
886
- $bytes_read = $stream.Read($buffer, 0, $buffer_size)
887
- if ($bytes_read -gt 0) {
888
- $bytes = $buffer[0..($bytes_read - 1)]
889
- [System.Convert]::ToBase64String($bytes)
890
- }
891
- $stream.Close() > $null
892
- }
893
- ElseIf (Test-Path -LiteralPath $path -PathType Container)
894
- {
895
- Write-Host "[DIR]";
896
- }
897
- Else
898
- {
899
- Write-Error "$path does not exist";
900
- Exit 1;
901
- }
902
- ''' % dict(buffer_size=buffer_size, path=self._shell._escape(in_path), offset=offset)
816
+ script, in_data = _bootstrap_powershell_script('winrm_fetch_file.ps1', {
817
+ 'Path': in_path,
818
+ 'BufferSize': buffer_size,
819
+ 'Offset': offset,
820
+ })
903
821
  display.vvvvv('WINRM FETCH "%s" to "%s" (offset=%d)' % (in_path, out_path, offset), host=self._winrm_host)
904
822
  cmd_parts = self._shell._encode_script(script, as_list=True, preserve_rc=False)
905
- status_code, b_stdout, b_stderr = self._winrm_exec(cmd_parts[0], cmd_parts[1:])
823
+ status_code, b_stdout, b_stderr = self._winrm_exec(cmd_parts[0], cmd_parts[1:], stdin_iterator=self._wrapper_payload_stream(in_data))
906
824
  stdout = to_text(b_stdout)
907
825
  stderr = to_text(b_stderr)
908
826
 
@@ -7,7 +7,7 @@ from __future__ import annotations
7
7
  class ModuleDocFragment(object):
8
8
 
9
9
  # Standard documentation fragment
10
- DOCUMENTATION = r'''
10
+ DOCUMENTATION = r"""
11
11
  attributes:
12
12
  check_mode:
13
13
  description: Can run in check_mode and return changed status prediction without modifying target, if not supported the action will be skipped.
@@ -16,17 +16,17 @@ attributes:
16
16
  platform:
17
17
  description: Target OS/families that can be operated against
18
18
  support: N/A
19
- '''
19
+ """
20
20
 
21
- ACTIONGROUPS = r'''
21
+ ACTIONGROUPS = r"""
22
22
  attributes:
23
23
  action_group:
24
24
  description: Action is part of action_group(s), for convenient setting of module_defaults.
25
25
  support: N/A
26
26
  membership: []
27
- '''
27
+ """
28
28
 
29
- CONN = r'''
29
+ CONN = r"""
30
30
  attributes:
31
31
  become:
32
32
  description: Is usable alongside become keywords
@@ -34,23 +34,23 @@ attributes:
34
34
  description: Uses the target's configured connection information to execute code on it
35
35
  delegation:
36
36
  description: Can be used in conjunction with delegate_to and related keywords
37
- '''
37
+ """
38
38
 
39
- FACTS = r'''
39
+ FACTS = r"""
40
40
  attributes:
41
41
  facts:
42
42
  description: Action returns an C(ansible_facts) dictionary that will update existing host facts
43
- '''
43
+ """
44
44
 
45
- FILES = r'''
45
+ FILES = r"""
46
46
  attributes:
47
47
  safe_file_operations:
48
48
  description: Uses Ansible's strict file operation functions to ensure proper permissions and avoid data corruption
49
49
  vault:
50
50
  description: Can automatically decrypt Ansible vaulted files
51
- '''
51
+ """
52
52
 
53
- FLOW = r'''
53
+ FLOW = r"""
54
54
  attributes:
55
55
  action:
56
56
  description: Indicates this has a corresponding action plugin so some parts of the options can be executed on the controller
@@ -62,9 +62,9 @@ attributes:
62
62
  throttle and other loop considerations
63
63
  - Conditionals will work as if C(run_once) is being used, variables used will be from the first available host
64
64
  - This action will not work normally outside of lockstep strategies
65
- '''
66
- RAW = r'''
65
+ """
66
+ RAW = r"""
67
67
  attributes:
68
68
  raw:
69
69
  description: Indicates if an action takes a 'raw' or 'free form' string as an option and has it's own special parsing of it
70
- '''
70
+ """
@@ -8,7 +8,7 @@ from __future__ import annotations
8
8
  class ModuleDocFragment(object):
9
9
 
10
10
  # requires action_common
11
- DOCUMENTATION = r'''
11
+ DOCUMENTATION = r"""
12
12
  attributes:
13
13
  async:
14
14
  support: none
@@ -33,10 +33,10 @@ attributes:
33
33
  tags:
34
34
  description: Allows for the 'tags' keyword to control the selection of this action for execution
35
35
  support: full
36
- '''
36
+ """
37
37
 
38
38
  # also requires core above
39
- IMPORT = r'''
39
+ IMPORT = r"""
40
40
  attributes:
41
41
  action:
42
42
  details: While this action executes locally on the controller it is not governed by an action plugin
@@ -59,9 +59,9 @@ attributes:
59
59
  support: none
60
60
  until:
61
61
  support: none
62
- '''
62
+ """
63
63
  # also requires core above
64
- INCLUDE = r'''
64
+ INCLUDE = r"""
65
65
  attributes:
66
66
  action:
67
67
  details: While this action executes locally on the controller it is not governed by an action plugin
@@ -76,4 +76,4 @@ attributes:
76
76
  tags:
77
77
  details: Tags are interpreted by this action but are not automatically inherited by the include tasks, see C(apply)
78
78
  support: partial
79
- '''
79
+ """
@@ -8,7 +8,7 @@ from __future__ import annotations
8
8
  class ModuleDocFragment(object):
9
9
 
10
10
  # Standard documentation fragment
11
- DOCUMENTATION = r'''
11
+ DOCUMENTATION = r"""
12
12
  options:
13
13
  backup:
14
14
  description:
@@ -16,4 +16,4 @@ options:
16
16
  the original file back if you somehow clobbered it incorrectly.
17
17
  type: bool
18
18
  default: no
19
- '''
19
+ """
@@ -0,0 +1,27 @@
1
+ # Copyright (c) 2024 ShIRann Chen <shirannx@gmail.com>
2
+ # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
3
+ from __future__ import annotations
4
+
5
+
6
+ class ModuleDocFragment(object):
7
+
8
+ DOCUMENTATION = r"""
9
+ options:
10
+ checksum_algorithm:
11
+ description:
12
+ - Algorithm to determine checksum of file.
13
+ - Will throw an error if the host is unable to use specified algorithm.
14
+ - The remote host has to support the hashing method specified, V(md5)
15
+ can be unavailable if the host is FIPS-140 compliant.
16
+ - Availability might be restricted by the target system, for example FIPS systems won't allow md5 use
17
+ type: str
18
+ choices: [ md5, sha1, sha224, sha256, sha384, sha512 ]
19
+ default: sha1
20
+ aliases: [ checksum, checksum_algo ]
21
+ version_added: "2.0"
22
+ get_checksum:
23
+ description:
24
+ - Whether to return a checksum of the file.
25
+ type: bool
26
+ default: yes
27
+ """
@@ -7,7 +7,7 @@ from __future__ import annotations
7
7
 
8
8
  class ModuleDocFragment(object):
9
9
 
10
- DOCUMENTATION = r'''
10
+ DOCUMENTATION = r"""
11
11
  options:
12
12
  strict:
13
13
  description:
@@ -79,4 +79,8 @@ options:
79
79
  type: boolean
80
80
  default: True
81
81
  version_added: '2.11'
82
- '''
82
+ notes:
83
+ - Inventories are not finalized at this stage, so the auto populated C(all) and C(ungrouped) groups will
84
+ only reflect what previous inventory sources explicitly added to them.
85
+ - Runtime 'magic variables' are not available during inventory construction. For example, C(groups) and C(hostvars) do not exist yet.
86
+ """
@@ -8,7 +8,7 @@ from __future__ import annotations
8
8
  class ModuleDocFragment(object):
9
9
 
10
10
  # Standard files documentation fragment
11
- DOCUMENTATION = r'''
11
+ DOCUMENTATION = r"""
12
12
  options:
13
13
  decrypt:
14
14
  description:
@@ -16,4 +16,4 @@ options:
16
16
  type: bool
17
17
  default: yes
18
18
  version_added: '2.4'
19
- '''
19
+ """
@@ -7,7 +7,7 @@ from __future__ import annotations
7
7
 
8
8
  class ModuleDocFragment(object):
9
9
 
10
- DOCUMENTATION = r'''
10
+ DOCUMENTATION = r"""
11
11
  options:
12
12
  display_skipped_hosts:
13
13
  name: Show skipped hosts
@@ -89,4 +89,4 @@ class ModuleDocFragment(object):
89
89
  - key: show_task_path_on_failure
90
90
  section: defaults
91
91
  version_added: '2.11'
92
- '''
92
+ """
@@ -11,7 +11,7 @@ class ModuleDocFragment(object):
11
11
 
12
12
  # Note: mode is overridden by the copy and template modules so if you change the description
13
13
  # here, you should also change it there.
14
- DOCUMENTATION = r'''
14
+ DOCUMENTATION = r"""
15
15
  options:
16
16
  mode:
17
17
  description:
@@ -88,4 +88,4 @@ options:
88
88
  type: str
89
89
  aliases: [ attr ]
90
90
  version_added: '2.3'
91
- '''
91
+ """
@@ -8,7 +8,7 @@ from __future__ import annotations
8
8
  class ModuleDocFragment(object):
9
9
 
10
10
  # inventory cache
11
- DOCUMENTATION = r'''
11
+ DOCUMENTATION = r"""
12
12
  options:
13
13
  cache:
14
14
  description:
@@ -70,4 +70,4 @@ options:
70
70
  key: fact_caching_prefix
71
71
  - section: inventory
72
72
  key: cache_prefix
73
- '''
73
+ """
@@ -7,7 +7,7 @@ from __future__ import annotations
7
7
 
8
8
  class ModuleDocFragment(object):
9
9
 
10
- DOCUMENTATION = r'''
10
+ DOCUMENTATION = r"""
11
11
  options:
12
12
  result_format:
13
13
  name: Format of the task result
@@ -46,4 +46,4 @@ class ModuleDocFragment(object):
46
46
  - key: callback_format_pretty
47
47
  section: defaults
48
48
  version_added: '2.13'
49
- '''
49
+ """
@@ -7,7 +7,7 @@ from __future__ import annotations
7
7
 
8
8
  class ModuleDocFragment(object):
9
9
  # Standard documentation fragment
10
- RETURN = r'''
10
+ RETURN = r"""
11
11
  changed:
12
12
  description: Whether the module affected changes on the target.
13
13
  returned: always
@@ -38,4 +38,4 @@ exception:
38
38
  returned: on some errors
39
39
  type: str
40
40
  sample: Unknown error
41
- '''
41
+ """
@@ -9,11 +9,11 @@ from __future__ import annotations
9
9
  class ModuleDocFragment(object):
10
10
 
11
11
  # Standard template documentation fragment, use by template and win_template.
12
- DOCUMENTATION = r'''
12
+ DOCUMENTATION = r"""
13
13
  description:
14
- - Templates are processed by the L(Jinja2 templating language,http://jinja.pocoo.org/docs/).
14
+ - Templates are processed by the L(Jinja2 templating language,https://jinja.palletsprojects.com/en/stable/).
15
15
  - Documentation on the template formatting can be found in the
16
- L(Template Designer Documentation,http://jinja.pocoo.org/docs/templates/).
16
+ L(Template Designer Documentation,https://jinja.palletsprojects.com/en/stable/templates/).
17
17
  - Additional variables listed below can be used in templates.
18
18
  - C(ansible_managed) (configurable via the C(defaults) section of C(ansible.cfg)) contains a string which can be used to
19
19
  describe the template name, host, modification time of the template file and the owner uid.
@@ -117,4 +117,4 @@ notes:
117
117
  This is the best way to prevent evaluation of things that look like, but should not be Jinja2.
118
118
  - To find Byte Order Marks in files, use C(Format-Hex <file> -Count 16) on Windows, and use C(od -a -t x1 -N 16 <file>)
119
119
  on Linux.
120
- '''
120
+ """
@@ -8,7 +8,7 @@ from __future__ import annotations
8
8
  class ModuleDocFragment(object):
9
9
 
10
10
  # Standard files documentation fragment
11
- DOCUMENTATION = r'''
11
+ DOCUMENTATION = r"""
12
12
  options:
13
13
  url:
14
14
  description:
@@ -71,4 +71,20 @@ options:
71
71
  type: bool
72
72
  default: no
73
73
  version_added: '2.11'
74
+ """
75
+
76
+ URL_REDIRECT = r'''
77
+ options:
78
+ follow_redirects:
79
+ description:
80
+ - Whether or not the URI module should follow redirects.
81
+ type: str
82
+ default: safe
83
+ choices:
84
+ all: Will follow all redirects.
85
+ none: Will not follow any redirects.
86
+ safe: Only redirects doing GET or HEAD requests will be followed.
87
+ urllib2: Defer to urllib2 behavior (As of writing this follows HTTP redirects).
88
+ 'no': (DEPRECATED, removed in 2.22) alias of V(none).
89
+ 'yes': (DEPRECATED, removed in 2.22) alias of V(all).
74
90
  '''
@@ -9,7 +9,7 @@ from __future__ import annotations
9
9
  class ModuleDocFragment:
10
10
 
11
11
  # Common options for Ansible.ModuleUtils.WebRequest
12
- DOCUMENTATION = r'''
12
+ DOCUMENTATION = r"""
13
13
  options:
14
14
  method:
15
15
  description:
@@ -145,4 +145,4 @@ options:
145
145
  type: bool
146
146
  seealso:
147
147
  - module: community.windows.win_inet_proxy
148
- '''
148
+ """
@@ -7,7 +7,7 @@ from __future__ import annotations
7
7
 
8
8
  class ModuleDocFragment(object):
9
9
  # Standard documentation fragment
10
- DOCUMENTATION = r'''
10
+ DOCUMENTATION = r"""
11
11
  options:
12
12
  validate:
13
13
  description:
@@ -17,4 +17,4 @@ options:
17
17
  - For an example on how to handle more complex validation than what this
18
18
  option provides, see R(handling complex validation,complex_configuration_validation).
19
19
  type: str
20
- '''
20
+ """
@@ -8,7 +8,7 @@ from __future__ import annotations
8
8
 
9
9
  class ModuleDocFragment(object):
10
10
 
11
- DOCUMENTATION = r'''
11
+ DOCUMENTATION = r"""
12
12
  options:
13
13
  stage:
14
14
  description:
@@ -20,4 +20,4 @@ options:
20
20
  choices: ['all', 'task', 'inventory']
21
21
  version_added: "2.10"
22
22
  type: str
23
- '''
23
+ """