wake-up-neo.com

Wie verwende ich ARM 'Outputs' sind eine weitere Freigabeaufgabe?

Ich habe eine ARM Vorlage, die einen Abschnitt wie den folgenden enthält und ausgibt:

"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')]"
    }
}

Ich habe eine Azure Resource Group-Bereitstellungstask, die die Vorlage verwendet. Ich möchte dann die Variable $ (sqlServerFqdn) in der nächsten Aufgabe zur Konfiguration verwenden. Die Variable scheint nicht nur zu füllen und ich kann nirgendwo etwas finden, das mir sagt, wie ich die Ausgabewerte bei der Veröffentlichung verwenden soll.

Was muss ich tun, um die Variable für die Konfiguration von Tasks zu füllen, nachdem diese ARM -Vorlage ausgeführt wurde? Ein Beispiel wären die Parameter einer Powershell-Skriptaufgabe oder einer anderen ARM-Vorlage.

11
AC4

Diese Antwort festhalten, weil ich bei der Suche nach der Lösung immer zu dieser Frage ende.

Es gibt eine Marktplatzaufgabe , die ARM Vorlagenausgabeparameter weiter unten in der Pipeline verfügbar macht. In einigen Fällen haben Sie jedoch keine Berechtigung zum Kauf von Marktplatz-Artikeln für Ihr Abonnement. Daher wird die folgende PowerShell dasselbe tun. Um es zu verwenden, fügen Sie es als Powershell-Script-Schritt unmittelbar nach dem Implementierungsschritt der Vorlagenressourcengruppe ARM hinzu. Es wird die letzte Bereitstellung betrachtet und die Ausgabevariablen in Pipeline-Variablen übernommen. 

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" 
    }
}

Beachten Sie, dass die Umgebungsvariablen nicht im Kontext dieses Skripts verfügbar sind, sondern in nachfolgenden Aufgaben.

5
Josh

Der auf der Benutzeroberfläche für die Task von Visual Studio Team Services angezeigte Ausgabewert für die Azure-Ressourcengruppenbereitstellung scheint nur für das in Eddies Antwort beschriebene Szenario zu funktionieren, das für VMs gilt. Wenn Ihre Bereitstellung keine VMs enthält, erhalten Sie eine Fehlermeldung, etwa:

Keine VMs in Ressourcengruppe gefunden: 'MY-RESOURCE-GROUP-NAME'. Die Umgebung Konnte in der Ausgabevariablen nicht registriert werden: 'myVariableName'.

Für Nicht-VM-Beispiele habe ich ein Powershell-Skript erstellt, das nach der Bereitstellung von RG ausgeführt wird. Dieses Skript verwendet als Beispiel Eingabevariablen für die Ressourcengruppe $resourceGroupName und den Namen der Ausgabevariablen, die Sie $rgDeploymentOutputParameterName benötigen. Sie können etwas ähnliches anpassen und verwenden:

#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-Ressourcengruppenbereitstellung task hat Ausgabenabschnitt now (seit Januar 2018 ). Sie können den Variablennamen in Bereitstellungsausgaben von Azure-Ressourcengruppenbereitstellung task beispielsweise auf ResourceGroupDeploymentOutputs und add PowerShell-Skript task mit dem folgenden Inline-Skript festlegen:

# 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)"
}

In nachfolgenden Aufgaben können Sie Ihre Vorlagenvariablen verwenden. Wenn Sie beispielsweise eine Variable sqlServerFqdn in Ihrer Vorlage haben, steht diese als $(RGDO_sqlServerFqdn) zur Verfügung, nachdem PowerShell Script task abgeschlossen ist.

7
oderibas

VSTS ermöglicht das Setzen von Variablen in Powershell-Skripts, die Sie in anderen Aufgaben verwenden können. 

Die Syntax lautet

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

Sie können über ein Inline-PowerShell-Skript verfügen, mit dem Sie die erforderliche Variable festlegen können, die in noch auszuführenden Aufgaben verwendet werden soll. Sie können auf diese Funktion wie $(myvariable) zugreifen.

Möglicherweise müssen Sie system.debug variable in true eingeben, um dies verwenden zu können.

Lesen Sie mehr Details hier .

1
Harshil Lodhi

Sie müssen lediglich einen Namen für die Ausgabevariable für die Aufgabe "Azure-Ressourcengruppenbereitstellung" hinzufügen, wie folgt:  enter image description here

Verwenden Sie dann die Variable in der Task "PowerShell auf Zielcomputern":  enter image description here

Die Task "PowerShell auf Zielcomputern" verwendet die in der Task "Azure-Ressourcenbereitstellung" konfigurierte Ressource:  enter image description here

Ausgangsvariablen:

Beim Erstellen/Aktualisieren der Aktion der Azure Resource Group-Task wird während der Ausführung jetzt eine Ausgabevariable Erstellt. Die Ausgabevariable kann verwendet werden, um In den nachfolgenden Tasks auf das Ressourcengruppenobjekt zu verweisen. Für das Beispiel kann die Task "PowerShell auf Zielmaschine" jetzt auf die Ausgangsvariable der Gruppe "Ressource " $ (Variablenname) "verweisen, sodass sie das Powershell-Skript auf der Ressource ausführen kann Gruppe VM Ziele.

Einschränkung: Die während der Ausführung erzeugte Ausgabevariable enthält Details zu VM Hostnamen und (öffentlichen) Ports, sofern vorhanden. Berechtigungsnachweise Für die Verbindung mit den VM Hosts müssen explizit in den nachfolgenden Tasks angegeben werden.

Weitere Informationen finden Sie unter diesem Link: Aufgabe zur Azure-Ressourcengruppenbereitstellung

0

Zunächst definieren Sie die Azure-Ressourcenbereitstellungsaufgabe und in diesem Zusammenhang den Deployment outputs

 enter image description here

Im nächsten Schritt erstellen Sie eine PowerShell-Aufgabe, die den oben definierten Deployment outputs als Eingabeargument verwendet

 enter image description here

Das PowerShell-Skript sieht folgendermaßen aus und weist für jede in der Vorlage ARM definierte Ausgabe eine separate VSTS-Umgebungsvariable mit demselben Namen zu, die im Ausgabeabschnitt ARM definiert ist. Diese Variablen können dann in nachfolgenden Aufgaben verwendet werden.

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!"
    }
}

In einer nachfolgenden Task können Sie auf die Umgebungsvariablen zugreifen, indem Sie sie entweder als Argument über '$(varName)' übergeben (dies funktioniert auch für SecureString) oder z. in einem PowerShell-Skript über $env:varName (dies funktioniert nicht für SecureString)

 enter image description here

0
quervernetzt