diff --git a/README-user.md b/README-user.md
index e7a934ba..630d860d 100644
--- a/README-user.md
+++ b/README-user.md
@@ -142,6 +142,64 @@ And ensure the presence of the users with this example playbook:
users: "{{ users }}"
```
+Ensure user pinky is present with a generated random password and print the random password:
+
+```yaml
+---
+- name: Playbook to handle users
+ hosts: ipaserver
+ become: true
+
+ tasks:
+ # Ensure user pinky is present with a random password
+ - ipauser:
+ ipaadmin_password: MyPassword123
+ name: brain
+ first: brain
+ last: Acme
+ random: yes
+ register: ipauser
+
+ - name: Print generated random password
+ debug:
+ var: ipauser.user.randompassword
+```
+
+Ensure users pinky and brain are present with a generated random password and print the random passwords:
+
+```yaml
+---
+- name: Playbook to handle users
+ hosts: ipaserver
+ become: true
+
+ tasks:
+ # Ensure users pinky and brain are present with random password
+ - ipauser:
+ ipaadmin_password: MyPassword123
+ users:
+ - name: pinky
+ first: pinky
+ last: Acme
+ uid: 10001
+ gid: 100
+ phone: "+555123457"
+ email: pinky@acme.com
+ passwordexpiration: "2023-01-19 23:59:59"
+ password: "no-brain"
+ - name: brain
+ first: brain
+ last: Acme
+ register: ipauser
+
+ - name: Print generated random password of pinky
+ debug:
+ var: ipauser.user.pinky.randompassword
+
+ - name: Print generated random password of brain
+ debug:
+ var: ipauser.user.brain.randompassword
+```
Example playbook to delete a user, but preserve it:
@@ -366,6 +424,22 @@ Variable | Description | Required
`nomembers` | Suppress processing of membership attributes. (bool) | no
+
+Return Values
+=============
+
+ipauser
+-------
+
+There are only return values if one or more random passwords have been generated.
+
+Variable | Description | Returned When
+-------- | ----------- | -------------
+`host` | Host dict with random password. (dict)
Options: | If random is yes and user did not exist or update_password is yes
+ | `randompassword` - The generated random password | If only one user is handled by the module
+ | `name` - The user name of the user that got a new random password. (dict)
Options:
`randompassword` - The generated random password | If several users are handled by the module
+
+
Authors
=======
diff --git a/playbooks/user/ensure_user_with_randompassword.yml b/playbooks/user/ensure_user_with_randompassword.yml
new file mode 100644
index 00000000..4ca9f214
--- /dev/null
+++ b/playbooks/user/ensure_user_with_randompassword.yml
@@ -0,0 +1,19 @@
+---
+- name: Ensure user with random password
+ hosts: ipaserver
+ become: true
+
+ tasks:
+ - name: User user1 present with random password
+ ipauser:
+ ipaadmin_password: MyPassword123
+ name: user1
+ first: first1
+ last: last1
+ random: yes
+ update_password: on_create
+ register: ipauser
+
+ - name: Print generated random password
+ debug:
+ var: ipauser.user.randompassword
diff --git a/playbooks/user/ensure_users_with_randompasswords.yml b/playbooks/user/ensure_users_with_randompasswords.yml
new file mode 100644
index 00000000..06f50c71
--- /dev/null
+++ b/playbooks/user/ensure_users_with_randompasswords.yml
@@ -0,0 +1,28 @@
+---
+- name: Tests
+ hosts: ipaserver
+ become: true
+
+ tasks:
+ - name: Users user1 and user1 present with random password
+ ipauser:
+ ipaadmin_password: MyPassword123
+ users:
+ - name: user1
+ first: first1
+ last: last1
+ random: yes
+ - name: user2
+ first: first2
+ last: last2
+ random: yes
+ update_password: on_create
+ register: ipauser
+
+ - name: Print generated random password for user1
+ debug:
+ var: ipauser.user.user1.randompassword
+
+ - name: Print generated random password for user2
+ debug:
+ var: ipauser.user.user2.randompassword
diff --git a/plugins/modules/ipauser.py b/plugins/modules/ipauser.py
index 9d4574f0..5964790b 100644
--- a/plugins/modules/ipauser.py
+++ b/plugins/modules/ipauser.py
@@ -436,6 +436,22 @@ EXAMPLES = """
"""
RETURN = """
+user:
+ description: User dict with random password
+ returned: If random is yes and user did not exist or update_password is yes
+ type: dict
+ options:
+ randompassword:
+ description: The generated random password
+ returned: If only one user is handled by the module
+ name:
+ description: The user name of the user that got a new random password
+ returned: If several users are handled by the module
+ type: dict
+ options:
+ randompassword:
+ description: The generated random password
+ returned: always
"""
from ansible.module_utils.basic import AnsibleModule
@@ -1003,7 +1019,8 @@ def main():
else:
commands.append([name, "user_add", args])
- # Handle members: principal, manager
+ # Handle members: principal, manager, certificate and
+ # certmapdata
if res_find is not None:
# Generate addition and removal lists
manager_add = list(
@@ -1274,6 +1291,16 @@ def main():
changed = True
else:
changed = True
+
+ if "random" in args and command in ["user_add", "user_mod"] \
+ and "randompassword" in result["result"]:
+ if len(names) == 1:
+ exit_args["randompassword"] = \
+ result["result"]["randompassword"]
+ else:
+ exit_args.setdefault(name, {})["randompassword"] = \
+ result["result"]["randompassword"]
+
except Exception as e:
msg = str(e)
if "already contains" in msg \
@@ -1310,7 +1337,7 @@ def main():
# Done
- ansible_module.exit_json(changed=changed, **exit_args)
+ ansible_module.exit_json(changed=changed, user=exit_args)
if __name__ == "__main__":
diff --git a/tests/user/test_user_random.yml b/tests/user/test_user_random.yml
new file mode 100644
index 00000000..47e4a350
--- /dev/null
+++ b/tests/user/test_user_random.yml
@@ -0,0 +1,70 @@
+---
+- name: Test ipauser random password generation
+ hosts: ipaserver
+ become: true
+
+ tasks:
+ - name: Users user1 and user2 absent
+ ipauser:
+ ipaadmin_password: MyPassword123
+ name:
+ - user1
+ - user2
+ state: absent
+
+ - name: User user1 present with random password
+ ipauser:
+ ipaadmin_password: MyPassword123
+ name: user1
+ first: first1
+ last: last1
+ random: yes
+ update_password: on_create
+ register: ipauser
+ failed_when: not ipauser.changed or
+ ipauser.user.randompassword is not defined
+
+ - name: Print generated random password
+ debug:
+ var: ipauser.user.randompassword
+
+ - name: User user1 absent
+ ipauser:
+ ipaadmin_password: MyPassword123
+ name:
+ - user1
+ state: absent
+
+ - name: Users user1 and user1 present with random password
+ ipauser:
+ ipaadmin_password: MyPassword123
+ users:
+ - name: user1
+ first: first1
+ last: last1
+ random: yes
+ - name: user2
+ first: first2
+ last: last2
+ random: yes
+ update_password: on_create
+ register: ipauser
+ failed_when: not ipauser.changed or
+ ipauser.user.user1.randompassword is not defined or
+ ipauser.user.user2.randompassword is not defined
+
+ - name: Print generated random password for user1
+ debug:
+ var: ipauser.user.user1.randompassword
+
+ - name: Print generated random password for user2
+ debug:
+ var: ipauser.user.user2.randompassword
+
+ - name: Users user1 and user2 absent
+ ipauser:
+ ipaadmin_password: MyPassword123
+ name:
+ - user1
+ - user2
+ state: absent