有没有办法获取任务中使用的 SubscriptionID:“Azure 资源组部署”

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

我正在 Azure Devops 中使用 Azure 资源组部署 任务。一些覆盖模板参数包括 SubscriptionID。

-virtualNetworkId /subscriptions/53614803-d327-4397-bf55-8dedcc24be0d/resourceGroups/$(resourceGroup)/providers/Microsoft.Network/virtualNetworks/vnet 

是否需要使用 Azure 订阅连接中使用的 SubsciptionID?

原因: 构建管道中需要知道 subscriptionId。这也解决了uniqueString模板问题,我们需要知道uniqueString,但是powershell没有办法告诉你。

我的部署正在构建为在不同订阅的任何资源组中运行。我正在使用在门户中创建一台虚拟机时生成的 ARM 模板来部署多台虚拟机。其中一个参数嵌入了订阅 ID,如问题所示。由于变量是如何在门户构建的模板内计算的, [subscription.SubscriptionId] 不起作用:

  "variables": {
    "vnetId": "[parameters('virtualNetworkId')]",
    "subnetRef": "[concat(variables('vnetId'), '/subnets/', parameters('subnetName'))]",

它在运行时最终为:

/subscriptions/$(subscription().subscriptionid)/resourceGroups/Dev1/providers/Microsoft.Network/virtualNetworks/vnet/subnets/default

我不想编辑模板,因为我需要对未来的部署进行一些调整,并且可能会使用门户来制作新模板。构建管道中需要知道 subscriptionId。这也解决了uniqueString模板问题,我们需要知道uniqueString,但是powershell没有办法告诉你。

azure azure-devops azure-pipelines-build-task
5个回答
6
投票

您可以使用此 YAML 管道从 Azure Cli 任务获取订阅并创建一个名为 subscriptionId

的管道变量
trigger:
- none

pool:
  vmImage: 'windows-latest'


stages:
- stage: Build
  displayName: Build stage

  jobs:
  - job: GetSubscription
    steps:
    - checkout: none
    - task: AzureCLI@2
      inputs:
        azureSubscription: 'CTP.AssuranceDW-Non-Production'
        scriptType: 'ps'
        scriptLocation: 'inlineScript'
        inlineScript: |
          $id = convertfrom-json (az account list --query "[?isDefault].id | [0]")
          Write-Host $id
          echo "##vso[task.setvariable variable=subscriptionId]$id"
    - powershell: Write-Host $(subscriptionId)

4
投票

解决方案:我创建了一个带有输出变量和空参数文件的空白模板: 模板.json:

{
  "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {  },
  "variables": {  },
  "resources": [ ],
  "outputs": {
    "subscriptionId": {
      "condition": "[bool('true')]",
      "type": "string",
      "value": "[subscription().subscriptionId]"
    },
    "uniqueString": {
      "condition": "[bool('true')]",
      "type": "string",
      "value": "[uniqueString(resourceGroup().id)]"
    }
  }
}

参数.json

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
  }
}

然后我运行了任务:

1。 Azure 资源组部署 -> 运行空模板

2。 ARM 输出 -> 将 ARM 的输出捕获为变量:

##[section]Starting: ARM Outputs
==============================================================================
Task         : ARM Outputs
Description  : This task reads the output values of an ARM deployment and sets them as Azure Pipelines variables.
Version      : 5.0.21
Author       : Kees Schollaart
Help         : [More Information](https://github.com/keesschollaart81/vsts-arm-outputs)
==============================================================================
1ef1317c-0917-4a7e-a922-a31b6069c707 exists true
Logging in using ApplicationTokenCredentials, authScheme is 'ServicePrincipal'
Updating Azure Pipelines variable 'subscriptionId'
Updating Azure Pipelines variable 'uniqueString'
##[section]Finishing: ARM Outputs

然后我调用真正的 Azure 资源组部署 来运行我的实际模板。

现在我可以使用管道语法设置覆盖模板参数属性,即 $(parmName):

-location eastus 
-enableAcceleratedNetworking true 
-subnetName default 
-virtualNetworkId /subscriptions/$(subscriptionId)/resourceGroups/$(resourceGroup)/providers/Microsoft.Network/virtualNetworks/vnet 
-diagnosticsStorageAccountId /subscriptions/$(subscriptionId)**/resourceGroups/$(resourceGroup)/providers/Microsoft.Storage/storageAccounts/osdiag$(uniqueString) 
...

1
投票

Powershell az 命令

此命令将输出默认订阅 ID:

convertfrom-json (az account list --query "[?isDefault].id | [0]")

它可以在Azure CLI任务中使用,查询语言是JMESPath


0
投票

对于那些拥有多个订阅的人,您可以通过订阅名称进行查询(如果您完全可以这样做),然后获取单个不带引号的值

az account list --query "[?name == 'Azure subscription 1'].{Id:id}" -o tsv

从这个链接了解了一切 https://learn.microsoft.com/en-us/cli/azure/query-azure-cli


0
投票

如果您使用Ubuntu代理/运行程序,这里我们运行实际的az和grep命令来获取订阅id

- job: 'MyJob'
  pool:
    vmImage: ubuntu-latest

  steps:
  - checkout: self
    displayName: 'Check out repository code'
 
  - task: AzureCLI@2
    inputs:
      azureSubscription: 'CTP.AssuranceDW-Non-Production'
      scriptType: 'bash'
      scriptLocation: 'inlineScript'
      inlineScript: |
        SUBSCRIPTION_ID=$(az account list --query "[?isDefault].id | [0]" | sed "s/\"//g")
        echo $SUBSCRIPTION_ID
© www.soinside.com 2019 - 2024. All rights reserved.