web-dev-qa-db-ja.com

ARM 'outputs' values別のリリースタスクを使用するにはどうすればよいですか?

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)を構成の次のタスクで使用します。変数は単に入力されているようには見えず、リリース時に「出力」値を使用する方法を教えてくれる場所を見つけることができません。

このARMテンプレートの実行後のタスクの構成で使用するために変数を設定するために何を行う必要がありますか?例は、PowerShellスクリプトタスクまたは別のARMテンプレート。

18
AC4

解決策を探すとき、私はいつもこの質問に終わるので、この答えをとらえます。

Marketplaceタスクがあります これにより、ARMテンプレート出力パラメーターがパイプラインのさらに下で利用可能になります。ただし、サブスクリプション用にMarketplaceアイテムを購入する権限がない場合があります。 、次の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" 
    }
}

環境変数は、このスクリプトのコンテキストでは使用できませんが、後続のタスクでは使用できることに注意してください。

11
Josh

VSTSAzure Resource Group Deploymentタスクに 出力セクション が追加されました( January 2018 以降)。したがって、Azure Resource Group Deploymentタスクの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変数がある場合、PowerShell Scriptタスクの完了後に$(RGDO_sqlServerFqdn)として使用できます。

17
oderibas

Azure Resource Group DeploymentのVisual Studio Team ServicesタスクのUIに表示される出力値は、Eddieの回答で説明されているシナリオであるVMに対してのみ機能するようです。実際、デプロイにVMが含まれていない場合、次のようなエラーが発生します。

リソースグループにVMが見つかりません: 'MY-RESOURCE-GROUP-NAME'。出力変数 'myVariableName'に環境を登録できませんでした。

VM以外の例では、RGの展開後に実行するPowerShellスクリプトを作成しました。このスクリプトは、例として、リソースグループ$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

最初に、Azureリソースデプロイメントタスクを定義し、このコンテキストで_Deployment outputs_を定義します

enter image description here

次のステップでは、上で定義した_Deployment outputs_を入力引数として受け取るPowerShellタスクを作成します

enter image description here

PowerShellスクリプトは次のようになり、ARMテンプレートで定義された各出力に、ARMテンプレート出力で定義されたものと同じ名前の個別のVSTS環境変数を割り当てますこれらの変数は、その後のタスクで使用できます。

_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でも機能します)。 _$env:varName_を介してPowerShellスクリプトで(これはSecureStringでは機能しません)

enter image description here

1
quervernetzt

VSTSを使用すると、他のタスクで使用できるPowerShellスクリプトで変数を設定できます。

構文は

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

必要な変数を設定して、まだ実行されていないタスクで使用できるインラインPowershellスクリプトを作成できます。$(myvariable)のようにアクセスできます。

これを使用するには、trueに_system.debug_変数が必要な場合があります。

詳細はこちら こちら

1
Harshil Lodhi

次のように、 "Azure Resource Group Deployment"タスクの出力変数名を追加するだけです: enter image description here

次に、「ターゲットマシン上のPowerShell」タスクで変数を使用します。 enter image description here

「ターゲットマシン上のPowerShell」タスクは、「Azureリソースグループのデプロイメント」タスクで構成されたリソースを使用します。 enter image description here

出力変数:

Azureリソースグループタスクの作成/更新アクションで、実行中に出力変数が生成されるようになりました。出力変数は、後続のタスクでリソースグループオブジェクトを参照するために使用できます。たとえば、「ターゲットマシンのPowerShell」タスクは、リソースグループの出力変数を '$(variableName)'として参照できるようになり、リソースグループVMターゲットでPowerShellスクリプトを実行できるようになりました。

制限:実行中に生成される出力変数には、VMホスト名と(パブリック)ポートがある場合は、そのポートに関する詳細が含まれます。VMホストに接続するための資格情報(s)は、後続のタスクで明示的に提供されます。

詳細については、このリンクを参照してください。 Azureリソースグループの展開タスク

0