2016-04-29 110 views
5

我有了與類似下面的輸出部分的ARM模板:如何使用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模板的參數中。

回答

1

VSTS允許在powershell腳本中設置變量,您可以在其他任務中使用它們。

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

你可以有一個內嵌PowerShell腳本可以設置所需要的變量尚未執行tasks.You消耗可以像$(myvariable)

訪問您可能需要system.debug變量true到用這個。

更多細節here

+0

這很好理解,但是我在ARM模板中使用提供的「Azure資源組部署」任務和輸出。沒有自定義PS。雖然我可能需要使用自定義PS,如果這不能在本地完成。我會嘗試system.debug的東西,看看它是否有所作爲。 – AC4

0

你只需要爲「Azure的資源組部署」任務添加一個輸出變量名稱,如下列: enter image description here

,然後使用變量「的PowerShell在目標計算機上」任務: enter image description here

任務將使用「天青資源組部署」任務配置資源「目標計算機上的PowerShell」: enter image description here

輸出變量:

創建天青資源組任務的/更新操作現在執行期間產生一個 輸出變量。輸出變量可用於 引用後續任務中的資源組對象。對於 示例「目標計算機上的PowerShell」任務現在可以將資源組 組輸出變量指定爲'$(variableName)',以便它可以在資源組VM目標上執行 powershell腳本。

限制:執行過程中產生的輸出變量將具有關於VM主機名和(公共)端口的詳細信息(如果有),請參閱 。要連接到VM主機的憑證 將在後續任務中明確提供。

請參考以下鏈接瞭解詳情:Azure Resource Group Deployment Task

+0

我會試一試,但是你看過這個:https://codesnob.wordpress.com/2016/02/03/vsts-release-no-vms-found-in-resource-group/ 幸運的是,正在處理VMS :) – AC4

+0

@DrydenMaker我也試過用虛擬機,它的工作原理。 :) –

+1

太棒了!然而虛擬機名稱似乎是我的一個不好的例子。我正在嘗試使用ARM模板的outputs部分中指定的值。我澄清了問題主體更具體。 – AC4

8

在UI上的Visual Studio團隊服務任務Azure的資源組部署顯示的輸出值似乎只在埃迪的回答中描述的情景工作,這是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" 
+1

這看起來正是我想要做的。我會嘗試它並回來。 – AC4

2

捕獲這個答案,因爲我總是在搜索解決方案時結束了這個問題。

There is a marketplace task這使得ARM模板輸出參數可以在管線的更下方得到。但在某些情況下,您沒有權限爲您的訂閱購買市場項目,因此以下PowerShell將執行相同的操作。要使用它,請在ARM模板資源組部署步驟之後立即將其作爲PowerShell腳本步驟添加。它將查看最後的部署並將輸出變量拉入流水線變量。

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

請注意,環境變量在此腳本的上下文中不可用,但將在後續任務中使用。

+0

我正在運行你的腳本,我得到「Get-AzureRmResourceGroupDeployment:運行Login-AzureRmAccount登錄。」在此腳本之前,您是否做過任何事情來登錄VSTS? – chris31389

+0

如果管道的服務帳戶的標識在目標訂閱中具有權限,則此腳本將在VSTS發佈管道中運行 – Josh

相關問題