Skip to content

Commit 63c1e27

Browse files
makirilloybed
andauthored
Adding new role management (#98)
* Adding new role management New role management is checking runtime config to create additional accounts based on 'additonal_groups` parameter. This allows to create two (admin and generic) accounts for users with privileged role like cluster administrators. * Fixing user-reset functionality The user-reset functionality is partially broken now since list for user to reset is not including accounts that was created for the additional groups configured in runtime. This fix includes all accounts associated with user specified under queue/user-management-*.json files. * Minor fixes after testing * Adding check for runtime.json file * Fixing remove queue generation * Adding verification to user_options.user_roles.options * Code fine-tuning and clean-up * Code fine-tuning and clean-up * Code fine-tuning and clean-up * Code fine-tuning and clean-up * Minor fixes - process_list_of_users.yml called twice, so user_list variable contain data not only form list of users to be added but list of users to remove (queue). This leads to incorrect group information. - state absent was missed from users listed for removal * Removing debug code Removing debug code Co-authored-by: Øystein Bedin <[email protected]> Co-authored-by: Øystein Bedin <[email protected]>
1 parent cb3767a commit 63c1e27

File tree

8 files changed

+174
-46
lines changed

8 files changed

+174
-46
lines changed

inventory-generation/identity-management/main.yml

Lines changed: 84 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
---
2+
23
- name: Generate identity-management inventory based off of engagement.json
34
hosts: local
45
gather_facts: true
@@ -13,12 +14,36 @@
1314
include_vars:
1415
file: "{{ directory }}/engagement.json"
1516

17+
- name: Check if Runtime Data file exist
18+
stat:
19+
path: "{{ directory }}/runtime.json"
20+
register: runtime_file_data
21+
22+
- name: Fail if runtime.json not found
23+
fail:
24+
msg: "The runtime.json file not found"
25+
when: not runtime_file_data.stat.exists
26+
27+
- name: Read Runtime Data
28+
include_vars:
29+
file: "{{ directory }}/runtime.json"
30+
when: runtime_file_data.stat.exists
31+
1632
- name: "Fail If Governor Type Is Not Provided"
1733
fail:
1834
msg: "governor_type and governor_spec vars need to be provided in order to indicate babylon workflow"
1935
when:
2036
- (governor_type is undefined or (governor_type | trim) == "") or (governor_spec is undefined or (governor_spec | trim) == "")
2137

38+
- name: "Fail if user_options.user_roles.options Is Not Provided"
39+
fail:
40+
msg: "user_options.user_roles.options is not defined at runtime.json file or contain incorrect values"
41+
when: >
42+
user_options is undefined or
43+
user_options.user_roles is undefined or
44+
user_options.user_roles.options is undefined or
45+
user_options.user_roles.options[0].value is undefined
46+
2247
- name: Generate Timestamp
2348
set_fact:
2449
inv_ts: "{{ lookup('pipe','date +%Y%m%d%H%M%S') }}"
@@ -30,50 +55,84 @@
3055
- "ocp-admin-credentials.json"
3156
- "ocp-ldap-sa-credentials.json"
3257

33-
- name: "Add users to inventory"
34-
set_fact:
35-
users: "{{ (users | default([])) + [ { 'first_name': (item.first_name | trim), 'last_name': (item.last_name | trim), 'email': (item.email | trim) , 'user_name': (item.email.split('@')[0] | trim) } ] }}"
36-
loop: "{{ engagement_users }}"
58+
#####################################################################################################################
59+
# Process list of users in the queue that needs to be removed
60+
#
61+
- block:
62+
- include_tasks: process_queue_list.yml
63+
- include_tasks: process_list_of_users.yml
64+
vars:
65+
list_of_users_to_process: "{{ list_of_users_to_remove | d([]) }}"
66+
- set_fact:
67+
users_to_remove: "{{ processed_users | d([]) }}"
3768

38-
- name: "Add LDAP Service Account"
39-
set_fact:
40-
users: "{{ (users | default([])) + [ { 'first_name': 'LDAP', 'last_name': 'SA', 'email': '[email protected]', 'user_name': ocp_ldap_sa_username, 'generate_password': False, 'notify_user': False, 'password': ocp_ldap_sa_password } ] }}"
69+
#####################################################################################################################
70+
# Process list of users that are part of this engagement
71+
#
72+
- block:
73+
- include_tasks: process_list_of_users.yml
74+
vars:
75+
list_of_users_to_process: "{{ engagement_users | d([]) }}"
76+
- set_fact:
77+
users: "{{ processed_users | d([]) }}"
4178

42-
- name: "Get Unique Groups"
79+
#####################################################################################################################
80+
# Process user groups and group memberships
81+
#
82+
- include_tasks: process_groups.yml
83+
loop_control:
84+
loop_var: group_item
85+
loop: "{{ user_options.user_roles.options }}"
86+
87+
- name: "Get Unique Groups from runtime config"
4388
set_fact:
44-
unique_groups: "{{ engagement_users | json_query('[].role') | unique }}"
89+
unique_groups: "{{ user_options.user_roles.options | json_query('[].value') | unique }}"
4590

46-
- name: "Set Group Membership"
91+
#####################################################################################################################
92+
# Add in the LDAP SA and group sync memberships
93+
#
94+
- name: "Create a LDAP user and group facts to simplify processing below"
95+
set_fact:
96+
ldap_users:
97+
- first_name: 'LDAP'
98+
last_name: 'SA'
99+
100+
user_name: "{{ ocp_ldap_sa_username }}"
101+
password: "{{ ocp_ldap_sa_password }}"
102+
generate_password: False
103+
notify_user: False
104+
ldap_groups:
105+
- name: 'ldap-members'
106+
childgroups: "{{ unique_groups }}"
107+
108+
- name: "Add LDAP Service Account to list of users"
47109
set_fact:
48-
usrgrp: "{{ (usrgrp | default([])) + [ {'name': item, 'members': (engagement_users | selectattr('role','equalto',item) | map(attribute='email') | map('regex_replace','@.*','') | list) } ] }}"
49-
loop: "{{ unique_groups }}"
110+
users: "{{ (users | default([])) + ldap_users }}"
50111

51112
- name: Add LDAP Groups Grouping
52113
set_fact:
53-
usrgrp: "{{ (usrgrp | default([])) + [ {'name': 'ldap-members', 'childgroups': unique_groups } ] }}"
114+
user_groups: "{{ (user_groups | default([])) + ldap_groups }}"
115+
54116

117+
#####################################################################################################################
118+
# Generate the CC list for emails
119+
#
55120
- name: "Set List of Mail CC"
56121
set_fact:
57122
cc_list: "{{ ', '.join(( '{{ engagement_lead_email }}', '{{ technical_lead_email }}' )) }}"
58123

59-
- name: "Check for Job queue"
60-
ansible.builtin.stat:
61-
path: "{{ directory }}/queue"
62-
register: job_queue
63-
ignore_errors: True
64-
65-
- name: "Process Job queue"
66-
include: "queue/main.yml"
67-
when:
68-
- job_queue.stat.isdir is defined
69124

125+
#####################################################################################################################
126+
# Gather repository facts for better processing below
127+
#
70128
- name: "Set repository information"
71129
set_fact:
72130
repository_url: "{{ url | default(omit) }}"
73131
repository_ssh_key: "{{ lookup('file', ssh_key_data_path, lstrip=False, rstrip=False) | default(omit) }}"
74132
repository_username: "{{ username if username is defined else omit }}"
75133
repository_password: "{{ password if password is defined else omit }}"
76134

135+
77136
#####################################################################################################################
78137
# Right now, the only supported configuration is a list of one hosting environment.
79138
# In the near future, this should be updated to support more than one, and this comment (and the code below)
@@ -103,9 +162,9 @@
103162
list_of_mail_cc: "{{ cc_list }}"
104163
lodestar_identities:
105164
users: "{{ users }}"
106-
groups: "{{ usrgrp }}"
165+
groups: "{{ user_groups }}"
107166
lodestar_identities_remove:
108-
users: "{{ users_remove | default([]) }}"
167+
users: "{{ users_to_remove | default([]) }}"
109168
repository:
110169
url: "{{ repository_url if repository_url is defined else omit }}"
111170
ssh_key: "{{ ( repository_ssh_key | to_nice_yaml( default_style='>-', indent=4, width=5000 ) | trim) if repository_ssh_key is defined else omit }}"
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
3+
- name: "Set Group Membership"
4+
set_fact:
5+
user_groups: "{{ (user_groups | default([])) + [ {'name': group_item.value, 'members': (user_list[group_item.value] | map(attribute='user_name') | list) } ] }}"
6+
when: user_list[group_item.value] is defined
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
---
2+
- set_fact:
3+
user_list: []
4+
5+
- include_tasks: process_user.yml
6+
loop_control:
7+
loop_var: user_item
8+
loop: "{{ list_of_users_to_process | d([]) }}"
9+
10+
- name: "Assemble final list of users"
11+
set_fact:
12+
processed_users: "{{ user_list.keys() | map('extract', user_list) | list | flatten | unique }}"
13+
when:
14+
- user_list | length > 0
15+
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
---
2+
3+
- name: "Check for Job queue"
4+
ansible.builtin.stat:
5+
path: "{{ directory }}/queue"
6+
register: job_queue
7+
ignore_errors: True
8+
9+
- name: "Process User Management Jobs in the queue"
10+
find:
11+
paths: "{{ directory }}/queue"
12+
patterns: "user-management-*.json"
13+
register: jobs_user_management
14+
when:
15+
- job_queue.stat.path is defined
16+
17+
- name: "Assemble list of users to be removed"
18+
include: "process_user_removal.yml"
19+
loop_control:
20+
loop_var: job
21+
with_items:
22+
- "{{ jobs_user_management.files }}"
23+
when:
24+
- jobs_user_management is defined
25+
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
---
2+
3+
- set_fact:
4+
user_group_list: []
5+
6+
- set_fact:
7+
user_group_list: "{{ item.additional_groups | d([]) + [ user_item.role] }}"
8+
loop: "{{ user_options.user_roles.options }}"
9+
when:
10+
- user_item.role == item.value
11+
12+
- include_tasks: process_user_entry.yml
13+
loop_control:
14+
loop_var: user_group
15+
loop: "{{ user_group_list }}"
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
---
2+
3+
- set_fact:
4+
name_append: ''
5+
6+
- set_fact:
7+
prefix: "{{ item.username_alteration.prefix | d('') }}"
8+
suffix: "{{ item.username_alteration.suffix | d('') }}"
9+
loop: "{{ user_options.user_roles.options }}"
10+
when:
11+
- user_group == item.value
12+
13+
- set_fact:
14+
name_append: " ({{ user_group }})"
15+
when:
16+
- prefix|trim != '' or suffix|trim != ''
17+
18+
- set_fact:
19+
new_user:
20+
first_name: "{{ user_item.first_name|trim }}"
21+
last_name: "{{ user_item.last_name|trim }}{{ name_append|d('') }}"
22+
email: "{{ user_item.email|trim }}"
23+
user_name: "{{ prefix }}{{ user_item.email.split('@')[0]|trim }}{{ suffix }}"
24+
state: "{{ user_item.state | d('present') }}"
25+
26+
- set_fact:
27+
user_list: "{{ user_list|d({})|combine({user_group: (user_list[user_group]|d([]) + [ new_user ]) }) }}"

inventory-generation/identity-management/queue/user-management.yml renamed to inventory-generation/identity-management/process_user_removal.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@
1111
last_name: "{{ last_name | trim }}"
1212
email: "{{ email | trim }}"
1313
user_name: "{{ email.split('@')[0] | trim }}"
14+
role: "{{ role | trim }}"
1415
state: "absent"
1516

1617
- name: "Add User to removal queue"
1718
set_fact:
18-
users_remove: "{{ (users_remove | default([])) + [ user_info ] }}"
19+
list_of_users_to_remove: "{{ (list_of_users_to_remove | d([])) + [ user_info ] }}"

inventory-generation/identity-management/queue/main.yml

Lines changed: 0 additions & 20 deletions
This file was deleted.

0 commit comments

Comments
 (0)