ansible-core 2.16.7rc1__py3-none-any.whl → 2.17.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 (597) hide show
  1. ansible/__init__.py +1 -3
  2. ansible/__main__.py +1 -0
  3. ansible/_vendor/__init__.py +1 -2
  4. ansible/cli/__init__.py +7 -8
  5. ansible/cli/adhoc.py +1 -2
  6. ansible/cli/arguments/__init__.py +1 -2
  7. ansible/cli/arguments/option_helpers.py +1 -2
  8. ansible/cli/config.py +1 -2
  9. ansible/cli/console.py +1 -2
  10. ansible/cli/doc.py +326 -202
  11. ansible/cli/galaxy.py +9 -3
  12. ansible/cli/inventory.py +4 -6
  13. ansible/cli/playbook.py +1 -2
  14. ansible/cli/pull.py +4 -5
  15. ansible/cli/scripts/ansible_connection_cli_stub.py +1 -4
  16. ansible/cli/vault.py +1 -2
  17. ansible/collections/list.py +1 -0
  18. ansible/compat/__init__.py +1 -4
  19. ansible/compat/importlib_resources.py +1 -2
  20. ansible/compat/{selectors/__init__.py → selectors.py} +12 -12
  21. ansible/config/ansible_builtin_runtime.yml +2 -0
  22. ansible/config/base.yml +154 -149
  23. ansible/config/manager.py +33 -25
  24. ansible/constants.py +1 -2
  25. ansible/context.py +1 -4
  26. ansible/errors/__init__.py +1 -3
  27. ansible/errors/yaml_strings.py +1 -3
  28. ansible/executor/__init__.py +1 -3
  29. ansible/executor/discovery/python_target.py +1 -2
  30. ansible/executor/interpreter_discovery.py +9 -8
  31. ansible/executor/module_common.py +1 -3
  32. ansible/executor/play_iterator.py +1 -3
  33. ansible/executor/playbook_executor.py +1 -3
  34. ansible/executor/powershell/module_manifest.py +2 -3
  35. ansible/executor/process/__init__.py +1 -3
  36. ansible/executor/process/worker.py +1 -3
  37. ansible/executor/stats.py +1 -3
  38. ansible/executor/task_executor.py +2 -3
  39. ansible/executor/task_queue_manager.py +1 -3
  40. ansible/executor/task_result.py +2 -3
  41. ansible/galaxy/__init__.py +1 -2
  42. ansible/galaxy/api.py +10 -2
  43. ansible/galaxy/collection/__init__.py +38 -24
  44. ansible/galaxy/collection/concrete_artifact_manager.py +1 -2
  45. ansible/galaxy/collection/galaxy_api_proxy.py +1 -2
  46. ansible/galaxy/collection/gpg.py +4 -2
  47. ansible/galaxy/data/apb/meta/main.yml.j2 +0 -15
  48. ansible/galaxy/data/container/meta/main.yml.j2 +0 -18
  49. ansible/galaxy/data/default/role/meta/main.yml.j2 +0 -18
  50. ansible/galaxy/data/network/cliconf_plugins/example.py.j2 +1 -2
  51. ansible/galaxy/data/network/library/example_command.py.j2 +1 -2
  52. ansible/galaxy/data/network/library/example_config.py.j2 +1 -2
  53. ansible/galaxy/data/network/library/example_facts.py.j2 +1 -2
  54. ansible/galaxy/data/network/meta/main.yml.j2 +0 -15
  55. ansible/galaxy/data/network/module_utils/example.py.j2 +1 -2
  56. ansible/galaxy/data/network/netconf_plugins/example.py.j2 +1 -2
  57. ansible/galaxy/data/network/terminal_plugins/example.py.j2 +1 -2
  58. ansible/galaxy/dependency_resolution/__init__.py +1 -2
  59. ansible/galaxy/dependency_resolution/dataclasses.py +5 -6
  60. ansible/galaxy/dependency_resolution/errors.py +1 -2
  61. ansible/galaxy/dependency_resolution/providers.py +3 -4
  62. ansible/galaxy/dependency_resolution/reporters.py +2 -3
  63. ansible/galaxy/dependency_resolution/resolvers.py +1 -2
  64. ansible/galaxy/dependency_resolution/versioning.py +1 -2
  65. ansible/galaxy/role.py +2 -3
  66. ansible/galaxy/token.py +1 -2
  67. ansible/galaxy/user_agent.py +1 -2
  68. ansible/inventory/data.py +1 -2
  69. ansible/inventory/group.py +1 -2
  70. ansible/inventory/helpers.py +1 -2
  71. ansible/inventory/host.py +1 -3
  72. ansible/inventory/manager.py +1 -2
  73. ansible/module_utils/_text.py +1 -2
  74. ansible/module_utils/ansible_release.py +3 -5
  75. ansible/module_utils/api.py +1 -2
  76. ansible/module_utils/basic.py +113 -158
  77. ansible/module_utils/common/_collections_compat.py +1 -2
  78. ansible/module_utils/common/_utils.py +1 -3
  79. ansible/module_utils/common/arg_spec.py +1 -2
  80. ansible/module_utils/common/collections.py +1 -2
  81. ansible/module_utils/common/dict_transformations.py +1 -2
  82. ansible/module_utils/common/file.py +10 -5
  83. ansible/module_utils/common/json.py +1 -3
  84. ansible/module_utils/common/locale.py +1 -2
  85. ansible/module_utils/common/network.py +2 -3
  86. ansible/module_utils/common/parameters.py +9 -9
  87. ansible/module_utils/common/process.py +12 -5
  88. ansible/module_utils/common/respawn.py +2 -3
  89. ansible/module_utils/common/sys_info.py +1 -2
  90. ansible/module_utils/common/text/converters.py +1 -2
  91. ansible/module_utils/common/text/formatters.py +1 -2
  92. ansible/module_utils/common/validation.py +5 -6
  93. ansible/module_utils/common/warnings.py +1 -2
  94. ansible/module_utils/common/yaml.py +1 -2
  95. ansible/module_utils/compat/datetime.py +1 -3
  96. ansible/module_utils/compat/importlib.py +21 -13
  97. ansible/module_utils/compat/paramiko.py +1 -2
  98. ansible/module_utils/compat/selectors.py +10 -34
  99. ansible/module_utils/compat/selinux.py +1 -2
  100. ansible/module_utils/compat/typing.py +1 -2
  101. ansible/module_utils/compat/version.py +1 -2
  102. ansible/module_utils/connection.py +1 -2
  103. ansible/module_utils/csharp/Ansible.Basic.cs +20 -3
  104. ansible/module_utils/distro/__init__.py +3 -4
  105. ansible/module_utils/distro/_distro.py +230 -234
  106. ansible/module_utils/errors.py +1 -2
  107. ansible/module_utils/facts/__init__.py +1 -2
  108. ansible/module_utils/facts/ansible_collector.py +1 -2
  109. ansible/module_utils/facts/collector.py +1 -2
  110. ansible/module_utils/facts/compat.py +1 -2
  111. ansible/module_utils/facts/default_collectors.py +1 -2
  112. ansible/module_utils/facts/hardware/aix.py +1 -2
  113. ansible/module_utils/facts/hardware/base.py +1 -2
  114. ansible/module_utils/facts/hardware/darwin.py +1 -2
  115. ansible/module_utils/facts/hardware/dragonfly.py +1 -2
  116. ansible/module_utils/facts/hardware/freebsd.py +1 -2
  117. ansible/module_utils/facts/hardware/hpux.py +1 -2
  118. ansible/module_utils/facts/hardware/hurd.py +1 -2
  119. ansible/module_utils/facts/hardware/linux.py +8 -6
  120. ansible/module_utils/facts/hardware/netbsd.py +1 -2
  121. ansible/module_utils/facts/hardware/openbsd.py +1 -2
  122. ansible/module_utils/facts/hardware/sunos.py +2 -3
  123. ansible/module_utils/facts/namespace.py +1 -2
  124. ansible/module_utils/facts/network/aix.py +1 -2
  125. ansible/module_utils/facts/network/base.py +1 -2
  126. ansible/module_utils/facts/network/darwin.py +1 -2
  127. ansible/module_utils/facts/network/dragonfly.py +1 -2
  128. ansible/module_utils/facts/network/fc_wwn.py +1 -2
  129. ansible/module_utils/facts/network/freebsd.py +1 -2
  130. ansible/module_utils/facts/network/generic_bsd.py +1 -2
  131. ansible/module_utils/facts/network/hpux.py +1 -2
  132. ansible/module_utils/facts/network/hurd.py +1 -2
  133. ansible/module_utils/facts/network/iscsi.py +1 -2
  134. ansible/module_utils/facts/network/linux.py +1 -2
  135. ansible/module_utils/facts/network/netbsd.py +1 -2
  136. ansible/module_utils/facts/network/nvme.py +1 -2
  137. ansible/module_utils/facts/network/openbsd.py +1 -2
  138. ansible/module_utils/facts/network/sunos.py +1 -2
  139. ansible/module_utils/facts/other/facter.py +1 -2
  140. ansible/module_utils/facts/other/ohai.py +1 -2
  141. ansible/module_utils/facts/packages.py +1 -2
  142. ansible/module_utils/facts/sysctl.py +1 -2
  143. ansible/module_utils/facts/system/apparmor.py +1 -2
  144. ansible/module_utils/facts/system/caps.py +1 -2
  145. ansible/module_utils/facts/system/chroot.py +1 -2
  146. ansible/module_utils/facts/system/cmdline.py +1 -2
  147. ansible/module_utils/facts/system/date_time.py +1 -2
  148. ansible/module_utils/facts/system/distribution.py +4 -5
  149. ansible/module_utils/facts/system/dns.py +1 -2
  150. ansible/module_utils/facts/system/env.py +1 -2
  151. ansible/module_utils/facts/system/fips.py +1 -2
  152. ansible/module_utils/facts/system/loadavg.py +1 -2
  153. ansible/module_utils/facts/system/local.py +1 -2
  154. ansible/module_utils/facts/system/lsb.py +1 -2
  155. ansible/module_utils/facts/system/pkg_mgr.py +7 -30
  156. ansible/module_utils/facts/system/platform.py +1 -2
  157. ansible/module_utils/facts/system/python.py +1 -2
  158. ansible/module_utils/facts/system/selinux.py +1 -2
  159. ansible/module_utils/facts/system/service_mgr.py +1 -2
  160. ansible/module_utils/facts/system/ssh_pub_keys.py +1 -2
  161. ansible/module_utils/facts/system/user.py +1 -2
  162. ansible/module_utils/facts/timeout.py +1 -2
  163. ansible/module_utils/facts/utils.py +1 -2
  164. ansible/module_utils/facts/virtual/base.py +1 -2
  165. ansible/module_utils/facts/virtual/dragonfly.py +1 -2
  166. ansible/module_utils/facts/virtual/freebsd.py +1 -2
  167. ansible/module_utils/facts/virtual/hpux.py +1 -2
  168. ansible/module_utils/facts/virtual/linux.py +1 -2
  169. ansible/module_utils/facts/virtual/netbsd.py +1 -2
  170. ansible/module_utils/facts/virtual/openbsd.py +1 -2
  171. ansible/module_utils/facts/virtual/sunos.py +1 -2
  172. ansible/module_utils/facts/virtual/sysctl.py +1 -2
  173. ansible/module_utils/json_utils.py +1 -2
  174. ansible/module_utils/parsing/convert_bool.py +1 -2
  175. ansible/module_utils/powershell/Ansible.ModuleUtils.Legacy.psm1 +5 -2
  176. ansible/module_utils/powershell/Ansible.ModuleUtils.WebRequest.psm1 +1 -1
  177. ansible/module_utils/pycompat24.py +24 -4
  178. ansible/module_utils/service.py +31 -5
  179. ansible/module_utils/six/__init__.py +1 -1
  180. ansible/module_utils/splitter.py +1 -2
  181. ansible/module_utils/urls.py +335 -1052
  182. ansible/module_utils/yumdnf.py +13 -35
  183. ansible/modules/add_host.py +1 -2
  184. ansible/modules/apt.py +38 -22
  185. ansible/modules/apt_key.py +1 -2
  186. ansible/modules/apt_repository.py +18 -10
  187. ansible/modules/assemble.py +1 -2
  188. ansible/modules/assert.py +8 -4
  189. ansible/modules/async_status.py +17 -14
  190. ansible/modules/async_wrapper.py +11 -9
  191. ansible/modules/blockinfile.py +2 -3
  192. ansible/modules/command.py +1 -2
  193. ansible/modules/copy.py +4 -76
  194. ansible/modules/cron.py +3 -3
  195. ansible/modules/deb822_repository.py +5 -5
  196. ansible/modules/debconf.py +19 -8
  197. ansible/modules/debug.py +1 -2
  198. ansible/modules/dnf.py +39 -46
  199. ansible/modules/dnf5.py +28 -26
  200. ansible/modules/dpkg_selections.py +1 -2
  201. ansible/modules/expect.py +23 -15
  202. ansible/modules/fail.py +1 -2
  203. ansible/modules/fetch.py +1 -2
  204. ansible/modules/file.py +4 -3
  205. ansible/modules/find.py +18 -5
  206. ansible/modules/gather_facts.py +1 -2
  207. ansible/modules/get_url.py +2 -3
  208. ansible/modules/getent.py +2 -3
  209. ansible/modules/git.py +28 -17
  210. ansible/modules/group.py +1 -2
  211. ansible/modules/group_by.py +1 -2
  212. ansible/modules/hostname.py +2 -19
  213. ansible/modules/import_playbook.py +1 -2
  214. ansible/modules/import_role.py +9 -2
  215. ansible/modules/import_tasks.py +1 -2
  216. ansible/modules/include_role.py +1 -2
  217. ansible/modules/include_tasks.py +1 -2
  218. ansible/modules/include_vars.py +1 -2
  219. ansible/modules/iptables.py +38 -21
  220. ansible/modules/known_hosts.py +15 -8
  221. ansible/modules/lineinfile.py +1 -6
  222. ansible/modules/meta.py +3 -2
  223. ansible/modules/package.py +6 -5
  224. ansible/modules/package_facts.py +1 -2
  225. ansible/modules/pause.py +2 -3
  226. ansible/modules/ping.py +1 -2
  227. ansible/modules/pip.py +40 -20
  228. ansible/modules/raw.py +1 -2
  229. ansible/modules/reboot.py +1 -2
  230. ansible/modules/replace.py +7 -5
  231. ansible/modules/rpm_key.py +1 -2
  232. ansible/modules/script.py +1 -2
  233. ansible/modules/service.py +3 -21
  234. ansible/modules/service_facts.py +3 -12
  235. ansible/modules/set_fact.py +1 -2
  236. ansible/modules/set_stats.py +1 -2
  237. ansible/modules/setup.py +1 -2
  238. ansible/modules/shell.py +1 -2
  239. ansible/modules/slurp.py +1 -2
  240. ansible/modules/stat.py +1 -2
  241. ansible/modules/subversion.py +2 -3
  242. ansible/modules/systemd.py +12 -9
  243. ansible/modules/systemd_service.py +12 -9
  244. ansible/modules/sysvinit.py +7 -2
  245. ansible/modules/tempfile.py +7 -2
  246. ansible/modules/template.py +2 -3
  247. ansible/modules/unarchive.py +13 -3
  248. ansible/modules/uri.py +12 -15
  249. ansible/modules/user.py +11 -4
  250. ansible/modules/validate_argument_spec.py +15 -16
  251. ansible/modules/wait_for.py +1 -2
  252. ansible/modules/wait_for_connection.py +1 -2
  253. ansible/modules/yum_repository.py +2 -3
  254. ansible/parsing/__init__.py +1 -3
  255. ansible/parsing/ajson.py +1 -3
  256. ansible/parsing/dataloader.py +23 -12
  257. ansible/parsing/mod_args.py +6 -4
  258. ansible/parsing/plugin_docs.py +1 -2
  259. ansible/parsing/quoting.py +1 -3
  260. ansible/parsing/splitter.py +1 -3
  261. ansible/parsing/utils/__init__.py +1 -3
  262. ansible/parsing/utils/addresses.py +1 -3
  263. ansible/parsing/utils/jsonify.py +1 -3
  264. ansible/parsing/utils/yaml.py +1 -3
  265. ansible/parsing/vault/__init__.py +6 -8
  266. ansible/parsing/yaml/__init__.py +1 -3
  267. ansible/parsing/yaml/constructor.py +1 -3
  268. ansible/parsing/yaml/dumper.py +1 -3
  269. ansible/parsing/yaml/loader.py +1 -3
  270. ansible/parsing/yaml/objects.py +1 -3
  271. ansible/playbook/__init__.py +1 -3
  272. ansible/playbook/attribute.py +1 -3
  273. ansible/playbook/base.py +2 -3
  274. ansible/playbook/block.py +1 -3
  275. ansible/playbook/collectionsearch.py +1 -2
  276. ansible/playbook/conditional.py +1 -3
  277. ansible/playbook/delegatable.py +1 -0
  278. ansible/playbook/handler.py +2 -4
  279. ansible/playbook/handler_task_include.py +1 -3
  280. ansible/playbook/helpers.py +1 -4
  281. ansible/playbook/included_file.py +4 -4
  282. ansible/playbook/loop_control.py +1 -3
  283. ansible/playbook/notifiable.py +1 -0
  284. ansible/playbook/play.py +1 -3
  285. ansible/playbook/play_context.py +1 -3
  286. ansible/playbook/playbook_include.py +1 -3
  287. ansible/playbook/role/__init__.py +1 -3
  288. ansible/playbook/role/definition.py +1 -3
  289. ansible/playbook/role/include.py +1 -3
  290. ansible/playbook/role/metadata.py +1 -3
  291. ansible/playbook/role/requirement.py +1 -3
  292. ansible/playbook/role_include.py +2 -10
  293. ansible/playbook/taggable.py +1 -3
  294. ansible/playbook/task.py +2 -4
  295. ansible/playbook/task_include.py +1 -3
  296. ansible/plugins/__init__.py +4 -5
  297. ansible/plugins/action/__init__.py +19 -13
  298. ansible/plugins/action/add_host.py +2 -4
  299. ansible/plugins/action/assemble.py +2 -3
  300. ansible/plugins/action/assert.py +1 -2
  301. ansible/plugins/action/async_status.py +1 -2
  302. ansible/plugins/action/command.py +1 -2
  303. ansible/plugins/action/copy.py +12 -9
  304. ansible/plugins/action/debug.py +1 -2
  305. ansible/plugins/action/dnf.py +4 -4
  306. ansible/plugins/action/fail.py +1 -2
  307. ansible/plugins/action/fetch.py +2 -3
  308. ansible/plugins/action/gather_facts.py +3 -4
  309. ansible/plugins/action/group_by.py +1 -2
  310. ansible/plugins/action/include_vars.py +1 -2
  311. ansible/plugins/action/normal.py +1 -2
  312. ansible/plugins/action/package.py +36 -21
  313. ansible/plugins/action/pause.py +1 -2
  314. ansible/plugins/action/raw.py +2 -3
  315. ansible/plugins/action/reboot.py +30 -15
  316. ansible/plugins/action/script.py +3 -4
  317. ansible/plugins/action/service.py +1 -2
  318. ansible/plugins/action/set_fact.py +1 -2
  319. ansible/plugins/action/set_stats.py +1 -2
  320. ansible/plugins/action/shell.py +1 -2
  321. ansible/plugins/action/template.py +1 -2
  322. ansible/plugins/action/unarchive.py +1 -2
  323. ansible/plugins/action/uri.py +2 -3
  324. ansible/plugins/action/validate_argument_spec.py +1 -2
  325. ansible/plugins/action/wait_for_connection.py +2 -3
  326. ansible/plugins/become/__init__.py +1 -2
  327. ansible/plugins/become/runas.py +1 -2
  328. ansible/plugins/become/su.py +1 -2
  329. ansible/plugins/become/sudo.py +1 -2
  330. ansible/plugins/cache/__init__.py +3 -3
  331. ansible/plugins/cache/base.py +1 -2
  332. ansible/plugins/cache/jsonfile.py +1 -3
  333. ansible/plugins/cache/memory.py +1 -2
  334. ansible/plugins/callback/__init__.py +2 -4
  335. ansible/plugins/callback/default.py +2 -3
  336. ansible/plugins/callback/junit.py +1 -2
  337. ansible/plugins/callback/minimal.py +1 -3
  338. ansible/plugins/callback/oneline.py +1 -3
  339. ansible/plugins/callback/tree.py +1 -2
  340. ansible/plugins/cliconf/__init__.py +1 -2
  341. ansible/plugins/connection/__init__.py +4 -5
  342. ansible/plugins/connection/local.py +3 -4
  343. ansible/plugins/connection/paramiko_ssh.py +1 -2
  344. ansible/plugins/connection/psrp.py +1 -2
  345. ansible/plugins/connection/ssh.py +18 -54
  346. ansible/plugins/connection/winrm.py +3 -4
  347. ansible/plugins/doc_fragments/action_common_attributes.py +2 -3
  348. ansible/plugins/doc_fragments/action_core.py +3 -4
  349. ansible/plugins/doc_fragments/backup.py +1 -2
  350. ansible/plugins/doc_fragments/connection_pipelining.py +1 -2
  351. ansible/plugins/doc_fragments/constructed.py +1 -2
  352. ansible/plugins/doc_fragments/decrypt.py +2 -3
  353. ansible/plugins/doc_fragments/default_callback.py +1 -2
  354. ansible/plugins/doc_fragments/files.py +1 -2
  355. ansible/plugins/doc_fragments/inventory_cache.py +1 -2
  356. ansible/plugins/doc_fragments/result_format_callback.py +1 -2
  357. ansible/plugins/doc_fragments/return_common.py +1 -2
  358. ansible/plugins/doc_fragments/shell_common.py +1 -2
  359. ansible/plugins/doc_fragments/shell_windows.py +1 -2
  360. ansible/plugins/doc_fragments/template_common.py +1 -2
  361. ansible/plugins/doc_fragments/url.py +1 -2
  362. ansible/plugins/doc_fragments/url_windows.py +1 -2
  363. ansible/plugins/doc_fragments/validate.py +1 -2
  364. ansible/plugins/doc_fragments/vars_plugin_staging.py +1 -2
  365. ansible/plugins/filter/__init__.py +1 -2
  366. ansible/plugins/filter/b64decode.yml +8 -8
  367. ansible/plugins/filter/b64encode.yml +4 -4
  368. ansible/plugins/filter/comment.yml +1 -1
  369. ansible/plugins/filter/core.py +11 -9
  370. ansible/plugins/filter/encryption.py +1 -3
  371. ansible/plugins/filter/extract.yml +1 -1
  372. ansible/plugins/filter/from_yaml_all.yml +1 -1
  373. ansible/plugins/filter/human_readable.yml +3 -3
  374. ansible/plugins/filter/human_to_bytes.yml +2 -2
  375. ansible/plugins/filter/mandatory.yml +1 -1
  376. ansible/plugins/filter/mathstuff.py +2 -2
  377. ansible/plugins/filter/password_hash.yml +3 -2
  378. ansible/plugins/filter/regex_replace.yml +15 -0
  379. ansible/plugins/filter/regex_search.yml +12 -0
  380. ansible/plugins/filter/strftime.yml +2 -9
  381. ansible/plugins/filter/to_datetime.yml +17 -2
  382. ansible/plugins/filter/to_nice_json.yml +4 -0
  383. ansible/plugins/filter/union.yml +1 -1
  384. ansible/plugins/filter/urls.py +1 -2
  385. ansible/plugins/filter/urlsplit.py +1 -2
  386. ansible/plugins/filter/zip.yml +2 -2
  387. ansible/plugins/filter/zip_longest.yml +1 -1
  388. ansible/plugins/httpapi/__init__.py +1 -2
  389. ansible/plugins/inventory/__init__.py +2 -4
  390. ansible/plugins/inventory/advanced_host_list.py +1 -2
  391. ansible/plugins/inventory/auto.py +2 -3
  392. ansible/plugins/inventory/constructed.py +3 -2
  393. ansible/plugins/inventory/generator.py +1 -2
  394. ansible/plugins/inventory/host_list.py +1 -2
  395. ansible/plugins/inventory/ini.py +1 -2
  396. ansible/plugins/inventory/script.py +122 -3
  397. ansible/plugins/inventory/toml.py +1 -2
  398. ansible/plugins/inventory/yaml.py +3 -4
  399. ansible/plugins/list.py +2 -3
  400. ansible/plugins/loader.py +10 -11
  401. ansible/plugins/lookup/__init__.py +1 -3
  402. ansible/plugins/lookup/config.py +19 -15
  403. ansible/plugins/lookup/csvfile.py +16 -7
  404. ansible/plugins/lookup/dict.py +2 -3
  405. ansible/plugins/lookup/env.py +4 -4
  406. ansible/plugins/lookup/file.py +1 -2
  407. ansible/plugins/lookup/fileglob.py +1 -2
  408. ansible/plugins/lookup/first_found.py +8 -7
  409. ansible/plugins/lookup/indexed_items.py +1 -2
  410. ansible/plugins/lookup/ini.py +6 -3
  411. ansible/plugins/lookup/inventory_hostnames.py +1 -2
  412. ansible/plugins/lookup/items.py +1 -2
  413. ansible/plugins/lookup/lines.py +1 -2
  414. ansible/plugins/lookup/list.py +1 -3
  415. ansible/plugins/lookup/nested.py +1 -2
  416. ansible/plugins/lookup/password.py +16 -14
  417. ansible/plugins/lookup/pipe.py +1 -2
  418. ansible/plugins/lookup/random_choice.py +1 -2
  419. ansible/plugins/lookup/sequence.py +21 -52
  420. ansible/plugins/lookup/subelements.py +1 -2
  421. ansible/plugins/lookup/template.py +1 -2
  422. ansible/plugins/lookup/together.py +1 -2
  423. ansible/plugins/lookup/unvault.py +1 -2
  424. ansible/plugins/lookup/url.py +9 -11
  425. ansible/plugins/lookup/varnames.py +1 -2
  426. ansible/plugins/lookup/vars.py +1 -2
  427. ansible/plugins/netconf/__init__.py +1 -2
  428. ansible/plugins/shell/__init__.py +3 -4
  429. ansible/plugins/shell/cmd.py +1 -2
  430. ansible/plugins/shell/powershell.py +1 -2
  431. ansible/plugins/shell/sh.py +1 -2
  432. ansible/plugins/strategy/__init__.py +33 -21
  433. ansible/plugins/strategy/debug.py +1 -2
  434. ansible/plugins/strategy/free.py +17 -7
  435. ansible/plugins/strategy/host_pinned.py +1 -3
  436. ansible/plugins/strategy/linear.py +22 -22
  437. ansible/plugins/terminal/__init__.py +2 -3
  438. ansible/plugins/test/__init__.py +1 -2
  439. ansible/plugins/test/change.yml +1 -1
  440. ansible/plugins/test/changed.yml +1 -1
  441. ansible/plugins/test/contains.yml +1 -1
  442. ansible/plugins/test/core.py +2 -4
  443. ansible/plugins/test/exists.yml +1 -1
  444. ansible/plugins/test/failed.yml +1 -1
  445. ansible/plugins/test/failure.yml +1 -1
  446. ansible/plugins/test/files.py +1 -3
  447. ansible/plugins/test/finished.yml +3 -3
  448. ansible/plugins/test/issuperset.yml +1 -1
  449. ansible/plugins/test/match.yml +1 -1
  450. ansible/plugins/test/mathstuff.py +1 -2
  451. ansible/plugins/test/reachable.yml +1 -1
  452. ansible/plugins/test/regex.yml +1 -1
  453. ansible/plugins/test/search.yml +1 -1
  454. ansible/plugins/test/skip.yml +1 -1
  455. ansible/plugins/test/skipped.yml +1 -1
  456. ansible/plugins/test/started.yml +1 -1
  457. ansible/plugins/test/succeeded.yml +1 -1
  458. ansible/plugins/test/success.yml +1 -1
  459. ansible/plugins/test/successful.yml +1 -1
  460. ansible/plugins/test/superset.yml +1 -1
  461. ansible/plugins/test/unreachable.yml +1 -1
  462. ansible/plugins/test/uri.py +1 -3
  463. ansible/plugins/vars/__init__.py +1 -2
  464. ansible/plugins/vars/host_group_vars.py +2 -3
  465. ansible/release.py +3 -5
  466. ansible/template/__init__.py +14 -27
  467. ansible/template/native_helpers.py +1 -3
  468. ansible/template/template.py +1 -3
  469. ansible/template/vars.py +1 -0
  470. ansible/utils/__init__.py +1 -3
  471. ansible/utils/cmd_functions.py +1 -2
  472. ansible/utils/collection_loader/__init__.py +1 -2
  473. ansible/utils/collection_loader/_collection_config.py +1 -2
  474. ansible/utils/collection_loader/_collection_finder.py +1 -2
  475. ansible/utils/collection_loader/_collection_meta.py +1 -2
  476. ansible/utils/color.py +1 -2
  477. ansible/utils/context_objects.py +1 -4
  478. ansible/utils/display.py +89 -30
  479. ansible/utils/encrypt.py +4 -105
  480. ansible/utils/fqcn.py +1 -2
  481. ansible/utils/galaxy.py +1 -3
  482. ansible/utils/hashing.py +1 -3
  483. ansible/utils/helpers.py +1 -3
  484. ansible/utils/jsonrpc.py +1 -2
  485. ansible/utils/listify.py +1 -3
  486. ansible/utils/lock.py +1 -3
  487. ansible/utils/multiprocessing.py +1 -3
  488. ansible/utils/native_jinja.py +1 -3
  489. ansible/utils/path.py +1 -2
  490. ansible/utils/plugin_docs.py +7 -6
  491. ansible/utils/py3compat.py +17 -55
  492. ansible/utils/sentinel.py +1 -3
  493. ansible/utils/shlex.py +1 -3
  494. ansible/utils/singleton.py +1 -3
  495. ansible/utils/ssh_functions.py +1 -3
  496. ansible/utils/unicode.py +1 -3
  497. ansible/utils/unsafe_proxy.py +1 -2
  498. ansible/utils/vars.py +6 -8
  499. ansible/utils/version.py +1 -3
  500. ansible/vars/clean.py +1 -3
  501. ansible/vars/fact_cache.py +1 -2
  502. ansible/vars/hostvars.py +3 -7
  503. ansible/vars/manager.py +24 -6
  504. ansible/vars/reserved.py +1 -3
  505. {ansible_core-2.16.7rc1.data → ansible_core-2.17.0.data}/scripts/ansible-test +1 -2
  506. {ansible_core-2.16.7rc1.dist-info → ansible_core-2.17.0.dist-info}/METADATA +3 -3
  507. ansible_core-2.17.0.dist-info/RECORD +987 -0
  508. ansible_test/__init__.py +1 -2
  509. ansible_test/_data/completion/docker.txt +7 -9
  510. ansible_test/_data/completion/remote.txt +6 -7
  511. ansible_test/_data/requirements/ansible-test.txt +0 -2
  512. ansible_test/_data/requirements/constraints.txt +1 -6
  513. ansible_test/_data/requirements/sanity.ansible-doc.txt +3 -3
  514. ansible_test/_data/requirements/sanity.changelog.txt +3 -3
  515. ansible_test/_data/requirements/sanity.import.plugin.txt +2 -2
  516. ansible_test/_data/requirements/sanity.mypy.txt +12 -12
  517. ansible_test/_data/requirements/sanity.pep8.txt +1 -1
  518. ansible_test/_data/requirements/sanity.pylint.txt +7 -7
  519. ansible_test/_data/requirements/sanity.runtime-metadata.txt +1 -1
  520. ansible_test/_data/requirements/sanity.validate-modules.txt +3 -3
  521. ansible_test/_data/requirements/sanity.yamllint.txt +2 -2
  522. ansible_test/_internal/bootstrap.py +2 -2
  523. ansible_test/_internal/classification/__init__.py +0 -5
  524. ansible_test/_internal/commands/integration/cloud/cs.py +1 -1
  525. ansible_test/_internal/commands/integration/cloud/nios.py +1 -1
  526. ansible_test/_internal/commands/sanity/__init__.py +1 -27
  527. ansible_test/_internal/commands/sanity/import.py +0 -18
  528. ansible_test/_internal/commands/sanity/mypy.py +7 -10
  529. ansible_test/_internal/commands/units/__init__.py +1 -1
  530. ansible_test/_internal/config.py +0 -1
  531. ansible_test/_internal/content_config.py +0 -5
  532. ansible_test/_internal/coverage_util.py +0 -1
  533. ansible_test/_internal/docker_util.py +1 -1
  534. ansible_test/_internal/host_profiles.py +5 -4
  535. ansible_test/_internal/pypi_proxy.py +1 -8
  536. ansible_test/_internal/python_requirements.py +1 -119
  537. ansible_test/_internal/ssh.py +1 -0
  538. ansible_test/_internal/util.py +1 -1
  539. ansible_test/_internal/util_common.py +1 -1
  540. ansible_test/_internal/venv.py +10 -108
  541. ansible_test/_util/__init__.py +1 -2
  542. ansible_test/_util/controller/sanity/mypy/ansible-core.ini +0 -6
  543. ansible_test/_util/controller/sanity/mypy/modules.ini +0 -6
  544. ansible_test/_util/controller/sanity/pylint/config/ansible-test-target.cfg +0 -1
  545. ansible_test/_util/controller/sanity/pylint/config/ansible-test.cfg +0 -1
  546. ansible_test/_util/controller/sanity/pylint/config/code-smell.cfg +0 -1
  547. ansible_test/_util/controller/sanity/pylint/config/collection.cfg +0 -1
  548. ansible_test/_util/controller/sanity/pylint/config/default.cfg +0 -1
  549. ansible_test/_util/controller/sanity/pylint/plugins/deprecated.py +1 -2
  550. ansible_test/_util/controller/sanity/shellcheck/exclude.txt +0 -1
  551. ansible_test/_util/controller/sanity/validate-modules/validate_modules/main.py +31 -59
  552. ansible_test/_util/controller/sanity/validate-modules/validate_modules/module_args.py +0 -7
  553. ansible_test/_util/controller/sanity/validate-modules/validate_modules/schema.py +10 -2
  554. ansible_test/_util/controller/sanity/validate-modules/validate_modules/utils.py +1 -1
  555. ansible_test/_util/controller/sanity/yamllint/yamllinter.py +16 -4
  556. ansible_test/_util/target/__init__.py +1 -2
  557. ansible_test/_util/target/cli/ansible_test_cli_stub.py +1 -2
  558. ansible_test/_util/target/common/constants.py +1 -4
  559. ansible_test/_util/target/injector/python.py +4 -19
  560. ansible_test/_util/target/pytest/plugins/ansible_forked.py +2 -9
  561. ansible_test/_util/target/pytest/plugins/ansible_pytest_collections.py +1 -5
  562. ansible_test/_util/target/pytest/plugins/ansible_pytest_coverage.py +1 -2
  563. ansible_test/_util/target/sanity/compile/compile.py +3 -12
  564. ansible_test/_util/target/sanity/import/importer.py +1 -12
  565. ansible_test/_util/target/setup/bootstrap.sh +49 -105
  566. ansible_test/_util/target/setup/probe_cgroups.py +1 -2
  567. ansible_test/_util/target/setup/quiet_pip.py +1 -16
  568. ansible_test/_util/target/setup/requirements.py +9 -2
  569. ansible_test/_util/target/tools/virtualenvcheck.py +1 -2
  570. ansible_test/_util/target/tools/yamlcheck.py +1 -2
  571. ansible/module_utils/common/_json_compat.py +0 -16
  572. ansible/module_utils/compat/_selectors2.py +0 -655
  573. ansible/modules/yum.py +0 -1821
  574. ansible/plugins/action/yum.py +0 -111
  575. ansible_core-2.16.7rc1.dist-info/RECORD +0 -1009
  576. ansible_test/_util/controller/sanity/code-smell/future-import-boilerplate.json +0 -7
  577. ansible_test/_util/controller/sanity/code-smell/future-import-boilerplate.py +0 -46
  578. ansible_test/_util/controller/sanity/code-smell/metaclass-boilerplate.json +0 -7
  579. ansible_test/_util/controller/sanity/code-smell/metaclass-boilerplate.py +0 -44
  580. ansible_test/_util/controller/sanity/code-smell/no-basestring.json +0 -7
  581. ansible_test/_util/controller/sanity/code-smell/no-basestring.py +0 -21
  582. ansible_test/_util/controller/sanity/code-smell/no-dict-iteritems.json +0 -7
  583. ansible_test/_util/controller/sanity/code-smell/no-dict-iteritems.py +0 -21
  584. ansible_test/_util/controller/sanity/code-smell/no-dict-iterkeys.json +0 -7
  585. ansible_test/_util/controller/sanity/code-smell/no-dict-iterkeys.py +0 -21
  586. ansible_test/_util/controller/sanity/code-smell/no-dict-itervalues.json +0 -7
  587. ansible_test/_util/controller/sanity/code-smell/no-dict-itervalues.py +0 -21
  588. ansible_test/_util/controller/sanity/code-smell/no-main-display.json +0 -10
  589. ansible_test/_util/controller/sanity/code-smell/no-main-display.py +0 -21
  590. ansible_test/_util/controller/sanity/code-smell/no-unicode-literals.json +0 -7
  591. ansible_test/_util/controller/sanity/code-smell/no-unicode-literals.py +0 -21
  592. ansible_test/_util/controller/tools/sslcheck.py +0 -22
  593. ansible_test/_util/target/common/__init__.py +0 -2
  594. {ansible_core-2.16.7rc1.dist-info → ansible_core-2.17.0.dist-info}/COPYING +0 -0
  595. {ansible_core-2.16.7rc1.dist-info → ansible_core-2.17.0.dist-info}/WHEEL +0 -0
  596. {ansible_core-2.16.7rc1.dist-info → ansible_core-2.17.0.dist-info}/entry_points.txt +0 -0
  597. {ansible_core-2.16.7rc1.dist-info → ansible_core-2.17.0.dist-info}/top_level.txt +0 -0
@@ -3,9 +3,7 @@
3
3
  # Copyright: (c) 2018, Ansible Project
4
4
  # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
5
5
 
6
- # Make coding more python3-ish
7
- from __future__ import (absolute_import, division, print_function)
8
- __metaclass__ = type
6
+ from __future__ import annotations
9
7
 
10
8
  import base64
11
9
  import json
@@ -102,7 +100,7 @@ class ActionBase(ABC):
102
100
  etc) associated with this task.
103
101
  :returns: dictionary of results from the module
104
102
 
105
- Implementors of action modules may find the following variables especially useful:
103
+ Implementers of action modules may find the following variables especially useful:
106
104
 
107
105
  * Module parameters. These are stored in self._task.args
108
106
  """
@@ -117,11 +115,9 @@ class ActionBase(ABC):
117
115
  del tmp
118
116
 
119
117
  if self._task.async_val and not self._supports_async:
120
- raise AnsibleActionFail('async is not supported for this task.')
118
+ raise AnsibleActionFail('This action (%s) does not support async.' % self._task.action)
121
119
  elif self._task.check_mode and not self._supports_check_mode:
122
- raise AnsibleActionSkip('check mode is not supported for this task.')
123
- elif self._task.async_val and self._task.check_mode:
124
- raise AnsibleActionFail('check mode and async cannot be used on same task.')
120
+ raise AnsibleActionSkip('This action (%s) does not support check mode.' % self._task.action)
125
121
 
126
122
  # Error if invalid argument is passed
127
123
  if self._VALID_ARGS:
@@ -851,10 +847,13 @@ class ActionBase(ABC):
851
847
  path=path,
852
848
  follow=follow,
853
849
  get_checksum=checksum,
850
+ get_size=False, # ansible.windows.win_stat added this in 1.11.0
854
851
  checksum_algorithm='sha1',
855
852
  )
853
+ # Unknown opts are ignored as module_args could be specific for the
854
+ # module that is being executed.
856
855
  mystat = self._execute_module(module_name='ansible.legacy.stat', module_args=module_args, task_vars=all_vars,
857
- wrap_async=False)
856
+ wrap_async=False, ignore_unknown_opts=True)
858
857
 
859
858
  if mystat.get('failed'):
860
859
  msg = mystat.get('module_stderr')
@@ -938,7 +937,7 @@ class ActionBase(ABC):
938
937
  data = re.sub(r'^((\r)?\n)?BECOME-SUCCESS.*(\r)?\n', '', data)
939
938
  return data
940
939
 
941
- def _update_module_args(self, module_name, module_args, task_vars):
940
+ def _update_module_args(self, module_name, module_args, task_vars, ignore_unknown_opts: bool = False):
942
941
 
943
942
  # set check mode in the module arguments, if required
944
943
  if self._task.check_mode:
@@ -996,7 +995,14 @@ class ActionBase(ABC):
996
995
  # make sure the remote_tmp value is sent through in case modules needs to create their own
997
996
  module_args['_ansible_remote_tmp'] = self.get_shell_option('remote_tmp', default='~/.ansible/tmp')
998
997
 
999
- def _execute_module(self, module_name=None, module_args=None, tmp=None, task_vars=None, persist_files=False, delete_remote_tmp=None, wrap_async=False):
998
+ # tells the module to ignore options that are not in its argspec.
999
+ module_args['_ansible_ignore_unknown_opts'] = ignore_unknown_opts
1000
+
1001
+ # allow user to insert string to add context to remote loggging
1002
+ module_args['_ansible_target_log_info'] = C.config.get_config_value('TARGET_LOG_INFO', variables=task_vars)
1003
+
1004
+ def _execute_module(self, module_name=None, module_args=None, tmp=None, task_vars=None, persist_files=False, delete_remote_tmp=None, wrap_async=False,
1005
+ ignore_unknown_opts: bool = False):
1000
1006
  '''
1001
1007
  Transfer and run a module along with its arguments.
1002
1008
  '''
@@ -1032,7 +1038,7 @@ class ActionBase(ABC):
1032
1038
  if module_args is None:
1033
1039
  module_args = self._task.args
1034
1040
 
1035
- self._update_module_args(module_name, module_args, task_vars)
1041
+ self._update_module_args(module_name, module_args, task_vars, ignore_unknown_opts=ignore_unknown_opts)
1036
1042
 
1037
1043
  remove_async_dir = None
1038
1044
  if wrap_async or self._task.async_val:
@@ -1157,7 +1163,7 @@ class ActionBase(ABC):
1157
1163
  if data.pop("_ansible_suppress_tmpdir_delete", False):
1158
1164
  self._cleanup_remote_tmp = False
1159
1165
 
1160
- # NOTE: yum returns results .. but that made it 'compatible' with squashing, so we allow mappings, for now
1166
+ # NOTE: dnf returns results .. but that made it 'compatible' with squashing, so we allow mappings, for now
1161
1167
  if 'results' in data and (not isinstance(data['results'], Sequence) or isinstance(data['results'], string_types)):
1162
1168
  data['ansible_module_results'] = data['results']
1163
1169
  del data['results']
@@ -16,9 +16,7 @@
16
16
  # You should have received a copy of the GNU General Public License
17
17
  # along with Ansible. If not, see <http://www.gnu.org/licenses/>.
18
18
 
19
- # Make coding more python3-ish
20
- from __future__ import (absolute_import, division, print_function)
21
- __metaclass__ = type
19
+ from __future__ import annotations
22
20
 
23
21
  from collections.abc import Mapping
24
22
 
@@ -51,7 +49,7 @@ class ActionModule(ActionBase):
51
49
  # TODO: create 'conflict' detection in base class to deal with repeats and aliases and warn user
52
50
  args = combine_vars(raw, args)
53
51
  else:
54
- raise AnsibleActionFail('Invalid raw parameters passed, requires a dictonary/mapping got a %s' % type(raw))
52
+ raise AnsibleActionFail('Invalid raw parameters passed, requires a dictionary/mapping got a %s' % type(raw))
55
53
 
56
54
  # Parse out any hostname:port patterns
57
55
  new_name = args.get('name', args.get('hostname', args.get('host', None)))
@@ -16,8 +16,7 @@
16
16
  # GNU General Public License for more details.
17
17
  #
18
18
  # You should have received a copy of the GNU General Public License
19
- from __future__ import (absolute_import, division, print_function)
20
- __metaclass__ = type
19
+ from __future__ import annotations
21
20
 
22
21
  import codecs
23
22
  import os
@@ -140,7 +139,7 @@ class ActionModule(ActionBase):
140
139
 
141
140
  if path_checksum != dest_stat['checksum']:
142
141
 
143
- if self._play_context.diff:
142
+ if self._task.diff:
144
143
  diff = self._get_diff_data(dest, path, task_vars)
145
144
 
146
145
  remote_path = self._connection._shell.join_path(self._connection._shell.tmpdir, 'src')
@@ -14,8 +14,7 @@
14
14
  #
15
15
  # You should have received a copy of the GNU General Public License
16
16
  # along with Ansible. If not, see <http://www.gnu.org/licenses/>.
17
- from __future__ import (absolute_import, division, print_function)
18
- __metaclass__ = type
17
+ from __future__ import annotations
19
18
 
20
19
  from ansible.errors import AnsibleError
21
20
  from ansible.playbook.conditional import Conditional
@@ -1,8 +1,7 @@
1
1
  # Copyright: (c) 2018, Ansible Project
2
2
  # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
3
3
 
4
- from __future__ import (absolute_import, division, print_function)
5
- __metaclass__ = type
4
+ from __future__ import annotations
6
5
 
7
6
  from ansible.plugins.action import ActionBase
8
7
  from ansible.utils.vars import merge_hash
@@ -1,8 +1,7 @@
1
1
  # Copyright: (c) 2017, Ansible Project
2
2
  # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
3
3
 
4
- from __future__ import (absolute_import, division, print_function)
5
- __metaclass__ = type
4
+ from __future__ import annotations
6
5
 
7
6
  from ansible.plugins.action import ActionBase
8
7
  from ansible.utils.vars import merge_hash
@@ -16,9 +16,7 @@
16
16
  # You should have received a copy of the GNU General Public License
17
17
  # along with Ansible. If not, see <http://www.gnu.org/licenses/>.
18
18
 
19
- # Make coding more python3-ish
20
- from __future__ import (absolute_import, division, print_function)
21
- __metaclass__ = type
19
+ from __future__ import annotations
22
20
 
23
21
  import json
24
22
  import os
@@ -151,7 +149,7 @@ def _walk_dirs(topdir, base_path=None, local_follow=False, trailing_slash_detect
151
149
  new_parents.add((parent_stat.st_dev, parent_stat.st_ino))
152
150
 
153
151
  if (dir_stats.st_dev, dir_stats.st_ino) in new_parents:
154
- # This was a a circular symlink. So add it as
152
+ # This was a circular symlink. So add it as
155
153
  # a symlink
156
154
  r_files['symlinks'].append((os.readlink(dirpath), dest_dirpath))
157
155
  else:
@@ -212,7 +210,7 @@ class ActionModule(ActionBase):
212
210
  # NOTE: do not add to this. This should be made a generic function for action plugins.
213
211
  # This should also use the same argspec as the module instead of keeping it in sync.
214
212
  if 'invocation' not in result:
215
- if self._play_context.no_log:
213
+ if self._task.no_log:
216
214
  result['invocation'] = "CENSORED: no_log is set"
217
215
  else:
218
216
  # NOTE: Should be removed in the future. For now keep this broken
@@ -285,16 +283,21 @@ class ActionModule(ActionBase):
285
283
  if local_checksum != dest_status['checksum']:
286
284
  # The checksums don't match and we will change or error out.
287
285
 
288
- if self._play_context.diff and not raw:
286
+ if self._task.diff and not raw:
289
287
  result['diff'].append(self._get_diff_data(dest_file, source_full, task_vars, content))
290
288
 
291
- if self._play_context.check_mode:
289
+ if self._task.check_mode:
292
290
  self._remove_tempfile_if_content_defined(content, content_tempfile)
293
291
  result['changed'] = True
294
292
  return result
295
293
 
296
294
  # Define a remote directory that we will copy the file to.
297
- tmp_src = self._connection._shell.join_path(self._connection._shell.tmpdir, 'source')
295
+ tmp_src = self._connection._shell.join_path(self._connection._shell.tmpdir, '.source')
296
+
297
+ # ensure we keep suffix for validate
298
+ suffix = os.path.splitext(dest_file)[1]
299
+ if suffix:
300
+ tmp_src += suffix
298
301
 
299
302
  remote_path = None
300
303
 
@@ -387,7 +390,7 @@ class ActionModule(ActionBase):
387
390
 
388
391
  def _create_content_tempfile(self, content):
389
392
  ''' Create a tempfile containing defined content '''
390
- fd, content_tempfile = tempfile.mkstemp(dir=C.DEFAULT_LOCAL_TMP)
393
+ fd, content_tempfile = tempfile.mkstemp(dir=C.DEFAULT_LOCAL_TMP, prefix='.')
391
394
  f = os.fdopen(fd, 'wb')
392
395
  content = to_bytes(content)
393
396
  try:
@@ -15,8 +15,7 @@
15
15
  #
16
16
  # You should have received a copy of the GNU General Public License
17
17
  # along with Ansible. If not, see <http://www.gnu.org/licenses/>.
18
- from __future__ import (absolute_import, division, print_function)
19
- __metaclass__ = type
18
+ from __future__ import annotations
20
19
 
21
20
  from ansible.errors import AnsibleUndefinedVariable
22
21
  from ansible.module_utils.six import string_types
@@ -1,5 +1,6 @@
1
1
  # Copyright: (c) 2023, Ansible Project
2
2
  # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
3
+ from __future__ import annotations
3
4
 
4
5
  from ansible.errors import AnsibleActionFail
5
6
  from ansible.plugins.action import ActionBase
@@ -7,10 +8,9 @@ from ansible.utils.display import Display
7
8
 
8
9
  display = Display()
9
10
 
10
- VALID_BACKENDS = frozenset(("dnf", "dnf4", "dnf5"))
11
+ VALID_BACKENDS = frozenset(("yum", "yum4", "dnf", "dnf4", "dnf5"))
11
12
 
12
13
 
13
- # FIXME mostly duplicate of the yum action plugin
14
14
  class ActionModule(ActionBase):
15
15
 
16
16
  TRANSFERS_FILES = False
@@ -28,7 +28,7 @@ class ActionModule(ActionBase):
28
28
 
29
29
  module = self._task.args.get('use', self._task.args.get('use_backend', 'auto'))
30
30
 
31
- if module == 'auto':
31
+ if module in {'yum', 'auto'}:
32
32
  try:
33
33
  if self._task.delegate_to: # if we delegate, we should use delegated host's facts
34
34
  module = self._templar.template("{{hostvars['%s']['ansible_facts']['pkg_mgr']}}" % self._task.delegate_to)
@@ -56,7 +56,7 @@ class ActionModule(ActionBase):
56
56
  )
57
57
 
58
58
  else:
59
- if module == "dnf4":
59
+ if module in {"yum4", "dnf4"}:
60
60
  module = "dnf"
61
61
 
62
62
  # eliminate collisions with collections search while still allowing local override
@@ -15,8 +15,7 @@
15
15
  #
16
16
  # You should have received a copy of the GNU General Public License
17
17
  # along with Ansible. If not, see <http://www.gnu.org/licenses/>.
18
- from __future__ import (absolute_import, division, print_function)
19
- __metaclass__ = type
18
+ from __future__ import annotations
20
19
 
21
20
  from ansible.plugins.action import ActionBase
22
21
 
@@ -14,8 +14,7 @@
14
14
  #
15
15
  # You should have received a copy of the GNU General Public License
16
16
  # along with Ansible. If not, see <http://www.gnu.org/licenses/>.
17
- from __future__ import (absolute_import, division, print_function)
18
- __metaclass__ = type
17
+ from __future__ import annotations
19
18
 
20
19
  import os
21
20
  import base64
@@ -42,7 +41,7 @@ class ActionModule(ActionBase):
42
41
  del tmp # tmp no longer has any effect
43
42
 
44
43
  try:
45
- if self._play_context.check_mode:
44
+ if self._task.check_mode:
46
45
  raise AnsibleActionSkip('check mode not (yet) supported for this module')
47
46
 
48
47
  source = self._task.args.get('src', None)
@@ -1,8 +1,7 @@
1
1
  # Copyright (c) 2017 Ansible Project
2
2
  # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
3
3
 
4
- from __future__ import (absolute_import, division, print_function)
5
- __metaclass__ = type
4
+ from __future__ import annotations
6
5
 
7
6
  import os
8
7
  import time
@@ -26,7 +25,7 @@ class ActionModule(ActionBase):
26
25
  # deal with 'setup specific arguments'
27
26
  if fact_module not in C._ACTION_SETUP:
28
27
 
29
- # TODO: remove in favor of controller side argspec detecing valid arguments
28
+ # TODO: remove in favor of controller side argspec detecting valid arguments
30
29
  # network facts modules must support gather_subset
31
30
  try:
32
31
  name = self._connection.ansible_name.removeprefix('ansible.netcommon.')
@@ -123,7 +122,7 @@ class ActionModule(ActionBase):
123
122
  mod_args = self._get_module_args(fact_module, task_vars)
124
123
 
125
124
  # if module does not handle timeout, use timeout to handle module, hijack async_val as this is what async_wrapper uses
126
- # TODO: make this action compain about async/async settings, use parallel option instead .. or remove parallel in favor of async settings?
125
+ # TODO: make this action complain about async/async settings, use parallel option instead .. or remove parallel in favor of async settings?
127
126
  if timeout and 'gather_timeout' not in mod_args:
128
127
  self._task.async_val = int(timeout)
129
128
  elif async_val != 0:
@@ -14,8 +14,7 @@
14
14
  #
15
15
  # You should have received a copy of the GNU General Public License
16
16
  # along with Ansible. If not, see <http://www.gnu.org/licenses/>.
17
- from __future__ import (absolute_import, division, print_function)
18
- __metaclass__ = type
17
+ from __future__ import annotations
19
18
 
20
19
  from ansible.plugins.action import ActionBase
21
20
  from ansible.module_utils.six import string_types
@@ -1,8 +1,7 @@
1
1
  # Copyright: (c) 2016, Allen Sanabria <asanabria@linuxdynasty.org>
2
2
  # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
3
3
 
4
- from __future__ import (absolute_import, division, print_function)
5
- __metaclass__ = type
4
+ from __future__ import annotations
6
5
 
7
6
  from os import path, walk
8
7
  import re
@@ -14,8 +14,7 @@
14
14
  #
15
15
  # You should have received a copy of the GNU General Public License
16
16
  # along with Ansible. If not, see <http://www.gnu.org/licenses/>.
17
- from __future__ import (absolute_import, division, print_function)
18
- __metaclass__ = type
17
+ from __future__ import annotations
19
18
 
20
19
  from ansible import constants as C
21
20
  from ansible.plugins.action import ActionBase
@@ -14,14 +14,14 @@
14
14
  #
15
15
  # You should have received a copy of the GNU General Public License
16
16
  # along with Ansible. If not, see <http://www.gnu.org/licenses/>.
17
- from __future__ import (absolute_import, division, print_function)
18
- __metaclass__ = type
17
+ from __future__ import annotations
19
18
 
20
19
  from ansible.errors import AnsibleAction, AnsibleActionFail
21
20
  from ansible.executor.module_common import get_action_args_with_defaults
22
21
  from ansible.module_utils.facts.system.pkg_mgr import PKG_MGRS
23
22
  from ansible.plugins.action import ActionBase
24
23
  from ansible.utils.display import Display
24
+ from ansible.utils.vars import combine_vars
25
25
 
26
26
  display = Display()
27
27
 
@@ -39,31 +39,46 @@ class ActionModule(ActionBase):
39
39
  self._supports_async = True
40
40
 
41
41
  result = super(ActionModule, self).run(tmp, task_vars)
42
- del tmp # tmp no longer has any effect
43
42
 
44
43
  module = self._task.args.get('use', 'auto')
45
44
 
46
- if module == 'auto':
47
- try:
48
- if self._task.delegate_to: # if we delegate, we should use delegated host's facts
49
- module = self._templar.template("{{hostvars['%s']['ansible_facts']['pkg_mgr']}}" % self._task.delegate_to)
50
- else:
51
- module = self._templar.template('{{ansible_facts.pkg_mgr}}')
52
- except Exception:
53
- pass # could not get it from template!
54
-
55
45
  try:
56
46
  if module == 'auto':
57
- facts = self._execute_module(
58
- module_name='ansible.legacy.setup',
59
- module_args=dict(filter='ansible_pkg_mgr', gather_subset='!all'),
60
- task_vars=task_vars)
61
- display.debug("Facts %s" % facts)
62
- module = facts.get('ansible_facts', {}).get('ansible_pkg_mgr', 'auto')
63
-
64
- if module != 'auto':
47
+
48
+ if self._task.delegate_to:
49
+ hosts_vars = task_vars['hostvars'][self._task.delegate_to]
50
+ tvars = combine_vars(self._task.vars, task_vars.get('delegated_vars', {}))
51
+ else:
52
+ hosts_vars = task_vars
53
+ tvars = task_vars
54
+
55
+ # use config
56
+ module = tvars.get('ansible_package_use', None)
57
+
58
+ if not module:
59
+ # no use, no config, get from facts
60
+ if hosts_vars.get('ansible_facts', {}).get('pkg_mgr', False):
61
+ facts = hosts_vars
62
+ pmgr = 'pkg_mgr'
63
+ else:
64
+ # we had no facts, so generate them
65
+ # very expensive step, we actually run fact gathering because we don't have facts for this host.
66
+ facts = self._execute_module(
67
+ module_name='ansible.legacy.setup',
68
+ module_args=dict(filter='ansible_pkg_mgr', gather_subset='!all'),
69
+ task_vars=task_vars,
70
+ )
71
+ pmgr = 'ansible_pkg_mgr'
72
+
73
+ try:
74
+ # actually get from facts
75
+ module = facts['ansible_facts'][pmgr]
76
+ except KeyError:
77
+ raise AnsibleActionFail('Could not detect a package manager. Try using the "use" option.')
78
+
79
+ if module and module != 'auto':
65
80
  if not self._shared_loader_obj.module_loader.has_plugin(module):
66
- raise AnsibleActionFail('Could not find a module for %s.' % module)
81
+ raise AnsibleActionFail('Could not find a matching action for the "%s" package manager.' % module)
67
82
  else:
68
83
  # run the 'package' module
69
84
  new_module_args = self._task.args.copy()
@@ -14,8 +14,7 @@
14
14
  #
15
15
  # You should have received a copy of the GNU General Public License
16
16
  # along with Ansible. If not, see <http://www.gnu.org/licenses/>.
17
- from __future__ import (absolute_import, division, print_function)
18
- __metaclass__ = type
17
+ from __future__ import annotations
19
18
 
20
19
  import datetime
21
20
  import time
@@ -14,8 +14,7 @@
14
14
  #
15
15
  # You should have received a copy of the GNU General Public License
16
16
  # along with Ansible. If not, see <http://www.gnu.org/licenses/>.
17
- from __future__ import (absolute_import, division, print_function)
18
- __metaclass__ = type
17
+ from __future__ import annotations
19
18
 
20
19
  from ansible.plugins.action import ActionBase
21
20
 
@@ -33,7 +32,7 @@ class ActionModule(ActionBase):
33
32
  result = super(ActionModule, self).run(tmp, task_vars)
34
33
  del tmp # tmp no longer has any effect
35
34
 
36
- if self._play_context.check_mode:
35
+ if self._task.check_mode:
37
36
  # in --check mode, always skip this module execution
38
37
  result['skipped'] = True
39
38
  return result
@@ -2,8 +2,7 @@
2
2
  # Copyright: (c) 2018, Sam Doran <sdoran@redhat.com>
3
3
  # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
4
4
 
5
- from __future__ import (absolute_import, division, print_function)
6
- __metaclass__ = type
5
+ from __future__ import annotations
7
6
 
8
7
  import random
9
8
  import time
@@ -241,9 +240,13 @@ class ActionModule(ActionBase):
241
240
  try:
242
241
  display.debug("{action}: setting connect_timeout to {value}".format(action=self._task.action, value=connect_timeout))
243
242
  self._connection.set_option("connection_timeout", connect_timeout)
244
- self._connection.reset()
245
- except AttributeError:
246
- display.warning("Connection plugin does not allow the connection timeout to be overridden")
243
+ except AnsibleError:
244
+ try:
245
+ self._connection.set_option("timeout", connect_timeout)
246
+ except (AnsibleError, AttributeError):
247
+ display.warning("Connection plugin does not allow the connection timeout to be overridden")
248
+
249
+ self._connection.reset()
247
250
 
248
251
  # try and get boot time
249
252
  try:
@@ -373,17 +376,25 @@ class ActionModule(ActionBase):
373
376
  try:
374
377
  connect_timeout = self._connection.get_option('connection_timeout')
375
378
  except KeyError:
376
- pass
379
+ try:
380
+ connect_timeout = self._connection.get_option('timeout')
381
+ except KeyError:
382
+ pass
377
383
  else:
378
384
  if original_connection_timeout != connect_timeout:
379
385
  try:
380
- display.debug("{action}: setting connect_timeout back to original value of {value}".format(
381
- action=self._task.action,
382
- value=original_connection_timeout))
383
- self._connection.set_option("connection_timeout", original_connection_timeout)
386
+ display.debug("{action}: setting connect_timeout/timeout back to original value of {value}".format(action=self._task.action,
387
+ value=original_connection_timeout))
388
+ try:
389
+ self._connection.set_option("connection_timeout", original_connection_timeout)
390
+ except AnsibleError:
391
+ try:
392
+ self._connection.set_option("timeout", original_connection_timeout)
393
+ except AnsibleError:
394
+ raise
395
+ # reset the connection to clear the custom connection timeout
384
396
  self._connection.reset()
385
397
  except (AnsibleError, AttributeError) as e:
386
- # reset the connection to clear the custom connection timeout
387
398
  display.debug("{action}: failed to reset connection_timeout back to default: {error}".format(action=self._task.action,
388
399
  error=to_text(e)))
389
400
 
@@ -409,14 +420,13 @@ class ActionModule(ActionBase):
409
420
 
410
421
  def run(self, tmp=None, task_vars=None):
411
422
  self._supports_check_mode = True
412
- self._supports_async = True
413
423
 
414
424
  # If running with local connection, fail so we don't reboot ourselves
415
425
  if self._connection.transport == 'local':
416
426
  msg = 'Running {0} with local connection would reboot the control node.'.format(self._task.action)
417
427
  return {'changed': False, 'elapsed': 0, 'rebooted': False, 'failed': True, 'msg': msg}
418
428
 
419
- if self._play_context.check_mode:
429
+ if self._task.check_mode:
420
430
  return {'changed': True, 'elapsed': 0, 'rebooted': True}
421
431
 
422
432
  if task_vars is None:
@@ -442,11 +452,16 @@ class ActionModule(ActionBase):
442
452
 
443
453
  # Get the original connection_timeout option var so it can be reset after
444
454
  original_connection_timeout = None
455
+
456
+ display.debug("{action}: saving original connect_timeout of {timeout}".format(action=self._task.action, timeout=original_connection_timeout))
445
457
  try:
446
458
  original_connection_timeout = self._connection.get_option('connection_timeout')
447
- display.debug("{action}: saving original connect_timeout of {timeout}".format(action=self._task.action, timeout=original_connection_timeout))
448
459
  except KeyError:
449
- display.debug("{action}: connect_timeout connection option has not been set".format(action=self._task.action))
460
+ try:
461
+ original_connection_timeout = self._connection.get_option('timeout')
462
+ except KeyError:
463
+ display.debug("{action}: connect_timeout connection option has not been set".format(action=self._task.action))
464
+
450
465
  # Initiate reboot
451
466
  reboot_result = self.perform_reboot(task_vars, distribution)
452
467
 
@@ -14,8 +14,7 @@
14
14
  #
15
15
  # You should have received a copy of the GNU General Public License
16
16
  # along with Ansible. If not, see <http://www.gnu.org/licenses/>.
17
- from __future__ import (absolute_import, division, print_function)
18
- __metaclass__ = type
17
+ from __future__ import annotations
19
18
 
20
19
  import os
21
20
  import re
@@ -151,11 +150,11 @@ class ActionModule(ActionBase):
151
150
  # like become and environment args
152
151
  if getattr(self._connection._shell, "_IS_WINDOWS", False):
153
152
  # FUTURE: use a more public method to get the exec payload
154
- pc = self._play_context
153
+ pc = self._task
155
154
  exec_data = ps_manifest._create_powershell_wrapper(
156
155
  to_bytes(script_cmd), source, {}, env_dict, self._task.async_val,
157
156
  pc.become, pc.become_method, pc.become_user,
158
- pc.become_pass, pc.become_flags, "script", task_vars, None
157
+ self._play_context.become_pass, pc.become_flags, "script", task_vars, None
159
158
  )
160
159
  # build the necessary exec wrapper command
161
160
  # FUTURE: this still doesn't let script work on Windows with non-pipelined connections or
@@ -14,8 +14,7 @@
14
14
  #
15
15
  # You should have received a copy of the GNU General Public License
16
16
  # along with Ansible. If not, see <http://www.gnu.org/licenses/>.
17
- from __future__ import (absolute_import, division, print_function)
18
- __metaclass__ = type
17
+ from __future__ import annotations
19
18
 
20
19
 
21
20
  from ansible.errors import AnsibleAction, AnsibleActionFail
@@ -15,8 +15,7 @@
15
15
  # You should have received a copy of the GNU General Public License
16
16
  # along with Ansible. If not, see <http://www.gnu.org/licenses/>.
17
17
 
18
- from __future__ import (absolute_import, division, print_function)
19
- __metaclass__ = type
18
+ from __future__ import annotations
20
19
 
21
20
  from ansible.errors import AnsibleActionFail
22
21
  from ansible.module_utils.six import string_types
@@ -15,8 +15,7 @@
15
15
  # You should have received a copy of the GNU General Public License
16
16
  # along with Ansible. If not, see <http://www.gnu.org/licenses/>.
17
17
 
18
- from __future__ import (absolute_import, division, print_function)
19
- __metaclass__ = type
18
+ from __future__ import annotations
20
19
 
21
20
  from ansible.module_utils.parsing.convert_bool import boolean
22
21
  from ansible.plugins.action import ActionBase
@@ -1,8 +1,7 @@
1
1
  # Copyright: (c) 2017, Ansible Project
2
2
  # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
3
3
 
4
- from __future__ import (absolute_import, division, print_function)
5
- __metaclass__ = type
4
+ from __future__ import annotations
6
5
 
7
6
  from ansible.errors import AnsibleActionFail
8
7
  from ansible.plugins.action import ActionBase