Public/New-AzureDevopsGuestConfigurationPolicy.ps1
|
Function New-AzureDevopsGuestConfigurationPolicy{ [CmdletBinding()] param ( [string]$StorageAccountName, [string]$StorageContainerName, [string]$StorageAccountKey, [string]$PipelineConfigdata ) Begin{ $jsonData = [System.Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($PipelineConfigdata)) $blobNames = $jsonData | ConvertFrom-Json $SASTokenURls = @() $NewGuestConfigurationPolicyData=@() $storageAccountKey = "$(storagekey)" Write-Verbose "Creating storage account context for $storageAccountName" Try{ $context = New-AzStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $storageAccountKey } Catch{ Write-Error "An error occured xwhile creating storage account context for $storageAccountName. Error - $($_.Exception.Message)." Break } } Process{ Foreach($blobName in $blobNames){ Write-Host "Processing the configuration $blobName" $Pattern = "^$($blobName.ConfigurationName)\.\d+\.\d+\.\d+\.\d+\.zip$" Switch($blobName.ChangeType){ {$_ -ieq "add" -or $_ -ieq "rename" }{ Write-Verbose "Change type - $($blobName.ChangeType), generating SAS url for the config file $($blobName.ConfigurationPackageName)" Write-Verbose "Getting the existing config packages for the config $($blobName.ConfigurationName) from storage account $($StorageAccountName)." Try{ $ExistingConfigurations = Get-AzStorageBlob -Container $StorageContainerName -Context $context | Where-Object {$_.Name -match $Pattern} If($ExistingConfigurations){ Write-Verbose "[$($ExistingConfigurations.Count)] Existing configurations found, performing the cleanup." Write-Verbose "Excluding the latest configuration package - $($blobName.ConfigurationPackageName)" $ConfigurationsToDelete = $ExistingConfigurations | Where-Object {$_.Name -ne "$($blobName.ConfigurationPackageName)"} $ConfigurationsToDelete | Remove-AzStorageBlob -Force } else{ Write-Verbose "No existing configuration package found for the configuration $($blobName.ConfigurationName) in the storage account storage account $($StorageAccountName)" } } Catch{ Write-Error "An error occured while getting the existing config packages for the config $($blobName.ConfigurationName) from storage account $($StorageAccountName). Error - $($_.Exception.Message)" } $sasToken = New-AzStorageBlobSASToken -Container $StorageContainerName -Blob $blobName.ConfigurationPackageName -Permission r -Context $context -ExpiryTime (Get-Date).AddYears(1) -FullUri $SASTokenURls += [PSCustomObject]@{ ConfigurationName = $blobName.ConfigurationName Version = $blobName.Version ConfigurationPackageName = $blobName.ConfigurationPackageName SaSURL = $sasToken ChangeType = $blobName.ChangeType } } {$_ -eq 'Edit'}{ Write-Verbose "Change type - $($blobName.ChangeType), clean-up the existing configuration pacakages." Write-Verbose "Getting the existing config packages for the config $($blobName.ConfigurationName) from storage account $($StorageAccountName)." Try{ $ExistingConfigurations = Get-AzStorageBlob -Container $StorageContainerName -Context $context | Where-Object {$_.Name -match $Pattern} If($ExistingConfigurations){ Write-Verbose "[$($ExistingConfigurations.Count)] Existing configurations found, performing the cleanup." Write-Verbose "Excluding the latest configuration package - $($blobName.ConfigurationPackageName)" $ConfigurationsToDelete = $ExistingConfigurations | Where-Object {$_.Name -ne "$($blobName.ConfigurationPackageName)"} $ConfigurationsToDelete | Remove-AzStorageBlob -Force } else{ Write-Verbose "No existing configuration package found for the configuration $($blobName.ConfigurationName) in the storage account storage account $($StorageAccountName)" } } Catch{ Write-Error "An error occured while getting the existing config packages for the config $($blobName.ConfigurationName) from storage account $($StorageAccountName). Error - $($_.Exception.Message)" } Try{ Write-Verbose "Generating the SAS token for the package $($blobName.ConfigurationPackageName)" $sasToken = New-AzStorageBlobSASToken -Container $StorageContainerName -Blob $blobName.ConfigurationPackageName -Permission r -Context $context -ExpiryTime (Get-Date).AddYears(1) -FullUri $SASTokenURls += [PSCustomObject]@{ ConfigurationName = $blobName.ConfigurationName Version = $blobName.Version ConfigurationPackageName = $blobName.ConfigurationPackageName SaSURL = $sasToken ChangeType = $blobName.ChangeType } } Catch{ Write-Error "An error occured while generating the SAS URL for the config package $($blobName.ConfigurationPackageName) from storage account $($StorageAccountName). Error - $($_.Exception.Message)" } } {$_ -ieq "delete" -or $_ -ieq "delete, sourceRename"} { Write-Verbose "Change type - $($blobName.ChangeType), no SAS url. Deleting the config files from the storage account $($StorageAccountName)" Try{ $ExistingConfigurations = Get-AzStorageBlob -Container $StorageContainerName -Context $context | Where-Object {$_.Name -match $Pattern} If($ExistingConfigurations){ Write-Verbose "[$($ExistingConfigurations.Count)] Existing configurations found, performing the cleanup." $ExistingConfigurations | Remove-AzStorageBlob -Force -ErrorAction Stop $SASTokenURls += [PSCustomObject]@{ ConfigurationName = $blobName.ConfigurationName Version = $blobName.Version ConfigurationPackageName = $blobName.ConfigurationPackageName SaSURL = "NO_SAS_URL" ChangeType = $blobName.ChangeType } } else{ Write-Verbose "No existing configuration package found for the configuration $($blobName.ConfigurationName) in the storage account storage account $($StorageAccountName)" } } Catch{ Write-Error "An error occured while getting the existing config packages for the config $($blobName.ConfigurationName) from storage account $($StorageAccountName). Error - $($_.Exception.Message)" } } }#End of switch }#End of foreach #Return $SASTokenURls foreach($Data in $SASTokenURls){ If($Data.ChangeType -ieq "add" -or $Data.ChangeType -ieq "rename" -or $Data.ChangeType -ieq "edit" ){ Write-Verbose "Generating new guest configuration policy for the configurations $($Data.ConfigurationName). Change type - $($Data.ChangeType)" $PolicyConfig = @{ PolicyId = $(New-Guid) ContentUri = $Data.SaSUrl DisplayName = $($Data.ConfigurationName) Description = $($Data.ConfigurationName) Path = './policies/deployIfNotExists.json' Platform = 'Windows' PolicyVersion = "$($Data.Version)" Mode = 'ApplyAndAutoCorrect' } $NewGuestConfigurationPolicy = New-GuestConfigurationPolicy @PolicyConfig $NewGuestConfigurationPolicyData += [PSCustomObject]@{ PolicyName = $NewGuestConfigurationPolicy.Name PolicyFilePath = $NewGuestConfigurationPolicy.Path PolicyID = $NewGuestConfigurationPolicy.PolicyId Version = $($Data.Version) ChangeType = $Data.ChangeType } } If($Data.ChangeType -ieq "delete, sourceRename" -or $Data.ChangeType -ieq "delete"){ Write-Verbose "Generating new guest configuration policy for the configurations $($Data.ConfigurationName). Change type - $($Data.ChangeType)" $NewGuestConfigurationPolicyData += [PSCustomObject]@{ PolicyName = $Data.ConfigurationName PolicyFilePath = "NA" PolicyID = "NA" Version = $($Data.Version) ChangeType = $Data.ChangeType } } } } End{ $context =@() $PolicyDatacollection = $NewGuestConfigurationPolicyData | ConvertTo-Json -Compress $PolicyCollectionbase64Data = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($PolicyDatacollection)) # Converting into Base64 format to handle the json array data correctly. Write-Verbose "Creating the azure devops variable 'policydatacollection' $($Data.ConfigurationName)." Write-Host "##vso[task.setvariable variable=policydatacollection]$PolicyCollectionbase64Data " #This is to write custom variable in azure devops } } #END OF New-AzureDevopsGuestConfigurationPolicy |