-
-
Notifications
You must be signed in to change notification settings - Fork 13
user_role: update role to take a list instead of string #324
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 5 commits
3fd41b9
8386b2a
40e634e
4c41f7b
c8f0821
d9ffdad
b3693bd
62db4fa
3028fe7
3a47ebc
97b68c7
d66a924
5c2ab58
90783b1
ceb87e6
fca53e7
dd8946d
832774c
d85b0a4
16ae9fa
88f5578
e33a412
4b0dea4
0fcedae
504b80e
0fc0192
d9f3485
8eee960
720455d
29bccba
28a3a2c
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -15,17 +15,19 @@ $spec = @{ | |||||||||||||||||||||||||||||||||||
| options = @{ | ||||||||||||||||||||||||||||||||||||
| database = @{type = 'str'; required = $true } | ||||||||||||||||||||||||||||||||||||
| username = @{type = 'str'; required = $true } | ||||||||||||||||||||||||||||||||||||
| role = @{type = 'str'; required = $true } | ||||||||||||||||||||||||||||||||||||
| roles = @{type = 'list'; elements = 'str'; required = $true; aliases = 'role' } | ||||||||||||||||||||||||||||||||||||
| state = @{type = 'str'; required = $false; default = 'present'; choices = @('present', 'absent') } | ||||||||||||||||||||||||||||||||||||
| remove_unlisted = @{type = 'bool'; required = $false; default = 'false' } | ||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||
| $module = [Ansible.Basic.AnsibleModule]::Create($args, $spec, @(Get-LowlyDbaSqlServerAuthSpec)) | ||||||||||||||||||||||||||||||||||||
| $sqlInstance, $sqlCredential = Get-SqlCredential -Module $module | ||||||||||||||||||||||||||||||||||||
| $username = $module.Params.username | ||||||||||||||||||||||||||||||||||||
| $database = $module.Params.database | ||||||||||||||||||||||||||||||||||||
| $role = $module.Params.role | ||||||||||||||||||||||||||||||||||||
| $roles = $module.Params.roles | ||||||||||||||||||||||||||||||||||||
| $state = $module.Params.state | ||||||||||||||||||||||||||||||||||||
| $remove_unlisted = $module.Params.remove_unlisted | ||||||||||||||||||||||||||||||||||||
| $checkMode = $module.CheckMode | ||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||
| $module.Result.changed = $false | ||||||||||||||||||||||||||||||||||||
|
|
@@ -37,78 +39,126 @@ $getUserSplat = @{ | |||||||||||||||||||||||||||||||||||
| User = $username | ||||||||||||||||||||||||||||||||||||
| EnableException = $true | ||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||
| $getRoleSplat = @{ | ||||||||||||||||||||||||||||||||||||
| SqlInstance = $sqlInstance | ||||||||||||||||||||||||||||||||||||
| SqlCredential = $sqlCredential | ||||||||||||||||||||||||||||||||||||
| Database = $database | ||||||||||||||||||||||||||||||||||||
| Role = $role | ||||||||||||||||||||||||||||||||||||
| EnableException = $true | ||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||
| $outputProps = @{} | ||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||
| # Verify user and role(s) exist, DBATools currently fails silently | ||||||||||||||||||||||||||||||||||||
| $existingUser = Get-DbaDbUser @getUserSplat | ||||||||||||||||||||||||||||||||||||
| if ($null -eq $existingUser) { | ||||||||||||||||||||||||||||||||||||
| $module.FailJson("User [$username] does not exist in database [$database].") | ||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||
| $roles | ForEach-Object { | ||||||||||||||||||||||||||||||||||||
| $thisRole = $_ | ||||||||||||||||||||||||||||||||||||
| $getRoleSplat = @{ | ||||||||||||||||||||||||||||||||||||
| SqlInstance = $sqlInstance | ||||||||||||||||||||||||||||||||||||
| SqlCredential = $sqlCredential | ||||||||||||||||||||||||||||||||||||
| Database = $database | ||||||||||||||||||||||||||||||||||||
| Role = $thisrole | ||||||||||||||||||||||||||||||||||||
|
harCamConsulting marked this conversation as resolved.
Outdated
|
||||||||||||||||||||||||||||||||||||
| EnableException = $true | ||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||
| $existingRole = Get-DbaDbRole @getRoleSplat | ||||||||||||||||||||||||||||||||||||
| if ($null -eq $existingRole) { | ||||||||||||||||||||||||||||||||||||
| $module.FailJson("Role [$thisRole] does not exist in database [$database].") | ||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||
| # Get role members of all roles we care about to compare against later | ||||||||||||||||||||||||||||||||||||
| $getRoleMemberSplat = @{ | ||||||||||||||||||||||||||||||||||||
| SqlInstance = $sqlInstance | ||||||||||||||||||||||||||||||||||||
| SqlCredential = $sqlCredential | ||||||||||||||||||||||||||||||||||||
| Database = $database | ||||||||||||||||||||||||||||||||||||
| Role = $role | ||||||||||||||||||||||||||||||||||||
| IncludeSystemUser = $true | ||||||||||||||||||||||||||||||||||||
| EnableException = $true | ||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||
| # Verify user and role exist, DBATools currently fails silently | ||||||||||||||||||||||||||||||||||||
| $existingUser = Get-DbaDbUser @getUserSplat | ||||||||||||||||||||||||||||||||||||
| if ($null -eq $existingUser) { | ||||||||||||||||||||||||||||||||||||
| $module.FailJson("User [$username] does not exist in database [$database].") | ||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||
| $existingRole = Get-DbaDbRole @getRoleSplat | ||||||||||||||||||||||||||||||||||||
| if ($null -eq $existingRole) { | ||||||||||||||||||||||||||||||||||||
| $module.FailJson("Role [$role] does not exist in database [$database].") | ||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||
| # Get role members | ||||||||||||||||||||||||||||||||||||
| $existingRoleMembers = Get-DbaDbRoleMember @getRoleMemberSplat | ||||||||||||||||||||||||||||||||||||
| $existingRoleMembership = Get-DbaDbRoleMember @getRoleMemberSplat | Where-Object {$_.UserName -eq $username} | Select -ExpandProperty role | Sort-Object | ||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||
| if ($state -eq "absent") { | ||||||||||||||||||||||||||||||||||||
| if ($existingRoleMembers.username -contains $username) { | ||||||||||||||||||||||||||||||||||||
| try { | ||||||||||||||||||||||||||||||||||||
| $removeRoleMemberSplat = @{ | ||||||||||||||||||||||||||||||||||||
| SqlInstance = $sqlInstance | ||||||||||||||||||||||||||||||||||||
| SqlCredential = $sqlCredential | ||||||||||||||||||||||||||||||||||||
| User = $username | ||||||||||||||||||||||||||||||||||||
| Database = $database | ||||||||||||||||||||||||||||||||||||
| Role = $role | ||||||||||||||||||||||||||||||||||||
| EnableException = $true | ||||||||||||||||||||||||||||||||||||
| WhatIf = $checkMode | ||||||||||||||||||||||||||||||||||||
| Confirm = $false | ||||||||||||||||||||||||||||||||||||
| $roles | ForEach-Object { | ||||||||||||||||||||||||||||||||||||
| $thisRole = $_ | ||||||||||||||||||||||||||||||||||||
| if ( $existingRoleMembership -contains $thisRole ) { | ||||||||||||||||||||||||||||||||||||
| try { | ||||||||||||||||||||||||||||||||||||
| $removeRoleMemberSplat = @{ | ||||||||||||||||||||||||||||||||||||
| SqlInstance = $sqlInstance | ||||||||||||||||||||||||||||||||||||
| SqlCredential = $sqlCredential | ||||||||||||||||||||||||||||||||||||
| User = $username | ||||||||||||||||||||||||||||||||||||
| Database = $database | ||||||||||||||||||||||||||||||||||||
| Role = $thisRole | ||||||||||||||||||||||||||||||||||||
| EnableException = $true | ||||||||||||||||||||||||||||||||||||
| WhatIf = $checkMode | ||||||||||||||||||||||||||||||||||||
| Confirm = $false | ||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||
| Remove-DbaDbRoleMember @removeRoleMemberSplat | ||||||||||||||||||||||||||||||||||||
| $module.Result.changed = $true | ||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||
| catch { | ||||||||||||||||||||||||||||||||||||
| $module.FailJson("Removing user [$username] from database role [$thisRole] failed: $($_.Exception.Message)", $_) | ||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||
| $output = Remove-DbaDbRoleMember @removeRoleMemberSplat | ||||||||||||||||||||||||||||||||||||
| $module.Result.changed = $true | ||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||
| catch { | ||||||||||||||||||||||||||||||||||||
| $module.FailJson("Removing user [$username] from database role [$role] failed: $($_.Exception.Message)", $_) | ||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||
|
Comment on lines
+123
to
+150
|
||||||||||||||||||||||||||||||||||||
| elseif ($state -eq "present") { | ||||||||||||||||||||||||||||||||||||
| # Add user to role | ||||||||||||||||||||||||||||||||||||
| if ($existingRoleMembers.username -notcontains $username) { | ||||||||||||||||||||||||||||||||||||
| try { | ||||||||||||||||||||||||||||||||||||
| $addRoleMemberSplat = @{ | ||||||||||||||||||||||||||||||||||||
| SqlInstance = $sqlInstance | ||||||||||||||||||||||||||||||||||||
| SqlCredential = $sqlCredential | ||||||||||||||||||||||||||||||||||||
| User = $username | ||||||||||||||||||||||||||||||||||||
| Database = $database | ||||||||||||||||||||||||||||||||||||
| Role = $role | ||||||||||||||||||||||||||||||||||||
| EnableException = $true | ||||||||||||||||||||||||||||||||||||
| WhatIf = $checkMode | ||||||||||||||||||||||||||||||||||||
| Confirm = $false | ||||||||||||||||||||||||||||||||||||
| $roles | ForEach-Object { | ||||||||||||||||||||||||||||||||||||
| $thisRole = $_ | ||||||||||||||||||||||||||||||||||||
| if ($existingRoleMembership -notcontains $thisRole) { | ||||||||||||||||||||||||||||||||||||
| try { | ||||||||||||||||||||||||||||||||||||
| $addRoleMemberSplat = @{ | ||||||||||||||||||||||||||||||||||||
| SqlInstance = $sqlInstance | ||||||||||||||||||||||||||||||||||||
| SqlCredential = $sqlCredential | ||||||||||||||||||||||||||||||||||||
| User = $username | ||||||||||||||||||||||||||||||||||||
| Database = $database | ||||||||||||||||||||||||||||||||||||
| Role = $thisRole | ||||||||||||||||||||||||||||||||||||
| EnableException = $true | ||||||||||||||||||||||||||||||||||||
| WhatIf = $checkMode | ||||||||||||||||||||||||||||||||||||
| Confirm = $false | ||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||
| Add-DbaDbRoleMember @addRoleMemberSplat | ||||||||||||||||||||||||||||||||||||
| $module.Result.changed = $true | ||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||
| catch { | ||||||||||||||||||||||||||||||||||||
| $module.FailJson("Adding user [$username] to database role [$thisRole] failed: $($_.Exception.Message)", $_) | ||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||
| $output = Add-DbaDbRoleMember @addRoleMemberSplat | ||||||||||||||||||||||||||||||||||||
| $module.Result.changed = $true | ||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||
| catch { | ||||||||||||||||||||||||||||||||||||
| $module.FailJson("Adding user [$username] to database role [$role] failed: $($_.Exception.Message)", $_) | ||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||
| if ($state -eq "present" -and $remove_unlisted -eq $true) { | ||||||||||||||||||||||||||||||||||||
| #remove users from roles that weren't listed (if we got the remove_unlisted option set to true) | ||||||||||||||||||||||||||||||||||||
| $existingRoleMembership | ForEach-Object { | ||||||||||||||||||||||||||||||||||||
| $thisRole = $_ | ||||||||||||||||||||||||||||||||||||
| if ($roles -notcontains $thisRole) { | ||||||||||||||||||||||||||||||||||||
| try { | ||||||||||||||||||||||||||||||||||||
| $removeRoleMemberSplat = @{ | ||||||||||||||||||||||||||||||||||||
| SqlInstance = $sqlInstance | ||||||||||||||||||||||||||||||||||||
| SqlCredential = $sqlCredential | ||||||||||||||||||||||||||||||||||||
| User = $username | ||||||||||||||||||||||||||||||||||||
| Database = $database | ||||||||||||||||||||||||||||||||||||
| Role = $thisRole | ||||||||||||||||||||||||||||||||||||
| EnableException = $true | ||||||||||||||||||||||||||||||||||||
| WhatIf = $checkMode | ||||||||||||||||||||||||||||||||||||
| Confirm = $false | ||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||
| Remove-DbaDbRoleMember @removeRoleMemberSplat | ||||||||||||||||||||||||||||||||||||
| $module.Result.changed = $true | ||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||
| catch { | ||||||||||||||||||||||||||||||||||||
| $module.FailJson("Removing user [$username] from extra unlisted database role [$thisRole] failed: $($_.Exception.Message)", $_) | ||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||
| try { | ||||||||||||||||||||||||||||||||||||
| #after changing any roles above, see what our new membership is and report it back | ||||||||||||||||||||||||||||||||||||
| $newRoleMembership = Get-DbaDbRoleMember @getRoleMemberSplat | Where-Object {$_.UserName -eq $username} | Select -ExpandProperty role | Sort-Object | ||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||
| catch { | ||||||||||||||||||||||||||||||||||||
| $module.FailJson("Failure getting new role membership: $($_.Exception.Message)", $_) | ||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||
| $outputProps.newRoleMembership = [array]$newRoleMembership | ||||||||||||||||||||||||||||||||||||
| $outputProps.oldRoleMembership = [array]$existingRoleMembership | ||||||||||||||||||||||||||||||||||||
| $output = New-Object -TypeName PSCustomObject -Property $outputProps | ||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||
| try { | ||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||
| try { | |
| try { | |
| # In non-compatibility (roles dict) mode, if no output was created earlier (e.g. query-only), | |
| # return the current role membership without a diff. | |
| if (-not $compatibilityMode -and $null -eq $output) { | |
| try { | |
| $membershipObjects = Get-DbaDbRoleMember @commonParamSplat -IncludeSystemUser $true | Where-Object { $_.UserName -eq $username } | |
| $currentRoleMembership = [array]($membershipObjects.role | Sort-Object) | |
| if ($null -eq $currentRoleMembership) { $currentRoleMembership = @() } | |
| } | |
| catch { | |
| $module.FailJson("Failure getting current role membership: $($_.Exception.Message)", $_) | |
| } | |
| if ($null -eq $outputProps) { $outputProps = @{} } | |
| $outputProps.roleMembership = $currentRoleMembership | |
| $output = New-Object -TypeName PSCustomObject -Property $outputProps | |
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@harCamConsulting I think this comment makes sense, can you add this query-mode logic in?
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| /home/cameron/ansible-collections-dev/lowlydba/sqlserver | ||
|
harCamConsulting marked this conversation as resolved.
Outdated
|
||
Uh oh!
There was an error while loading. Please reload this page.