Octopus.AzurePowerShell exported 2021-06-02 by harrisonmeister belongs to ‘Azure Key Vault’ category.
This step retrieves one or more secrets from an Azure Key Vault and creates sensitive output variables for each value retrieved. These values can be used in other steps in your deployment or runbook process.
You can retrieve secrets with a specific version, and you can choose a custom output variable name for each secret.
Required:
- An azure account with permissions to retrieve secrets from the Azure Key Vault.
- The
Az.KeyVault
PowerShell module installed on the target or worker. If the module can’t be found, the step will fail. TheAz
module(s) can be installed from the PowerShell gallery
Notes:
- Tested on Octopus
2021.1
. - Tested with both Windows PowerShell and PowerShell Core on Linux.
Parameters
When steps based on the template are included in a project’s deployment process, the parameters below can be set.
Azure Account
Azure.KeyVault.RetrieveSecrets.Account =
An Azure account with permissions to retrieve secrets from the Azure Key Vault.
Vault Name
Azure.KeyVault.RetrieveSecrets.VaultName =
The name of the Azure Key Vault to retrieve secrets from.
Vault Secrets to retrieve
Azure.KeyVault.RetrieveSecrets.VaultSecrets =
Specify the names of the Secrets to be returned from Azure Key Vault, in the format SecretName SecretVersion | OutputVariableName
where:
SecretName
is the name of the Secret to retrieve.SecretVersion
is the optional version of the Secret to retrieve. If this value isn’t specified, the latest version will be retrieved.OutputVariableName
is the optional Octopus output variable name to store the secret’s value in. If this value isn’t specified, an output name will be generated dynamically.
Note: Multiple fields can be retrieved by entering each one on a new line.
Print output variable names
Azure.KeyVault.RetrieveSecrets.PrintVariableNames = False
Write out the Octopus output variable names to the task log. Default: False
.
Az PowerShell Module version (optional)
Azure.KeyVault.RetrieveSecrets.AzModule.SpecificVersion =
If you wish to use a specific version of the Az
PowerShell module (rather than the default), enter the version number here. e.g. 5.9.0
.
Note: The version specified must exist on the machine.
Az PowerShell Install Location (optional)
Azure.KeyVault.RetrieveSecrets.AzModule.CustomInstallLocation =
If you wish to provide a custom path to the Az
PowerShell module (rather than the default), enter the value here.
Note: The Module must exist at the specified location on the machine. This step template will not download the Module.
Script body
Steps based on this template will execute the following PowerShell script.
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$ErrorActionPreference = 'Stop'
# Variables
$AzVaultModuleName = "Az.KeyVault"
$AzureKeyVaultName = $OctopusParameters["Azure.KeyVault.RetrieveSecrets.VaultName"]
$VaultSecretNames = $OctopusParameters["Azure.KeyVault.RetrieveSecrets.VaultSecrets"]
$AzVaultModuleSpecificVersion = $OctopusParameters["Azure.KeyVault.RetrieveSecrets.AzModule.SpecificVersion"]
$AzVaultModuleCustomInstallLocation = $OctopusParameters["Azure.KeyVault.RetrieveSecrets.AzModule.CustomInstallLocation"]
$PrintVariableNames = $OctopusParameters["Azure.KeyVault.RetrieveSecrets.PrintVariableNames"]
# Validation
if ([string]::IsNullOrWhiteSpace($AzureKeyVaultName)) {
throw "Required parameter Azure.KeyVault.RetrieveSecrets.VaultName not specified"
}
if ([string]::IsNullOrWhiteSpace($VaultSecretNames)) {
throw "Required parameter Azure.KeyVault.RetrieveSecrets.VaultSecrets not specified"
}
if ([string]::IsNullOrWhiteSpace($AzVaultModuleSpecificVersion) -eq $False) {
$requiredVersion = [Version]$AzVaultModuleSpecificVersion
}
# Cross-platform bits
$WindowsPowerShell = $True
if ($PSEdition -eq "Core") {
$WindowsPowerShell = $False
}
### Helper functions
function Get-Module-CrossPlatform {
[CmdletBinding()]
Param(
[Parameter(Mandatory = $true, Position = 0)]
[string] $Name
)
$module = Get-Module -Name $Name -ListAvailable
if($WindowsPowerShell -eq $True -and $null -eq $module) {
$module = Get-InstalledModule -Name $Name
}
return $module
}
$PowerShellModuleName = $AzVaultModuleName
# Check for Custom install location specified for AzVaultModule
if ([string]::IsNullOrWhiteSpace($AzVaultModuleCustomInstallLocation) -eq $false) {
if ((Test-Path $AzVaultModuleCustomInstallLocation -IsValid) -eq $false) {
throw "The path $AzVaultModuleCustomInstallLocation is not valid, please use a relative or absolute path."
}
$AzVaultModulesFolder = [System.IO.Path]::GetFullPath($AzVaultModuleCustomInstallLocation)
$LocalModules = (New-Item "$AzVaultModulesFolder" -ItemType Directory -Force).FullName
$env:PSModulePath = $LocalModules + [System.IO.Path]::PathSeparator + $env:PSModulePath
# Check to see if there
if ((Test-Path -Path "$LocalModules/$AzVaultModuleName") -eq $true)
{
# Use specific location
$PowerShellModuleName = "$LocalModules/$PowerShellModuleName"
}
}
# Import module
if([string]::IsNullOrWhiteSpace($AzVaultModuleSpecificVersion)) {
Write-Host "Importing module $PowerShellModuleName ..."
Import-Module -Name $PowerShellModuleName
}
else {
Write-Host "Importing module $PowerShellModuleName ($AzVaultModuleSpecificVersion)..."
Import-Module -Name $PowerShellModuleName -RequiredVersion $requiredVersion
}
# Check if Az.Vault Module is installed.
$azVaultModule = Get-Module-CrossPlatform -Name $AzVaultModuleName
if ($null -eq $azVaultModule) {
throw "Cannot find the '$AzVaultModuleName' module on the machine. If you think it is installed, try restarting the Tentacle service for it to be detected."
}
$Secrets = @()
$VariablesCreated = 0
$StepName = $OctopusParameters["Octopus.Step.Name"]
# Extract secret names+versions
@(($VaultSecretNames -Split "`n").Trim()) | ForEach-Object {
if (![string]::IsNullOrWhiteSpace($_)) {
Write-Verbose "Working on: '$_'"
$secretDefinition = ($_ -Split "\|")
$secretName = $secretDefinition[0].Trim()
$secretNameAndVersion = ($secretName -Split " ")
$secretVersion = $null
if($secretNameAndVersion.Count -gt 1) {
$secretName = $secretNameAndVersion[0].Trim()
$secretVersion = $secretNameAndVersion[1].Trim()
}
if([string]::IsNullOrWhiteSpace($secretName)) {
throw "Unable to establish secret name from: '$($_)'"
}
$secret = [PsCustomObject]@{
Name = $secretName
SecretVersion= $secretVersion
VariableName = if (![string]::IsNullOrWhiteSpace($secretDefinition[1])) { $secretDefinition[1].Trim() } else { "" }
}
$Secrets += $secret
}
}
Write-Verbose "Vault Name: $AzureKeyVaultName"
Write-Verbose "Print variables: $PrintVariableNames"
Write-Verbose "Secrets to retrieve: $($Secrets.Count)"
Write-Verbose "Az Version specified: $AzVaultModuleSpecificVersion"
Write-Verbose "Az Custom Install Dir: $AzVaultModuleCustomInstallLocation"
# Retrieve Secrets
foreach($secret in $secrets) {
$name = $secret.Name
$secretVersion = $secret.SecretVersion
$variableName = $secret.VariableName
if ([string]::IsNullOrWhiteSpace($variableName)) {
$variableName = "$($AzureKeyVaultName.Trim()).$($name.Trim())"
}
if ([string]::IsNullOrWhiteSpace($secretVersion)) {
$azSecretValue = Get-AzKeyVaultSecret -VaultName $AzureKeyVaultName -Name $name -AsPlainText
}
else {
$azSecretValue = Get-AzKeyVaultSecret -VaultName $AzureKeyVaultName -Name $name -Version $secretVersion -AsPlainText
}
Set-OctopusVariable -Name $variableName -Value $azSecretValue -Sensitive
if($PrintVariableNames -eq $True) {
Write-Host "Created output variable: ##{Octopus.Action[$StepName].Output.$variableName}"
}
$VariablesCreated += 1
}
Write-Host "Created $variablesCreated output variables"
Provided under the Apache License version 2.0.
To use this template in Octopus Deploy, copy the JSON below and paste it into the Library → Step templates → Import dialog.
{
"Id": "6f59f8aa-b2db-4f7a-b02d-a72c13d386f0",
"Name": "Azure Key Vault - Retrieve Secrets",
"Description": "This step retrieves one or more secrets from an Azure Key Vault and creates [sensitive output variables](https://octopus.com/docs/projects/variables/output-variables#sensitive-output-variables) for each value retrieved. These values can be used in other steps in your deployment or runbook process.\n\nYou can retrieve secrets with a specific version, and you can choose a custom output variable name for each secret.\n\n---\n\n**Required:** \n- An azure account with permissions to retrieve secrets from the Azure Key Vault.\n- The`Az.KeyVault` PowerShell module installed on the target or worker. If the module can't be found, the step will fail. *The `Az` module(s) can be installed from the [PowerShell gallery](https://www.powershellgallery.com/packages/Az)*\n\nNotes:\n\n- Tested on Octopus `2021.1`.\n- Tested with both Windows PowerShell and PowerShell Core on Linux.\n\n",
"Version": 2,
"ExportedAt": "2021-06-02T08:34:02.548Z",
"ActionType": "Octopus.AzurePowerShell",
"Author": "harrisonmeister",
"Packages": [],
"Parameters": [
{
"Id": "5b05337d-a62d-44f4-a702-95b45a400160",
"Name": "Azure.KeyVault.RetrieveSecrets.Account",
"Label": "Azure Account",
"HelpText": "An Azure account with permissions to retrieve secrets from the Azure Key Vault.",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "AzureAccount"
}
},
{
"Id": "9b09b2b3-3c4d-4cbb-a065-8955f62448ad",
"Name": "Azure.KeyVault.RetrieveSecrets.VaultName",
"Label": "Vault Name",
"HelpText": "The name of the Azure Key Vault to retrieve secrets from.",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Id": "43949afd-1049-41fc-bd01-e878476f5952",
"Name": "Azure.KeyVault.RetrieveSecrets.VaultSecrets",
"Label": "Vault Secrets to retrieve",
"HelpText": "Specify the names of the Secrets to be returned from Azure Key Vault, in the format `SecretName SecretVersion | OutputVariableName` where:\n\n- `SecretName` is the name of the Secret to retrieve.\n- `SecretVersion` is the _optional_ version of the Secret to retrieve. *If this value isn't specified, the latest version will be retrieved*.\n- `OutputVariableName` is the _optional_ Octopus [output variable](https://octopus.com/docs/projects/variables/output-variables) name to store the secret's value in. *If this value isn't specified, an output name will be generated dynamically*.\n\n**Note:** Multiple fields can be retrieved by entering each one on a new line.",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "MultiLineText"
}
},
{
"Id": "46842344-405e-4633-a63f-115baaff7774",
"Name": "Azure.KeyVault.RetrieveSecrets.PrintVariableNames",
"Label": "Print output variable names",
"HelpText": "Write out the Octopus [output variable](https://octopus.com/docs/projects/variables/output-variables) names to the task log. Default: `False`.",
"DefaultValue": "False",
"DisplaySettings": {
"Octopus.ControlType": "Checkbox"
}
},
{
"Id": "0c20c004-c792-4acc-81c5-62ecceecf6ac",
"Name": "Azure.KeyVault.RetrieveSecrets.AzModule.SpecificVersion",
"Label": "Az PowerShell Module version (optional)",
"HelpText": "If you wish to use a specific version of the `Az` PowerShell module (rather than the default), enter the version number here. e.g. `5.9.0`.\n\n**Note:** The version specified must exist on the machine.\n",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Id": "d4d93a9a-72e1-48be-9ed6-78986bbfaa06",
"Name": "Azure.KeyVault.RetrieveSecrets.AzModule.CustomInstallLocation",
"Label": "Az PowerShell Install Location (optional)",
"HelpText": "If you wish to provide a custom path to the `Az` PowerShell module (rather than the default), enter the value here.\n\n**Note:** The Module must exist at the specified location on the machine. This step template will not download the Module.\n",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
}
],
"Properties": {
"Octopus.Action.Script.ScriptSource": "Inline",
"Octopus.Action.Script.Syntax": "PowerShell",
"OctopusUseBundledTooling": "False",
"Octopus.Action.Script.ScriptBody": "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12\n$ErrorActionPreference = 'Stop'\n\n# Variables\n$AzVaultModuleName = \"Az.KeyVault\"\n$AzureKeyVaultName = $OctopusParameters[\"Azure.KeyVault.RetrieveSecrets.VaultName\"]\n$VaultSecretNames = $OctopusParameters[\"Azure.KeyVault.RetrieveSecrets.VaultSecrets\"]\n$AzVaultModuleSpecificVersion = $OctopusParameters[\"Azure.KeyVault.RetrieveSecrets.AzModule.SpecificVersion\"]\n$AzVaultModuleCustomInstallLocation = $OctopusParameters[\"Azure.KeyVault.RetrieveSecrets.AzModule.CustomInstallLocation\"]\n$PrintVariableNames = $OctopusParameters[\"Azure.KeyVault.RetrieveSecrets.PrintVariableNames\"]\n\n# Validation\nif ([string]::IsNullOrWhiteSpace($AzureKeyVaultName)) {\n throw \"Required parameter Azure.KeyVault.RetrieveSecrets.VaultName not specified\"\n}\nif ([string]::IsNullOrWhiteSpace($VaultSecretNames)) {\n throw \"Required parameter Azure.KeyVault.RetrieveSecrets.VaultSecrets not specified\"\n}\n\nif ([string]::IsNullOrWhiteSpace($AzVaultModuleSpecificVersion) -eq $False) {\n $requiredVersion = [Version]$AzVaultModuleSpecificVersion\n}\n\n# Cross-platform bits\n$WindowsPowerShell = $True\nif ($PSEdition -eq \"Core\") {\n $WindowsPowerShell = $False\n}\n\n### Helper functions\nfunction Get-Module-CrossPlatform {\n [CmdletBinding()]\n Param(\n [Parameter(Mandatory = $true, Position = 0)]\n [string] $Name\n )\n\n $module = Get-Module -Name $Name -ListAvailable\n if($WindowsPowerShell -eq $True -and $null -eq $module) {\n $module = Get-InstalledModule -Name $Name\n }\n\n return $module\n}\n\n$PowerShellModuleName = $AzVaultModuleName\n\n# Check for Custom install location specified for AzVaultModule\nif ([string]::IsNullOrWhiteSpace($AzVaultModuleCustomInstallLocation) -eq $false) {\n if ((Test-Path $AzVaultModuleCustomInstallLocation -IsValid) -eq $false) {\n throw \"The path $AzVaultModuleCustomInstallLocation is not valid, please use a relative or absolute path.\"\n }\n \n $AzVaultModulesFolder = [System.IO.Path]::GetFullPath($AzVaultModuleCustomInstallLocation) \n $LocalModules = (New-Item \"$AzVaultModulesFolder\" -ItemType Directory -Force).FullName\n $env:PSModulePath = $LocalModules + [System.IO.Path]::PathSeparator + $env:PSModulePath\n\n # Check to see if there\n if ((Test-Path -Path \"$LocalModules/$AzVaultModuleName\") -eq $true)\n {\n # Use specific location\n $PowerShellModuleName = \"$LocalModules/$PowerShellModuleName\"\n }\n}\n\n# Import module\nif([string]::IsNullOrWhiteSpace($AzVaultModuleSpecificVersion)) {\n Write-Host \"Importing module $PowerShellModuleName ...\"\n Import-Module -Name $PowerShellModuleName\n}\nelse {\n Write-Host \"Importing module $PowerShellModuleName ($AzVaultModuleSpecificVersion)...\"\n Import-Module -Name $PowerShellModuleName -RequiredVersion $requiredVersion\n}\n\n# Check if Az.Vault Module is installed.\n$azVaultModule = Get-Module-CrossPlatform -Name $AzVaultModuleName\t\nif ($null -eq $azVaultModule) {\n throw \"Cannot find the '$AzVaultModuleName' module on the machine. If you think it is installed, try restarting the Tentacle service for it to be detected.\"\t\n}\n\n$Secrets = @()\n$VariablesCreated = 0\n$StepName = $OctopusParameters[\"Octopus.Step.Name\"]\n\n# Extract secret names+versions \n@(($VaultSecretNames -Split \"`n\").Trim()) | ForEach-Object {\n if (![string]::IsNullOrWhiteSpace($_)) {\n Write-Verbose \"Working on: '$_'\"\n $secretDefinition = ($_ -Split \"\\|\")\n $secretName = $secretDefinition[0].Trim()\n $secretNameAndVersion = ($secretName -Split \" \")\n $secretVersion = $null\n if($secretNameAndVersion.Count -gt 1) {\n \t$secretName = $secretNameAndVersion[0].Trim()\n $secretVersion = $secretNameAndVersion[1].Trim()\n }\n if([string]::IsNullOrWhiteSpace($secretName)) {\n throw \"Unable to establish secret name from: '$($_)'\"\n }\n $secret = [PsCustomObject]@{\n Name = $secretName\n SecretVersion= $secretVersion\n VariableName = if (![string]::IsNullOrWhiteSpace($secretDefinition[1])) { $secretDefinition[1].Trim() } else { \"\" }\n }\n $Secrets += $secret\n }\n}\n\nWrite-Verbose \"Vault Name: $AzureKeyVaultName\"\nWrite-Verbose \"Print variables: $PrintVariableNames\"\nWrite-Verbose \"Secrets to retrieve: $($Secrets.Count)\"\nWrite-Verbose \"Az Version specified: $AzVaultModuleSpecificVersion\"\nWrite-Verbose \"Az Custom Install Dir: $AzVaultModuleCustomInstallLocation\"\n\n# Retrieve Secrets\nforeach($secret in $secrets) {\n $name = $secret.Name\n $secretVersion = $secret.SecretVersion\n $variableName = $secret.VariableName\n if ([string]::IsNullOrWhiteSpace($variableName)) {\n $variableName = \"$($AzureKeyVaultName.Trim()).$($name.Trim())\"\n }\n \n if ([string]::IsNullOrWhiteSpace($secretVersion)) {\n \t$azSecretValue = Get-AzKeyVaultSecret -VaultName $AzureKeyVaultName -Name $name -AsPlainText \n }\n else {\n \t$azSecretValue = Get-AzKeyVaultSecret -VaultName $AzureKeyVaultName -Name $name -Version $secretVersion -AsPlainText\n }\n \n Set-OctopusVariable -Name $variableName -Value $azSecretValue -Sensitive\n\n if($PrintVariableNames -eq $True) {\n Write-Host \"Created output variable: ##{Octopus.Action[$StepName].Output.$variableName}\"\n }\n $VariablesCreated += 1\n}\n\nWrite-Host \"Created $variablesCreated output variables\"",
"Octopus.Action.Azure.AccountId": "#{Azure.KeyVault.RetrieveSecrets.Account}"
},
"Category": "Azure Key Vault",
"HistoryUrl": "https://github.com/OctopusDeploy/Library/commits/master/step-templates//opt/buildagent/work/75443764cd38076d/step-templates/azure-keyvault-retrieve-secrets.json",
"Website": "/step-templates/6f59f8aa-b2db-4f7a-b02d-a72c13d386f0",
"Logo": "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",
"$Meta": {
"Type": "ActionTemplate"
}
}
Page updated on Wednesday, June 2, 2021