web-dev-qa-db-fra.com

Comment puis-je utiliser ARM 'sorties' valeurs une autre tâche de publication?

J'ai un gabarit ARM qui a et affiche une section comme celle-ci:

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

J'ai une tâche de déploiement du groupe de ressources Azure qui utilise le modèle. Je souhaite ensuite utiliser la variable $ (sqlServerFqdn) dans la tâche suivante pour la configuration. La variable ne semble pas simplement peupler et je ne trouve aucun endroit qui me dise comment utiliser les valeurs de 'sorties' lors de la publication.

Que dois-je faire pour que la variable soit peuplée et utilisée lors de la configuration des tâches après l'exécution de ce modèle ARM? Un exemple serait dans les paramètres d'une tâche de script PowerShell ou d'un autre modèle ARM.

11
AC4

Capturer cette réponse parce que je finis toujours par cette question lors de la recherche de la solution.

Il existe une tâche de marché qui rend les paramètres de sortie du modèle ARM disponibles plus loin dans le pipeline. Toutefois, dans certains cas, vous n'êtes pas autorisé à acheter des éléments du marché pour votre abonnement. Par conséquent, PowerShell suivant fera la même chose. Pour l'utiliser, vous l'ajoutez en tant qu'action de script PowerShell immédiatement après l'étape de déploiement du groupe de ressources modèle ARM. Il examinera le dernier déploiement et extraira les variables de sortie en variables de pipeline. 

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

Notez que les variables d'environnement ne seront pas disponibles dans le contexte de ce script, mais le seront dans les tâches suivantes.

5
Josh

La valeur de sortie affichée dans l'interface utilisateur pour la tâche Visual Studio Team Services pour le déploiement du groupe de ressources Azure semble uniquement fonctionner pour le scénario décrit dans la réponse d'Eddie, à savoir les ordinateurs virtuels. En fait, si votre déploiement n'inclut pas de machines virtuelles, vous obtiendrez une erreur du type:

Aucune machine virtuelle trouvée dans le groupe de ressources: 'MY-RESOURCE-GROUP-NAME'. Impossible de Enregistrer l’environnement dans la variable de sortie: 'myVariableName'.

Pour les exemples non-VM, j'ai créé un script PowerShell qui s'exécute après le déploiement du groupe de récupération. Ce script, à titre d'exemple, prend des variables d'entrée pour le groupe de ressources $resourceGroupName et le nom de la variable de sortie dont vous avez besoin $rgDeploymentOutputParameterName. Vous pouvez personnaliser et utiliser quelque chose de similaire:

#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 Déploiement du groupe de ressources Azure tâche a la section sorties maintenant (depuis janvier 2018 ). Ainsi, vous pouvez définir le nom de la variable dans Résultats de déploiement sur Déploiement du groupe de ressources Azure tâche sur, par exemple, ResourceGroupDeploymentOutputs et add Script PowerShell avec le script en ligne suivant:

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

Et dans les tâches suivantes, vous pouvez utiliser vos variables de modèle. Ainsi, par exemple, si vous avez la variable sqlServerFqdn dans votre modèle, celui-ci sera disponible en tant que $(RGDO_sqlServerFqdn) après que Script PowerShell task est terminé.

7
oderibas

VSTS permet de définir des variables dans des scripts PowerShell que vous pouvez utiliser dans d'autres tâches. 

La syntaxe est

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

Vous pouvez avoir un script Powershell en ligne qui peut définir la variable requise à consommer dans les tâches à exécuter. Vous pouvez y accéder de la même manière que $(myvariable).

Vous devrez peut-être system.debug variable à true pour l'utiliser.

Lire plus de détails ici .

1
Harshil Lodhi

Vous devez simplement ajouter un nom de variable de sortie pour la tâche "Azure Resource Group Deployment", comme suit:  enter image description here

Et utilisez ensuite la variable dans la tâche "PowerShell sur les ordinateurs cibles":  enter image description here

La tâche "PowerShell sur les ordinateurs cibles" utilisera la ressource configurée dans la tâche "Déploiement du groupe de ressources Azure":  enter image description here

Variables de sortie:

L'action Créer/Mettre à jour de la tâche Groupe de ressources Azure génère désormais une variable de sortie Lors de l'exécution. La variable de sortie peut être utilisée pour Faire référence à l'objet groupe de ressources dans les tâches suivantes. Pour Exemple, la tâche "PowerShell sur la machine cible" peut désormais faire référence à la variable de sortie du groupe En tant que "$ (NomVariable)" afin qu'elle puisse exécuter le script Powershell sur la ressource groupe VM cibles.

Limitation: la variable de sortie produite pendant l'exécution aura Des détails sur VM nom (s) d'hôte (s) et les ports (publics), le cas échéant. Les informations d'identification Pour se connecter à l'hôte VM doivent être fournies explicitement dans les tâches Suivantes.

Pour plus de détails, consultez ce lien: Tâche de déploiement du groupe de ressources Azure

0

Vous définissez d’abord la tâche de déploiement de ressources Azure et dans ce contexte le Deployment outputs

 enter image description here

Dans l'étape suivante, vous créez une tâche PowerShell qui prend comme argument d'entrée le Deployment outputs défini ci-dessus.

 enter image description here

Le script PowerShell se présente comme suit et attribue à chaque sortie définie dans le modèle ARM une variable d'environnement VSTS distincte du même nom que celui défini dans la section de sortie du modèle ARM. Ces variables peuvent ensuite être utilisées dans les tâches suivantes.

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

Dans une tâche ultérieure, vous pouvez accéder aux variables d'environnement en les passant en tant qu'argument via '$(varName)' (cela fonctionne également pour SecureString) ou par ex. dans un script PowerShell via $env:varName (cela ne fonctionne pas pour SecureString)

 enter image description here

0
quervernetzt