2016-04-29 15 views
5

Mam szablon, który ma ARM i wyjść sekcję jak następuje:Jak używać wyjść ARM "wartości innego zadania wydania?

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

mam zadanie wdrażania Grupa Azure zasób, który używa szablonu. Następnie chcę użyć zmiennej $ (sqlServerFqdn) w następnym zadaniu do konfiguracji. Zmienna nie wydaje się po prostu wypełniać i nie mogę znaleźć nigdzie, co mówi mi, jak używać wartości "output" w wydaniu.

Co należy zrobić, aby zmienna została zapełniona do użycia podczas konfigurowania zadań po uruchomieniu tego szablonu ARM? Przykładem może być parametr do zadania skryptowego powershell lub innego szablonu ARM.

Odpowiedz

1

VSTS umożliwia ustawienie zmiennych w skrypcie powershell, który można wykorzystać w innych zadaniach.

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

Możesz mieć inline skryptu PowerShell, które można ustawić żądaną zmienną spożywać w jeszcze być wykonywany tasks.You można uzyskać do niego dostęp jak $(myvariable)

może zaistnieć potrzeba system.debug zmiennej true do Użyj tego.

Czytaj więcej szczegółów here

+0

Dobrze wiedzieć, ale używam dostarczonego zadania "Azure Resource Group Deployment" z wyjściami w szablonie ARM. Brak niestandardowego PS. Chociaż mogę potrzebować użyć niestandardowego PS, jeśli nie można tego zrobić natywnie. Spróbuję czegoś system.debug, aby sprawdzić, czy to coś zmieni. – AC4

0

Wystarczy dodać nazwę zmiennej wyjściowej dla „rozmieszczenia Grupa Azure zasobów” zadanie jak następuje: enter image description here

a następnie użyć zmiennej w „PowerShell na komputerach docelowych” zadanie: enter image description here

„PowerShell na komputerach docelowych” zadania będą korzystać z zasobu skonfigurowanego w „Wdrażanie Grupa Azure zasobów” zadanie: enter image description here

zmienne

wyjściowe:

tworzyć/akcję aktualizacji zadania Azure Resource Group produkuje teraz zmienną wyjściowego podczas wykonywania. Zmienna wyjściowa może być używana do odwoływania się do obiektu grupy zasobów w kolejnych zadaniach. Dla przykładu zadanie "PowerShell na maszynie docelowej" może teraz odwoływać się do zmiennej wyjściowej grupy zasobu jako "$ (nazwa_zmiennej)", aby można było wykonać skrypt powłoki automatycznej na obiektach docelowych VM grupy zasobów.

Ograniczenie: zmienna wyjściowa wyprodukowana podczas wykonywania będzie zawierała szczegóły dotyczące nazw hosta VM i (publicznych) portów, jeśli takie istnieją. Poświadczenia: w celu połączenia z hostami maszyn wirtualnych należy wyraźnie podać w kolejnych zadaniach .

Patrz tym linkiem więcej szczegółów: Azure Resource Group Deployment Task

+0

Spróbuję, ale widziałem to: https://codesnob.wordpress.com/2016/02/03/vsts-release-no-vms-found-in-resource-group/ Na szczęście mamy do czynienia z VMS :) – AC4

+0

@DrydenMaker Próbowałem też z VM i to działa. :) –

+1

świetnie! jednak nazwa VM wydaje się być złym przykładem z mojej strony. Próbuję użyć wartości określonych w sekcji wyników szablonu ARM. Wyjaśniłem, że treść pytania jest bardziej szczegółowa. – AC4

8

Wartość wyjściowa pokazany na UI dla Visual zadania Studio Team Services dla Azure Deployment grupa zasobów wydaje się tylko do pracy ze scenariuszem opisanym w odpowiedzi Eddiego, który jest dla maszyn wirtualnych.W rzeczywistości, jeśli wdrożenie nie obejmuje maszyn wirtualnych, pojawi się komunikat o błędzie w rodzaju:

Nie znaleziono maszyn wirtualnych w grupie zasobów: "NAZWA_MOGUJESZ-GRUPY". Nie można zarejestrować środowiska w zmiennej wyjściowej: "myVariableName".

Dla przykładów innych niż VM, utworzyłem skrypt powłoki, który działa po wdrożeniu RG. Ten skrypt, jako przykład, pobiera zmienne wejściowe dla grupy zasobów $resourceGroupName i nazwę zmiennej wyjściowej, której potrzebujesz $rgDeploymentOutputParameterName. Można dostosować i użyć czegoś podobnego:

#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" 
+1

Wygląda na to, że dokładnie to, co chciałem zrobić. Spróbuję i wrócę. – AC4

2

Przechwytywanie tę odpowiedź, bo zawsze kończy się na tym pytaniu, szukając rozwiązania.

There is a marketplace task co powoduje, że parametry wyjściowe szablonu ARM są dostępne w dalszej części potoku. Ale w niektórych przypadkach nie masz uprawnień do kupowania pozycji z rynku dla swojej subskrypcji, więc poniższy PowerShell zrobi to samo. Aby go użyć, dodaj go jako krok skryptu powershell natychmiast po kroku wdrażania grupy zasobów szablonu ARM. Przyjrzy się ostatniemu wdrożeniu i pobierze zmienne wyjściowe do zmiennych potoku.

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

Należy zauważyć, że zmienne środowiskowe nie będą dostępne w kontekście tego skryptu, ale będą w kolejnych zadaniach.

+0

Uruchomiłem twój skrypt i otrzymuję "Get-AzureRmResourceGroupDeployment: Uruchom Login-AzureRmAccount, aby się zalogować." Czy zrobiłeś coś przed tym skryptem, aby zalogować się na VSTS? – chris31389

+0

Ten skrypt zostanie uruchomiony w potoku wydania VSTS, jeśli tożsamość konta usługi dla potoku ma pozwolenie w docelowej subskrypcji – Josh