ansible-core 2.17.6__py3-none-any.whl → 2.18.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 (325) hide show
  1. ansible/__main__.py +2 -17
  2. ansible/cli/__init__.py +3 -15
  3. ansible/cli/config.py +187 -24
  4. ansible/cli/console.py +1 -1
  5. ansible/cli/doc.py +38 -16
  6. ansible/cli/galaxy.py +3 -49
  7. ansible/cli/inventory.py +2 -2
  8. ansible/cli/pull.py +2 -2
  9. ansible/cli/scripts/ansible_connection_cli_stub.py +1 -10
  10. ansible/config/base.yml +127 -57
  11. ansible/config/manager.py +89 -11
  12. ansible/constants.py +32 -9
  13. ansible/errors/__init__.py +5 -0
  14. ansible/executor/interpreter_discovery.py +1 -1
  15. ansible/executor/play_iterator.py +16 -0
  16. ansible/executor/playbook_executor.py +1 -4
  17. ansible/executor/powershell/become_wrapper.ps1 +4 -5
  18. ansible/executor/powershell/bootstrap_wrapper.ps1 +2 -3
  19. ansible/executor/powershell/exec_wrapper.ps1 +1 -1
  20. ansible/executor/powershell/module_manifest.py +2 -2
  21. ansible/executor/task_executor.py +50 -39
  22. ansible/executor/task_queue_manager.py +1 -1
  23. ansible/executor/task_result.py +1 -1
  24. ansible/galaxy/api.py +3 -4
  25. ansible/galaxy/collection/__init__.py +21 -10
  26. ansible/galaxy/collection/concrete_artifact_manager.py +2 -2
  27. ansible/galaxy/collection/galaxy_api_proxy.py +10 -16
  28. ansible/galaxy/collection/gpg.py +17 -23
  29. ansible/galaxy/data/COPYING +7 -0
  30. ansible/galaxy/data/apb/Dockerfile.j2 +1 -0
  31. ansible/galaxy/data/apb/Makefile.j2 +1 -0
  32. ansible/galaxy/data/apb/README.md +7 -3
  33. ansible/galaxy/data/apb/apb.yml.j2 +1 -0
  34. ansible/galaxy/data/apb/defaults/main.yml.j2 +1 -0
  35. ansible/galaxy/data/apb/handlers/main.yml.j2 +1 -0
  36. ansible/galaxy/data/apb/meta/main.yml.j2 +1 -0
  37. ansible/galaxy/data/apb/playbooks/deprovision.yml.j2 +1 -0
  38. ansible/galaxy/data/apb/playbooks/provision.yml.j2 +1 -0
  39. ansible/galaxy/data/apb/tasks/main.yml.j2 +1 -0
  40. ansible/galaxy/data/apb/tests/ansible.cfg +1 -0
  41. ansible/galaxy/data/apb/tests/inventory +1 -0
  42. ansible/galaxy/data/apb/tests/test.yml.j2 +1 -0
  43. ansible/galaxy/data/apb/vars/main.yml.j2 +1 -0
  44. ansible/galaxy/data/collections_galaxy_meta.yml +1 -0
  45. ansible/galaxy/data/container/defaults/main.yml.j2 +1 -0
  46. ansible/galaxy/data/container/handlers/main.yml.j2 +1 -0
  47. ansible/galaxy/data/container/meta/container.yml.j2 +1 -0
  48. ansible/galaxy/data/container/meta/main.yml.j2 +1 -0
  49. ansible/galaxy/data/container/tasks/main.yml.j2 +1 -0
  50. ansible/galaxy/data/container/tests/ansible.cfg +1 -0
  51. ansible/galaxy/data/container/tests/inventory +1 -0
  52. ansible/galaxy/data/container/tests/test.yml.j2 +1 -0
  53. ansible/galaxy/data/container/vars/main.yml.j2 +1 -0
  54. ansible/galaxy/data/default/collection/README.md.j2 +1 -0
  55. ansible/galaxy/data/default/collection/galaxy.yml.j2 +1 -0
  56. ansible/galaxy/data/default/collection/meta/runtime.yml +1 -0
  57. ansible/galaxy/data/default/collection/plugins/README.md.j2 +1 -0
  58. ansible/galaxy/data/default/role/defaults/main.yml.j2 +1 -0
  59. ansible/galaxy/data/default/role/handlers/main.yml.j2 +1 -0
  60. ansible/galaxy/data/default/role/meta/main.yml.j2 +1 -0
  61. ansible/galaxy/data/default/role/tasks/main.yml.j2 +1 -0
  62. ansible/galaxy/data/default/role/tests/inventory +1 -0
  63. ansible/galaxy/data/default/role/tests/test.yml.j2 +1 -0
  64. ansible/galaxy/data/default/role/vars/main.yml.j2 +1 -0
  65. ansible/galaxy/data/network/cliconf_plugins/example.py.j2 +1 -0
  66. ansible/galaxy/data/network/defaults/main.yml.j2 +1 -0
  67. ansible/galaxy/data/network/library/example_command.py.j2 +1 -0
  68. ansible/galaxy/data/network/library/example_config.py.j2 +1 -0
  69. ansible/galaxy/data/network/library/example_facts.py.j2 +1 -0
  70. ansible/galaxy/data/network/meta/main.yml.j2 +1 -0
  71. ansible/galaxy/data/network/module_utils/example.py.j2 +1 -0
  72. ansible/galaxy/data/network/netconf_plugins/example.py.j2 +1 -0
  73. ansible/galaxy/data/network/tasks/main.yml.j2 +1 -0
  74. ansible/galaxy/data/network/terminal_plugins/example.py.j2 +1 -0
  75. ansible/galaxy/data/network/tests/inventory +1 -0
  76. ansible/galaxy/data/network/tests/test.yml.j2 +1 -0
  77. ansible/galaxy/data/network/vars/main.yml.j2 +1 -0
  78. ansible/galaxy/dependency_resolution/providers.py +3 -3
  79. ansible/galaxy/role.py +1 -1
  80. ansible/galaxy/token.py +20 -8
  81. ansible/keyword_desc.yml +1 -1
  82. ansible/module_utils/_internal/__init__.py +0 -0
  83. ansible/module_utils/_internal/_concurrent/__init__.py +0 -0
  84. ansible/module_utils/_internal/_concurrent/_daemon_threading.py +28 -0
  85. ansible/module_utils/_internal/_concurrent/_futures.py +21 -0
  86. ansible/module_utils/ansible_release.py +2 -2
  87. ansible/module_utils/api.py +2 -2
  88. ansible/module_utils/basic.py +8 -8
  89. ansible/module_utils/common/collections.py +1 -1
  90. ansible/module_utils/common/file.py +0 -6
  91. ansible/module_utils/common/process.py +22 -9
  92. ansible/module_utils/common/text/converters.py +5 -8
  93. ansible/module_utils/common/text/formatters.py +20 -4
  94. ansible/module_utils/common/validation.py +33 -25
  95. ansible/module_utils/compat/paramiko.py +6 -1
  96. ansible/module_utils/compat/selinux.py +2 -2
  97. ansible/module_utils/connection.py +8 -24
  98. ansible/module_utils/csharp/Ansible.Become.cs +14 -25
  99. ansible/module_utils/csharp/Ansible.Process.cs +1 -1
  100. ansible/module_utils/distro/__init__.py +1 -1
  101. ansible/module_utils/distro/_distro.py +8 -4
  102. ansible/module_utils/facts/collector.py +2 -0
  103. ansible/module_utils/facts/default_collectors.py +3 -1
  104. ansible/module_utils/facts/hardware/aix.py +54 -52
  105. ansible/module_utils/facts/hardware/darwin.py +37 -34
  106. ansible/module_utils/facts/hardware/freebsd.py +55 -15
  107. ansible/module_utils/facts/hardware/hpux.py +3 -0
  108. ansible/module_utils/facts/hardware/linux.py +101 -57
  109. ansible/module_utils/facts/hardware/netbsd.py +3 -0
  110. ansible/module_utils/facts/hardware/openbsd.py +4 -1
  111. ansible/module_utils/facts/hardware/sunos.py +7 -1
  112. ansible/module_utils/facts/network/aix.py +16 -17
  113. ansible/module_utils/facts/network/fc_wwn.py +4 -1
  114. ansible/module_utils/facts/network/hpux.py +21 -4
  115. ansible/module_utils/facts/network/iscsi.py +7 -8
  116. ansible/module_utils/facts/network/linux.py +0 -2
  117. ansible/module_utils/facts/other/facter.py +9 -4
  118. ansible/module_utils/facts/other/ohai.py +5 -5
  119. ansible/module_utils/facts/packages.py +49 -7
  120. ansible/module_utils/facts/sysctl.py +33 -31
  121. ansible/module_utils/facts/system/distribution.py +1 -1
  122. ansible/module_utils/facts/system/local.py +12 -22
  123. ansible/module_utils/facts/system/service_mgr.py +3 -1
  124. ansible/module_utils/facts/system/systemd.py +47 -0
  125. ansible/module_utils/powershell/Ansible.ModuleUtils.AddType.psm1 +1 -1
  126. ansible/module_utils/powershell/Ansible.ModuleUtils.CamelConversion.psm1 +1 -1
  127. ansible/module_utils/splitter.py +1 -1
  128. ansible/modules/add_host.py +1 -1
  129. ansible/modules/apt.py +43 -32
  130. ansible/modules/apt_key.py +6 -6
  131. ansible/modules/apt_repository.py +23 -14
  132. ansible/modules/assemble.py +7 -2
  133. ansible/modules/assert.py +4 -4
  134. ansible/modules/blockinfile.py +3 -6
  135. ansible/modules/command.py +1 -1
  136. ansible/modules/copy.py +4 -4
  137. ansible/modules/cron.py +13 -10
  138. ansible/modules/deb822_repository.py +16 -17
  139. ansible/modules/debconf.py +9 -9
  140. ansible/modules/debug.py +1 -1
  141. ansible/modules/dnf.py +79 -164
  142. ansible/modules/dnf5.py +54 -29
  143. ansible/modules/dpkg_selections.py +2 -2
  144. ansible/modules/expect.py +2 -2
  145. ansible/modules/fetch.py +2 -2
  146. ansible/modules/file.py +5 -3
  147. ansible/modules/find.py +40 -12
  148. ansible/modules/gather_facts.py +4 -2
  149. ansible/modules/get_url.py +29 -24
  150. ansible/modules/git.py +35 -35
  151. ansible/modules/group.py +71 -1
  152. ansible/modules/hostname.py +2 -4
  153. ansible/modules/include_vars.py +5 -5
  154. ansible/modules/iptables.py +13 -16
  155. ansible/modules/known_hosts.py +16 -13
  156. ansible/modules/lineinfile.py +1 -4
  157. ansible/modules/meta.py +6 -1
  158. ansible/modules/mount_facts.py +651 -0
  159. ansible/modules/package_facts.py +63 -80
  160. ansible/modules/pause.py +4 -3
  161. ansible/modules/pip.py +14 -14
  162. ansible/modules/replace.py +1 -4
  163. ansible/modules/rpm_key.py +31 -11
  164. ansible/modules/service.py +8 -8
  165. ansible/modules/service_facts.py +20 -5
  166. ansible/modules/set_stats.py +1 -1
  167. ansible/modules/setup.py +3 -3
  168. ansible/modules/stat.py +3 -3
  169. ansible/modules/subversion.py +1 -1
  170. ansible/modules/systemd.py +16 -10
  171. ansible/modules/systemd_service.py +16 -10
  172. ansible/modules/sysvinit.py +4 -4
  173. ansible/modules/unarchive.py +35 -22
  174. ansible/modules/uri.py +24 -18
  175. ansible/modules/user.py +145 -12
  176. ansible/modules/validate_argument_spec.py +3 -3
  177. ansible/modules/wait_for_connection.py +2 -1
  178. ansible/modules/yum_repository.py +136 -179
  179. ansible/parsing/dataloader.py +2 -2
  180. ansible/parsing/mod_args.py +11 -10
  181. ansible/parsing/vault/__init__.py +8 -3
  182. ansible/parsing/yaml/constructor.py +10 -8
  183. ansible/parsing/yaml/objects.py +1 -1
  184. ansible/playbook/base.py +12 -23
  185. ansible/playbook/helpers.py +4 -0
  186. ansible/playbook/loop_control.py +8 -0
  187. ansible/playbook/play.py +4 -22
  188. ansible/playbook/play_context.py +0 -16
  189. ansible/playbook/playbook_include.py +2 -2
  190. ansible/playbook/role/__init__.py +2 -2
  191. ansible/plugins/__init__.py +2 -0
  192. ansible/plugins/action/__init__.py +7 -9
  193. ansible/plugins/action/dnf.py +7 -5
  194. ansible/plugins/action/package.py +5 -4
  195. ansible/plugins/action/reboot.py +2 -2
  196. ansible/plugins/become/__init__.py +1 -1
  197. ansible/plugins/callback/__init__.py +44 -3
  198. ansible/plugins/callback/default.py +1 -1
  199. ansible/plugins/cliconf/__init__.py +1 -1
  200. ansible/plugins/connection/paramiko_ssh.py +2 -80
  201. ansible/plugins/connection/psrp.py +33 -82
  202. ansible/plugins/connection/ssh.py +0 -8
  203. ansible/plugins/connection/winrm.py +46 -1
  204. ansible/plugins/doc_fragments/connection_pipelining.py +2 -2
  205. ansible/plugins/doc_fragments/constructed.py +10 -10
  206. ansible/plugins/doc_fragments/default_callback.py +8 -8
  207. ansible/plugins/doc_fragments/files.py +5 -5
  208. ansible/plugins/doc_fragments/inventory_cache.py +2 -2
  209. ansible/plugins/doc_fragments/result_format_callback.py +6 -6
  210. ansible/plugins/doc_fragments/return_common.py +1 -1
  211. ansible/plugins/doc_fragments/shell_common.py +2 -10
  212. ansible/plugins/doc_fragments/shell_windows.py +0 -9
  213. ansible/plugins/doc_fragments/url.py +2 -2
  214. ansible/plugins/doc_fragments/url_windows.py +4 -5
  215. ansible/plugins/doc_fragments/validate.py +1 -1
  216. ansible/plugins/filter/core.py +2 -0
  217. ansible/plugins/filter/human_to_bytes.yml +9 -0
  218. ansible/plugins/filter/password_hash.yml +1 -1
  219. ansible/plugins/filter/strftime.yml +1 -1
  220. ansible/plugins/filter/to_nice_json.yml +7 -3
  221. ansible/plugins/filter/to_uuid.yml +1 -1
  222. ansible/plugins/inventory/script.py +1 -1
  223. ansible/plugins/list.py +1 -1
  224. ansible/plugins/loader.py +0 -11
  225. ansible/plugins/lookup/config.py +1 -1
  226. ansible/plugins/lookup/csvfile.py +21 -9
  227. ansible/plugins/lookup/env.py +8 -9
  228. ansible/plugins/lookup/ini.py +10 -1
  229. ansible/plugins/lookup/random_choice.py +2 -2
  230. ansible/plugins/lookup/url.py +7 -2
  231. ansible/plugins/shell/__init__.py +15 -20
  232. ansible/plugins/shell/powershell.py +9 -6
  233. ansible/plugins/strategy/__init__.py +16 -7
  234. ansible/plugins/test/core.py +23 -1
  235. ansible/plugins/test/issubset.yml +1 -1
  236. ansible/plugins/test/subset.yml +1 -1
  237. ansible/plugins/test/timedout.yml +20 -0
  238. ansible/plugins/test/vault_encrypted.yml +6 -6
  239. ansible/plugins/test/vaulted_file.yml +19 -0
  240. ansible/release.py +2 -2
  241. ansible/template/__init__.py +3 -8
  242. ansible/utils/collection_loader/_collection_finder.py +23 -55
  243. ansible/utils/display.py +44 -31
  244. ansible/utils/jsonrpc.py +1 -1
  245. ansible/utils/listify.py +1 -5
  246. ansible/utils/path.py +3 -0
  247. ansible/utils/vars.py +18 -27
  248. ansible/vars/manager.py +7 -150
  249. ansible/vars/plugins.py +1 -1
  250. ansible_core-2.18.0.dist-info/Apache-License.txt +202 -0
  251. {ansible_core-2.17.6.dist-info → ansible_core-2.18.0.dist-info}/METADATA +36 -23
  252. ansible_core-2.18.0.dist-info/MIT-license.txt +14 -0
  253. ansible_core-2.18.0.dist-info/PSF-license.txt +48 -0
  254. {ansible_core-2.17.6.dist-info → ansible_core-2.18.0.dist-info}/RECORD +316 -311
  255. {ansible_core-2.17.6.dist-info → ansible_core-2.18.0.dist-info}/entry_points.txt +1 -1
  256. ansible_core-2.18.0.dist-info/simplified_bsd.txt +8 -0
  257. ansible_test/_data/completion/docker.txt +7 -7
  258. ansible_test/_data/completion/remote.txt +5 -4
  259. ansible_test/_data/completion/windows.txt +4 -4
  260. ansible_test/_data/requirements/ansible-test.txt +1 -2
  261. ansible_test/_data/requirements/constraints.txt +1 -2
  262. ansible_test/_data/requirements/sanity.ansible-doc.txt +3 -3
  263. ansible_test/_data/requirements/sanity.changelog.in +1 -1
  264. ansible_test/_data/requirements/sanity.changelog.txt +4 -4
  265. ansible_test/_data/requirements/sanity.import.plugin.txt +2 -2
  266. ansible_test/_data/requirements/sanity.import.txt +1 -1
  267. ansible_test/_data/requirements/sanity.integration-aliases.txt +1 -1
  268. ansible_test/_data/requirements/sanity.pep8.txt +1 -1
  269. ansible_test/_data/requirements/sanity.pylint.txt +6 -8
  270. ansible_test/_data/requirements/sanity.runtime-metadata.txt +2 -2
  271. ansible_test/_data/requirements/sanity.validate-modules.txt +3 -3
  272. ansible_test/_data/requirements/sanity.yamllint.in +1 -0
  273. ansible_test/_data/requirements/sanity.yamllint.txt +1 -1
  274. ansible_test/_internal/ansible_util.py +8 -35
  275. ansible_test/_internal/ci/azp.py +1 -1
  276. ansible_test/_internal/classification/__init__.py +0 -2
  277. ansible_test/_internal/cli/parsers/key_value_parsers.py +3 -0
  278. ansible_test/_internal/commands/integration/cloud/hcloud.py +1 -1
  279. ansible_test/_internal/commands/integration/cloud/httptester.py +1 -1
  280. ansible_test/_internal/commands/integration/cloud/nios.py +1 -1
  281. ansible_test/_internal/commands/sanity/__init__.py +96 -19
  282. ansible_test/_internal/commands/sanity/pylint.py +20 -24
  283. ansible_test/_internal/completion.py +2 -0
  284. ansible_test/_internal/constants.py +0 -1
  285. ansible_test/_internal/coverage_util.py +1 -2
  286. ansible_test/_internal/docker_util.py +1 -1
  287. ansible_test/_internal/encoding.py +4 -4
  288. ansible_test/_internal/host_configs.py +10 -0
  289. ansible_test/_internal/host_profiles.py +9 -13
  290. ansible_test/_internal/pypi_proxy.py +1 -1
  291. ansible_test/_internal/python_requirements.py +5 -14
  292. ansible_test/_internal/timeout.py +1 -1
  293. ansible_test/_internal/util.py +40 -0
  294. ansible_test/_internal/util_common.py +5 -1
  295. ansible_test/_util/controller/sanity/code-smell/action-plugin-docs.json +3 -1
  296. ansible_test/_util/controller/sanity/code-smell/action-plugin-docs.py +6 -3
  297. ansible_test/_util/controller/sanity/code-smell/empty-init.json +0 -2
  298. ansible_test/_util/controller/sanity/pylint/config/ansible-test-target.cfg +5 -0
  299. ansible_test/_util/controller/sanity/pylint/config/ansible-test.cfg +5 -0
  300. ansible_test/_util/controller/sanity/pylint/config/code-smell.cfg +5 -0
  301. ansible_test/_util/controller/sanity/pylint/config/collection.cfg +6 -0
  302. ansible_test/_util/controller/sanity/pylint/config/default.cfg +6 -0
  303. ansible_test/_util/controller/sanity/pylint/plugins/deprecated.py +1 -19
  304. ansible_test/_util/controller/sanity/shellcheck/exclude.txt +1 -0
  305. ansible_test/_util/controller/sanity/validate-modules/validate_modules/main.py +67 -2
  306. ansible_test/_util/controller/sanity/validate-modules/validate_modules/schema.py +27 -5
  307. ansible_test/_util/target/cli/ansible_test_cli_stub.py +0 -0
  308. ansible_test/_util/target/common/constants.py +2 -2
  309. ansible_test/_util/target/injector/python.py +5 -0
  310. ansible_test/_util/target/pytest/plugins/ansible_pytest_coverage.py +6 -0
  311. ansible_test/_util/target/sanity/import/importer.py +1 -1
  312. ansible_test/_util/target/setup/bootstrap.sh +6 -17
  313. ansible_test/_util/target/setup/requirements.py +18 -24
  314. ansible_test/config/config.yml +1 -1
  315. ansible_core-2.17.6.data/scripts/ansible-test +0 -44
  316. ansible_test/_data/requirements/sanity.mypy.in +0 -10
  317. ansible_test/_data/requirements/sanity.mypy.txt +0 -18
  318. ansible_test/_internal/commands/sanity/mypy.py +0 -274
  319. ansible_test/_util/controller/sanity/mypy/ansible-core.ini +0 -116
  320. ansible_test/_util/controller/sanity/mypy/ansible-test.ini +0 -27
  321. ansible_test/_util/controller/sanity/mypy/modules.ini +0 -92
  322. ansible_test/_util/controller/sanity/mypy/packaging.ini +0 -20
  323. {ansible_core-2.17.6.dist-info → ansible_core-2.18.0.dist-info}/COPYING +0 -0
  324. {ansible_core-2.17.6.dist-info → ansible_core-2.18.0.dist-info}/WHEEL +0 -0
  325. {ansible_core-2.17.6.dist-info → ansible_core-2.18.0.dist-info}/top_level.txt +0 -0
ansible/modules/user.py CHANGED
@@ -37,19 +37,19 @@ options:
37
37
  version_added: "2.6"
38
38
  non_unique:
39
39
  description:
40
- - Optionally when used with the -u option, this option allows to change the user ID to a non-unique value.
40
+ - Optionally when used with the C(-u) option, this option allows to change the user ID to a non-unique value.
41
41
  type: bool
42
42
  default: no
43
43
  version_added: "1.1"
44
44
  seuser:
45
45
  description:
46
- - Optionally sets the seuser type (user_u) on selinux enabled systems.
46
+ - Optionally sets the C(seuser) type C(user_u) on SELinux enabled systems.
47
47
  type: str
48
48
  version_added: "2.1"
49
49
  group:
50
50
  description:
51
51
  - Optionally sets the user's primary group (takes a group name).
52
- - On macOS, this defaults to V('staff')
52
+ - On macOS, this defaults to V(staff).
53
53
  type: str
54
54
  groups:
55
55
  description:
@@ -74,7 +74,8 @@ options:
74
74
  Since Ansible 2.5, the default shell for non-system users on macOS is V(/bin/bash).
75
75
  - On other operating systems, the default shell is determined by the underlying tool
76
76
  invoked by this module. See Notes for a per platform list of invoked tools.
77
- type: str
77
+ - From Ansible 2.18, the type is changed to I(path) from I(str).
78
+ type: path
78
79
  home:
79
80
  description:
80
81
  - Optionally set the user's home directory.
@@ -95,7 +96,7 @@ options:
95
96
  - To create an account with a locked/disabled password on OpenBSD, set this to V('*************').
96
97
  - B(OS X/macOS:) Enter the cleartext password as the value. Be sure to take relevant security precautions.
97
98
  - On macOS, the password specified in the C(password) option will always be set, regardless of whether the user account already exists or not.
98
- - When the password is passed as an argument, the C(user) module will always return changed to C(true) for macOS systems.
99
+ - When the password is passed as an argument, the M(ansible.builtin.user) module will always return changed to C(true) for macOS systems.
99
100
  Since macOS no longer provides access to the hashed passwords directly.
100
101
  type: str
101
102
  state:
@@ -153,7 +154,7 @@ options:
153
154
  ssh_key_bits:
154
155
  description:
155
156
  - Optionally specify number of bits in SSH key to create.
156
- - The default value depends on ssh-keygen.
157
+ - The default value depends on C(ssh-keygen).
157
158
  type: int
158
159
  version_added: "0.9"
159
160
  ssh_key_type:
@@ -204,7 +205,7 @@ options:
204
205
  - Lock the password (C(usermod -L), C(usermod -U), C(pw lock)).
205
206
  - Implementation differs by platform. This option does not always mean the user cannot login using other methods.
206
207
  - This option does not disable the user, only lock the password.
207
- - This must be set to V(False) in order to unlock a currently locked password. The absence of this parameter will not unlock a password.
208
+ - This must be set to V(false) in order to unlock a currently locked password. The absence of this parameter will not unlock a password.
208
209
  - Currently supported on Linux, FreeBSD, DragonFlyBSD, NetBSD, OpenBSD.
209
210
  type: bool
210
211
  version_added: "2.6"
@@ -265,9 +266,32 @@ options:
265
266
  description:
266
267
  - Sets the umask of the user.
267
268
  - Currently supported on Linux. Does nothing when used with other platforms.
268
- - Requires O(local) is omitted or V(False).
269
+ - Requires O(local) is omitted or V(false).
269
270
  type: str
270
271
  version_added: "2.12"
272
+ password_expire_account_disable:
273
+ description:
274
+ - Number of days after a password expires until the account is disabled.
275
+ - Currently supported on AIX, Linux, NetBSD, OpenBSD.
276
+ type: int
277
+ version_added: "2.18"
278
+ uid_min:
279
+ description:
280
+ - Sets the UID_MIN value for user creation.
281
+ - Overwrites /etc/login.defs default value.
282
+ - Currently supported on Linux. Does nothing when used with other platforms.
283
+ - Requires O(local) is omitted or V(False).
284
+ type: int
285
+ version_added: "2.18"
286
+ uid_max:
287
+ description:
288
+ - Sets the UID_MAX value for user creation.
289
+ - Overwrites /etc/login.defs default value.
290
+ - Currently supported on Linux. Does nothing when used with other platforms.
291
+ - Requires O(local) is omitted or V(False).
292
+ type: int
293
+ version_added: "2.18"
294
+
271
295
  extends_documentation_fragment: action_common_attributes
272
296
  attributes:
273
297
  check_mode:
@@ -356,6 +380,11 @@ EXAMPLES = r'''
356
380
  ansible.builtin.user:
357
381
  name: jane157
358
382
  password_expire_warn: 30
383
+
384
+ - name: Set number of days after password expires until account is disabled
385
+ ansible.builtin.user:
386
+ name: jimholden2016
387
+ password_expire_account_disable: 15
359
388
  '''
360
389
 
361
390
  RETURN = r'''
@@ -582,9 +611,17 @@ class User(object):
582
611
  self.password_expire_min = module.params['password_expire_min']
583
612
  self.password_expire_warn = module.params['password_expire_warn']
584
613
  self.umask = module.params['umask']
614
+ self.inactive = module.params['password_expire_account_disable']
615
+ self.uid_min = module.params['uid_min']
616
+ self.uid_max = module.params['uid_max']
585
617
 
586
- if self.umask is not None and self.local:
587
- module.fail_json(msg="'umask' can not be used with 'local'")
618
+ if self.local:
619
+ if self.umask is not None:
620
+ module.fail_json(msg="'umask' can not be used with 'local'")
621
+ if self.uid_min is not None:
622
+ module.fail_json(msg="'uid_min' can not be used with 'local'")
623
+ if self.uid_max is not None:
624
+ module.fail_json(msg="'uid_max' can not be used with 'local'")
588
625
 
589
626
  if module.params['groups'] is not None:
590
627
  self.groups = ','.join(module.params['groups'])
@@ -757,6 +794,10 @@ class User(object):
757
794
  else:
758
795
  cmd.append(time.strftime(self.DATE_FORMAT, self.expires))
759
796
 
797
+ if self.inactive is not None:
798
+ cmd.append('-f')
799
+ cmd.append(int(self.inactive))
800
+
760
801
  if self.password is not None:
761
802
  cmd.append('-p')
762
803
  if self.password_lock:
@@ -781,6 +822,14 @@ class User(object):
781
822
  if self.system:
782
823
  cmd.append('-r')
783
824
 
825
+ if self.uid_min is not None:
826
+ cmd.append('-K')
827
+ cmd.append('UID_MIN=' + str(self.uid_min))
828
+
829
+ if self.uid_max is not None:
830
+ cmd.append('-K')
831
+ cmd.append('UID_MAX=' + str(self.uid_max))
832
+
784
833
  cmd.append(self.name)
785
834
  (rc, out, err) = self.execute_command(cmd)
786
835
  if not self.local or rc != 0:
@@ -946,6 +995,10 @@ class User(object):
946
995
  cmd.append('-e')
947
996
  cmd.append(time.strftime(self.DATE_FORMAT, self.expires))
948
997
 
998
+ if self.inactive is not None:
999
+ cmd.append('-f')
1000
+ cmd.append(self.inactive)
1001
+
949
1002
  # Lock if no password or unlocked, unlock only if locked
950
1003
  if self.password_lock and not info[1].startswith('!'):
951
1004
  cmd.append('-L')
@@ -1459,6 +1512,14 @@ class FreeBsdUser(User):
1459
1512
  else:
1460
1513
  cmd.append(str(calendar.timegm(self.expires)))
1461
1514
 
1515
+ if self.uid_min is not None:
1516
+ cmd.append('-K')
1517
+ cmd.append('UID_MIN=' + str(self.uid_min))
1518
+
1519
+ if self.uid_max is not None:
1520
+ cmd.append('-K')
1521
+ cmd.append('UID_MAX=' + str(self.uid_max))
1522
+
1462
1523
  # system cannot be handled currently - should we error if its requested?
1463
1524
  # create the user
1464
1525
  (rc, out, err) = self.execute_command(cmd)
@@ -1709,6 +1770,17 @@ class OpenBSDUser(User):
1709
1770
  cmd.append('-K')
1710
1771
  cmd.append('UMASK=' + self.umask)
1711
1772
 
1773
+ if self.inactive is not None:
1774
+ cmd.append('-f')
1775
+ cmd.append(self.inactive)
1776
+ if self.uid_min is not None:
1777
+ cmd.append('-K')
1778
+ cmd.append('UID_MIN=' + str(self.uid_min))
1779
+
1780
+ if self.uid_max is not None:
1781
+ cmd.append('-K')
1782
+ cmd.append('UID_MAX=' + str(self.uid_max))
1783
+
1712
1784
  cmd.append(self.name)
1713
1785
  return self.execute_command(cmd)
1714
1786
 
@@ -1779,6 +1851,10 @@ class OpenBSDUser(User):
1779
1851
  cmd.append('-s')
1780
1852
  cmd.append(self.shell)
1781
1853
 
1854
+ if self.inactive is not None:
1855
+ cmd.append('-f')
1856
+ cmd.append(self.inactive)
1857
+
1782
1858
  if self.login_class is not None:
1783
1859
  # find current login class
1784
1860
  user_login_class = None
@@ -1875,6 +1951,10 @@ class NetBSDUser(User):
1875
1951
  cmd.append('-p')
1876
1952
  cmd.append(self.password)
1877
1953
 
1954
+ if self.inactive is not None:
1955
+ cmd.append('-f')
1956
+ cmd.append(self.inactive)
1957
+
1878
1958
  if self.create_home:
1879
1959
  cmd.append('-m')
1880
1960
 
@@ -1886,6 +1966,14 @@ class NetBSDUser(User):
1886
1966
  cmd.append('-K')
1887
1967
  cmd.append('UMASK=' + self.umask)
1888
1968
 
1969
+ if self.uid_min is not None:
1970
+ cmd.append('-K')
1971
+ cmd.append('UID_MIN=' + str(self.uid_min))
1972
+
1973
+ if self.uid_max is not None:
1974
+ cmd.append('-K')
1975
+ cmd.append('UID_MAX=' + str(self.uid_max))
1976
+
1889
1977
  cmd.append(self.name)
1890
1978
  return self.execute_command(cmd)
1891
1979
 
@@ -1961,6 +2049,10 @@ class NetBSDUser(User):
1961
2049
  cmd.append('-L')
1962
2050
  cmd.append(self.login_class)
1963
2051
 
2052
+ if self.inactive is not None:
2053
+ cmd.append('-f')
2054
+ cmd.append(self.inactive)
2055
+
1964
2056
  if self.update_password == 'always' and self.password is not None and info[1] != self.password:
1965
2057
  cmd.append('-p')
1966
2058
  cmd.append(self.password)
@@ -2087,6 +2179,17 @@ class SunOS(User):
2087
2179
  cmd.append('-R')
2088
2180
  cmd.append(self.role)
2089
2181
 
2182
+ if self.inactive is not None:
2183
+ cmd.append('-f')
2184
+ cmd.append(self.inactive)
2185
+ if self.uid_min is not None:
2186
+ cmd.append('-K')
2187
+ cmd.append('UID_MIN=' + str(self.uid_min))
2188
+
2189
+ if self.uid_max is not None:
2190
+ cmd.append('-K')
2191
+ cmd.append('UID_MAX=' + str(self.uid_max))
2192
+
2090
2193
  cmd.append(self.name)
2091
2194
 
2092
2195
  (rc, out, err) = self.execute_command(cmd)
@@ -2204,6 +2307,10 @@ class SunOS(User):
2204
2307
  cmd.append('-R')
2205
2308
  cmd.append(self.role)
2206
2309
 
2310
+ if self.inactive is not None:
2311
+ cmd.append('-f')
2312
+ cmd.append(self.inactive)
2313
+
2207
2314
  # modify the user if cmd will do anything
2208
2315
  if cmd_len != len(cmd):
2209
2316
  cmd.append(self.name)
@@ -2301,7 +2408,7 @@ class DarwinUser(User):
2301
2408
 
2302
2409
  super(DarwinUser, self).__init__(module)
2303
2410
 
2304
- # make the user hidden if option is set or deffer to system option
2411
+ # make the user hidden if option is set or defer to system option
2305
2412
  if self.hidden is None:
2306
2413
  if self.system:
2307
2414
  self.hidden = 1
@@ -2689,6 +2796,17 @@ class AIX(User):
2689
2796
  cmd.append('-K')
2690
2797
  cmd.append('UMASK=' + self.umask)
2691
2798
 
2799
+ if self.inactive is not None:
2800
+ cmd.append('-f')
2801
+ cmd.append(self.inactive)
2802
+ if self.uid_min is not None:
2803
+ cmd.append('-K')
2804
+ cmd.append('UID_MIN=' + str(self.uid_min))
2805
+
2806
+ if self.uid_max is not None:
2807
+ cmd.append('-K')
2808
+ cmd.append('UID_MAX=' + str(self.uid_max))
2809
+
2692
2810
  cmd.append(self.name)
2693
2811
  (rc, out, err) = self.execute_command(cmd)
2694
2812
 
@@ -2757,6 +2875,10 @@ class AIX(User):
2757
2875
  cmd.append('-s')
2758
2876
  cmd.append(self.shell)
2759
2877
 
2878
+ if self.inactive is not None:
2879
+ cmd.append('-f')
2880
+ cmd.append(self.inactive)
2881
+
2760
2882
  # skip if no changes to be made
2761
2883
  if len(cmd) == 1:
2762
2884
  (rc, out, err) = (None, '', '')
@@ -3021,6 +3143,14 @@ class BusyBox(User):
3021
3143
  if self.system:
3022
3144
  cmd.append('-S')
3023
3145
 
3146
+ if self.uid_min is not None:
3147
+ cmd.append('-K')
3148
+ cmd.append('UID_MIN=' + str(self.uid_min))
3149
+
3150
+ if self.uid_max is not None:
3151
+ cmd.append('-K')
3152
+ cmd.append('UID_MAX=' + str(self.uid_max))
3153
+
3024
3154
  cmd.append(self.name)
3025
3155
 
3026
3156
  rc, out, err = self.execute_command(cmd)
@@ -3130,7 +3260,7 @@ def main():
3130
3260
  groups=dict(type='list', elements='str'),
3131
3261
  comment=dict(type='str'),
3132
3262
  home=dict(type='path'),
3133
- shell=dict(type='str'),
3263
+ shell=dict(type='path'),
3134
3264
  password=dict(type='str', no_log=True),
3135
3265
  login_class=dict(type='str'),
3136
3266
  password_expire_max=dict(type='int', no_log=False),
@@ -3165,6 +3295,9 @@ def main():
3165
3295
  authorization=dict(type='str'),
3166
3296
  role=dict(type='str'),
3167
3297
  umask=dict(type='str'),
3298
+ password_expire_account_disable=dict(type='int', no_log=False),
3299
+ uid_min=dict(type='int'),
3300
+ uid_max=dict(type='int'),
3168
3301
  ),
3169
3302
  supports_check_mode=True,
3170
3303
  )
@@ -16,11 +16,11 @@ version_added: "2.11"
16
16
  options:
17
17
  argument_spec:
18
18
  description:
19
- - A dictionary like AnsibleModule argument_spec. See R(argument spec definition,argument_spec)
19
+ - A dictionary like AnsibleModule argument_spec. See R(argument spec definition,argument_spec).
20
20
  required: true
21
21
  provided_arguments:
22
22
  description:
23
- - A dictionary of the arguments that will be validated according to argument_spec
23
+ - A dictionary of the arguments that will be validated according to argument_spec.
24
24
  author:
25
25
  - Ansible Core Team
26
26
  extends_documentation_fragment:
@@ -51,7 +51,7 @@ attributes:
51
51
  EXAMPLES = r'''
52
52
  - name: verify vars needed for this task file are present when included
53
53
  ansible.builtin.validate_argument_spec:
54
- argument_spec: '{{ required_data }}'
54
+ argument_spec: '{{ required_data }}'
55
55
  vars:
56
56
  required_data:
57
57
  # unlike spec file, just put the options in directly
@@ -14,7 +14,8 @@ description:
14
14
  - Waits for a total of O(timeout) seconds.
15
15
  - Retries the transport connection after a timeout of O(connect_timeout).
16
16
  - Tests the transport connection every O(sleep) seconds.
17
- - This module makes use of internal ansible transport (and configuration) and the ping/win_ping module to guarantee correct end-to-end functioning.
17
+ - This module makes use of internal ansible transport (and configuration) and the M(ansible.builtin.ping)/M(ansible.windows.win_ping)
18
+ modules to guarantee correct end-to-end functioning.
18
19
  - This module is also supported for Windows targets.
19
20
  version_added: '2.3'
20
21
  options: