我正在使用安全字符串输出和安全字符串输入测试 Arm 模板任务的部署。
第一个任务输出 cosmosdb 的安全字符串。
- task: AzureResourceManagerTemplateDeployment@3
displayName: "Create CosmosDB"
inputs:
deploymentScope: 'Resource Group'
azureResourceManagerConnection: ${{ parameters['ServiceConnection']}}
subscriptionId: $(SubscriptionID)
action: 'Create Or Update Resource Group'
resourceGroupName: '$(ResourceGroup)'
location: 'West Europe'
templateLocation: 'Linked artifact'
csmFile: '$(Pipeline.Workspace)/drop/armtemplates/cosmosdb_deployment.json'
csmParametersFile: '$(Pipeline.Workspace)/drop/armtemplates/cosmosdb_parameters.json'
deploymentMode: 'Incremental'
deploymentOutputs: 'ArmOutputsCMDB'
overrideParameters: '-SubscriptionName $(subname) -VersionToDeploy $(VersionToDeploy) -CosmosResourceName $(CosmosResourceName) -DatabaseID $(DatabaseID) -ContainerID $(ContainerID) -PartitionKey $(PartitionKey) -CosmosDBmaxThroughput $(CosmosDBmaxThroughput)'
continueOnError: false
在第二个任务中,我想将第一个任务的输出也用作 securestring 的类型。不幸的是,该字符串返回一个空值。
我要在第二个任务中覆盖的参数是: -CosmosDbConnectionString $(ArmOutputsCMDBPrimaryConnectionStringCosmos)
我尝试使用 powershell 脚本输出安全字符串并使其成为带有选项 issecret=true 的变量,但这也没有在第二个任务中为我提供正确的输入,它仍然是一个空值。
Powershell
- task: PowerShell@2
displayName: "Create variables from Cosmos output"
inputs:
targetType: 'inline'
script: |
$outputs = ConvertFrom-Json $($env:ArmOutputsCMDB)
foreach ($output in $outputs.PSObject.Properties) {
Write-Host "##vso[task.setvariable
variable=$($output.Name);issecret=true]$($output.Value.value)"
}
continueOnError: false
当我使用 azure devops 库来获取机密时,该机密会传递到arm模板并用作安全字符串。
我找不到原因。
当我将第二个任务中的参数设为字符串类型时,变量不为空。当我将其更改为 securestring 时,该值为空。
我找到了一篇微软的文章。
不要使用安全字符串或对象作为输出值。如果您包含安全值作为输出值,则该值不会显示在部署历史记录中,并且无法从其他模板中检索。相反,请将安全值保存在密钥保管库中,并作为参数从密钥保管库传递。
在这种情况下我正在改变部署方式并这样做。
对于步骤 5,AzureKeyVault@2 任务上的属性 RunAsPreJob 必须设置为 false。因此,您可以在步骤 3/4 中定义后下载机密。
对我来说,这个解决方法/选项/解决方案现在有效。