Övning – Lägga till logik för villkorsstyrning i ARM-mallar
I de tidigare övningarna har du arbetat med virtuella Linux-datorer. Nu ska du variera dig lite och fokusera på hantering av lagringskonton.
Anta att du har tre miljöer som du behöver distribuera till: Dev, Staging och Production.
- Utvecklingsmiljön är den första platsen där du samlar allt som appen behöver. I den här miljön kan det finnas webbservrar, en lastbalanserare och en databas.
- I mellanlagringsmiljön görs de sista testerna innan nya appfunktioner släpps till dina slutanvändare.
- Det är i produktionsmiljön som slutanvändarna använder din app.
När du flyttar från utvecklingsmiljön till produktionsmiljön behövs ytterligare infrastruktur. I produktionsmiljön behöver du till exempel ett extra lagringskonto som du inte behöver i de tidigare miljöerna.
Här använder du ett villkor som styr när ett lagringskonto ska etableras. På så sätt kan du hantera de tre infrastrukturmiljöerna från samma ARM-mall.
Skapa ARM-mallen
Här skapar du en ARM-mall (Azure Resource Manager) som definierar en lagringskontoresurs.
Mallen definierar också två parametrar:
environment
: namnet på den aktuella miljön.storageAccountName
: namnet på lagringskontot.
environment
kan ha något av tre värden: dev
, staging
eller production
. Villkoret gör att lagringskontot bara etableras när environment
är lika med production
.
Skapa en fil i Visual Studio Code med namnet condition.json i samma katalog som azuredeploy.json.
Lägg till följande innehåll i condition.json:
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "environment": { "type": "string", "defaultValue": "dev", "allowedValues": [ "dev", "staging", "production" ], "metadata": { "description": "a value that represents the current environment" } }, "storageAccountName": { "type": "string", "metadata": { "description": "a name for the account" } } }, "functions": [], "variables": {}, "resources": [ { "condition": "[equals(parameters('environment'),'production')]", "name": "[parameters('storageAccountName')]", "type": "Microsoft.Storage/storageAccounts", "apiVersion": "2019-06-01", "tags": { "displayName": "[parameters('storageAccountName')]" }, "location": "[resourceGroup().location]", "kind": "StorageV2", "sku": { "name": "Premium_LRS", "tier": "Premium" } } ], "outputs": {} }
Här ska du distribuera en ARM-mall med en condition-konstruktion via PowerShell och Az-modulen.
Etablera utvecklingsmiljön
Här distribuerar du ARM-mallen till utvecklingsmiljön. Det gör du genom att ange värdet dev
för mallparametern environment
.
Eftersom villkoret gör att lagringskontot bara etableras när environment
är lika med production
väntar du dig att mallen inte ska etablera lagringskontot. Du förväntar dig alltså en distribution som inte innehåller några resurser.
Skapa en PowerShell-variabel för namnet på lagringskontot.
$STORAGE_ACCT_NAME="tailwindsa"+ (Get-Random -COUNT 1 -Maximum 9999999 )
Lagringskontonamn måste vara unika. Delen
Get-Random
ser till att namnet på lagringskontot slutar med en slumpmässig serie siffror.Kör följande
New-AzResourceGroupDeployment
kommando för att distribuera mallen till Dev-miljön:New-AzResourceGroupDeployment ` -TemplateFile "./condition.json" ` -storageAccountName $STORAGE_ACCT_NAME ` -environment dev
Verifiera distributionen till utvecklingsmiljön
Kom ihåg att du förväntar dig att mallen inte har etablerat lagringskontot.
Det kontrollerar du genom att köra kommandot Get-AzStorageAccount
och kontrollera om lagringskontots namn används eller inte.
Kör kommandot Get-AzStorageAccount
:
Get-AzStorageAccount -Name $STORAGE_ACCT_NAME -ResourceGroupName <rgn>sandbox resource group</rgn>
Ditt resultat ser ut ungefär så här:
Get-AzStorageAccount: The Resource 'Microsoft.Storage/storageAccounts/tailwindsa4736629' under resource group '<rgn>name of resource group</rgn>' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix
Det här anger att lagringskontot inte har etablerats ännu. Det är som du förväntar dig eftersom du inte har distribuerat till produktionsmiljön ännu.
Etablera till produktionsmiljön
Här distribuerar du ARM-mallen till produktionsmiljön, ungefär som när du distribuerade till utvecklingsmiljön.
Vi påminner om hur villkoret ser ut i mallen:
"condition": "[equals(parameters('environment'),'production')]"
För att utlösa det här villkoret anger du production
som värde för mallparametern environment
.
Kör följande New-AzResourceGroupDeployment
kommando för att distribuera mallen till produktionsmiljön:
New-AzResourceGroupDeployment `
-TemplateFile "./condition.json" `
-storageAccountName $STORAGE_ACCT_NAME `
-environment production
Verifiera distributionen till produktion
Den här gånger förväntar du dig att mallen har etablerat lagringskontot.
Det kontrollerar du genom att köra kommandot Get-AzStorageAccount
och verifiera att lagringskontots namn används.
Kör följande Get-AzStorageAccount
-kommando:
Get-AzStorageAccount -Name $STORAGE_ACCT_NAME -ResourceGroupName <rgn>sandbox resource group</rgn>
Den här gången får du andra utdata. I stället för ett felmeddelande visas den här tabellens med information om din lagringskontoresurs:
Ditt resultat ser ut ungefär så här:
Location Name Type Kind
-------- ---- ---- ----
westus tailwindsa4736629 Microsoft.Storage/storageAccounts StorageV2
De här värdena anger att lagringskontot har etablerats som förväntat.
Även om det här är ett enkelt exempel så ser du hur du kan distribuera baserat på ett villkor.
I praktiken skulle utvecklingsmiljön, mellanlagringsmiljön och produktionsmiljön innehålla fler Azure-resurser för beräkning, nätverksfunktioner och lagring. Varje miljö skulle sannolikt hanteras via en egen resursgrupp så att den kan etableras och behandlas som en enskild enhet.
Skapa ARM-mallen
Här skapar du en ARM-mall (Azure Resource Manager) som definierar en lagringskontoresurs.
Mallen definierar också två parametrar:
environment
: namnet på den aktuella miljön.storageAccountName
: namnet på lagringskontot.
environment
kan ha något av tre värden: dev
, staging
eller production
. Villkoret gör att lagringskontot bara etableras när environment
är lika med production
.
Skapa en fil i Visual Studio Code med namnet condition.json i samma katalog som azuredeploy.json.
Lägg till följande innehåll i condition.json:
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "environment": { "type": "string", "defaultValue": "dev", "allowedValues": [ "dev", "staging", "production" ], "metadata": { "description": "a value that represents the current environment" } }, "storageAccountName": { "type": "string", "metadata": { "description": "a name for the account" } } }, "functions": [], "variables": {}, "resources": [ { "condition": "[equals(parameters('environment'),'production')]", "name": "[parameters('storageAccountName')]", "type": "Microsoft.Storage/storageAccounts", "apiVersion": "2019-06-01", "tags": { "displayName": "[parameters('storageAccountName')]" }, "location": "[resourceGroup().location]", "kind": "StorageV2", "sku": { "name": "Premium_LRS", "tier": "Premium" } } ], "outputs": {} }
Etablera utvecklingsmiljön
Här distribuerar du ARM-mallen till utvecklingsmiljön. Det gör du genom att ange värdet dev
för mallparametern environment
.
Eftersom villkoret gör att lagringskontot bara etableras när environment
är lika med production
väntar du dig att mallen inte ska etablera lagringskontot. Du förväntar dig alltså en distribution som inte innehåller några resurser.
Skapa en Bash-variabel för namnet på lagringskontot.
STORAGE_ACCT_NAME=tailwindsa$RANDOM
Lagringskontonamn måste vara unika. Delen
$RANDOM
ser till att namnet på lagringskontot slutar med en slumpmässig serie siffror.Kör följande
az deployment group create
kommando för att distribuera mallen till Dev-miljön:az deployment group create \ --template-file condition.json \ --parameters storageAccountName=$STORAGE_ACCT_NAME environment=dev
Verifiera distributionen till utvecklingsmiljön
Kom ihåg att du förväntar dig att mallen inte har etablerat lagringskontot.
Det kontrollerar du genom att köra kommandot az storage account check-name
och kontrollera om lagringskontots namn används eller inte.
Kör följande az storage account check-name
-kommando:
az storage account check-name --name $STORAGE_ACCT_NAME
Följande visas:
{
"message": null,
"nameAvailable": true,
"reason": null
}
Värdet för nameAvailable
är true
, vilket innebär att lagringskontots namn fortfarande är tillgängligt och inte har etablerats ännu. Det är som du förväntar dig eftersom du inte har distribuerat till produktionsmiljön ännu.
Etablera till produktionsmiljön
Här distribuerar du ARM-mallen till produktionsmiljön, ungefär som du gjorde för Dev-miljön .
Vi påminner om hur villkoret ser ut i mallen:
"condition": "[equals(parameters('environment'),'production')]"
För att utlösa det här villkoret anger du production
som värde för mallparametern environment
.
Kör följande az deployment group create
kommando för att distribuera mallen till produktionsmiljön:
az deployment group create \
--template-file condition.json \
--parameters storageAccountName=$STORAGE_ACCT_NAME environment=production
Verifiera distributionen till produktion
Den här gånger förväntar du dig att mallen har etablerat lagringskontot.
Det kontrollerar du genom att köra kommandot az storage account check-name
och verifiera att lagringskontots namn används.
Kör följande az storage account check-name
-kommando:
az storage account check-name --name $STORAGE_ACCT_NAME
Ditt resultat ser ut ungefär så här:
{
"message": "The storage account named tailwindsa32100 is already taken.",
"nameAvailable": false,
"reason": "AlreadyExists"
}
De här värdena anger att lagringskontot har etablerats som förväntat.
Även om det här är ett enkelt exempel så ser du hur du kan distribuera baserat på ett villkor.
I praktiken skulle utvecklingsmiljön, mellanlagringsmiljön och produktionsmiljön innehålla fler Azure-resurser för beräkning, nätverksfunktioner och lagring. Varje miljö skulle sannolikt hanteras via en egen resursgrupp så att den kan etableras och behandlas som en enskild enhet.