在Azure CLI任务中传递变量组值时如何正确转义?
解决Azure CLI传递含特殊字符机密到Bicep的问题
方案1:使用JSON参数文件(推荐,最可靠)
通过生成JSON参数文件传递参数,完全规避命令行转义问题。PowerShell的ConvertTo-Json会自动处理所有特殊字符的转义(包括双引号、单引号、反斜杠、换行等),是稳定性最高的方案。
流水线步骤示例:
- task: AzureCLI@2 displayName: deploy bicep template inputs: azureSubscription: ${{ parameters.azure_subscription }} scriptType: 'ps' scriptLocation: 'inlineScript' inlineScript: | # 构建参数对象 $params = @{ environment = "${{ parameters.environment }}" kv_secret_one = "$(bd_kv_secret_one)" kv_secret_two = "$(bd_kv_secret_two)" } # 导出为UTF-8编码的JSON参数文件 $params | ConvertTo-Json -Depth 10 | Out-File -FilePath $(Pipeline.Workspace)/params.json -Encoding utf8 # 执行部署,引用参数文件 az deployment group create ` --name foo.$(Build.BuildNumber) ` --resource-group my-rg-name ` --template-file $(Pipeline.Workspace)/iac/main.bicep ` --parameters @$(Pipeline.Workspace)/params.json
方案2:PowerShell变量中转后传递
将机密存入PowerShell变量,再用双引号包裹传递给Azure CLI,依赖PowerShell自动处理变量内的特殊字符转义,适合不想生成额外文件的场景。
流水线步骤示例:
- task: AzureCLI@2 displayName: deploy bicep template inputs: azureSubscription: ${{ parameters.azure_subscription }} scriptType: 'ps' scriptLocation: 'inlineScript' inlineScript: | # 将机密存入PowerShell变量 $secret1 = "$(bd_kv_secret_one)" $secret2 = "$(bd_kv_secret_two)" # 执行部署,用双引号传递变量 az deployment group create ` --name foo.$(Build.BuildNumber) ` --resource-group my-rg-name ` --template-file $(Pipeline.Workspace)/iac/main.bicep ` --parameters environment="${{ parameters.environment }}" ` kv_secret_one="$secret1" ` kv_secret_two="$secret2"
方案3:直接传递JSON字符串参数
将参数转换为压缩的JSON字符串,直接传递给--parameters参数,Azure CLI会按照JSON标准解析内容,无需手动转义。
流水线步骤示例:
- task: AzureCLI@2 displayName: deploy bicep template inputs: azureSubscription: ${{ parameters.azure_subscription }} scriptType: 'ps' scriptLocation: 'inlineScript' inlineScript: | # 生成压缩格式的参数JSON字符串 $paramsJson = @{ environment = "${{ parameters.environment }}" kv_secret_one = "$(bd_kv_secret_one)" kv_secret_two = "$(bd_kv_secret_two)" } | ConvertTo-Json -Compress # 执行部署,传递JSON字符串 az deployment group create ` --name foo.$(Build.BuildNumber) ` --resource-group my-rg-name ` --template-file $(Pipeline.Workspace)/iac/main.bicep ` --parameters $paramsJson
内容的提问来源于stack exchange,提问作者mortenbock
相关产品推荐
相关产品推荐

