将秘密变量输出从arm模板任务传递到第二个arm模板任务(在同一作业中)

问题描述 投票:0回答:1

我正在使用安全字符串输出和安全字符串输入测试 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 时,该值为空。

azure-devops azure-pipelines-yaml azure-rm-template
1个回答
0
投票

我找到了一篇微软的文章。

不要使用安全字符串或对象作为输出值。如果您包含安全值作为输出值,则该值不会显示在部署历史记录中,并且无法从其他模板中检索。相反,请将安全值保存在密钥保管库中,并作为参数从密钥保管库传递。

在这种情况下我正在改变部署方式并这样做。

  1. 从密钥库获取密钥(如果存在)。
  2. 如果步骤 1 为真,则禁用当前版本。
  3. 部署手臂模板。
  4. 在步骤 3 中通过 Arm 模板在密钥保管库中设置机密。
  5. 使用 Key Vault 任务从 Key Vault 下载下一个任务中的密钥,并在第二个 Arm 模板中使用该变量。

对于步骤 5,AzureKeyVault@2 任务上的属性 RunAsPreJob 必须设置为 false。因此,您可以在步骤 3/4 中定义后下载机密。

对我来说,这个解决方法/选项/解决方案现在有效。

© www.soinside.com 2019 - 2024. All rights reserved.