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
ansible/playbook/play.py CHANGED
@@ -19,8 +19,8 @@ from __future__ import annotations
19
19
 
20
20
  from ansible import constants as C
21
21
  from ansible import context
22
+ from ansible.errors import AnsibleError
22
23
  from ansible.errors import AnsibleParserError, AnsibleAssertionError
23
- from ansible.module_utils.common.text.converters import to_native
24
24
  from ansible.module_utils.common.collections import is_sequence
25
25
  from ansible.module_utils.six import binary_type, string_types, text_type
26
26
  from ansible.playbook.attribute import NonInheritableFieldAttribute
@@ -31,6 +31,7 @@ from ansible.playbook.helpers import load_list_of_blocks, load_list_of_roles
31
31
  from ansible.playbook.role import Role
32
32
  from ansible.playbook.task import Task
33
33
  from ansible.playbook.taggable import Taggable
34
+ from ansible.parsing.vault import EncryptedString
34
35
  from ansible.utils.display import Display
35
36
 
36
37
  display = Display()
@@ -99,6 +100,15 @@ class Play(Base, Taggable, CollectionSearch):
99
100
  def __repr__(self):
100
101
  return self.get_name()
101
102
 
103
+ def _get_cached_role(self, role):
104
+ role_path = role.get_role_path()
105
+ role_cache = self.role_cache[role_path]
106
+ try:
107
+ idx = role_cache.index(role)
108
+ return role_cache[idx]
109
+ except ValueError:
110
+ raise AnsibleError(f'Cannot locate {role.get_name()} in role cache')
111
+
102
112
  def _validate_hosts(self, attribute, name, value):
103
113
  # Only validate 'hosts' if a value was passed in to original data set.
104
114
  if 'hosts' in self._ds:
@@ -113,11 +123,11 @@ class Play(Base, Taggable, CollectionSearch):
113
123
  elif not isinstance(entry, (binary_type, text_type)):
114
124
  raise AnsibleParserError("Hosts list contains an invalid host value: '{host!s}'".format(host=entry))
115
125
 
116
- elif not isinstance(value, (binary_type, text_type)):
126
+ elif not isinstance(value, (binary_type, text_type, EncryptedString)):
117
127
  raise AnsibleParserError("Hosts list must be a sequence or string. Please check your playbook.")
118
128
 
119
129
  def get_name(self):
120
- ''' return the name of the Play '''
130
+ """ return the name of the Play """
121
131
  if self.name:
122
132
  return self.name
123
133
 
@@ -136,9 +146,9 @@ class Play(Base, Taggable, CollectionSearch):
136
146
  return p.load_data(data, variable_manager=variable_manager, loader=loader)
137
147
 
138
148
  def preprocess_data(self, ds):
139
- '''
149
+ """
140
150
  Adjusts play datastructure to cleanup old/legacy items
141
- '''
151
+ """
142
152
 
143
153
  if not isinstance(ds, dict):
144
154
  raise AnsibleAssertionError('while preprocessing data (%s), ds should be a dict but was a %s' % (ds, type(ds)))
@@ -158,55 +168,57 @@ class Play(Base, Taggable, CollectionSearch):
158
168
 
159
169
  return super(Play, self).preprocess_data(ds)
160
170
 
171
+ # DTFIX-FUTURE: these do nothing but augment the exception message; DRY and nuke
172
+
161
173
  def _load_tasks(self, attr, ds):
162
- '''
174
+ """
163
175
  Loads a list of blocks from a list which may be mixed tasks/blocks.
164
176
  Bare tasks outside of a block are given an implicit block.
165
- '''
177
+ """
166
178
  try:
167
179
  return load_list_of_blocks(ds=ds, play=self, variable_manager=self._variable_manager, loader=self._loader)
168
- except AssertionError as e:
169
- raise AnsibleParserError("A malformed block was encountered while loading tasks: %s" % to_native(e), obj=self._ds, orig_exc=e)
180
+ except AssertionError as ex:
181
+ raise AnsibleParserError("A malformed block was encountered while loading tasks.", obj=self._ds) from ex
170
182
 
171
183
  def _load_pre_tasks(self, attr, ds):
172
- '''
184
+ """
173
185
  Loads a list of blocks from a list which may be mixed tasks/blocks.
174
186
  Bare tasks outside of a block are given an implicit block.
175
- '''
187
+ """
176
188
  try:
177
189
  return load_list_of_blocks(ds=ds, play=self, variable_manager=self._variable_manager, loader=self._loader)
178
- except AssertionError as e:
179
- raise AnsibleParserError("A malformed block was encountered while loading pre_tasks", obj=self._ds, orig_exc=e)
190
+ except AssertionError as ex:
191
+ raise AnsibleParserError("A malformed block was encountered while loading pre_tasks.", obj=self._ds) from ex
180
192
 
181
193
  def _load_post_tasks(self, attr, ds):
182
- '''
194
+ """
183
195
  Loads a list of blocks from a list which may be mixed tasks/blocks.
184
196
  Bare tasks outside of a block are given an implicit block.
185
- '''
197
+ """
186
198
  try:
187
199
  return load_list_of_blocks(ds=ds, play=self, variable_manager=self._variable_manager, loader=self._loader)
188
- except AssertionError as e:
189
- raise AnsibleParserError("A malformed block was encountered while loading post_tasks", obj=self._ds, orig_exc=e)
200
+ except AssertionError as ex:
201
+ raise AnsibleParserError("A malformed block was encountered while loading post_tasks.", obj=self._ds) from ex
190
202
 
191
203
  def _load_handlers(self, attr, ds):
192
- '''
204
+ """
193
205
  Loads a list of blocks from a list which may be mixed handlers/blocks.
194
206
  Bare handlers outside of a block are given an implicit block.
195
- '''
207
+ """
196
208
  try:
197
209
  return self._extend_value(
198
210
  self.handlers,
199
211
  load_list_of_blocks(ds=ds, play=self, use_handlers=True, variable_manager=self._variable_manager, loader=self._loader),
200
212
  prepend=True
201
213
  )
202
- except AssertionError as e:
203
- raise AnsibleParserError("A malformed block was encountered while loading handlers", obj=self._ds, orig_exc=e)
214
+ except AssertionError as ex:
215
+ raise AnsibleParserError("A malformed block was encountered while loading handlers.", obj=self._ds) from ex
204
216
 
205
217
  def _load_roles(self, attr, ds):
206
- '''
218
+ """
207
219
  Loads and returns a list of RoleInclude objects from the datastructure
208
220
  list of role definitions and creates the Role from those objects
209
- '''
221
+ """
210
222
 
211
223
  if ds is None:
212
224
  ds = []
@@ -214,8 +226,8 @@ class Play(Base, Taggable, CollectionSearch):
214
226
  try:
215
227
  role_includes = load_list_of_roles(ds, play=self, variable_manager=self._variable_manager,
216
228
  loader=self._loader, collection_search_list=self.collections)
217
- except AssertionError as e:
218
- raise AnsibleParserError("A malformed role declaration was encountered.", obj=self._ds, orig_exc=e)
229
+ except AssertionError as ex:
230
+ raise AnsibleParserError("A malformed role declaration was encountered.", obj=self._ds) from ex
219
231
 
220
232
  roles = []
221
233
  for ri in role_includes:
@@ -242,13 +254,13 @@ class Play(Base, Taggable, CollectionSearch):
242
254
  return vars_prompts
243
255
 
244
256
  def _compile_roles(self):
245
- '''
257
+ """
246
258
  Handles the role compilation step, returning a flat list of tasks
247
259
  with the lowest level dependencies first. For example, if a role R
248
260
  has a dependency D1, which also has a dependency D2, the tasks from
249
261
  D2 are merged first, followed by D1, and lastly by the tasks from
250
262
  the parent role R last. This is done for all roles in the Play.
251
- '''
263
+ """
252
264
 
253
265
  block_list = []
254
266
 
@@ -263,10 +275,10 @@ class Play(Base, Taggable, CollectionSearch):
263
275
  return block_list
264
276
 
265
277
  def compile_roles_handlers(self):
266
- '''
278
+ """
267
279
  Handles the role handler compilation step, returning a flat list of Handlers
268
280
  This is done for all roles in the Play.
269
- '''
281
+ """
270
282
 
271
283
  block_list = []
272
284
 
@@ -279,25 +291,39 @@ class Play(Base, Taggable, CollectionSearch):
279
291
  return block_list
280
292
 
281
293
  def compile(self):
282
- '''
294
+ """
283
295
  Compiles and returns the task list for this play, compiled from the
284
296
  roles (which are themselves compiled recursively) and/or the list of
285
297
  tasks specified in the play.
286
- '''
287
-
298
+ """
288
299
  # create a block containing a single flush handlers meta
289
300
  # task, so we can be sure to run handlers at certain points
290
301
  # of the playbook execution
291
- flush_block = Block.load(
292
- data={'meta': 'flush_handlers'},
293
- play=self,
294
- variable_manager=self._variable_manager,
295
- loader=self._loader
296
- )
297
-
298
- for task in flush_block.block:
299
- task.implicit = True
302
+ flush_block = Block(play=self)
303
+
304
+ t = Task(block=flush_block)
305
+ t.action = 'meta'
306
+ t.resolved_action = 'ansible.builtin.meta'
307
+ t.args['_raw_params'] = 'flush_handlers'
308
+ t.implicit = True
309
+ t.set_loader(self._loader)
310
+
311
+ if self.tags:
312
+ # Avoid calling flush_handlers in case the whole play is skipped on tags,
313
+ # this could be performance improvement since calling flush_handlers on
314
+ # large inventories could be expensive even if no hosts are notified
315
+ # since we call flush_handlers per host.
316
+ # Block.filter_tagged_tasks ignores evaluating tags on implicit meta
317
+ # tasks so we need to explicitly call Task.evaluate_tags here.
318
+ t.tags = self.tags
319
+ if t.evaluate_tags(self.only_tags, self.skip_tags, all_vars=self.vars):
320
+ flush_block.block = [t]
321
+ else:
322
+ flush_block.block = [t]
300
323
 
324
+ # NOTE keep flush_handlers tasks even if a section has no regular tasks,
325
+ # there may be notified handlers from the previous section
326
+ # (typically when a handler notifies a handler defined before)
301
327
  block_list = []
302
328
  if self.force_handlers:
303
329
  noop_task = Task()
@@ -307,18 +333,33 @@ class Play(Base, Taggable, CollectionSearch):
307
333
  noop_task.set_loader(self._loader)
308
334
 
309
335
  b = Block(play=self)
310
- b.block = self.pre_tasks or [noop_task]
336
+ if self.pre_tasks:
337
+ b.block = self.pre_tasks
338
+ else:
339
+ nt = noop_task.copy(exclude_parent=True)
340
+ nt._parent = b
341
+ b.block = [nt]
311
342
  b.always = [flush_block]
312
343
  block_list.append(b)
313
344
 
314
345
  tasks = self._compile_roles() + self.tasks
315
346
  b = Block(play=self)
316
- b.block = tasks or [noop_task]
347
+ if tasks:
348
+ b.block = tasks
349
+ else:
350
+ nt = noop_task.copy(exclude_parent=True)
351
+ nt._parent = b
352
+ b.block = [nt]
317
353
  b.always = [flush_block]
318
354
  block_list.append(b)
319
355
 
320
356
  b = Block(play=self)
321
- b.block = self.post_tasks or [noop_task]
357
+ if self.post_tasks:
358
+ b.block = self.post_tasks
359
+ else:
360
+ nt = noop_task.copy(exclude_parent=True)
361
+ nt._parent = b
362
+ b.block = [nt]
322
363
  b.always = [flush_block]
323
364
  block_list.append(b)
324
365
 
@@ -65,11 +65,11 @@ RESET_VARS = (
65
65
 
66
66
  class PlayContext(Base):
67
67
 
68
- '''
68
+ """
69
69
  This class is used to consolidate the connection information for
70
70
  hosts in a play and child tasks, where the task may override some
71
71
  connection/authentication information.
72
- '''
72
+ """
73
73
 
74
74
  # base
75
75
  module_compression = FieldAttribute(isa='string', default=C.DEFAULT_MODULE_COMPRESSION)
@@ -88,7 +88,7 @@ class PlayContext(Base):
88
88
  # networking modules
89
89
  network_os = FieldAttribute(isa='string')
90
90
 
91
- # docker FIXME: remove these
91
+ # FIXME: docker - remove these
92
92
  docker_extra_args = FieldAttribute(isa='string')
93
93
 
94
94
  # ???
@@ -103,10 +103,6 @@ class PlayContext(Base):
103
103
  become_flags = FieldAttribute(isa='string', default=C.DEFAULT_BECOME_FLAGS)
104
104
  prompt = FieldAttribute(isa='string')
105
105
 
106
- # general flags
107
- only_tags = FieldAttribute(isa='set', default=set)
108
- skip_tags = FieldAttribute(isa='set', default=set)
109
-
110
106
  start_at_task = FieldAttribute(isa='string')
111
107
  step = FieldAttribute(isa='bool', default=False)
112
108
 
@@ -158,11 +154,11 @@ class PlayContext(Base):
158
154
  self.force_handlers = play.force_handlers
159
155
 
160
156
  def set_attributes_from_cli(self):
161
- '''
157
+ """
162
158
  Configures this connection information instance with data from
163
159
  options specified by the user on the command line. These have a
164
160
  lower precedence than those set on the play or host.
165
- '''
161
+ """
166
162
  if context.CLIARGS.get('timeout', False):
167
163
  self.timeout = int(context.CLIARGS['timeout'])
168
164
 
@@ -175,14 +171,14 @@ class PlayContext(Base):
175
171
  self.start_at_task = context.CLIARGS.get('start_at_task', None) # Else default
176
172
 
177
173
  def set_task_and_variable_override(self, task, variables, templar):
178
- '''
174
+ """
179
175
  Sets attributes from the task if they are set, which will override
180
176
  those from the play.
181
177
 
182
178
  :arg task: the task object with the parameters that were set on it
183
179
  :arg variables: variables from inventory
184
180
  :arg templar: templar instance if templating variables is needed
185
- '''
181
+ """
186
182
 
187
183
  new_info = self.copy()
188
184
 
@@ -201,8 +197,7 @@ class PlayContext(Base):
201
197
  # In the case of a loop, the delegated_to host may have been
202
198
  # templated based on the loop variable, so we try and locate
203
199
  # the host name in the delegated variable dictionary here
204
- delegated_host_name = templar.template(task.delegate_to)
205
- delegated_vars = variables.get('ansible_delegated_vars', dict()).get(delegated_host_name, dict())
200
+ delegated_vars = variables.get('ansible_delegated_vars', dict()).get(task.delegate_to, dict())
206
201
 
207
202
  delegated_transport = C.DEFAULT_TRANSPORT
208
203
  for transport_var in C.MAGIC_VARIABLE_MAPPING.get('connection'):
@@ -218,8 +213,8 @@ class PlayContext(Base):
218
213
  if address_var in delegated_vars:
219
214
  break
220
215
  else:
221
- display.debug("no remote address found for delegated host %s\nusing its name, so success depends on DNS resolution" % delegated_host_name)
222
- delegated_vars['ansible_host'] = delegated_host_name
216
+ display.debug("no remote address found for delegated host %s\nusing its name, so success depends on DNS resolution" % task.delegate_to)
217
+ delegated_vars['ansible_host'] = task.delegate_to
223
218
 
224
219
  # reset the port back to the default if none was specified, to prevent
225
220
  # the delegated host from inheriting the original host's setting
@@ -312,10 +307,10 @@ class PlayContext(Base):
312
307
  self._become_plugin = plugin
313
308
 
314
309
  def update_vars(self, variables):
315
- '''
310
+ """
316
311
  Adds 'magic' variables relating to connections to the variable dictionary provided.
317
312
  In case users need to access from the play, this is a legacy from runner.
318
- '''
313
+ """
319
314
 
320
315
  for prop, var_list in C.MAGIC_VARIABLE_MAPPING.items():
321
316
  try:
@@ -22,16 +22,16 @@ import os
22
22
  import ansible.constants as C
23
23
  from ansible.errors import AnsibleParserError, AnsibleAssertionError
24
24
  from ansible.module_utils.common.text.converters import to_bytes
25
+ from ansible.module_utils._internal._datatag import AnsibleTagHelper
25
26
  from ansible.module_utils.six import string_types
26
27
  from ansible.parsing.splitter import split_args
27
- from ansible.parsing.yaml.objects import AnsibleBaseYAMLObject, AnsibleMapping
28
28
  from ansible.playbook.attribute import NonInheritableFieldAttribute
29
29
  from ansible.playbook.base import Base
30
30
  from ansible.playbook.conditional import Conditional
31
31
  from ansible.playbook.taggable import Taggable
32
32
  from ansible.utils.collection_loader import AnsibleCollectionConfig
33
33
  from ansible.utils.collection_loader._collection_finder import _get_collection_name_from_path, _get_collection_playbook_path
34
- from ansible.template import Templar
34
+ from ansible._internal._templating._engine import TemplateEngine
35
35
  from ansible.utils.display import Display
36
36
 
37
37
  display = Display()
@@ -47,10 +47,10 @@ class PlaybookInclude(Base, Conditional, Taggable):
47
47
  return PlaybookInclude().load_data(ds=data, basedir=basedir, variable_manager=variable_manager, loader=loader)
48
48
 
49
49
  def load_data(self, ds, variable_manager=None, loader=None, basedir=None):
50
- '''
50
+ """
51
51
  Overrides the base load_data(), as we're actually going to return a new
52
52
  Playbook() object rather than a PlaybookInclude object
53
- '''
53
+ """
54
54
 
55
55
  # import here to avoid a dependency loop
56
56
  from ansible.playbook import Playbook
@@ -65,7 +65,7 @@ class PlaybookInclude(Base, Conditional, Taggable):
65
65
  if variable_manager:
66
66
  all_vars |= variable_manager.get_vars()
67
67
 
68
- templar = Templar(loader=loader, variables=all_vars)
68
+ templar = TemplateEngine(loader=loader, variables=all_vars)
69
69
 
70
70
  # then we use the object to load a Playbook
71
71
  pb = Playbook(loader=loader)
@@ -122,19 +122,17 @@ class PlaybookInclude(Base, Conditional, Taggable):
122
122
  return pb
123
123
 
124
124
  def preprocess_data(self, ds):
125
- '''
125
+ """
126
126
  Reorganizes the data for a PlaybookInclude datastructure to line
127
127
  up with what we expect the proper attributes to be
128
- '''
128
+ """
129
129
 
130
130
  if not isinstance(ds, dict):
131
131
  raise AnsibleAssertionError('ds (%s) should be a dict but was a %s' % (ds, type(ds)))
132
132
 
133
- # the new, cleaned datastructure, which will have legacy
134
- # items reduced to a standard structure
135
- new_ds = AnsibleMapping()
136
- if isinstance(ds, AnsibleBaseYAMLObject):
137
- new_ds.ansible_pos = ds.ansible_pos
133
+ # the new, cleaned datastructure, which will have legacy items reduced to a standard structure suitable for the
134
+ # attributes of the task class; copy any tagged data to preserve things like origin
135
+ new_ds = AnsibleTagHelper.tag_copy(ds, {})
138
136
 
139
137
  for (k, v) in ds.items():
140
138
  if k in C._ACTION_IMPORT_PLAYBOOK:
@@ -152,9 +150,9 @@ class PlaybookInclude(Base, Conditional, Taggable):
152
150
  return super(PlaybookInclude, self).preprocess_data(new_ds)
153
151
 
154
152
  def _preprocess_import(self, ds, new_ds, k, v):
155
- '''
153
+ """
156
154
  Splits the playbook import line up into filename and parameters
157
- '''
155
+ """
158
156
  if v is None:
159
157
  raise AnsibleParserError("playbook import parameter is missing", obj=ds)
160
158
  elif not isinstance(v, string_types):
@@ -166,4 +164,5 @@ class PlaybookInclude(Base, Conditional, Taggable):
166
164
  if len(items) == 0:
167
165
  raise AnsibleParserError("import_playbook statements must specify the file name to import", obj=ds)
168
166
 
169
- new_ds['import_playbook'] = items[0].strip()
167
+ # DTFIX-RELEASE: investigate this as a possible "problematic strip"
168
+ new_ds['import_playbook'] = AnsibleTagHelper.tag_copy(v, items[0].strip())
@@ -24,9 +24,9 @@ from types import MappingProxyType
24
24
 
25
25
  from ansible import constants as C
26
26
  from ansible.errors import AnsibleError, AnsibleParserError, AnsibleAssertionError
27
+ from ansible.module_utils.common.sentinel import Sentinel
27
28
  from ansible.module_utils.common.text.converters import to_text
28
29
  from ansible.module_utils.six import binary_type, text_type
29
- from ansible.playbook.attribute import FieldAttribute
30
30
  from ansible.playbook.base import Base
31
31
  from ansible.playbook.collectionsearch import CollectionSearch
32
32
  from ansible.playbook.conditional import Conditional
@@ -37,7 +37,6 @@ from ansible.playbook.taggable import Taggable
37
37
  from ansible.plugins.loader import add_all_plugin_dirs
38
38
  from ansible.utils.collection_loader import AnsibleCollectionConfig
39
39
  from ansible.utils.path import is_subpath
40
- from ansible.utils.sentinel import Sentinel
41
40
  from ansible.utils.vars import combine_vars
42
41
 
43
42
  __all__ = ['Role', 'hash_params']
@@ -200,9 +199,9 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
200
199
 
201
200
  return r
202
201
 
203
- except RuntimeError:
202
+ except RecursionError as ex:
204
203
  raise AnsibleError("A recursion loop was detected with the roles specified. Make sure child roles do not have dependencies on parent roles",
205
- obj=role_include._ds)
204
+ obj=role_include._ds) from ex
206
205
 
207
206
  def _load_role_data(self, role_include, parent_role=None):
208
207
  self._role_name = role_include.role
@@ -274,18 +273,17 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
274
273
  if task_data:
275
274
  try:
276
275
  self._task_blocks = load_list_of_blocks(task_data, play=self._play, role=self, loader=self._loader, variable_manager=self._variable_manager)
277
- except AssertionError as e:
278
- raise AnsibleParserError("The tasks/main.yml file for role '%s' must contain a list of tasks" % self._role_name,
279
- obj=task_data, orig_exc=e)
276
+ except AssertionError as ex:
277
+ raise AnsibleParserError(f"The tasks/main.yml file for role {self._role_name!r} must contain a list of tasks.", obj=task_data) from ex
280
278
 
281
279
  handler_data = self._load_role_yaml('handlers', main=self._from_files.get('handlers'))
282
280
  if handler_data:
283
281
  try:
284
282
  self._handler_blocks = load_list_of_blocks(handler_data, play=self._play, role=self, use_handlers=True, loader=self._loader,
285
283
  variable_manager=self._variable_manager)
286
- except AssertionError as e:
287
- raise AnsibleParserError("The handlers/main.yml file for role '%s' must contain a list of tasks" % self._role_name,
288
- obj=handler_data, orig_exc=e)
284
+ except AssertionError as ex:
285
+ raise AnsibleParserError(f"The handlers/main.yml file for role {self._role_name!r} must contain a list of tasks.",
286
+ obj=handler_data) from ex
289
287
 
290
288
  def _get_role_argspecs(self):
291
289
  """Get the role argument spec data.
@@ -316,7 +314,7 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
316
314
  return getattr(self._metadata, 'argument_specs', {})
317
315
 
318
316
  def _prepend_validation_task(self, task_data, argspecs):
319
- '''Insert a role validation task if we have a role argument spec.
317
+ """Insert a role validation task if we have a role argument spec.
320
318
 
321
319
  This method will prepend a validation task to the front of the role task
322
320
  list to perform argument spec validation before any other tasks, if an arg spec
@@ -326,7 +324,7 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
326
324
  :param argspecs: The role argument spec data dict.
327
325
 
328
326
  :returns: The (possibly modified) task list.
329
- '''
327
+ """
330
328
  if argspecs:
331
329
  # Determine the role entry point so we can retrieve the correct argument spec.
332
330
  # This comes from the `tasks_from` value to include_role or import_role.
@@ -345,13 +343,13 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
345
343
  return task_data
346
344
 
347
345
  def _create_validation_task(self, argument_spec, entrypoint_name):
348
- '''Create a new task data structure that uses the validate_argument_spec action plugin.
346
+ """Create a new task data structure that uses the validate_argument_spec action plugin.
349
347
 
350
348
  :param argument_spec: The arg spec definition for a particular role entry point.
351
349
  This will be the entire arg spec for the entry point as read from the input file.
352
350
  :param entrypoint_name: The name of the role entry point associated with the
353
351
  supplied `argument_spec`.
354
- '''
352
+ """
355
353
 
356
354
  # If the arg spec provides a short description, use it to flesh out the validation task name
357
355
  task_name = "Validating arguments against arg spec '%s'" % entrypoint_name
@@ -376,7 +374,7 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
376
374
  }
377
375
 
378
376
  def _load_role_yaml(self, subdir, main=None, allow_dir=False):
379
- '''
377
+ """
380
378
  Find and load role YAML files and return data found.
381
379
  :param subdir: subdir of role to search (vars, files, tasks, handlers, defaults)
382
380
  :type subdir: string
@@ -387,7 +385,7 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
387
385
  :type allow_dir: bool
388
386
 
389
387
  :returns: data from the matched file(s), type can be dict or list depending on vars or tasks.
390
- '''
388
+ """
391
389
  data = None
392
390
  file_path = os.path.join(self._role_path, subdir)
393
391
  if self._loader.path_exists(file_path) and self._loader.is_directory(file_path):
@@ -412,7 +410,7 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
412
410
  raise AnsibleParserError("Failed loading '%s' for role (%s) as it is not inside the expected role path: '%s'" %
413
411
  (to_text(found), self._role_name, to_text(file_path)))
414
412
 
415
- new_data = self._loader.load_from_file(found)
413
+ new_data = self._loader.load_from_file(found, trusted_as_template=True)
416
414
  if new_data:
417
415
  if data is not None and isinstance(new_data, Mapping):
418
416
  data = combine_vars(data, new_data)
@@ -430,10 +428,10 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
430
428
  return data
431
429
 
432
430
  def _load_dependencies(self):
433
- '''
431
+ """
434
432
  Recursively loads role dependencies from the metadata list of
435
433
  dependencies, if it exists
436
- '''
434
+ """
437
435
 
438
436
  deps = []
439
437
  for role_include in self._metadata.dependencies:
@@ -445,7 +443,7 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
445
443
  # other functions
446
444
 
447
445
  def add_parent(self, parent_role):
448
- ''' adds a role to the list of this roles parents '''
446
+ """ adds a role to the list of this roles parents """
449
447
  if not isinstance(parent_role, Role):
450
448
  raise AnsibleAssertionError()
451
449
 
@@ -533,10 +531,10 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
533
531
  return self._dependencies[:]
534
532
 
535
533
  def get_all_dependencies(self):
536
- '''
534
+ """
537
535
  Returns a list of all deps, built recursively from all child dependencies,
538
536
  in the proper order in which they should be executed or evaluated.
539
- '''
537
+ """
540
538
  if self._all_dependencies is None:
541
539
 
542
540
  self._all_dependencies = []
@@ -579,15 +577,15 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
579
577
  return block_list
580
578
 
581
579
  def has_run(self, host):
582
- '''
580
+ """
583
581
  Returns true if this role has been iterated over completely and
584
582
  at least one task was run
585
- '''
583
+ """
586
584
 
587
585
  return host.name in self._completed
588
586
 
589
587
  def compile(self, play, dep_chain=None):
590
- '''
588
+ """
591
589
  Returns the task list for this role, which is created by first
592
590
  recursively compiling the tasks for all direct dependencies, and
593
591
  then adding on the tasks for this role.
@@ -595,7 +593,7 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable):
595
593
  The role compile() also remembers and saves the dependency chain
596
594
  with each task, so tasks know by which route they were found, and
597
595
  can correctly take their parent's tags/conditionals into account.
598
- '''
596
+ """
599
597
  from ansible.playbook.block import Block
600
598
  from ansible.playbook.task import Task
601
599