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
@@ -92,13 +92,13 @@ from io import StringIO
92
92
  from collections import defaultdict
93
93
  from collections.abc import MutableSequence
94
94
 
95
- from ansible.errors import AnsibleLookupError, AnsibleOptionsError
96
- from ansible.module_utils.common.text.converters import to_text, to_native
95
+ from ansible.errors import AnsibleError
96
+ from ansible.module_utils.common.text.converters import to_native
97
97
  from ansible.plugins.lookup import LookupBase
98
98
 
99
99
 
100
100
  def _parse_params(term, paramvals):
101
- '''Safely split parameter term to preserve spaces'''
101
+ """Safely split parameter term to preserve spaces"""
102
102
 
103
103
  # TODO: deprecate this method
104
104
  valid_keys = paramvals.keys()
@@ -161,6 +161,7 @@ class LookupModule(LookupBase):
161
161
  if '=' in term or ' ' in term.strip():
162
162
  self._deprecate_inline_kv()
163
163
  params = _parse_params(term, paramvals)
164
+ param = None
164
165
  try:
165
166
  updated_key = False
166
167
  updated_options = False
@@ -168,7 +169,7 @@ class LookupModule(LookupBase):
168
169
  if '=' in param:
169
170
  name, value = param.split('=')
170
171
  if name not in paramvals:
171
- raise AnsibleLookupError('%s is not a valid option.' % name)
172
+ raise AnsibleError(f"{name!r} is not a valid option.")
172
173
  self.set_option(name, value)
173
174
  updated_options = True
174
175
  elif key == term:
@@ -177,11 +178,11 @@ class LookupModule(LookupBase):
177
178
  updated_key = True
178
179
  if updated_options:
179
180
  paramvals = self.get_options()
180
- except ValueError as e:
181
+ except ValueError as ex:
181
182
  # bad params passed
182
- raise AnsibleLookupError("Could not use '%s' from '%s': %s" % (param, params, to_native(e)), orig_exc=e)
183
+ raise ValueError(f"Could not use {param!r} from {params!r}.") from ex
183
184
  if not updated_key:
184
- raise AnsibleOptionsError("No key to lookup was provided as first term with in string inline options: %s" % term)
185
+ raise ValueError(f"No key to look up was provided as first term within string inline options: {term}")
185
186
  # only passed options in inline string
186
187
 
187
188
  # TODO: look to use cache to avoid redoing this for every term if they use same file
@@ -195,25 +196,25 @@ class LookupModule(LookupBase):
195
196
  config.write(u'[java_properties]\n')
196
197
  paramvals['section'] = 'java_properties'
197
198
 
198
- # Open file using encoding
199
- contents, show_data = self._loader._get_file_contents(path)
200
- contents = to_text(contents, errors='surrogate_or_strict', encoding=paramvals['encoding'])
199
+ contents = self._loader.get_text_file_contents(path, encoding=paramvals['encoding'])
201
200
  config.write(contents)
202
201
  config.seek(0, os.SEEK_SET)
203
202
 
204
203
  try:
205
204
  self.cp.read_file(config)
206
- except configparser.DuplicateOptionError as doe:
207
- raise AnsibleLookupError("Duplicate option in '{file}': {error}".format(file=paramvals['file'], error=to_native(doe)))
205
+ except configparser.DuplicateOptionError as ex:
206
+ raise ValueError(f"Duplicate option in {paramvals['file']!r}.") from ex
208
207
 
209
208
  try:
210
209
  var = self.get_value(key, paramvals['section'], paramvals['default'], paramvals['re'])
211
210
  except configparser.NoSectionError:
212
- raise AnsibleLookupError("No section '{section}' in {file}".format(section=paramvals['section'], file=paramvals['file']))
211
+ raise ValueError(f"No section {paramvals['section']!r} in {paramvals['file']!r}.") from None
212
+
213
213
  if var is not None:
214
214
  if isinstance(var, MutableSequence):
215
215
  for v in var:
216
216
  ret.append(v)
217
217
  else:
218
218
  ret.append(var)
219
+
219
220
  return ret
@@ -67,6 +67,6 @@ from ansible.plugins.lookup import LookupBase
67
67
 
68
68
  class LookupModule(LookupBase):
69
69
 
70
- def run(self, terms, **kwargs):
70
+ def run(self, terms, variables=None, **kwargs):
71
71
 
72
72
  return self._flatten(terms)
@@ -16,6 +16,9 @@ DOCUMENTATION = """
16
16
  description: command(s) to run
17
17
  required: True
18
18
  notes:
19
+ - The given commands are passed to a shell for execution, therefore all variables that are part of the commands and
20
+ come from a remote/untrusted source MUST be sanitized using the P(ansible.builtin.quote#filter) filter to avoid
21
+ shell injection vulnerabilities. See the example section.
19
22
  - Like all lookups, this runs on the Ansible controller and is unaffected by other keywords such as 'become'.
20
23
  If you need to use different permissions, you must change the command or run Ansible as another user.
21
24
  - Alternatively, you can use a shell/command task that runs against localhost and registers the result.
@@ -27,6 +30,10 @@ EXAMPLES = """
27
30
  ansible.builtin.debug: msg="{{ item }} is an output line from running cat on /etc/motd"
28
31
  with_lines: cat /etc/motd
29
32
 
33
+ - name: Always use quote filter to make sure your variables are safe to use with shell
34
+ ansible.builtin.debug: msg="{{ item }} is an output line from running given command"
35
+ with_lines: "cat {{ file_name | quote }}"
36
+
30
37
  - name: More useful example of looping over a command result
31
38
  ansible.builtin.shell: "/usr/bin/frobnicate {{ item }}"
32
39
  with_lines:
@@ -49,7 +56,7 @@ from ansible.module_utils.common.text.converters import to_text
49
56
 
50
57
  class LookupModule(LookupBase):
51
58
 
52
- def run(self, terms, variables, **kwargs):
59
+ def run(self, terms, variables=None, **kwargs):
53
60
 
54
61
  ret = []
55
62
  for term in terms:
@@ -37,7 +37,7 @@ from ansible.errors import AnsibleError
37
37
 
38
38
  class LookupModule(LookupBase):
39
39
 
40
- def run(self, terms, **kwargs):
40
+ def run(self, terms, variables=None, **kwargs):
41
41
  if not isinstance(terms, Sequence):
42
42
  raise AnsibleError("with_list expects a list")
43
43
  return terms
@@ -46,32 +46,16 @@ RETURN = """
46
46
  type: list
47
47
  """
48
48
 
49
- from jinja2.exceptions import UndefinedError
50
49
 
51
- from ansible.errors import AnsibleError, AnsibleUndefinedVariable
50
+ from ansible.errors import AnsibleError
52
51
  from ansible.plugins.lookup import LookupBase
53
- from ansible.utils.listify import listify_lookup_plugin_terms
54
52
 
55
53
 
56
54
  class LookupModule(LookupBase):
57
-
58
- def _lookup_variables(self, terms, variables):
59
- results = []
60
- for x in terms:
61
- try:
62
- intermediate = listify_lookup_plugin_terms(x, templar=self._templar, fail_on_undefined=True)
63
- except UndefinedError as e:
64
- raise AnsibleUndefinedVariable("One of the nested variables was undefined. The error was: %s" % e)
65
- results.append(intermediate)
66
- return results
67
-
68
55
  def run(self, terms, variables=None, **kwargs):
69
-
70
- terms = self._lookup_variables(terms, variables)
71
-
72
56
  my_list = terms[:]
73
57
  my_list.reverse()
74
- result = []
58
+
75
59
  if len(my_list) == 0:
76
60
  raise AnsibleError("with_nested requires at least one element in the nested list")
77
61
  result = my_list.pop()
@@ -161,7 +161,7 @@ def _read_password_file(b_path):
161
161
 
162
162
 
163
163
  def _gen_candidate_chars(characters):
164
- '''Generate a string containing all valid chars as defined by ``characters``
164
+ """Generate a string containing all valid chars as defined by ``characters``
165
165
 
166
166
  :arg characters: A list of character specs. The character specs are
167
167
  shorthand names for sets of characters like 'digits', 'ascii_letters',
@@ -182,7 +182,7 @@ def _gen_candidate_chars(characters):
182
182
  the question mark and pipe characters directly. Return will be the string::
183
183
 
184
184
  u'0123456789?|'
185
- '''
185
+ """
186
186
  chars = []
187
187
  for chars_spec in characters:
188
188
  # getattr from string expands things like "ascii_letters" and "digits"
@@ -193,11 +193,11 @@ def _gen_candidate_chars(characters):
193
193
 
194
194
 
195
195
  def _parse_content(content):
196
- '''parse our password data format into password and salt
196
+ """parse our password data format into password and salt
197
197
 
198
198
  :arg content: The data read from the file
199
199
  :returns: password and salt
200
- '''
200
+ """
201
201
  password = content
202
202
  salt = None
203
203
  ident = None
@@ -348,7 +348,7 @@ class LookupModule(LookupBase):
348
348
 
349
349
  return relpath, params
350
350
 
351
- def run(self, terms, variables, **kwargs):
351
+ def run(self, terms, variables=None, **kwargs):
352
352
  ret = []
353
353
 
354
354
  for term in terms:
@@ -15,14 +15,12 @@ DOCUMENTATION = r"""
15
15
  description: command(s) to run.
16
16
  required: True
17
17
  notes:
18
+ - The given command is passed to a shell for execution, therefore all variables that are part of the command and
19
+ come from a remote/untrusted source MUST be sanitized using the P(ansible.builtin.quote#filter) filter to avoid
20
+ shell injection vulnerabilities. See the example section.
18
21
  - Like all lookups this runs on the Ansible controller and is unaffected by other keywords, such as become,
19
22
  so if you need to different permissions you must change the command or run Ansible as another user.
20
23
  - Alternatively you can use a shell/command task that runs against localhost and registers the result.
21
- - Pipe lookup internally invokes Popen with shell=True (this is required and intentional).
22
- This type of invocation is considered a security issue if appropriate care is not taken to sanitize any user provided or variable input.
23
- It is strongly recommended to pass user input or variable input via quote filter before using with pipe lookup.
24
- See example section for this.
25
- Read more about this L(Bandit B602 docs,https://bandit.readthedocs.io/en/latest/plugins/b602_subprocess_popen_with_shell_equals_true.html)
26
24
  - The directory of the play is used as the current working directory.
27
25
  """
28
26
 
@@ -52,7 +50,7 @@ from ansible.plugins.lookup import LookupBase
52
50
 
53
51
  class LookupModule(LookupBase):
54
52
 
55
- def run(self, terms, variables, **kwargs):
53
+ def run(self, terms, variables=None, **kwargs):
56
54
 
57
55
  ret = []
58
56
  for term in terms:
@@ -65,7 +63,7 @@ class LookupModule(LookupBase):
65
63
  # https://github.com/ansible/ansible/issues/6550
66
64
  term = str(term)
67
65
 
68
- p = subprocess.Popen(term, cwd=self._loader.get_basedir(), shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
66
+ p = subprocess.Popen(term, cwd=self._templar.basedir, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
69
67
  (stdout, stderr) = p.communicate()
70
68
  if p.returncode == 0:
71
69
  ret.append(stdout.decode("utf-8").rstrip())
@@ -171,6 +171,12 @@ class LookupModule(LookupBase):
171
171
  setattr(self, f, self.get_option(f))
172
172
 
173
173
  def sanity_check(self):
174
+ """
175
+ Returns True if options comprise a valid sequence expression
176
+ Raises AnsibleError if options are an invalid expression
177
+ Returns false if options are valid but result in an empty sequence - these cases do not raise exceptions
178
+ in order to maintain historic behavior
179
+ """
174
180
  if self.count is None and self.end is None:
175
181
  raise AnsibleError("must specify count or end in with_sequence")
176
182
  elif self.count is not None and self.end is not None:
@@ -180,17 +186,18 @@ class LookupModule(LookupBase):
180
186
  if self.count != 0:
181
187
  self.end = self.start + self.count * self.stride - 1
182
188
  else:
183
- self.start = 0
184
- self.end = 0
185
- self.stride = 0
186
- del self.count
189
+ return False
187
190
  if self.stride > 0 and self.end < self.start:
188
191
  raise AnsibleError("to count backwards make stride negative")
189
192
  if self.stride < 0 and self.end > self.start:
190
193
  raise AnsibleError("to count forward don't make stride negative")
194
+ if self.stride == 0:
195
+ return False
191
196
  if self.format.count('%') != 1:
192
197
  raise AnsibleError("bad formatting string: %s" % self.format)
193
198
 
199
+ return True
200
+
194
201
  def generate_sequence(self):
195
202
  if self.stride >= 0:
196
203
  adjust = 1
@@ -207,9 +214,13 @@ class LookupModule(LookupBase):
207
214
  "problem formatting %r with %r" % (i, self.format)
208
215
  )
209
216
 
210
- def run(self, terms, variables, **kwargs):
217
+ def run(self, terms, variables=None, **kwargs):
211
218
  results = []
212
219
 
220
+ if kwargs and not terms:
221
+ # All of the necessary arguments can be provided as keywords, but we still need something to loop over
222
+ terms = ['']
223
+
213
224
  for term in terms:
214
225
  try:
215
226
  # set defaults/global
@@ -223,10 +234,9 @@ class LookupModule(LookupBase):
223
234
  raise AnsibleError("unknown error parsing with_sequence arguments: %r. Error was: %s" % (term, e))
224
235
 
225
236
  self.set_fields()
226
- self.sanity_check()
227
-
228
- if self.stride != 0:
237
+ if self.sanity_check():
229
238
  results.extend(self.generate_sequence())
239
+
230
240
  except AnsibleError:
231
241
  raise
232
242
  except Exception as e:
@@ -86,7 +86,6 @@ from ansible.errors import AnsibleError
86
86
  from ansible.module_utils.six import string_types
87
87
  from ansible.module_utils.parsing.convert_bool import boolean
88
88
  from ansible.plugins.lookup import LookupBase
89
- from ansible.utils.listify import listify_lookup_plugin_terms
90
89
 
91
90
 
92
91
  FLAGS = ('skip_missing',)
@@ -94,14 +93,12 @@ FLAGS = ('skip_missing',)
94
93
 
95
94
  class LookupModule(LookupBase):
96
95
 
97
- def run(self, terms, variables, **kwargs):
96
+ def run(self, terms, variables=None, **kwargs):
98
97
 
99
98
  def _raise_terms_error(msg=""):
100
99
  raise AnsibleError(
101
100
  "subelements lookup expects a list of two or three items, " + msg)
102
101
 
103
- terms[0] = listify_lookup_plugin_terms(terms[0], templar=self._templar)
104
-
105
102
  # check lookup terms - check number of terms
106
103
  if not isinstance(terms, list) or not 2 <= len(terms) <= 3:
107
104
  _raise_terms_error()
@@ -17,9 +17,13 @@ DOCUMENTATION = """
17
17
  convert_data:
18
18
  type: bool
19
19
  description:
20
- - Whether to convert YAML into data. If False, strings that are YAML will be left untouched.
21
- - Mutually exclusive with the jinja2_native option.
20
+ - Whether to convert YAML into data. If V(False), strings that are YAML will be left untouched.
21
+ - Mutually exclusive with the O(jinja2_native) option.
22
22
  default: true
23
+ deprecated:
24
+ why: This option is no longer used in the Ansible Core code base.
25
+ version: "2.23"
26
+ alternatives: Jinja2 native mode is now the default and only option, which is mutually exclusive with this option.
23
27
  variable_start_string:
24
28
  description: The string marking the beginning of a print statement.
25
29
  default: '{{'
@@ -33,13 +37,16 @@ DOCUMENTATION = """
33
37
  jinja2_native:
34
38
  description:
35
39
  - Controls whether to use Jinja2 native types.
36
- - It is off by default even if global jinja2_native is True.
37
- - Has no effect if global jinja2_native is False.
40
+ - It is off by default even if global O(jinja2_native) is V(True).
41
+ - Has no effect if global O(jinja2_native) is V(False).
38
42
  - This offers more flexibility than the template module which does not use Jinja2 native types at all.
39
- - Mutually exclusive with the convert_data option.
40
- default: False
43
+ default: True
41
44
  version_added: '2.11'
42
45
  type: bool
46
+ deprecated:
47
+ why: This option is no longer used in the Ansible Core code base.
48
+ version: "2.23"
49
+ alternatives: Jinja2 native mode is now the default and only option.
43
50
  template_vars:
44
51
  description: A dictionary, the keys become additional variables available for templating.
45
52
  default: {}
@@ -55,6 +62,13 @@ DOCUMENTATION = """
55
62
  version_added: '2.12'
56
63
  type: str
57
64
  default: '#}'
65
+ trim_blocks:
66
+ description:
67
+ - Determine when newlines should be removed from blocks.
68
+ - When set to V(yes) the first newline after a block is removed (block, not variable tag!).
69
+ type: bool
70
+ default: yes
71
+ version_added: '2.19'
58
72
  seealso:
59
73
  - ref: playbook_task_paths
60
74
  description: Search paths used for relative templates.
@@ -72,6 +86,11 @@ EXAMPLES = """
72
86
  - name: show templating results with different comment start and end string
73
87
  ansible.builtin.debug:
74
88
  msg: "{{ lookup('ansible.builtin.template', './some_template.j2', comment_start_string='[#', comment_end_string='#]') }}"
89
+
90
+ - name: show templating results with trim_blocks
91
+ ansible.builtin.debug:
92
+ msg: "{{ lookup('ansible.builtin.template', './some_template.j2', trim_blocks=True) }}"
93
+
75
94
  """
76
95
 
77
96
  RETURN = """
@@ -84,14 +103,11 @@ _raw:
84
103
  from copy import deepcopy
85
104
  import os
86
105
 
87
- import ansible.constants as C
88
-
89
106
  from ansible.errors import AnsibleError
90
107
  from ansible.plugins.lookup import LookupBase
91
- from ansible.module_utils.common.text.converters import to_text
92
- from ansible.template import generate_ansible_template_vars, AnsibleEnvironment
108
+ from ansible.template import trust_as_template
109
+ from ansible._internal._templating import _template_vars
93
110
  from ansible.utils.display import Display
94
- from ansible.utils.native_jinja import NativeJinjaText
95
111
 
96
112
 
97
113
  display = Display()
@@ -99,25 +115,21 @@ display = Display()
99
115
 
100
116
  class LookupModule(LookupBase):
101
117
 
102
- def run(self, terms, variables, **kwargs):
118
+ def run(self, terms, variables=None, **kwargs):
103
119
 
104
120
  ret = []
105
121
 
106
122
  self.set_options(var_options=variables, direct=kwargs)
107
123
 
108
124
  # capture options
109
- convert_data_p = self.get_option('convert_data')
110
125
  lookup_template_vars = self.get_option('template_vars')
111
- jinja2_native = self.get_option('jinja2_native') and C.DEFAULT_JINJA2_NATIVE
112
126
  variable_start_string = self.get_option('variable_start_string')
113
127
  variable_end_string = self.get_option('variable_end_string')
114
128
  comment_start_string = self.get_option('comment_start_string')
115
129
  comment_end_string = self.get_option('comment_end_string')
130
+ trim_blocks = self.get_option('trim_blocks')
116
131
 
117
- if jinja2_native:
118
- templar = self._templar
119
- else:
120
- templar = self._templar.copy_with_new_env(environment_class=AnsibleEnvironment)
132
+ templar = self._templar
121
133
 
122
134
  for term in terms:
123
135
  display.debug("File lookup term: %s" % term)
@@ -125,8 +137,7 @@ class LookupModule(LookupBase):
125
137
  lookupfile = self.find_file_in_search_path(variables, 'templates', term)
126
138
  display.vvvv("File lookup using %s as file" % lookupfile)
127
139
  if lookupfile:
128
- b_template_data, show_data = self._loader._get_file_contents(lookupfile)
129
- template_data = to_text(b_template_data, errors='surrogate_or_strict')
140
+ template_data = trust_as_template(self._loader.get_text_file_contents(lookupfile))
130
141
 
131
142
  # set jinja2 internal search path for includes
132
143
  searchpath = variables.get('ansible_search_path', [])
@@ -145,25 +156,25 @@ class LookupModule(LookupBase):
145
156
  # plus some added by ansible (e.g., template_{path,mtime}),
146
157
  # plus anything passed to the lookup with the template_vars=
147
158
  # argument.
159
+ # FIXME: why isn't this a chainmap with a sacrificial bottom layer?
148
160
  vars = deepcopy(variables)
149
- vars.update(generate_ansible_template_vars(term, lookupfile))
161
+ vars.update(_template_vars.generate_ansible_template_vars(
162
+ path=term,
163
+ fullpath=lookupfile,
164
+ include_ansible_managed='ansible_managed' not in vars, # do not clobber ansible_managed when set by the user
165
+ ))
150
166
  vars.update(lookup_template_vars)
151
167
 
152
- with templar.set_temporary_context(available_variables=vars, searchpath=searchpath):
153
- overrides = dict(
154
- variable_start_string=variable_start_string,
155
- variable_end_string=variable_end_string,
156
- comment_start_string=comment_start_string,
157
- comment_end_string=comment_end_string
158
- )
159
- res = templar.template(template_data, preserve_trailing_newlines=True,
160
- convert_data=convert_data_p, escape_backslashes=False,
161
- overrides=overrides)
162
-
163
- if (C.DEFAULT_JINJA2_NATIVE and not jinja2_native) or not convert_data_p:
164
- # jinja2_native is true globally but off for the lookup, we need this text
165
- # not to be processed by literal_eval anywhere in Ansible
166
- res = NativeJinjaText(res)
168
+ overrides = dict(
169
+ variable_start_string=variable_start_string,
170
+ variable_end_string=variable_end_string,
171
+ comment_start_string=comment_start_string,
172
+ comment_end_string=comment_end_string,
173
+ trim_blocks=trim_blocks,
174
+ )
175
+
176
+ data_templar = templar.copy_with_new_env(available_variables=vars, searchpath=searchpath)
177
+ res = data_templar.template(template_data, escape_backslashes=False, overrides=overrides)
167
178
 
168
179
  ret.append(res)
169
180
  else:
@@ -38,7 +38,6 @@ import itertools
38
38
 
39
39
  from ansible.errors import AnsibleError
40
40
  from ansible.plugins.lookup import LookupBase
41
- from ansible.utils.listify import listify_lookup_plugin_terms
42
41
 
43
42
 
44
43
  class LookupModule(LookupBase):
@@ -48,18 +47,7 @@ class LookupModule(LookupBase):
48
47
  Replace any empty spots in 2nd array with None:
49
48
  [1, 2], [3] -> [1, 3], [2, None]
50
49
  """
51
-
52
- def _lookup_variables(self, terms):
53
- results = []
54
- for x in terms:
55
- intermediate = listify_lookup_plugin_terms(x, templar=self._templar)
56
- results.append(intermediate)
57
- return results
58
-
59
50
  def run(self, terms, variables=None, **kwargs):
60
-
61
- terms = self._lookup_variables(terms)
62
-
63
51
  my_list = terms[:]
64
52
  if len(my_list) == 0:
65
53
  raise AnsibleError("with_together requires at least one element in each list")
@@ -34,7 +34,6 @@ RETURN = """
34
34
 
35
35
  from ansible.errors import AnsibleParserError
36
36
  from ansible.plugins.lookup import LookupBase
37
- from ansible.module_utils.common.text.converters import to_text
38
37
  from ansible.utils.display import Display
39
38
 
40
39
  display = Display()
@@ -55,10 +54,7 @@ class LookupModule(LookupBase):
55
54
  lookupfile = self.find_file_in_search_path(variables, 'files', term)
56
55
  display.vvvv(u"Unvault lookup found %s" % lookupfile)
57
56
  if lookupfile:
58
- actual_file = self._loader.get_real_file(lookupfile, decrypt=True)
59
- with open(actual_file, 'rb') as f:
60
- b_contents = f.read()
61
- ret.append(to_text(b_contents))
57
+ ret.append(self._loader.get_text_file_contents(lookupfile))
62
58
  else:
63
59
  raise AnsibleParserError('Unable to find file matching "%s" ' % term)
64
60
 
@@ -87,7 +87,6 @@ options:
87
87
  - section: url_lookup
88
88
  key: force_basic_auth
89
89
  follow_redirects:
90
- description: String of urllib2, all/yes, safe, none to determine how redirects are followed
91
90
  type: string
92
91
  version_added: "2.10"
93
92
  default: 'urllib2'
@@ -98,13 +97,6 @@ options:
98
97
  ini:
99
98
  - section: url_lookup
100
99
  key: follow_redirects
101
- choices:
102
- all: Will follow all redirects.
103
- none: Will not follow any redirects.
104
- safe: Only redirects doing GET or HEAD requests will be followed.
105
- urllib2: Defer to urllib2 behavior (As of writing this follows HTTP redirects).
106
- 'no': (DEPRECATED, removed in 2.22) alias of V(none).
107
- 'yes': (DEPRECATED, removed in 2.22) alias of V(all).
108
100
  use_gssapi:
109
101
  description:
110
102
  - Use GSSAPI handler of requests
@@ -185,6 +177,8 @@ options:
185
177
  ini:
186
178
  - section: url_lookup
187
179
  key: ciphers
180
+ extends_documentation_fragment:
181
+ - url.url_redirect
188
182
  """
189
183
 
190
184
  EXAMPLES = """
@@ -236,8 +230,8 @@ class LookupModule(LookupBase):
236
230
  display.vvvv("url lookup connecting to %s" % term)
237
231
  if self.get_option('follow_redirects') in ('yes', 'no'):
238
232
  display.deprecated(
239
- "Using 'yes' or 'no' for 'follow_redirects' parameter is deprecated.",
240
- version='2.22'
233
+ msg="Using 'yes' or 'no' for 'follow_redirects' parameter is deprecated.",
234
+ version='2.22',
241
235
  )
242
236
  try:
243
237
  response = open_url(
@@ -73,40 +73,32 @@ _value:
73
73
  elements: raw
74
74
  """
75
75
 
76
- from ansible.errors import AnsibleError, AnsibleUndefinedVariable
77
- from ansible.module_utils.six import string_types
76
+ from ansible.errors import AnsibleTypeError
78
77
  from ansible.plugins.lookup import LookupBase
78
+ from ansible.module_utils.datatag import native_type_name
79
+ from ansible._internal._templating import _jinja_bits
79
80
 
80
81
 
81
82
  class LookupModule(LookupBase):
82
-
83
- def run(self, terms, variables=None, **kwargs):
84
- if variables is not None:
85
- self._templar.available_variables = variables
86
- myvars = getattr(self._templar, '_available_variables', {})
87
-
83
+ def run(self, terms, variables, **kwargs):
88
84
  self.set_options(var_options=variables, direct=kwargs)
85
+
89
86
  default = self.get_option('default')
90
87
 
91
88
  ret = []
89
+
92
90
  for term in terms:
93
- if not isinstance(term, string_types):
94
- raise AnsibleError('Invalid setting identifier, "%s" is not a string, its a %s' % (term, type(term)))
91
+ if not isinstance(term, str):
92
+ raise AnsibleTypeError(f'Variable name must be {native_type_name(str)!r} not {native_type_name(term)!r}.', obj=term)
95
93
 
96
94
  try:
97
- try:
98
- value = myvars[term]
99
- except KeyError:
100
- try:
101
- value = myvars['hostvars'][myvars['inventory_hostname']][term]
102
- except KeyError:
103
- raise AnsibleUndefinedVariable('No variable found with this name: %s' % term)
104
-
105
- ret.append(self._templar.template(value, fail_on_undefined=True))
106
- except AnsibleUndefinedVariable:
107
- if default is not None:
108
- ret.append(default)
95
+ value = variables[term]
96
+ except KeyError:
97
+ if default is None:
98
+ value = _jinja_bits._undef(f'No variable named {term!r} was found.')
109
99
  else:
110
- raise
100
+ value = default
101
+
102
+ ret.append(value)
111
103
 
112
- return ret
104
+ return self._templar._engine.template(ret)