Как использовать значения выходов ARM для другой задачи выпуска?

У меня есть шаблон ARM, который имеет и выводит раздел следующим образом:

"outputs": {
    "sqlServerFqdn": {
        "type": "string",
        "value": "[reference(concat('Microsoft.Sql/servers/', variables('sqlserverName'))).fullyQualifiedDomainName]"
    },
    "primaryConnectionString": {
        "type": "string",
        "value": "[concat('Data Source=tcp:', reference(concat('Microsoft.Sql/servers/', variables('sqlserverName'))).fullyQualifiedDomainName, ',1433;Initial Catalog=', variables('databaseName'), ';User Id=', parameters('administratorLogin'), '@', variables('sqlserverName'), ';Password=', parameters('administratorLoginPassword'), ';')]"
    },
    "envResourceGroup": {
        "type": "string",
        "value": "[parameters('hostingPlanName')]"
    }
}

У меня есть задача развертывания группы ресурсов Azure, которая использует шаблон. Затем я хочу использовать переменную $(sqlServerFqdn) в следующей задаче для конфигурации. Переменная, похоже, просто не заполняется, и я не могу найти нигде, что говорит мне, как использовать значения "выходов" при выпуске.

Что мне нужно сделать, чтобы заполнить эту переменную для использования при настройке задач после запуска этого шаблона ARM? Примером может служить параметр в задаче powershell script или другом шаблоне ARM.

Ответ 1

Захват этого ответа, потому что я всегда решаю этот вопрос при поиске решения.

Существует задача на рынке, которая делает параметры вывода шаблона ARM доступными дальше по конвейеру. Но в некоторых случаях у вас нет разрешения на покупку позиций на рынке для вашей подписки, поэтому следующий PowerShell сделает то же самое. Чтобы использовать его, вы добавляете его как шаг powershell script сразу же после этапа развертывания группы ресурсов шаблона ARM. Он рассмотрит последнее развертывание и вытащит выходные переменные в переменные конвейера.

param(
 [string]  $resourceGroupName
)

$lastDeployment = Get-AzureRmResourceGroupDeployment -ResourceGroupName $resourceGroupName | Sort Timestamp -Descending | Select -First 1 

if(!$lastDeployment) {
    throw "Deployment could not be found for Resource Group '$resourceGroupName'."
}

if(!$lastDeployment.Outputs) {
    throw "No output parameters could be found for the last deployment of Resource Group '$resourceGroupName'."
}

foreach ($key in $lastDeployment.Outputs.Keys){
    $type = $lastDeployment.Outputs.Item($key).Type
    $value = $lastDeployment.Outputs.Item($key).Value

    if ($type -eq "SecureString") {
        Write-Host "##vso[task.setvariable variable=$key;issecret=true]$value" 
    }
    else {
        Write-Host "##vso[task.setvariable variable=$key;]$value" 
    }
}

Обратите внимание, что переменные среды не будут доступны в контексте этого script, но будут выполняться в последующих задачах.

Ответ 2

Значение вывода, отображаемое в пользовательском интерфейсе для задачи Team Services Team Visual Studio для развертывания группы ресурсов Azure, похоже, работает для сценария, описанного в ответе Эдди, который предназначен для виртуальных машин. На самом деле, если ваше развертывание не включает виртуальные машины, вы получите сообщение об ошибке:

В группе ресурсов нет виртуальных машин: "MY-RESOURCE-GROUP-NAME". Не мог зарегистрируйте среду в выходной переменной: "myVariableName".

Для примеров, отличных от VM, я создал powershell script, который запускается после развертывания RG. Этот script, как пример, принимает входные переменные для группы ресурсов $resourceGroupName и имя требуемой переменной вывода $rgDeploymentOutputParameterName. Вы можете настроить и использовать что-то подобное:

#get the most recent deployment for the resource group
$lastRgDeployment = Get-AzureRmResourceGroupDeployment -ResourceGroupName $resourceGroupName |
    Sort Timestamp -Descending |
        Select -First 1        

if(!$lastRgDeployment)
{
    throw "Resource Group Deployment could not be found for '$resourceGroupName'."
}

$deploymentOutputParameters = $lastRgDeployment.Outputs

if(!$deploymentOutputParameters)
{
    throw "No output parameters could be found for the last deployment of '$resourceGroupName'."
}

$outputParameter = $deploymentOutputParameters.Item($rgDeploymentOutputParameterName)

if(!$outputParameter)
{
    throw "No output parameter could be found with the name of '$rgDeploymentOutputParameterName'."
}

$outputParameterValue  = $outputParameter.Value

# From here, use $outputParameterValue, for example:
Write-Host "##vso[task.setvariable variable=$rgDeploymentOutputParameterName;]$outputParameterValue"

Ответ 3

Задача развертывания группы ресурсов VSTS Azure теперь имеет разделы выводаянваря 2018 года). Таким образом, вы можете установить имя переменной в выводах развертывания задачи Azure Resource Group Deployment, например, ResourceGroupDeploymentOutputs и добавить задачу PowerShell Script со следующим встроенным скриптом:

# Make outputs from resource group deployment available to subsequent tasks

$outputs = ConvertFrom-Json $($env:ResourceGroupDeploymentOutputs)
foreach ($output in $outputs.PSObject.Properties) {
  Write-Host "##vso[task.setvariable variable=RGDO_$($output.Name)]$($output.Value.value)"
}

И в последующих задачах вы можете использовать переменные шаблона. Так, например, если у вас есть переменная sqlServerFqdn в вашем шаблоне, она будет доступна в виде $(RGDO_sqlServerFqdn) после завершения задачи PowerShell Script.

Ответ 4

VSTS позволяет устанавливать переменные в сценариях powershell, которые вы можете использовать в других задачах.

Синтаксис

Write-Host "##vso[task.setvariable variable=myvariable;]myvalue"

У вас может быть встроенный скрипт Powershell, который может установить требуемую переменную для использования в еще не выполненных задачах. Вы можете получить к нему доступ как $(myvariable).

Вам может понадобиться переменная system.debug для true чтобы использовать это.

Подробнее читайте здесь.

Ответ 5

Вам просто нужно добавить имя выходной переменной для задачи "Развертывание группы ресурсов Azure" следующим образом: введите описание изображения здесь

И затем используйте переменную в задаче "PowerShell on Target Machines": введите описание изображения здесь

Задача "PowerShell on Target Machines" будет использовать ресурс, настроенный в задаче "Развертывание группы ресурсов Azure": введите описание изображения здесь

Выходные переменные:

Создание/обновление действия задачи Azure Resource Group теперь создает выходной переменной во время выполнения. Выходную переменную можно использовать для обратитесь к объекту группы ресурсов в последующих задачах. Для Например, задача "PowerShell on Target Machine" теперь может ссылаться на ресурс групповую выходную переменную как '$ (variableName)', чтобы она могла выполнять powershell script для целей VM группы ресурсов.

Ограничение: выходная переменная, созданная во время выполнения, будет иметь сведения о виртуальных машинах и (общедоступных) портах, если таковые имеются. полномочия для подключения к хосту (узлам) VM должны быть явно указаны в последующие задачи.

Обратитесь к этой ссылке для получения дополнительной информации: Задача развертывания группы Azure

Ответ 6

Сначала вы определяете задачу развертывания ресурсов Azure, и в этом контексте Deployment outputs

enter image description here

На следующем шаге вы создаете задачу PowerShell, которая Deployment outputs вышеперечисленные Deployment outputs качестве входных аргументов

enter image description here

Сценарий PowerShell выглядит следующим образом и назначает для каждого выхода, определенного в шаблоне ARM, отдельную переменную среды VSTS с тем же именем, что и в разделе вывода шаблона ARM. Эти переменные затем могут использоваться в последующих задачах.

param (
    [Parameter(Mandatory=$true)]
    [string]
    $armOutputString
)

Write-Host $armOutputString
$armOutputObj = $armOutputString | convertfrom-json
Write-Host $armOutputObj

$armOutputObj.PSObject.Properties | ForEach-Object {
    $type = ($_.value.type).ToLower()
    $key = $_.name
    $value = $_.value.value

    if ($type -eq "securestring") {
        Write-Host "##vso[task.setvariable variable=$key;issecret=true]$value"
        Write-Host "Create VSTS variable with key '$key' and value '$value' of type '$type'!"
    } elseif ($type -eq "string") {
        Write-Host "##vso[task.setvariable variable=$key]$value"
        Write-Host "Create VSTS variable with key '$key' and value '$value' of type '$type'!"
    } else {
        Throw "Type '$type' not supported!"
    }
}

В следующей задаче вы можете получить доступ к переменным среды, передав их как аргумент через '$(varName)' (это также работает для SecureString) или, например, в скрипте PowerShell через $env:varName (это не работает для SecureString)

enter image description here