使用 ARM 範本與 Azure PowerShell 來部署資源

本文說明如何搭配使用 Azure PowerShell 與 Azure Resource Manager 範本 (ARM 範本),將您的資源部署到 Azure。 如果您不熟悉部署和管理 Azure 解決方案的概念,請參閱範本部署概觀

提示

我們建議使用 Bicep,因為其提供的功能與 ARM 範本相同,而且語法更易於使用。 若要深入了解,請參閱使用 Bicep 和 Azure PowerShell 部署資源

必要條件

您需要範本才能部署。 如果您還沒有範本,請從 Azure 快速入門範本存放庫下載並儲存範例範本。 本文所使用的本機檔案名稱是 C:\MyTemplates\azuredeploy.json

您必須安裝 Azure PowerShell 並連線到 Azure:

如果尚未安裝 PowerShell,您可以使用 Azure Cloud Shell。 如需詳細資訊,請參閱從 Azure Cloud Shell 部署 ARM 範本

所需的權限

若要部署 Bicep 檔案或 ARM 範本,您需要對即將進行部署的資源具備寫入存取權,並可存取 Microsoft.Resources/部署資源類型上的所有作業。 例如,若要部署虛擬機器,您需要 Microsoft.Compute/virtualMachines/writeMicrosoft.Resources/deployments/* 權限。 假設狀況作業具有相同的權限需求。

如需角色與權限的清單,請參閱 Azure 內建角色

部署範圍

您可以將部署的目標設為資源群組、訂用帳戶、管理群組或租用戶。 視部署的範圍而定,您可以使用不同的命令。

針對每個範圍,部署範本的使用者必須擁有建立資源的必要權限。

部署名稱

部署 ARM 範本時,您可以為部署命名。 此名稱可協助您從部署歷程記錄中擷取部署。 如果您未提供部署的名稱,系統會使用範本檔案的名稱。 例如,如果您部署名為 azuredeploy.json 的範本且未指定部署名稱,系統會將部署命名為 azuredeploy

每次執行部署時,資源群組的部署歷程記錄便會新增一筆具有部署名稱的項目。 如果您執行另一個部署並提供相同名稱,則系統會將先前的項目取代為目前的部署。 如果您想在部署歷程記錄中維護唯一的項目,請為每個部署提供唯一的名稱。

若要建立唯一的名稱,您可以指派隨機數字。

$suffix = Get-Random -Maximum 1000
$deploymentName = "ExampleDeployment" + $suffix

或者,加入日期值。

$today=Get-Date -Format "MM-dd-yyyy"
$deploymentName="ExampleDeployment"+"$today"

如果您使用相同的部署名稱,同時對同一個資源群組執行部署,則只會完成最後一個部署。 具有相同名稱但尚未完成的任何部署,都會由最後一個部署所取代。 例如,如果您執行名為 newStorage 的部署來部署名為 storage1 的儲存體帳戶,且同時執行另一個名為 newStorage 的部署來部署名為 storage2 的儲存體帳戶,則您只會部署一個儲存體帳戶。 產生的儲存體帳戶名稱為 storage2

但是,如果您執行名為 newStorage 的部署來部署名為 storage1 的儲存體帳戶,並在其完成後立即執行另一個名為 newStorage 的部署來部署名為 storage2 的儲存體帳戶,則您會具有兩個儲存體帳戶。 一個名稱為 storage1,另一個名稱則為 storage2。 但是,您在部署歷程記錄中只會具有一個項目。

若您為每個部署指定唯一的名稱,便可以同時執行這些部署,而不會發生衝突。 如果您執行名為 newStorage1 的部署來部署名為 storage1 的儲存體帳戶,且同時執行另一個名為 newStorage2 的部署來部署名為 storage2 的儲存體帳戶,則您會具有兩個儲存體帳戶,且在部署歷程記錄中會具有兩個項目。

為了避免因同時部署而發生衝突,並確保在部署歷程記錄中的唯一項目,請為每個部署提供唯一的名稱。

部署本機範本

您可以從本機電腦或外部儲存的範本來部署範本。 本節說明如何部署本機範本。

如果您要部署到不存在的資源群組,請先建立資源群組。 資源群組的名稱只能包含英數字元、句點 (.)、底線、連字號及括弧。 最多可有 90 個字元。 名稱不能以句點結尾。

New-AzResourceGroup -Name ExampleGroup -Location "Central US"

若要部署本機範本,請在部署命令中使用 -TemplateFile 參數。 下列範例也會顯示如何設定來自範本的參數值。

New-AzResourceGroupDeployment `
  -Name ExampleDeployment `
  -ResourceGroupName ExampleGroup `
  -TemplateFile <path-to-template>

部署需要幾分鐘的時間才能完成。

部署遠端範本

您可能會想將 ARM 範本儲存在外部位置,而非儲存在本機電腦中。 您可以在原始檔控制存放庫 (例如 GitHub) 中儲存範本。 或者,您可以將其儲存在 Azure 儲存體帳戶中,以在組織中進行共用存取。

注意

若要針對儲存在私人 GitHub 存放庫中的連結範本來部署範本或參考,請參閱建立自訂和安全 Azure 入口網站供應項目中記載的自訂解決方案。 您可以建立 Azure 函數,以從 Azure Key Vault 提取 GitHub 權杖。

如果您要部署到不存在的資源群組,請先建立資源群組。 資源群組的名稱只能包含英數字元、句點 (.)、底線、連字號及括弧。 最多可有 90 個字元。 名稱不能以句點結尾。

New-AzResourceGroup -Name ExampleGroup -Location "Central US"

使用 -TemplateUri 參數部署外部範本。

New-AzResourceGroupDeployment `
  -Name remoteTemplateDeployment `
  -ResourceGroupName ExampleGroup `
  -TemplateUri https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/quickstarts/microsoft.storage/storage-account-create/azuredeploy.json

上述範例針對範本需要可公開存取 URI,這適用於大部分的案例,因為您的範本不應該包含機密資料。 如果您需要指定機密資料 (例如系統管理員密碼),請將該值以安全參數傳遞。 但是,如果您想要管理範本的存取權,請考慮使用範本規格

若要使用儲存在儲存體帳戶中的相對路徑,來部署遠端連結範本,請使用 QueryString 指定 SAS 權杖:

New-AzResourceGroupDeployment `
  -Name linkedTemplateWithRelativePath `
  -ResourceGroupName "myResourceGroup" `
  -TemplateUri "https://stage20210126.blob.core.windows.net/template-staging/mainTemplate.json" `
  -QueryString "$sasToken"

如需詳細資訊,請參閱使用連結範本的相對路徑

部署範本規格

您可以建立範本規格 (部分機器翻譯),而不是部署本機或遠端範本。範本規格是 Azure 訂用帳戶中的資源,其中包含 ARM 範本。 可讓您輕鬆、安全地與組織中的使用者共用範本。 您可以使用 Azure 角色型存取控制 (Azure RBAC),授與範本規格的存取權。此功能目前為預覽狀態。

下列範例示範如何建立和部署範本規格。

首先,提供 ARM 範本來建立範本規格。

New-AzTemplateSpec `
  -Name storageSpec `
  -Version 1.0 `
  -ResourceGroupName templateSpecsRg `
  -Location westus2 `
  -TemplateJsonFile ./mainTemplate.json

接著,取得範本規格的識別碼並加以部署。

$id = (Get-AzTemplateSpec -Name storageSpec -ResourceGroupName templateSpecsRg -Version 1.0).Versions.Id

New-AzResourceGroupDeployment `
  -ResourceGroupName demoRG `
  -TemplateSpecId $id

如需詳細資訊,請參閱 Azure Resource Manager 範本規格

預覽變更

在部署範本之前,您可以預覽範本即將在環境中進行的變更。 使用假設狀況作業來驗證範本是否會如預期進行變更。 假設狀況也能驗證範本是否有錯誤。

傳遞參數值

若要傳遞參數值,可以使用內嵌參數或參數檔案。 參數檔案可以是 Bicep 參數檔案JSON 參數檔案

內嵌參數

若要傳遞內嵌參數,請使用 New-AzResourceGroupDeployment 命令提供參數名稱。 例如,若要將字串和陣列傳遞至範本,請使用:

$arrayParam = "value1", "value2"
New-AzResourceGroupDeployment -ResourceGroupName testgroup `
  -TemplateFile <path-to-template> `
  -exampleString "inline string" `
  -exampleArray $arrayParam

您也可以取得檔案內容,並提供該內容作為內嵌參數。

$arrayParam = "value1", "value2"
New-AzResourceGroupDeployment -ResourceGroupName testgroup `
  -TemplateFile <path-to-template> `
  -exampleString $(Get-Content -Path c:\MyTemplates\stringcontent.txt -Raw) `
  -exampleArray $arrayParam

當您需要提供組態值時,從檔案取得參數值會很有幫助。 例如,您可以提供 Linux 虛擬機器的 cloud-init 值

如果您需要傳入物件的陣列,請在 PowerShell 中建立雜湊表,並將其新增至陣列。 在部署期間,將該陣列做為參數傳遞。

$hash1 = @{ Name = "firstSubnet"; AddressPrefix = "10.0.0.0/24"}
$hash2 = @{ Name = "secondSubnet"; AddressPrefix = "10.0.1.0/24"}
$subnetArray = $hash1, $hash2
New-AzResourceGroupDeployment -ResourceGroupName testgroup `
  -TemplateFile <path-to-template> `
  -exampleArray $subnetArray

JSON 參數檔案

相對於在您的指令碼中將參數做為內嵌值傳遞,使用包含該參數值的 JSON 檔案可能較為容易。 參數檔案可以是本機檔案或具有可存取 URI 的外部檔案。

如需參數檔案的詳細資訊,請參閱建立 Resource Manager 參數檔案

若要傳遞本機參數檔案,請使用 TemplateParameterFile 參數:

New-AzResourceGroupDeployment `
  -Name ExampleDeployment `
  -ResourceGroupName ExampleResourceGroup `
  -TemplateFile <path-to-template> `
  -TemplateParameterFile c:\MyTemplates\storage.parameters.json

若要傳遞外部參數檔案,請使用 TemplateParameterUri 參數:

New-AzResourceGroupDeployment `
  -Name ExampleDeployment `
  -ResourceGroupName ExampleResourceGroup `
  -TemplateUri https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/quickstarts/microsoft.storage/storage-account-create/azuredeploy.json `
  -TemplateParameterUri https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/quickstarts/microsoft.storage/storage-account-create/azuredeploy.parameters.json

如需參數檔案的詳細資訊,請參閱建立 Resource Manager 參數檔案 (部分機器翻譯)。

Bicep 參數檔案

透過 Azure PowerShell 10.4.0 版或更新版本,以及 Bicep CLI 0.22.6 版或更新版本,您可以使用 Bicep 參數檔案 (部分機器翻譯) 來部署 ARM 範本檔案。 若使用 Bicep 參數檔案內的 using 陳述式,在指定 -TemplateParameterFile 參數的 Bicep 參數檔案時,就不需要提供 -TemplateFile 參數。

下列範例會顯示名為 storage.bicepparam 的參數檔案。 該檔案必須位於執行此命令的相同目錄中。

New-AzResourceGroupDeployment `
  -Name ExampleDeployment `
  -ResourceGroupName ExampleResourceGroup `
  -TemplateParameterFile storage.bicepparam

如需 Bicep 參數檔案的詳細資訊,請參閱 Bicep 參數檔案 (部分機器翻譯)。

下一步