ansible-core 2.17.4rc1__py3-none-any.whl → 2.18.0b1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of ansible-core might be problematic. Click here for more details.

Files changed (320) 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 +30 -53
  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 +14 -11
  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 +48 -31
  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/playbook/task.py +1 -1
  192. ansible/plugins/__init__.py +2 -0
  193. ansible/plugins/action/__init__.py +7 -9
  194. ansible/plugins/action/reboot.py +2 -2
  195. ansible/plugins/become/__init__.py +1 -1
  196. ansible/plugins/callback/__init__.py +44 -3
  197. ansible/plugins/callback/default.py +1 -1
  198. ansible/plugins/cliconf/__init__.py +1 -1
  199. ansible/plugins/connection/paramiko_ssh.py +2 -80
  200. ansible/plugins/connection/psrp.py +33 -82
  201. ansible/plugins/connection/ssh.py +0 -8
  202. ansible/plugins/connection/winrm.py +46 -1
  203. ansible/plugins/doc_fragments/connection_pipelining.py +2 -2
  204. ansible/plugins/doc_fragments/constructed.py +10 -10
  205. ansible/plugins/doc_fragments/default_callback.py +8 -8
  206. ansible/plugins/doc_fragments/files.py +5 -5
  207. ansible/plugins/doc_fragments/inventory_cache.py +2 -2
  208. ansible/plugins/doc_fragments/result_format_callback.py +6 -6
  209. ansible/plugins/doc_fragments/return_common.py +1 -1
  210. ansible/plugins/doc_fragments/shell_common.py +2 -10
  211. ansible/plugins/doc_fragments/shell_windows.py +0 -9
  212. ansible/plugins/doc_fragments/url.py +2 -2
  213. ansible/plugins/doc_fragments/url_windows.py +4 -5
  214. ansible/plugins/doc_fragments/validate.py +1 -1
  215. ansible/plugins/filter/core.py +2 -0
  216. ansible/plugins/filter/human_to_bytes.yml +9 -0
  217. ansible/plugins/filter/password_hash.yml +1 -1
  218. ansible/plugins/filter/strftime.yml +1 -1
  219. ansible/plugins/filter/to_nice_json.yml +7 -3
  220. ansible/plugins/filter/to_uuid.yml +1 -1
  221. ansible/plugins/inventory/script.py +1 -1
  222. ansible/plugins/list.py +1 -1
  223. ansible/plugins/loader.py +0 -11
  224. ansible/plugins/lookup/config.py +1 -1
  225. ansible/plugins/lookup/csvfile.py +21 -9
  226. ansible/plugins/lookup/env.py +8 -9
  227. ansible/plugins/lookup/ini.py +10 -1
  228. ansible/plugins/lookup/random_choice.py +2 -2
  229. ansible/plugins/lookup/url.py +7 -2
  230. ansible/plugins/shell/__init__.py +15 -20
  231. ansible/plugins/shell/powershell.py +9 -6
  232. ansible/plugins/strategy/__init__.py +16 -7
  233. ansible/plugins/test/core.py +23 -1
  234. ansible/plugins/test/issubset.yml +1 -1
  235. ansible/plugins/test/subset.yml +1 -1
  236. ansible/plugins/test/timedout.yml +20 -0
  237. ansible/plugins/test/vault_encrypted.yml +6 -6
  238. ansible/plugins/test/vaulted_file.yml +19 -0
  239. ansible/release.py +2 -2
  240. ansible/template/__init__.py +3 -8
  241. ansible/utils/collection_loader/_collection_finder.py +23 -55
  242. ansible/utils/display.py +44 -31
  243. ansible/utils/jsonrpc.py +1 -1
  244. ansible/utils/listify.py +1 -5
  245. ansible/utils/path.py +3 -0
  246. ansible/utils/vars.py +18 -27
  247. ansible/vars/manager.py +7 -150
  248. ansible/vars/plugins.py +1 -1
  249. ansible_core-2.18.0b1.dist-info/Apache-License.txt +202 -0
  250. {ansible_core-2.17.4rc1.dist-info → ansible_core-2.18.0b1.dist-info}/METADATA +36 -23
  251. ansible_core-2.18.0b1.dist-info/MIT-license.txt +14 -0
  252. ansible_core-2.18.0b1.dist-info/PSF-license.txt +48 -0
  253. {ansible_core-2.17.4rc1.dist-info → ansible_core-2.18.0b1.dist-info}/RECORD +311 -306
  254. {ansible_core-2.17.4rc1.dist-info → ansible_core-2.18.0b1.dist-info}/WHEEL +1 -1
  255. {ansible_core-2.17.4rc1.dist-info → ansible_core-2.18.0b1.dist-info}/entry_points.txt +1 -1
  256. ansible_core-2.18.0b1.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 +5 -7
  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/host_configs.py +10 -0
  288. ansible_test/_internal/host_profiles.py +9 -13
  289. ansible_test/_internal/pypi_proxy.py +1 -1
  290. ansible_test/_internal/python_requirements.py +5 -14
  291. ansible_test/_internal/timeout.py +1 -1
  292. ansible_test/_internal/util.py +40 -0
  293. ansible_test/_internal/util_common.py +5 -1
  294. ansible_test/_util/controller/sanity/code-smell/action-plugin-docs.json +3 -1
  295. ansible_test/_util/controller/sanity/code-smell/action-plugin-docs.py +6 -3
  296. ansible_test/_util/controller/sanity/code-smell/empty-init.json +0 -2
  297. ansible_test/_util/controller/sanity/pylint/config/collection.cfg +1 -0
  298. ansible_test/_util/controller/sanity/pylint/config/default.cfg +1 -0
  299. ansible_test/_util/controller/sanity/pylint/plugins/deprecated.py +1 -19
  300. ansible_test/_util/controller/sanity/shellcheck/exclude.txt +1 -0
  301. ansible_test/_util/controller/sanity/validate-modules/validate_modules/main.py +67 -2
  302. ansible_test/_util/controller/sanity/validate-modules/validate_modules/schema.py +27 -5
  303. ansible_test/_util/target/cli/ansible_test_cli_stub.py +0 -0
  304. ansible_test/_util/target/common/constants.py +2 -2
  305. ansible_test/_util/target/injector/python.py +5 -0
  306. ansible_test/_util/target/pytest/plugins/ansible_pytest_coverage.py +6 -0
  307. ansible_test/_util/target/sanity/import/importer.py +1 -1
  308. ansible_test/_util/target/setup/bootstrap.sh +6 -17
  309. ansible_test/_util/target/setup/requirements.py +14 -20
  310. ansible_test/config/config.yml +1 -1
  311. ansible_core-2.17.4rc1.data/scripts/ansible-test +0 -44
  312. ansible_test/_data/requirements/sanity.mypy.in +0 -10
  313. ansible_test/_data/requirements/sanity.mypy.txt +0 -18
  314. ansible_test/_internal/commands/sanity/mypy.py +0 -274
  315. ansible_test/_util/controller/sanity/mypy/ansible-core.ini +0 -116
  316. ansible_test/_util/controller/sanity/mypy/ansible-test.ini +0 -27
  317. ansible_test/_util/controller/sanity/mypy/modules.ini +0 -92
  318. ansible_test/_util/controller/sanity/mypy/packaging.ini +0 -20
  319. {ansible_core-2.17.4rc1.dist-info → ansible_core-2.18.0b1.dist-info}/COPYING +0 -0
  320. {ansible_core-2.17.4rc1.dist-info → ansible_core-2.18.0b1.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')
@@ -1444,6 +1497,14 @@ class FreeBsdUser(User):
1444
1497
  else:
1445
1498
  cmd.append(str(calendar.timegm(self.expires)))
1446
1499
 
1500
+ if self.uid_min is not None:
1501
+ cmd.append('-K')
1502
+ cmd.append('UID_MIN=' + str(self.uid_min))
1503
+
1504
+ if self.uid_max is not None:
1505
+ cmd.append('-K')
1506
+ cmd.append('UID_MAX=' + str(self.uid_max))
1507
+
1447
1508
  # system cannot be handled currently - should we error if its requested?
1448
1509
  # create the user
1449
1510
  (rc, out, err) = self.execute_command(cmd)
@@ -1694,6 +1755,17 @@ class OpenBSDUser(User):
1694
1755
  cmd.append('-K')
1695
1756
  cmd.append('UMASK=' + self.umask)
1696
1757
 
1758
+ if self.inactive is not None:
1759
+ cmd.append('-f')
1760
+ cmd.append(self.inactive)
1761
+ if self.uid_min is not None:
1762
+ cmd.append('-K')
1763
+ cmd.append('UID_MIN=' + str(self.uid_min))
1764
+
1765
+ if self.uid_max is not None:
1766
+ cmd.append('-K')
1767
+ cmd.append('UID_MAX=' + str(self.uid_max))
1768
+
1697
1769
  cmd.append(self.name)
1698
1770
  return self.execute_command(cmd)
1699
1771
 
@@ -1764,6 +1836,10 @@ class OpenBSDUser(User):
1764
1836
  cmd.append('-s')
1765
1837
  cmd.append(self.shell)
1766
1838
 
1839
+ if self.inactive is not None:
1840
+ cmd.append('-f')
1841
+ cmd.append(self.inactive)
1842
+
1767
1843
  if self.login_class is not None:
1768
1844
  # find current login class
1769
1845
  user_login_class = None
@@ -1860,6 +1936,10 @@ class NetBSDUser(User):
1860
1936
  cmd.append('-p')
1861
1937
  cmd.append(self.password)
1862
1938
 
1939
+ if self.inactive is not None:
1940
+ cmd.append('-f')
1941
+ cmd.append(self.inactive)
1942
+
1863
1943
  if self.create_home:
1864
1944
  cmd.append('-m')
1865
1945
 
@@ -1871,6 +1951,14 @@ class NetBSDUser(User):
1871
1951
  cmd.append('-K')
1872
1952
  cmd.append('UMASK=' + self.umask)
1873
1953
 
1954
+ if self.uid_min is not None:
1955
+ cmd.append('-K')
1956
+ cmd.append('UID_MIN=' + str(self.uid_min))
1957
+
1958
+ if self.uid_max is not None:
1959
+ cmd.append('-K')
1960
+ cmd.append('UID_MAX=' + str(self.uid_max))
1961
+
1874
1962
  cmd.append(self.name)
1875
1963
  return self.execute_command(cmd)
1876
1964
 
@@ -1946,6 +2034,10 @@ class NetBSDUser(User):
1946
2034
  cmd.append('-L')
1947
2035
  cmd.append(self.login_class)
1948
2036
 
2037
+ if self.inactive is not None:
2038
+ cmd.append('-f')
2039
+ cmd.append(self.inactive)
2040
+
1949
2041
  if self.update_password == 'always' and self.password is not None and info[1] != self.password:
1950
2042
  cmd.append('-p')
1951
2043
  cmd.append(self.password)
@@ -2072,6 +2164,17 @@ class SunOS(User):
2072
2164
  cmd.append('-R')
2073
2165
  cmd.append(self.role)
2074
2166
 
2167
+ if self.inactive is not None:
2168
+ cmd.append('-f')
2169
+ cmd.append(self.inactive)
2170
+ if self.uid_min is not None:
2171
+ cmd.append('-K')
2172
+ cmd.append('UID_MIN=' + str(self.uid_min))
2173
+
2174
+ if self.uid_max is not None:
2175
+ cmd.append('-K')
2176
+ cmd.append('UID_MAX=' + str(self.uid_max))
2177
+
2075
2178
  cmd.append(self.name)
2076
2179
 
2077
2180
  (rc, out, err) = self.execute_command(cmd)
@@ -2189,6 +2292,10 @@ class SunOS(User):
2189
2292
  cmd.append('-R')
2190
2293
  cmd.append(self.role)
2191
2294
 
2295
+ if self.inactive is not None:
2296
+ cmd.append('-f')
2297
+ cmd.append(self.inactive)
2298
+
2192
2299
  # modify the user if cmd will do anything
2193
2300
  if cmd_len != len(cmd):
2194
2301
  cmd.append(self.name)
@@ -2286,7 +2393,7 @@ class DarwinUser(User):
2286
2393
 
2287
2394
  super(DarwinUser, self).__init__(module)
2288
2395
 
2289
- # make the user hidden if option is set or deffer to system option
2396
+ # make the user hidden if option is set or defer to system option
2290
2397
  if self.hidden is None:
2291
2398
  if self.system:
2292
2399
  self.hidden = 1
@@ -2674,6 +2781,17 @@ class AIX(User):
2674
2781
  cmd.append('-K')
2675
2782
  cmd.append('UMASK=' + self.umask)
2676
2783
 
2784
+ if self.inactive is not None:
2785
+ cmd.append('-f')
2786
+ cmd.append(self.inactive)
2787
+ if self.uid_min is not None:
2788
+ cmd.append('-K')
2789
+ cmd.append('UID_MIN=' + str(self.uid_min))
2790
+
2791
+ if self.uid_max is not None:
2792
+ cmd.append('-K')
2793
+ cmd.append('UID_MAX=' + str(self.uid_max))
2794
+
2677
2795
  cmd.append(self.name)
2678
2796
  (rc, out, err) = self.execute_command(cmd)
2679
2797
 
@@ -2742,6 +2860,10 @@ class AIX(User):
2742
2860
  cmd.append('-s')
2743
2861
  cmd.append(self.shell)
2744
2862
 
2863
+ if self.inactive is not None:
2864
+ cmd.append('-f')
2865
+ cmd.append(self.inactive)
2866
+
2745
2867
  # skip if no changes to be made
2746
2868
  if len(cmd) == 1:
2747
2869
  (rc, out, err) = (None, '', '')
@@ -3006,6 +3128,14 @@ class BusyBox(User):
3006
3128
  if self.system:
3007
3129
  cmd.append('-S')
3008
3130
 
3131
+ if self.uid_min is not None:
3132
+ cmd.append('-K')
3133
+ cmd.append('UID_MIN=' + str(self.uid_min))
3134
+
3135
+ if self.uid_max is not None:
3136
+ cmd.append('-K')
3137
+ cmd.append('UID_MAX=' + str(self.uid_max))
3138
+
3009
3139
  cmd.append(self.name)
3010
3140
 
3011
3141
  rc, out, err = self.execute_command(cmd)
@@ -3115,7 +3245,7 @@ def main():
3115
3245
  groups=dict(type='list', elements='str'),
3116
3246
  comment=dict(type='str'),
3117
3247
  home=dict(type='path'),
3118
- shell=dict(type='str'),
3248
+ shell=dict(type='path'),
3119
3249
  password=dict(type='str', no_log=True),
3120
3250
  login_class=dict(type='str'),
3121
3251
  password_expire_max=dict(type='int', no_log=False),
@@ -3150,6 +3280,9 @@ def main():
3150
3280
  authorization=dict(type='str'),
3151
3281
  role=dict(type='str'),
3152
3282
  umask=dict(type='str'),
3283
+ password_expire_account_disable=dict(type='int', no_log=False),
3284
+ uid_min=dict(type='int'),
3285
+ uid_max=dict(type='int'),
3153
3286
  ),
3154
3287
  supports_check_mode=True,
3155
3288
  )
@@ -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: