ansible-core 2.15.4rc1__py3-none-any.whl → 2.16.0b2__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 (427) hide show
  1. ansible/cli/__init__.py +3 -3
  2. ansible/cli/adhoc.py +1 -1
  3. ansible/cli/arguments/option_helpers.py +15 -5
  4. ansible/cli/config.py +2 -2
  5. ansible/cli/console.py +21 -17
  6. ansible/cli/doc.py +8 -9
  7. ansible/cli/galaxy.py +60 -27
  8. ansible/cli/inventory.py +1 -1
  9. ansible/cli/playbook.py +1 -1
  10. ansible/cli/pull.py +2 -2
  11. ansible/cli/scripts/ansible_connection_cli_stub.py +1 -1
  12. ansible/cli/vault.py +11 -6
  13. ansible/collections/__init__.py +0 -29
  14. ansible/collections/list.py +23 -44
  15. ansible/config/ansible_builtin_runtime.yml +8 -4
  16. ansible/config/base.yml +34 -22
  17. ansible/config/manager.py +1 -1
  18. ansible/constants.py +3 -5
  19. ansible/errors/__init__.py +1 -1
  20. ansible/executor/interpreter_discovery.py +1 -1
  21. ansible/executor/module_common.py +39 -32
  22. ansible/executor/play_iterator.py +0 -15
  23. ansible/executor/playbook_executor.py +3 -3
  24. ansible/executor/powershell/module_manifest.py +1 -1
  25. ansible/executor/powershell/module_wrapper.ps1 +4 -1
  26. ansible/executor/process/worker.py +22 -7
  27. ansible/executor/task_executor.py +39 -40
  28. ansible/executor/task_queue_manager.py +8 -11
  29. ansible/galaxy/__init__.py +1 -1
  30. ansible/galaxy/api.py +8 -11
  31. ansible/galaxy/collection/__init__.py +17 -4
  32. ansible/galaxy/collection/concrete_artifact_manager.py +7 -2
  33. ansible/galaxy/collection/galaxy_api_proxy.py +1 -1
  34. ansible/galaxy/data/container/README.md +3 -5
  35. ansible/galaxy/dependency_resolution/__init__.py +1 -6
  36. ansible/galaxy/dependency_resolution/dataclasses.py +22 -1
  37. ansible/galaxy/dependency_resolution/providers.py +61 -69
  38. ansible/galaxy/role.py +31 -13
  39. ansible/galaxy/token.py +2 -2
  40. ansible/inventory/group.py +1 -1
  41. ansible/inventory/manager.py +1 -1
  42. ansible/module_utils/ansible_release.py +2 -2
  43. ansible/module_utils/basic.py +11 -41
  44. ansible/module_utils/common/file.py +0 -100
  45. ansible/module_utils/common/json.py +1 -1
  46. ansible/module_utils/common/locale.py +1 -1
  47. ansible/module_utils/common/text/converters.py +2 -2
  48. ansible/module_utils/common/validation.py +1 -1
  49. ansible/module_utils/compat/_selectors2.py +4 -4
  50. ansible/module_utils/compat/datetime.py +40 -0
  51. ansible/module_utils/compat/selinux.py +1 -1
  52. ansible/module_utils/compat/typing.py +1 -1
  53. ansible/module_utils/connection.py +1 -1
  54. ansible/module_utils/facts/hardware/linux.py +2 -2
  55. ansible/module_utils/facts/hardware/openbsd.py +1 -1
  56. ansible/module_utils/facts/network/linux.py +3 -3
  57. ansible/module_utils/facts/other/facter.py +8 -15
  58. ansible/module_utils/facts/sysctl.py +1 -1
  59. ansible/module_utils/facts/system/date_time.py +2 -2
  60. ansible/module_utils/facts/system/distribution.py +1 -1
  61. ansible/module_utils/facts/system/local.py +6 -2
  62. ansible/module_utils/facts/system/pkg_mgr.py +6 -1
  63. ansible/module_utils/facts/system/service_mgr.py +4 -2
  64. ansible/module_utils/parsing/convert_bool.py +1 -1
  65. ansible/module_utils/service.py +9 -6
  66. ansible/module_utils/urls.py +40 -22
  67. ansible/modules/add_host.py +2 -2
  68. ansible/modules/apt.py +48 -31
  69. ansible/modules/apt_key.py +4 -4
  70. ansible/modules/apt_repository.py +5 -5
  71. ansible/modules/assemble.py +7 -7
  72. ansible/modules/assert.py +1 -1
  73. ansible/modules/async_status.py +11 -7
  74. ansible/modules/async_wrapper.py +1 -1
  75. ansible/modules/blockinfile.py +60 -17
  76. ansible/modules/command.py +37 -15
  77. ansible/modules/copy.py +35 -30
  78. ansible/modules/cron.py +14 -14
  79. ansible/modules/deb822_repository.py +4 -3
  80. ansible/modules/debconf.py +35 -14
  81. ansible/modules/debug.py +1 -1
  82. ansible/modules/dnf.py +29 -27
  83. ansible/modules/dnf5.py +22 -22
  84. ansible/modules/dpkg_selections.py +9 -2
  85. ansible/modules/expect.py +4 -4
  86. ansible/modules/fetch.py +7 -7
  87. ansible/modules/file.py +30 -30
  88. ansible/modules/find.py +82 -22
  89. ansible/modules/gather_facts.py +6 -2
  90. ansible/modules/get_url.py +29 -29
  91. ansible/modules/getent.py +4 -4
  92. ansible/modules/git.py +27 -27
  93. ansible/modules/group.py +5 -12
  94. ansible/modules/hostname.py +21 -2
  95. ansible/modules/include_role.py +5 -5
  96. ansible/modules/include_tasks.py +2 -2
  97. ansible/modules/include_vars.py +5 -5
  98. ansible/modules/iptables.py +70 -65
  99. ansible/modules/known_hosts.py +7 -7
  100. ansible/modules/lineinfile.py +33 -33
  101. ansible/modules/meta.py +13 -13
  102. ansible/modules/package.py +8 -8
  103. ansible/modules/package_facts.py +3 -3
  104. ansible/modules/pause.py +2 -2
  105. ansible/modules/ping.py +5 -5
  106. ansible/modules/pip.py +80 -46
  107. ansible/modules/reboot.py +8 -4
  108. ansible/modules/replace.py +20 -15
  109. ansible/modules/rpm_key.py +2 -2
  110. ansible/modules/script.py +16 -10
  111. ansible/modules/service.py +26 -98
  112. ansible/modules/service_facts.py +36 -12
  113. ansible/modules/set_fact.py +2 -2
  114. ansible/modules/set_stats.py +2 -2
  115. ansible/modules/setup.py +18 -18
  116. ansible/modules/shell.py +3 -3
  117. ansible/modules/stat.py +9 -30
  118. ansible/modules/subversion.py +9 -9
  119. ansible/modules/systemd.py +20 -19
  120. ansible/modules/systemd_service.py +20 -19
  121. ansible/modules/sysvinit.py +26 -21
  122. ansible/modules/tempfile.py +5 -4
  123. ansible/modules/template.py +60 -6
  124. ansible/modules/unarchive.py +21 -18
  125. ansible/modules/uri.py +39 -39
  126. ansible/modules/user.py +81 -53
  127. ansible/modules/wait_for.py +22 -21
  128. ansible/modules/wait_for_connection.py +4 -4
  129. ansible/modules/yum.py +38 -38
  130. ansible/modules/yum_repository.py +58 -80
  131. ansible/parsing/dataloader.py +27 -27
  132. ansible/parsing/mod_args.py +1 -1
  133. ansible/parsing/plugin_docs.py +3 -3
  134. ansible/parsing/splitter.py +14 -16
  135. ansible/parsing/utils/yaml.py +1 -1
  136. ansible/parsing/vault/__init__.py +8 -6
  137. ansible/parsing/yaml/constructor.py +1 -1
  138. ansible/parsing/yaml/objects.py +1 -1
  139. ansible/playbook/__init__.py +1 -1
  140. ansible/playbook/base.py +2 -2
  141. ansible/playbook/block.py +0 -1
  142. ansible/playbook/conditional.py +40 -114
  143. ansible/playbook/helpers.py +5 -28
  144. ansible/playbook/included_file.py +8 -7
  145. ansible/playbook/play.py +1 -1
  146. ansible/playbook/play_context.py +2 -2
  147. ansible/playbook/playbook_include.py +2 -2
  148. ansible/playbook/role/__init__.py +1 -1
  149. ansible/playbook/role/include.py +1 -1
  150. ansible/playbook/role/metadata.py +1 -1
  151. ansible/playbook/role_include.py +1 -1
  152. ansible/playbook/task.py +2 -2
  153. ansible/playbook/task_include.py +1 -24
  154. ansible/plugins/__init__.py +13 -5
  155. ansible/plugins/action/__init__.py +17 -43
  156. ansible/plugins/action/add_host.py +2 -3
  157. ansible/plugins/action/assemble.py +1 -1
  158. ansible/plugins/action/assert.py +2 -1
  159. ansible/plugins/action/copy.py +2 -2
  160. ansible/plugins/action/debug.py +2 -1
  161. ansible/plugins/action/fail.py +1 -0
  162. ansible/plugins/action/fetch.py +3 -1
  163. ansible/plugins/action/gather_facts.py +37 -13
  164. ansible/plugins/action/group_by.py +1 -0
  165. ansible/plugins/action/include_vars.py +3 -2
  166. ansible/plugins/action/normal.py +3 -3
  167. ansible/plugins/action/pause.py +1 -1
  168. ansible/plugins/action/reboot.py +21 -16
  169. ansible/plugins/action/script.py +23 -8
  170. ansible/plugins/action/set_fact.py +1 -0
  171. ansible/plugins/action/set_stats.py +1 -0
  172. ansible/plugins/action/shell.py +6 -0
  173. ansible/plugins/action/template.py +1 -1
  174. ansible/plugins/action/unarchive.py +1 -1
  175. ansible/plugins/action/uri.py +1 -1
  176. ansible/plugins/action/validate_argument_spec.py +1 -0
  177. ansible/plugins/action/wait_for_connection.py +4 -4
  178. ansible/plugins/become/__init__.py +1 -1
  179. ansible/plugins/become/su.py +1 -1
  180. ansible/plugins/cache/__init__.py +1 -1
  181. ansible/plugins/callback/junit.py +1 -1
  182. ansible/plugins/callback/oneline.py +1 -1
  183. ansible/plugins/callback/tree.py +1 -1
  184. ansible/plugins/cliconf/__init__.py +2 -2
  185. ansible/plugins/connection/__init__.py +65 -37
  186. ansible/plugins/connection/local.py +9 -8
  187. ansible/plugins/connection/paramiko_ssh.py +34 -28
  188. ansible/plugins/connection/psrp.py +56 -43
  189. ansible/plugins/connection/ssh.py +67 -43
  190. ansible/plugins/connection/winrm.py +77 -30
  191. ansible/plugins/doc_fragments/constructed.py +4 -4
  192. ansible/plugins/doc_fragments/files.py +12 -12
  193. ansible/plugins/doc_fragments/inventory_cache.py +0 -6
  194. ansible/plugins/doc_fragments/result_format_callback.py +5 -5
  195. ansible/plugins/doc_fragments/shell_common.py +2 -2
  196. ansible/plugins/doc_fragments/shell_windows.py +1 -1
  197. ansible/plugins/doc_fragments/template_common.py +6 -6
  198. ansible/plugins/doc_fragments/url.py +10 -10
  199. ansible/plugins/doc_fragments/url_windows.py +15 -15
  200. ansible/plugins/doc_fragments/vars_plugin_staging.py +4 -4
  201. ansible/plugins/filter/b64decode.yml +1 -1
  202. ansible/plugins/filter/b64encode.yml +2 -2
  203. ansible/plugins/filter/bool.yml +5 -5
  204. ansible/plugins/filter/combine.yml +1 -1
  205. ansible/plugins/filter/commonpath.yml +2 -1
  206. ansible/plugins/filter/core.py +6 -8
  207. ansible/plugins/filter/dict2items.yml +11 -1
  208. ansible/plugins/filter/difference.yml +1 -0
  209. ansible/plugins/filter/encryption.py +1 -1
  210. ansible/plugins/filter/extract.yml +1 -1
  211. ansible/plugins/filter/flatten.yml +1 -1
  212. ansible/plugins/filter/from_yaml.yml +1 -1
  213. ansible/plugins/filter/from_yaml_all.yml +2 -2
  214. ansible/plugins/filter/hash.yml +1 -1
  215. ansible/plugins/filter/human_readable.yml +1 -1
  216. ansible/plugins/filter/human_to_bytes.yml +2 -2
  217. ansible/plugins/filter/intersect.yml +1 -0
  218. ansible/plugins/filter/mandatory.yml +7 -0
  219. ansible/plugins/filter/mathstuff.py +15 -17
  220. ansible/plugins/filter/normpath.yml +1 -1
  221. ansible/plugins/filter/path_join.yml +8 -1
  222. ansible/plugins/filter/realpath.yml +3 -2
  223. ansible/plugins/filter/regex_findall.yml +8 -2
  224. ansible/plugins/filter/regex_replace.yml +9 -3
  225. ansible/plugins/filter/regex_search.yml +8 -2
  226. ansible/plugins/filter/relpath.yml +2 -2
  227. ansible/plugins/filter/root.yml +1 -1
  228. ansible/plugins/filter/splitext.yml +1 -1
  229. ansible/plugins/filter/subelements.yml +2 -2
  230. ansible/plugins/filter/symmetric_difference.yml +1 -0
  231. ansible/plugins/filter/ternary.yml +5 -5
  232. ansible/plugins/filter/to_json.yml +7 -7
  233. ansible/plugins/filter/to_nice_json.yml +5 -5
  234. ansible/plugins/filter/to_yaml.yml +2 -2
  235. ansible/plugins/filter/type_debug.yml +1 -1
  236. ansible/plugins/filter/union.yml +1 -0
  237. ansible/plugins/filter/unvault.yml +2 -2
  238. ansible/plugins/filter/urldecode.yml +13 -32
  239. ansible/plugins/filter/urlsplit.py +1 -1
  240. ansible/plugins/filter/vault.yml +1 -1
  241. ansible/plugins/filter/zip.yml +1 -1
  242. ansible/plugins/filter/zip_longest.yml +1 -1
  243. ansible/plugins/inventory/__init__.py +1 -1
  244. ansible/plugins/inventory/advanced_host_list.py +1 -1
  245. ansible/plugins/inventory/constructed.py +2 -2
  246. ansible/plugins/inventory/host_list.py +1 -1
  247. ansible/plugins/inventory/ini.py +6 -3
  248. ansible/plugins/inventory/script.py +8 -2
  249. ansible/plugins/inventory/toml.py +1 -1
  250. ansible/plugins/inventory/yaml.py +1 -1
  251. ansible/plugins/list.py +21 -17
  252. ansible/plugins/loader.py +66 -88
  253. ansible/plugins/lookup/__init__.py +1 -1
  254. ansible/plugins/lookup/config.py +16 -6
  255. ansible/plugins/lookup/csvfile.py +7 -4
  256. ansible/plugins/lookup/env.py +1 -1
  257. ansible/plugins/lookup/file.py +5 -2
  258. ansible/plugins/lookup/fileglob.py +5 -2
  259. ansible/plugins/lookup/first_found.py +20 -14
  260. ansible/plugins/lookup/ini.py +6 -3
  261. ansible/plugins/lookup/lines.py +2 -1
  262. ansible/plugins/lookup/password.py +7 -7
  263. ansible/plugins/lookup/pipe.py +1 -0
  264. ansible/plugins/lookup/random_choice.py +2 -2
  265. ansible/plugins/lookup/sequence.py +1 -1
  266. ansible/plugins/lookup/subelements.py +2 -2
  267. ansible/plugins/lookup/template.py +4 -1
  268. ansible/plugins/lookup/unvault.py +4 -1
  269. ansible/plugins/lookup/url.py +6 -6
  270. ansible/plugins/lookup/varnames.py +1 -1
  271. ansible/plugins/netconf/__init__.py +3 -3
  272. ansible/plugins/shell/__init__.py +1 -1
  273. ansible/plugins/shell/cmd.py +7 -7
  274. ansible/plugins/shell/powershell.py +1 -1
  275. ansible/plugins/strategy/__init__.py +8 -10
  276. ansible/plugins/strategy/free.py +1 -1
  277. ansible/plugins/strategy/linear.py +3 -3
  278. ansible/plugins/terminal/__init__.py +2 -2
  279. ansible/plugins/test/abs.yml +1 -1
  280. ansible/plugins/test/all.yml +1 -1
  281. ansible/plugins/test/any.yml +1 -1
  282. ansible/plugins/test/change.yml +2 -2
  283. ansible/plugins/test/changed.yml +2 -2
  284. ansible/plugins/test/contains.yml +1 -1
  285. ansible/plugins/test/core.py +1 -1
  286. ansible/plugins/test/directory.yml +1 -1
  287. ansible/plugins/test/exists.yml +3 -2
  288. ansible/plugins/test/failed.yml +2 -2
  289. ansible/plugins/test/failure.yml +2 -2
  290. ansible/plugins/test/falsy.yml +2 -2
  291. ansible/plugins/test/file.yml +1 -1
  292. ansible/plugins/test/finished.yml +2 -2
  293. ansible/plugins/test/is_abs.yml +1 -1
  294. ansible/plugins/test/is_dir.yml +1 -1
  295. ansible/plugins/test/is_file.yml +1 -1
  296. ansible/plugins/test/is_link.yml +1 -1
  297. ansible/plugins/test/is_mount.yml +1 -1
  298. ansible/plugins/test/is_same_file.yml +1 -1
  299. ansible/plugins/test/isnan.yml +1 -1
  300. ansible/plugins/test/issubset.yml +1 -2
  301. ansible/plugins/test/issuperset.yml +1 -2
  302. ansible/plugins/test/link.yml +1 -1
  303. ansible/plugins/test/link_exists.yml +1 -1
  304. ansible/plugins/test/match.yml +2 -2
  305. ansible/plugins/test/mount.yml +1 -1
  306. ansible/plugins/test/nan.yml +1 -1
  307. ansible/plugins/test/reachable.yml +2 -2
  308. ansible/plugins/test/regex.yml +1 -1
  309. ansible/plugins/test/same_file.yml +1 -1
  310. ansible/plugins/test/search.yml +2 -2
  311. ansible/plugins/test/skip.yml +3 -3
  312. ansible/plugins/test/skipped.yml +3 -3
  313. ansible/plugins/test/started.yml +2 -2
  314. ansible/plugins/test/subset.yml +1 -2
  315. ansible/plugins/test/succeeded.yml +2 -2
  316. ansible/plugins/test/success.yml +2 -2
  317. ansible/plugins/test/successful.yml +2 -2
  318. ansible/plugins/test/superset.yml +1 -2
  319. ansible/plugins/test/truthy.yml +3 -3
  320. ansible/plugins/test/unreachable.yml +2 -2
  321. ansible/plugins/test/uri.yml +1 -1
  322. ansible/plugins/test/url.yml +1 -1
  323. ansible/plugins/test/urn.yml +1 -1
  324. ansible/plugins/test/vault_encrypted.yml +1 -1
  325. ansible/plugins/test/version.yml +7 -7
  326. ansible/plugins/test/version_compare.yml +7 -7
  327. ansible/plugins/vars/host_group_vars.py +1 -1
  328. ansible/release.py +2 -2
  329. ansible/template/__init__.py +24 -26
  330. ansible/template/native_helpers.py +1 -1
  331. ansible/template/vars.py +1 -1
  332. ansible/utils/_junit_xml.py +1 -1
  333. ansible/utils/cmd_functions.py +1 -1
  334. ansible/utils/collection_loader/_collection_finder.py +12 -1
  335. ansible/utils/display.py +113 -62
  336. ansible/utils/encrypt.py +11 -14
  337. ansible/utils/hashing.py +1 -1
  338. ansible/utils/jsonrpc.py +1 -1
  339. ansible/utils/path.py +1 -1
  340. ansible/utils/plugin_docs.py +1 -1
  341. ansible/utils/py3compat.py +1 -1
  342. ansible/utils/shlex.py +2 -10
  343. ansible/utils/ssh_functions.py +5 -4
  344. ansible/utils/unicode.py +1 -1
  345. ansible/utils/unsafe_proxy.py +1 -1
  346. ansible/utils/vars.py +4 -29
  347. ansible/vars/hostvars.py +1 -2
  348. ansible/vars/manager.py +13 -9
  349. ansible/vars/plugins.py +2 -2
  350. {ansible_core-2.15.4rc1.dist-info → ansible_core-2.16.0b2.dist-info}/COPYING +4 -5
  351. {ansible_core-2.15.4rc1.dist-info → ansible_core-2.16.0b2.dist-info}/METADATA +2 -4
  352. {ansible_core-2.15.4rc1.dist-info → ansible_core-2.16.0b2.dist-info}/RECORD +424 -425
  353. ansible_test/_data/completion/docker.txt +9 -9
  354. ansible_test/_data/completion/remote.txt +4 -7
  355. ansible_test/_data/completion/windows.txt +0 -2
  356. ansible_test/_data/requirements/ansible-test.txt +2 -1
  357. ansible_test/_data/requirements/ansible.txt +0 -3
  358. ansible_test/_data/requirements/constraints.txt +0 -2
  359. ansible_test/_data/requirements/sanity.ansible-doc.txt +3 -5
  360. ansible_test/_data/requirements/sanity.changelog.in +1 -2
  361. ansible_test/_data/requirements/sanity.changelog.txt +4 -6
  362. ansible_test/_data/requirements/sanity.import.plugin.txt +2 -4
  363. ansible_test/_data/requirements/sanity.import.txt +1 -3
  364. ansible_test/_data/requirements/sanity.integration-aliases.txt +1 -3
  365. ansible_test/_data/requirements/sanity.mypy.txt +12 -12
  366. ansible_test/_data/requirements/sanity.pep8.txt +1 -1
  367. ansible_test/_data/requirements/sanity.pylint.txt +6 -12
  368. ansible_test/_data/requirements/sanity.runtime-metadata.txt +1 -3
  369. ansible_test/_data/requirements/sanity.validate-modules.in +1 -1
  370. ansible_test/_data/requirements/sanity.validate-modules.txt +3 -5
  371. ansible_test/_data/requirements/sanity.yamllint.txt +3 -5
  372. ansible_test/_data/requirements/units.txt +0 -1
  373. ansible_test/_internal/ci/azp.py +4 -4
  374. ansible_test/_internal/cli/environments.py +0 -13
  375. ansible_test/_internal/commands/coverage/analyze/targets/__init__.py +4 -4
  376. ansible_test/_internal/commands/coverage/combine.py +1 -1
  377. ansible_test/_internal/commands/integration/cloud/acme.py +6 -8
  378. ansible_test/_internal/commands/integration/cloud/cs.py +4 -9
  379. ansible_test/_internal/commands/integration/cloud/galaxy.py +103 -96
  380. ansible_test/_internal/commands/integration/cloud/httptester.py +0 -3
  381. ansible_test/_internal/commands/integration/cloud/nios.py +7 -9
  382. ansible_test/_internal/commands/integration/cloud/openshift.py +2 -7
  383. ansible_test/_internal/commands/integration/cloud/vcenter.py +11 -95
  384. ansible_test/_internal/commands/sanity/__init__.py +10 -0
  385. ansible_test/_internal/commands/sanity/import.py +8 -2
  386. ansible_test/_internal/commands/sanity/pylint.py +27 -1
  387. ansible_test/_internal/commands/units/__init__.py +2 -1
  388. ansible_test/_internal/config.py +0 -7
  389. ansible_test/_internal/containers.py +11 -56
  390. ansible_test/_internal/core_ci.py +0 -7
  391. ansible_test/_internal/coverage_util.py +8 -3
  392. ansible_test/_internal/delegation.py +0 -1
  393. ansible_test/_internal/diff.py +1 -1
  394. ansible_test/_internal/docker_util.py +9 -2
  395. ansible_test/_internal/host_profiles.py +6 -6
  396. ansible_test/_internal/http.py +1 -1
  397. ansible_test/_internal/junit_xml.py +1 -1
  398. ansible_test/_internal/pypi_proxy.py +1 -1
  399. ansible_test/_internal/python_requirements.py +3 -8
  400. ansible_test/_internal/util.py +1 -6
  401. ansible_test/_util/controller/sanity/code-smell/no-get-exception.json +4 -0
  402. ansible_test/_util/controller/sanity/code-smell/replace-urlopen.json +4 -0
  403. ansible_test/_util/controller/sanity/code-smell/use-compat-six.json +4 -0
  404. ansible_test/_util/controller/sanity/mypy/ansible-core.ini +3 -0
  405. ansible_test/_util/controller/sanity/pylint/config/ansible-test-target.cfg +2 -0
  406. ansible_test/_util/controller/sanity/pylint/config/ansible-test.cfg +0 -1
  407. ansible_test/_util/controller/sanity/pylint/config/collection.cfg +1 -0
  408. ansible_test/_util/controller/sanity/pylint/plugins/deprecated.py +172 -10
  409. ansible_test/_util/controller/sanity/pylint/plugins/string_format.py +13 -2
  410. ansible_test/_util/controller/sanity/pylint/plugins/unwanted.py +7 -1
  411. ansible_test/_util/controller/sanity/validate-modules/validate_modules/main.py +6 -6
  412. ansible_test/_util/controller/sanity/validate-modules/validate_modules/module_args.py +1 -1
  413. ansible_test/_util/controller/sanity/validate-modules/validate_modules/utils.py +1 -1
  414. ansible_test/_util/controller/sanity/yamllint/yamllinter.py +3 -3
  415. ansible_test/_util/controller/tools/collection_detail.py +2 -2
  416. ansible_test/_util/target/common/constants.py +2 -2
  417. ansible_test/_util/target/pytest/plugins/ansible_forked.py +103 -0
  418. ansible_test/_util/target/sanity/import/importer.py +0 -8
  419. ansible_test/_util/target/setup/bootstrap.sh +36 -16
  420. ansible_test/_util/target/setup/quiet_pip.py +0 -4
  421. ansible/modules/_include.py +0 -80
  422. ansible_test/_internal/commands/integration/cloud/foreman.py +0 -102
  423. ansible_test/_util/target/setup/ConfigureRemotingForAnsible.ps1 +0 -435
  424. {ansible_core-2.15.4rc1.data → ansible_core-2.16.0b2.data}/scripts/ansible-test +0 -0
  425. {ansible_core-2.15.4rc1.dist-info → ansible_core-2.16.0b2.dist-info}/WHEEL +0 -0
  426. {ansible_core-2.15.4rc1.dist-info → ansible_core-2.16.0b2.dist-info}/entry_points.txt +0 -0
  427. {ansible_core-2.15.4rc1.dist-info → ansible_core-2.16.0b2.dist-info}/top_level.txt +0 -0
ansible/modules/group.py CHANGED
@@ -44,7 +44,7 @@ options:
44
44
  version_added: "2.15"
45
45
  system:
46
46
  description:
47
- - If I(yes), indicates that the group created is a system group.
47
+ - If V(yes), indicates that the group created is a system group.
48
48
  type: bool
49
49
  default: no
50
50
  local:
@@ -58,7 +58,7 @@ options:
58
58
  version_added: "2.6"
59
59
  non_unique:
60
60
  description:
61
- - This option allows to change the group ID to a non-unique value. Requires C(gid).
61
+ - This option allows to change the group ID to a non-unique value. Requires O(gid).
62
62
  - Not supported on macOS or BusyBox distributions.
63
63
  type: bool
64
64
  default: no
@@ -94,7 +94,7 @@ EXAMPLES = '''
94
94
  RETURN = r'''
95
95
  gid:
96
96
  description: Group ID of the group.
97
- returned: When C(state) is 'present'
97
+ returned: When O(state) is C(present)
98
98
  type: int
99
99
  sample: 1001
100
100
  name:
@@ -109,7 +109,7 @@ state:
109
109
  sample: 'absent'
110
110
  system:
111
111
  description: Whether the group is a system group or not.
112
- returned: When C(state) is 'present'
112
+ returned: When O(state) is C(present)
113
113
  type: bool
114
114
  sample: False
115
115
  '''
@@ -117,7 +117,7 @@ system:
117
117
  import grp
118
118
  import os
119
119
 
120
- from ansible.module_utils._text import to_bytes
120
+ from ansible.module_utils.common.text.converters import to_bytes
121
121
  from ansible.module_utils.basic import AnsibleModule
122
122
  from ansible.module_utils.common.sys_info import get_platform_subclass
123
123
 
@@ -227,14 +227,7 @@ class Group(object):
227
227
  if line.startswith(to_bytes(name_test)):
228
228
  exists = True
229
229
  break
230
-
231
- if not exists:
232
- self.module.warn(
233
- "'local: true' specified and group was not found in {file}. "
234
- "The local group may already exist if the local group database exists somewhere other than {file}.".format(file=self.GROUPFILE))
235
-
236
230
  return exists
237
-
238
231
  else:
239
232
  try:
240
233
  if grp.getgrnam(self.name):
@@ -81,7 +81,7 @@ from ansible.module_utils.basic import (
81
81
  from ansible.module_utils.common.sys_info import get_platform_subclass
82
82
  from ansible.module_utils.facts.system.service_mgr import ServiceMgrFactCollector
83
83
  from ansible.module_utils.facts.utils import get_file_lines, get_file_content
84
- from ansible.module_utils._text import to_native, to_text
84
+ from ansible.module_utils.common.text.converters import to_native, to_text
85
85
  from ansible.module_utils.six import PY3, text_type
86
86
 
87
87
  STRATS = {
@@ -387,10 +387,29 @@ class OpenRCStrategy(BaseStrategy):
387
387
  class OpenBSDStrategy(FileStrategy):
388
388
  """
389
389
  This is a OpenBSD family Hostname manipulation strategy class - it edits
390
- the /etc/myname file.
390
+ the /etc/myname file for the permanent hostname and executes hostname
391
+ command for the current hostname.
391
392
  """
392
393
 
393
394
  FILE = '/etc/myname'
395
+ COMMAND = "hostname"
396
+
397
+ def __init__(self, module):
398
+ super(OpenBSDStrategy, self).__init__(module)
399
+ self.hostname_cmd = self.module.get_bin_path(self.COMMAND, True)
400
+
401
+ def get_current_hostname(self):
402
+ cmd = [self.hostname_cmd]
403
+ rc, out, err = self.module.run_command(cmd)
404
+ if rc != 0:
405
+ self.module.fail_json(msg="Command failed rc=%d, out=%s, err=%s" % (rc, out, err))
406
+ return to_native(out).strip()
407
+
408
+ def set_current_hostname(self, name):
409
+ cmd = [self.hostname_cmd, name]
410
+ rc, out, err = self.module.run_command(cmd)
411
+ if rc != 0:
412
+ self.module.fail_json(msg="Command failed rc=%d, out=%s, err=%s" % (rc, out, err))
394
413
 
395
414
 
396
415
  class SolarisStrategy(BaseStrategy):
@@ -16,7 +16,7 @@ description:
16
16
  - Dynamically loads and executes a specified role as a task.
17
17
  - May be used only where Ansible tasks are allowed - inside C(pre_tasks), C(tasks), or C(post_tasks) play objects, or as a task inside a role.
18
18
  - Task-level keywords, loops, and conditionals apply only to the C(include_role) statement itself.
19
- - To apply keywords to the tasks within the role, pass them using the C(apply) option or use M(ansible.builtin.import_role) instead.
19
+ - To apply keywords to the tasks within the role, pass them using the O(apply) option or use M(ansible.builtin.import_role) instead.
20
20
  - Ignores some keywords, like C(until) and C(retries).
21
21
  - This module is also supported for Windows targets.
22
22
  - Does not work in handlers.
@@ -24,7 +24,7 @@ version_added: "2.2"
24
24
  options:
25
25
  apply:
26
26
  description:
27
- - Accepts a hash of task keywords (e.g. C(tags), C(become)) that will be applied to all tasks within the included role.
27
+ - Accepts a hash of task keywords (for example C(tags), C(become)) that will be applied to all tasks within the included role.
28
28
  version_added: '2.7'
29
29
  name:
30
30
  description:
@@ -53,9 +53,9 @@ options:
53
53
  default: yes
54
54
  public:
55
55
  description:
56
- - This option dictates whether the role's C(vars) and C(defaults) are exposed to the play. If set to C(true)
56
+ - This option dictates whether the role's C(vars) and C(defaults) are exposed to the play. If set to V(true)
57
57
  the variables will be available to tasks following the C(include_role) task. This functionality differs from
58
- standard variable exposure for roles listed under the C(roles) header or C(import_role) as they are exposed
58
+ standard variable exposure for roles listed under the C(roles) header or M(ansible.builtin.import_role) as they are exposed
59
59
  to the play at playbook parsing time, and available to earlier roles and tasks as well.
60
60
  type: bool
61
61
  default: no
@@ -85,7 +85,7 @@ attributes:
85
85
  support: none
86
86
  notes:
87
87
  - Handlers and are made available to the whole play.
88
- - After Ansible 2.4, you can use M(ansible.builtin.import_role) for C(static) behaviour and this action for C(dynamic) one.
88
+ - After Ansible 2.4, you can use M(ansible.builtin.import_role) for B(static) behaviour and this action for B(dynamic) one.
89
89
  seealso:
90
90
  - module: ansible.builtin.import_playbook
91
91
  - module: ansible.builtin.import_role
@@ -23,14 +23,14 @@ options:
23
23
  version_added: '2.7'
24
24
  apply:
25
25
  description:
26
- - Accepts a hash of task keywords (e.g. C(tags), C(become)) that will be applied to the tasks within the include.
26
+ - Accepts a hash of task keywords (for example C(tags), C(become)) that will be applied to the tasks within the include.
27
27
  type: str
28
28
  version_added: '2.7'
29
29
  free-form:
30
30
  description:
31
31
  - |
32
32
  Specifies the name of the imported file directly without any other option C(- include_tasks: file.yml).
33
- - Is the equivalent of specifying an argument for the I(file) parameter.
33
+ - Is the equivalent of specifying an argument for the O(file) parameter.
34
34
  - Most keywords, including loop, with_items, and conditionals, apply to this statement unlike M(ansible.builtin.import_tasks).
35
35
  - The do-until loop is not supported.
36
36
  extends_documentation_fragment:
@@ -40,7 +40,7 @@ options:
40
40
  version_added: "2.2"
41
41
  depth:
42
42
  description:
43
- - When using C(dir), this module will, by default, recursively go through each sub directory and load up the
43
+ - When using O(dir), this module will, by default, recursively go through each sub directory and load up the
44
44
  variables. By explicitly setting the depth, this module will only go as deep as the depth.
45
45
  type: int
46
46
  default: 0
@@ -58,7 +58,7 @@ options:
58
58
  version_added: "2.2"
59
59
  extensions:
60
60
  description:
61
- - List of file extensions to read when using C(dir).
61
+ - List of file extensions to read when using O(dir).
62
62
  type: list
63
63
  elements: str
64
64
  default: [ json, yaml, yml ]
@@ -73,9 +73,9 @@ options:
73
73
  version_added: "2.7"
74
74
  hash_behaviour:
75
75
  description:
76
- - If set to C(merge), merges existing hash variables instead of overwriting them.
77
- - If omitted C(null), the behavior falls back to the global I(hash_behaviour) configuration.
78
- - This option is self-contained and does not apply to individual files in C(dir). You can use a loop to apply C(hash_behaviour) per file.
76
+ - If set to V(merge), merges existing hash variables instead of overwriting them.
77
+ - If omitted (V(null)), the behavior falls back to the global C(hash_behaviour) configuration.
78
+ - This option is self-contained and does not apply to individual files in O(dir). You can use a loop to apply O(hash_behaviour) per file.
79
79
  default: null
80
80
  type: str
81
81
  choices: ["replace", "merge"]
@@ -17,7 +17,7 @@ author:
17
17
  - Linus Unnebäck (@LinusU) <linus@folkdatorn.se>
18
18
  - Sébastien DA ROCHA (@sebastiendarocha)
19
19
  description:
20
- - C(iptables) is used to set up, maintain, and inspect the tables of IP packet
20
+ - M(ansible.builtin.iptables) is used to set up, maintain, and inspect the tables of IP packet
21
21
  filter rules in the Linux kernel.
22
22
  - This module does not handle the saving and/or loading of rules, but rather
23
23
  only manipulates the current rules that are present in memory. This is the
@@ -61,7 +61,7 @@ options:
61
61
  rule_num:
62
62
  description:
63
63
  - Insert the rule as the given rule number.
64
- - This works only with C(action=insert).
64
+ - This works only with O(action=insert).
65
65
  type: str
66
66
  version_added: "2.5"
67
67
  ip_version:
@@ -74,18 +74,18 @@ options:
74
74
  description:
75
75
  - Specify the iptables chain to modify.
76
76
  - This could be a user-defined chain or one of the standard iptables chains, like
77
- C(INPUT), C(FORWARD), C(OUTPUT), C(PREROUTING), C(POSTROUTING), C(SECMARK) or C(CONNSECMARK).
77
+ V(INPUT), V(FORWARD), V(OUTPUT), V(PREROUTING), V(POSTROUTING), V(SECMARK) or V(CONNSECMARK).
78
78
  type: str
79
79
  protocol:
80
80
  description:
81
81
  - The protocol of the rule or of the packet to check.
82
- - The specified protocol can be one of C(tcp), C(udp), C(udplite), C(icmp), C(ipv6-icmp) or C(icmpv6),
83
- C(esp), C(ah), C(sctp) or the special keyword C(all), or it can be a numeric value,
82
+ - The specified protocol can be one of V(tcp), V(udp), V(udplite), V(icmp), V(ipv6-icmp) or V(icmpv6),
83
+ V(esp), V(ah), V(sctp) or the special keyword V(all), or it can be a numeric value,
84
84
  representing one of these protocols or a different one.
85
- - A protocol name from I(/etc/protocols) is also allowed.
86
- - A C(!) argument before the protocol inverts the test.
85
+ - A protocol name from C(/etc/protocols) is also allowed.
86
+ - A V(!) argument before the protocol inverts the test.
87
87
  - The number zero is equivalent to all.
88
- - C(all) will match with all protocols and is taken as default when this option is omitted.
88
+ - V(all) will match with all protocols and is taken as default when this option is omitted.
89
89
  type: str
90
90
  source:
91
91
  description:
@@ -97,7 +97,7 @@ options:
97
97
  a remote query such as DNS is a really bad idea.
98
98
  - The mask can be either a network mask or a plain number, specifying
99
99
  the number of 1's at the left side of the network mask. Thus, a mask
100
- of 24 is equivalent to 255.255.255.0. A C(!) argument before the
100
+ of 24 is equivalent to 255.255.255.0. A V(!) argument before the
101
101
  address specification inverts the sense of the address.
102
102
  type: str
103
103
  destination:
@@ -110,13 +110,13 @@ options:
110
110
  a remote query such as DNS is a really bad idea.
111
111
  - The mask can be either a network mask or a plain number, specifying
112
112
  the number of 1's at the left side of the network mask. Thus, a mask
113
- of 24 is equivalent to 255.255.255.0. A C(!) argument before the
113
+ of 24 is equivalent to 255.255.255.0. A V(!) argument before the
114
114
  address specification inverts the sense of the address.
115
115
  type: str
116
116
  tcp_flags:
117
117
  description:
118
118
  - TCP flags specification.
119
- - C(tcp_flags) expects a dict with the two keys C(flags) and C(flags_set).
119
+ - O(tcp_flags) expects a dict with the two keys C(flags) and C(flags_set).
120
120
  type: dict
121
121
  version_added: "2.4"
122
122
  suboptions:
@@ -154,7 +154,7 @@ options:
154
154
  gateway:
155
155
  description:
156
156
  - This specifies the IP address of host to send the cloned packets.
157
- - This option is only valid when C(jump) is set to C(TEE).
157
+ - This option is only valid when O(jump) is set to V(TEE).
158
158
  type: str
159
159
  version_added: "2.8"
160
160
  log_prefix:
@@ -166,7 +166,7 @@ options:
166
166
  description:
167
167
  - Logging level according to the syslogd-defined priorities.
168
168
  - The value can be strings or numbers from 1-8.
169
- - This parameter is only applicable if C(jump) is set to C(LOG).
169
+ - This parameter is only applicable if O(jump) is set to V(LOG).
170
170
  type: str
171
171
  version_added: "2.8"
172
172
  choices: [ '0', '1', '2', '3', '4', '5', '6', '7', 'emerg', 'alert', 'crit', 'error', 'warning', 'notice', 'info', 'debug' ]
@@ -179,18 +179,18 @@ options:
179
179
  in_interface:
180
180
  description:
181
181
  - Name of an interface via which a packet was received (only for packets
182
- entering the C(INPUT), C(FORWARD) and C(PREROUTING) chains).
183
- - When the C(!) argument is used before the interface name, the sense is inverted.
184
- - If the interface name ends in a C(+), then any interface which begins with
182
+ entering the V(INPUT), V(FORWARD) and V(PREROUTING) chains).
183
+ - When the V(!) argument is used before the interface name, the sense is inverted.
184
+ - If the interface name ends in a V(+), then any interface which begins with
185
185
  this name will match.
186
186
  - If this option is omitted, any interface name will match.
187
187
  type: str
188
188
  out_interface:
189
189
  description:
190
190
  - Name of an interface via which a packet is going to be sent (for
191
- packets entering the C(FORWARD), C(OUTPUT) and C(POSTROUTING) chains).
192
- - When the C(!) argument is used before the interface name, the sense is inverted.
193
- - If the interface name ends in a C(+), then any interface which begins
191
+ packets entering the V(FORWARD), V(OUTPUT) and V(POSTROUTING) chains).
192
+ - When the V(!) argument is used before the interface name, the sense is inverted.
193
+ - If the interface name ends in a V(+), then any interface which begins
194
194
  with this name will match.
195
195
  - If this option is omitted, any interface name will match.
196
196
  type: str
@@ -206,14 +206,14 @@ options:
206
206
  set_counters:
207
207
  description:
208
208
  - This enables the administrator to initialize the packet and byte
209
- counters of a rule (during C(INSERT), C(APPEND), C(REPLACE) operations).
209
+ counters of a rule (during V(INSERT), V(APPEND), V(REPLACE) operations).
210
210
  type: str
211
211
  source_port:
212
212
  description:
213
213
  - Source port or port range specification.
214
214
  - This can either be a service name or a port number.
215
215
  - An inclusive range can also be specified, using the format C(first:last).
216
- - If the first port is omitted, C(0) is assumed; if the last is omitted, C(65535) is assumed.
216
+ - If the first port is omitted, V(0) is assumed; if the last is omitted, V(65535) is assumed.
217
217
  - If the first port is greater than the second one they will be swapped.
218
218
  type: str
219
219
  destination_port:
@@ -239,7 +239,7 @@ options:
239
239
  - This specifies a destination port or range of ports to use, without
240
240
  this, the destination port is never altered.
241
241
  - This is only valid if the rule also specifies one of the protocol
242
- C(tcp), C(udp), C(dccp) or C(sctp).
242
+ V(tcp), V(udp), V(dccp) or V(sctp).
243
243
  type: str
244
244
  to_destination:
245
245
  description:
@@ -266,14 +266,14 @@ options:
266
266
  description:
267
267
  - This allows specifying a DSCP mark to be added to packets.
268
268
  It takes either an integer or hex value.
269
- - Mutually exclusive with C(set_dscp_mark_class).
269
+ - Mutually exclusive with O(set_dscp_mark_class).
270
270
  type: str
271
271
  version_added: "2.1"
272
272
  set_dscp_mark_class:
273
273
  description:
274
274
  - This allows specifying a predefined DiffServ class which will be
275
275
  translated to the corresponding DSCP mark.
276
- - Mutually exclusive with C(set_dscp_mark).
276
+ - Mutually exclusive with O(set_dscp_mark).
277
277
  type: str
278
278
  version_added: "2.1"
279
279
  comment:
@@ -283,7 +283,7 @@ options:
283
283
  ctstate:
284
284
  description:
285
285
  - A list of the connection states to match in the conntrack module.
286
- - Possible values are C(INVALID), C(NEW), C(ESTABLISHED), C(RELATED), C(UNTRACKED), C(SNAT), C(DNAT).
286
+ - Possible values are V(INVALID), V(NEW), V(ESTABLISHED), V(RELATED), V(UNTRACKED), V(SNAT), V(DNAT).
287
287
  type: list
288
288
  elements: str
289
289
  default: []
@@ -301,7 +301,7 @@ options:
301
301
  description:
302
302
  - Specifies a set name which can be defined by ipset.
303
303
  - Must be used together with the match_set_flags parameter.
304
- - When the C(!) argument is prepended then it inverts the rule.
304
+ - When the V(!) argument is prepended then it inverts the rule.
305
305
  - Uses the iptables set extension.
306
306
  type: str
307
307
  version_added: "2.11"
@@ -317,8 +317,8 @@ options:
317
317
  description:
318
318
  - Specifies the maximum average number of matches to allow per second.
319
319
  - The number can specify units explicitly, using C(/second), C(/minute),
320
- C(/hour) or C(/day), or parts of them (so C(5/second) is the same as
321
- C(5/s)).
320
+ C(/hour) or C(/day), or parts of them (so V(5/second) is the same as
321
+ V(5/s)).
322
322
  type: str
323
323
  limit_burst:
324
324
  description:
@@ -362,10 +362,10 @@ options:
362
362
  description:
363
363
  - Set the policy for the chain to the given target.
364
364
  - Only built-in chains can have policies.
365
- - This parameter requires the C(chain) parameter.
365
+ - This parameter requires the O(chain) parameter.
366
366
  - If you specify this parameter, all other parameters will be ignored.
367
- - This parameter is used to set default policy for the given C(chain).
368
- Do not confuse this with C(jump) parameter.
367
+ - This parameter is used to set default policy for the given O(chain).
368
+ Do not confuse this with O(jump) parameter.
369
369
  type: str
370
370
  choices: [ ACCEPT, DROP, QUEUE, RETURN ]
371
371
  version_added: "2.2"
@@ -377,9 +377,9 @@ options:
377
377
  version_added: "2.10"
378
378
  chain_management:
379
379
  description:
380
- - If C(true) and C(state) is C(present), the chain will be created if needed.
381
- - If C(true) and C(state) is C(absent), the chain will be deleted if the only
382
- other parameter passed are C(chain) and optionally C(table).
380
+ - If V(true) and O(state) is V(present), the chain will be created if needed.
381
+ - If V(true) and O(state) is V(absent), the chain will be deleted if the only
382
+ other parameter passed are O(chain) and optionally O(table).
383
383
  type: bool
384
384
  default: false
385
385
  version_added: "2.13"
@@ -387,7 +387,7 @@ options:
387
387
  description:
388
388
  - This parameter controls the running of the list -action of iptables, which is used internally by the module
389
389
  - Does not affect the actual functionality. Use this if iptables hangs when creating chain or altering policy
390
- - If C(true), then iptables skips the DNS-lookup of the IP addresses in a chain when it uses the list -action
390
+ - If V(true), then iptables skips the DNS-lookup of the IP addresses in a chain when it uses the list -action
391
391
  - Listing is used internally for example when setting a policy or creting of a chain
392
392
  type: bool
393
393
  default: false
@@ -698,7 +698,7 @@ def push_arguments(iptables_path, action, params, make_rule=True):
698
698
 
699
699
  def check_rule_present(iptables_path, module, params):
700
700
  cmd = push_arguments(iptables_path, '-C', params)
701
- rc, _, __ = module.run_command(cmd, check_rc=False)
701
+ rc, stdout, stderr = module.run_command(cmd, check_rc=False)
702
702
  return (rc == 0)
703
703
 
704
704
 
@@ -732,7 +732,7 @@ def get_chain_policy(iptables_path, module, params):
732
732
  cmd = push_arguments(iptables_path, '-L', params, make_rule=False)
733
733
  if module.params['numeric']:
734
734
  cmd.append('--numeric')
735
- rc, out, _ = module.run_command(cmd, check_rc=True)
735
+ rc, out, err = module.run_command(cmd, check_rc=True)
736
736
  chain_header = out.split("\n")[0]
737
737
  result = re.search(r'\(policy ([A-Z]+)\)', chain_header)
738
738
  if result:
@@ -742,7 +742,7 @@ def get_chain_policy(iptables_path, module, params):
742
742
 
743
743
  def get_iptables_version(iptables_path, module):
744
744
  cmd = [iptables_path, '--version']
745
- rc, out, _ = module.run_command(cmd, check_rc=True)
745
+ rc, out, err = module.run_command(cmd, check_rc=True)
746
746
  return out.split('v')[1].rstrip('\n')
747
747
 
748
748
 
@@ -755,7 +755,7 @@ def check_chain_present(iptables_path, module, params):
755
755
  cmd = push_arguments(iptables_path, '-L', params, make_rule=False)
756
756
  if module.params['numeric']:
757
757
  cmd.append('--numeric')
758
- rc, _, __ = module.run_command(cmd, check_rc=False)
758
+ rc, out, err = module.run_command(cmd, check_rc=False)
759
759
  return (rc == 0)
760
760
 
761
761
 
@@ -895,33 +895,38 @@ def main():
895
895
  delete_chain(iptables_path, module, module.params)
896
896
 
897
897
  else:
898
- insert = (module.params['action'] == 'insert')
899
- rule_is_present = check_rule_present(
900
- iptables_path, module, module.params
901
- )
902
- chain_is_present = rule_is_present or check_chain_present(
903
- iptables_path, module, module.params
904
- )
905
- should_be_present = (args['state'] == 'present')
906
-
907
- # Check if target is up to date
908
- args['changed'] = (rule_is_present != should_be_present)
909
- if args['changed'] is False:
910
- # Target is already up to date
911
- module.exit_json(**args)
912
-
913
- # Check only; don't modify
914
- if not module.check_mode:
915
- if should_be_present:
916
- if not chain_is_present and args['chain_management']:
917
- create_chain(iptables_path, module, module.params)
918
-
919
- if insert:
920
- insert_rule(iptables_path, module, module.params)
898
+ # Create the chain if there are no rule arguments
899
+ if (args['state'] == 'present') and not args['rule']:
900
+ chain_is_present = check_chain_present(
901
+ iptables_path, module, module.params
902
+ )
903
+ args['changed'] = not chain_is_present
904
+
905
+ if (not chain_is_present and args['chain_management'] and not module.check_mode):
906
+ create_chain(iptables_path, module, module.params)
907
+
908
+ else:
909
+ insert = (module.params['action'] == 'insert')
910
+ rule_is_present = check_rule_present(
911
+ iptables_path, module, module.params
912
+ )
913
+
914
+ should_be_present = (args['state'] == 'present')
915
+ # Check if target is up to date
916
+ args['changed'] = (rule_is_present != should_be_present)
917
+ if args['changed'] is False:
918
+ # Target is already up to date
919
+ module.exit_json(**args)
920
+
921
+ # Modify if not check_mode
922
+ if not module.check_mode:
923
+ if should_be_present:
924
+ if insert:
925
+ insert_rule(iptables_path, module, module.params)
926
+ else:
927
+ append_rule(iptables_path, module, module.params)
921
928
  else:
922
- append_rule(iptables_path, module, module.params)
923
- else:
924
- remove_rule(iptables_path, module, module.params)
929
+ remove_rule(iptables_path, module, module.params)
925
930
 
926
931
  module.exit_json(**args)
927
932
 
@@ -11,7 +11,7 @@ DOCUMENTATION = r'''
11
11
  module: known_hosts
12
12
  short_description: Add or remove a host from the C(known_hosts) file
13
13
  description:
14
- - The C(known_hosts) module lets you add or remove a host keys from the C(known_hosts) file.
14
+ - The M(ansible.builtin.known_hosts) module lets you add or remove a host keys from the C(known_hosts) file.
15
15
  - Starting at Ansible 2.2, multiple entries per host are allowed, but only one for each key type supported by ssh.
16
16
  This is useful if you're going to want to use the M(ansible.builtin.git) module over ssh, for example.
17
17
  - If you have a very large number of host keys to manage, you will find the M(ansible.builtin.template) module more useful.
@@ -22,19 +22,19 @@ options:
22
22
  description:
23
23
  - The host to add or remove (must match a host specified in key). It will be converted to lowercase so that ssh-keygen can find it.
24
24
  - Must match with <hostname> or <ip> present in key attribute.
25
- - For custom SSH port, C(name) needs to specify port as well. See example section.
25
+ - For custom SSH port, O(name) needs to specify port as well. See example section.
26
26
  type: str
27
27
  required: true
28
28
  key:
29
29
  description:
30
30
  - The SSH public host key, as a string.
31
- - Required if C(state=present), optional when C(state=absent), in which case all keys for the host are removed.
31
+ - Required if O(state=present), optional when O(state=absent), in which case all keys for the host are removed.
32
32
  - The key must be in the right format for SSH (see sshd(8), section "SSH_KNOWN_HOSTS FILE FORMAT").
33
33
  - Specifically, the key should not match the format that is found in an SSH pubkey file, but should rather have the hostname prepended to a
34
34
  line that includes the pubkey, the same way that it would appear in the known_hosts file. The value prepended to the line must also match
35
35
  the value of the name parameter.
36
36
  - Should be of format C(<hostname[,IP]> ssh-rsa <pubkey>).
37
- - For custom SSH port, C(key) needs to specify port as well. See example section.
37
+ - For custom SSH port, O(key) needs to specify port as well. See example section.
38
38
  type: str
39
39
  path:
40
40
  description:
@@ -50,8 +50,8 @@ options:
50
50
  version_added: "2.3"
51
51
  state:
52
52
  description:
53
- - I(present) to add the host key.
54
- - I(absent) to remove it.
53
+ - V(present) to add the host key.
54
+ - V(absent) to remove it.
55
55
  choices: [ "absent", "present" ]
56
56
  default: "present"
57
57
  type: str
@@ -111,7 +111,7 @@ import re
111
111
  import tempfile
112
112
 
113
113
  from ansible.module_utils.basic import AnsibleModule
114
- from ansible.module_utils._text import to_bytes, to_native
114
+ from ansible.module_utils.common.text.converters import to_bytes, to_native
115
115
 
116
116
 
117
117
  def enforce_state(module, params):