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.
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.
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"
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é.
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 .
Vous devez simplement ajouter un nom de variable de sortie pour la tâche "Azure Resource Group Deployment", comme suit:
Et utilisez ensuite la variable dans la tâche "PowerShell sur les ordinateurs cibles":
La tâche "PowerShell sur les ordinateurs cibles" utilisera la ressource configurée dans la tâche "Déploiement du groupe de ressources Azure":
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
Vous définissez d’abord la tâche de déploiement de ressources Azure et dans ce contexte le Deployment outputs
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.
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
)