it-swarm.com.ru

Как я использую 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) в следующей задаче для настройки. Кажется, что переменная не просто заполняется, и я не могу найти где-нибудь, что говорит мне, как использовать значения «output» при выпуске.

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

11
AC4

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

Существует рыночная задача которая делает выходные параметры шаблона ARM доступными дальше по конвейеру. Но в некоторых случаях у вас нет разрешения на покупку товаров для вашей подписки, поэтому следующий PowerShell сделает то же самое. Чтобы использовать его, вы добавляете его в качестве шага сценария powershell сразу после шага развертывания группы ресурсов шаблона 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" 
    }
}

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

5
Josh

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

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

Для примеров, не относящихся к виртуальным машинам, я создал сценарий powershell, который запускается после развертывания RG. Этот скрипт, в качестве примера, принимает входные переменные для группы ресурсов $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"
9
Chris Melinn

VSTS Задача развертывания группы ресурсов Azure имеет раздел выходов сейчас (с января 2018 г. ). Таким образом, вы можете задать имя переменной в Deployment output задачи 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.

7
oderibas

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

Синтаксис

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

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

Возможно, вам понадобится переменная system.debug для переменной true.

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

1
Harshil Lodhi

Вам просто нужно добавить имя выходной переменной для задачи «Развертывание группы ресурсов Azure», как показано ниже:  enter image description here

А затем используйте переменную в задаче «PowerShell на целевых машинах»:  enter image description here

Задача «PowerShell на целевых машинах» будет использовать ресурс, настроенный в задаче «Развертывание группы ресурсов Azure»:  enter image description here

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

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

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

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

0
Eddie Chen - MSFT

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

 enter image description here

На следующем шаге вы создаете задачу PowerShell, которая принимает 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

0
quervernetzt