Distribuera resurser med ARM-mallar och Azure PowerShell

Den här artikeln beskriver hur du använder Azure PowerShell med Azure Resource Manager-mallar (ARM-mallar) för att distribuera dina resurser till Azure. Om du inte är bekant med begreppen för att distribuera och hantera dina Azure-lösningar kan du läsa översikt över malldistribution.

Dricks

Vi rekommenderar Bicep eftersom det erbjuder samma funktioner som ARM-mallar och syntaxen är enklare att använda. Mer information finns i Distribuera resurser med Bicep och Azure PowerShell.

Förutsättningar

Du behöver en mall för att distribuera. Om du inte redan har en kan du ladda ned och spara en exempelmall från lagringsplatsen för Azure-snabbstartsmallar. Det lokala filnamnet som används i den här artikeln är C:\MyTemplates\azuredeploy.json.

Du måste installera Azure PowerShell och ansluta till Azure:

Om du inte har PowerShell installerat kan du använda Azure Cloud Shell. Mer information finns i Distribuera ARM-mallar från Azure Cloud Shell.

Behörigheter som krävs

Om du vill distribuera en Bicep-fil eller en ARM-mall måste du ha skrivåtkomst till de resurser som du distribuerar och åtkomst till alla åtgärder i resurstypen Microsoft.Resources/deployments. Om du till exempel vill distribuera en virtuell dator behöver Microsoft.Compute/virtualMachines/write du och Microsoft.Resources/deployments/* behörigheter. Konsekvensåtgärden har samma behörighetskrav.

Det finns en lista med roller och behörigheter i Inbyggda roller i Azure.

Distributionsomfång

Du kan rikta distributionen mot en resursgrupp, prenumeration, hanteringsgrupp eller klientorganisation. Beroende på omfånget för distributionen använder du olika kommandon.

För varje omfång måste användaren som distribuerar mallen ha de behörigheter som krävs för att skapa resurser.

Distributionsnamnet

När du distribuerar en ARM-mall kan du ge distributionen ett namn. Det här namnet kan hjälpa dig att hämta distributionen från distributionshistoriken. Om du inte anger något namn för distributionen används namnet på mallfilen. Om du till exempel distribuerar en mall med namnet azuredeploy.json och inte anger något distributionsnamn får distributionen namnet azuredeploy.

Varje gång du kör en distribution läggs en post till i resursgruppens distributionshistorik med distributionsnamnet. Om du kör en annan distribution och ger den samma namn ersätts den tidigare posten med den aktuella distributionen. Om du vill behålla unika poster i distributionshistoriken ger du varje distribution ett unikt namn.

Om du vill skapa ett unikt namn kan du tilldela ett slumptal.

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

Eller lägg till ett datumvärde.

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

Om du kör samtidiga distributioner till samma resursgrupp med samma distributionsnamn slutförs endast den senaste distributionen. Alla distributioner med samma namn som inte har slutförts ersätts av den senaste distributionen. Om du till exempel kör en distribution med namnet newStorage som distribuerar ett lagringskonto med namnet storage1och samtidigt kör en annan distribution med namnet newStorage som distribuerar ett lagringskonto med namnet storage2distribuerar du bara ett lagringskonto. Det resulterande lagringskontot heter storage2.

Men om du kör en distribution med namnet newStorage som distribuerar ett lagringskonto med namnet storage1och omedelbart efter att den har slutförts kör du en annan distribution med namnet newStorage som distribuerar ett lagringskonto med namnet storage2, så har du två lagringskonton. Den ena heter storage1och den andra heter storage2. Men du har bara en post i distributionshistoriken.

När du anger ett unikt namn för varje distribution kan du köra dem samtidigt utan konflikter. Om du kör en distribution med namnet newStorage1 som distribuerar ett lagringskonto med namnet storage1och samtidigt kör en annan distribution med namnet newStorage2 som distribuerar ett lagringskonto med namnet storage2, har du två lagringskonton och två poster i distributionshistoriken.

För att undvika konflikter med samtidiga distributioner och för att säkerställa unika poster i distributionshistoriken ger du varje distribution ett unikt namn.

Distribuera en lokal mall

Du kan distribuera en mall från den lokala datorn eller en som lagras externt. I det här avsnittet beskrivs hur du distribuerar en lokal mall.

Om du distribuerar till en resursgrupp som inte finns skapar du resursgruppen. Namnet på resursgruppen kan bara innehålla alfanumeriska tecken, punkter, understreck, bindestreck och parenteser. Det kan vara upp till 90 tecken. Namnet kan inte sluta i en punkt.

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

Om du vill distribuera en lokal mall använder du parametern -TemplateFile i distributionskommandot. I följande exempel visas också hur du anger ett parametervärde som kommer från mallen.

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

Distributionen kan ta flera minuter att slutföra.

Distribuera fjärrmall

I stället för att lagra ARM-mallar på den lokala datorn kanske du föredrar att lagra dem på en extern plats. Du kan lagra mallar på en lagringsplats för versionskontroll (till exempel GitHub). Eller så kan du lagra dem i ett Azure Storage-konto för delad åtkomst i din organisation.

Kommentar

Om du vill distribuera en mall eller referera till en länkad mall som lagras i en privat GitHub-lagringsplats kan du läsa en anpassad lösning som beskrivs i Skapa ett anpassat och säkert Azure Portal-erbjudande. Du kan skapa en Azure-funktion som hämtar GitHub-token från Azure Key Vault.

Om du distribuerar till en resursgrupp som inte finns skapar du resursgruppen. Namnet på resursgruppen kan bara innehålla alfanumeriska tecken, punkter, understreck, bindestreck och parenteser. Det kan vara upp till 90 tecken. Namnet kan inte sluta i en punkt.

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

Om du vill distribuera en extern mall använder du parametern -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

Föregående exempel kräver en offentligt tillgänglig URI för mallen, som fungerar för de flesta scenarier eftersom mallen inte ska innehålla känsliga data. Om du behöver ange känsliga data (till exempel ett administratörslösenord) skickar du det värdet som en säker parameter. Men om du vill hantera åtkomsten till mallen bör du överväga att använda mallspecifikationer.

Om du vill distribuera fjärrlänkade mallar med relativ sökväg som lagras i ett lagringskonto använder du QueryString för att ange SAS-token:

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

Mer information finns i Använda relativ sökväg för länkade mallar.

Distribuera mallspecifikation

I stället för att distribuera en lokal mall eller fjärrmall kan du skapa en mallspecifikation. Mallspecifikationen är en resurs i din Azure-prenumeration som innehåller en ARM-mall. Det gör det enkelt att på ett säkert sätt dela mallen med användare i din organisation. Du använder rollbaserad åtkomstkontroll i Azure (Azure RBAC) för att ge åtkomst till mallspecifikationen. Den här funktionen är för närvarande i förhandsversion.

I följande exempel visas hur du skapar och distribuerar en mallspecifikation.

Skapa först mallspecifikationen genom att ange ARM-mallen.

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

Hämta sedan ID:t för mallspecifikationen och distribuera det.

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

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

Mer information finns i Mallspecifikationer för Azure Resource Manager.

Förhandsgranska ändringar

Innan du distribuerar mallen kan du förhandsgranska de ändringar som mallen kommer att göra i din miljö. Använd konsekvensåtgärden för att kontrollera att mallen gör de ändringar som du förväntar dig. What-if validerar även mallen för fel.

Skicka parametervärden

Om du vill skicka parametervärden kan du använda antingen infogade parametrar eller en parameterfil. Parameterfilen kan vara antingen en Bicep-parameterfil eller en JSON-parameterfil.

Infogade parametrar

Om du vill skicka infogade parametrar anger du namnen på parametern med New-AzResourceGroupDeployment kommandot . Om du till exempel vill skicka en sträng och matris till en mall använder du:

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

Du kan använda parametern TemplateParameterObject för att passera genom en hashtable som innehåller parametrarna för mallen.

$params = @{
  exampleString = "inline string"
  exampleArray = "value1", "value2"
}

New-AzResourceGroupDeployment -ResourceGroupName testgroup `
  -TemplateFile <path-to-bicep> `
  -TemplateParameterObject $params

Du kan också hämta innehållet i filen och ange innehållet som en infogad parameter.

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

Det är praktiskt att hämta ett parametervärde från en fil när du behöver ange konfigurationsvärden. Du kan till exempel ange cloud-init-värden för en virtuell Linux-dator.

Om du behöver skicka in en matris med objekt skapar du hash-tabeller i PowerShell och lägger till dem i en matris. Skicka matrisen som en parameter under distributionen.

$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-parameterfiler

I stället för att skicka parametrar som infogade värden i skriptet, kan det vara lättare att använda en JSON-fil som innehåller parametervärdena. Parameterfilen kan vara en lokal fil eller en extern fil med en tillgänglig URI.

Mer information om parameterfilen finns i Skapa en parameterfil för Resource Manager.

Använd parametern för TemplateParameterFile att skicka en lokal parameterfil:

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

Om du vill skicka en extern parameterfil använder du parametern 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

Mer information om parameterfilen finns i Skapa Resource Manager-parameterfil.

Bicep-parameterfiler

Med Azure PowerShell version 10.4.0 eller senare och Bicep CLI version 0.22.6 eller senare kan du distribuera en ARM-mallfil genom att använda en Bicep-parameterfil. Med -instruktionen using i Bicep-parameterfilen behöver du inte ange växeln -TemplateFile när du anger en Bicep-parameterfil för växeln -TemplateParameterFile .

I följande exempel visas en parameterfil med namnet storage.bicepparam. Filen finns i samma katalog där kommandot körs.

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

Mer information om filen med Bicep-parametrar finns i filen med Bicep-parametrar.

Nästa steg