Azure ARM šablony v PowerShellu
Myslím si, že pracovat se šablonami Azure Resource Manager (ARM), které jsou postavené na syntaxí JSON, může být poněkud těžké a nepřehledné. Jde o jinou logiku a syntaxi, než jakou používáme pro správu prostředí za pomocí skriptovacích nástrojů jako jsou PowerShell nebo CLI. Řekl bych, že to je právě ten důvod, proč firmy nevyužívají výhod ARM šablon a snaží se vytvářet nebo spravovat Azure prostředí jinak. Například pomocí jiných Infrastructure as a Code nástrojů nebo manuální konfigurací.
Předělat ARM šablony, nebo vymyslet nový jazyk, by pravděpodobně znamenalo provádět velké změny v Azure Resource Manager a adopce na nový jazyk by naopak trvala velmi dlouho. Proto Microsoft přichází s již druhou iterací Domain Specific Language, který nám umožní jednodušší způsob psaní ARM šablon. Nejdříve byl představen Azure Bicep a nedávno byl oznámen PowerShell modul PSArm, o kterém dnes budu psát.
Tento nový modul PowerShell je navržen tak, abychom mohli pomocí příkazů a syntaxe PowerShellu vytvářet šablony ARM. Znalosti nativních příkazů a logiky PowerShellu by nám k vytváření šablon ARM mělo vystačit.
Co to je PSArm?
PSArm využívá silné stránky prostředí PowerShell k vylepšení procesu a postupu tvorby ARM šablon.
Je nutné podotknout, že PSArm je aktuálně experimentální modul, v takzvaném Public Preview. Dokud nepřejde do Generally Available, tak s ním není spojená žádná podpora a Microsoft může kdykoli zavést nejnovější změny. Jinými slovy, vyzkoušejte to, otestujte, ale momentálně se na to nespoléhejte v produkčním prostředí. Všiml jsem si, že tato novinka získala velmi dobrý ohlas ze strany uživatelů, a myslím si, že je jen otázka času kdy to začne být podporovaná.
Na rozdíl od Azure Bicep, PSArm není samostatný nový jazyk, který se musíme učit. PSArm syntaxi vkládáme do klasického PowerShell skriptu. Je to jen nový modul, který přináší nové cmdlety, ale vše ostatní zůstává. Oba projekty, Bicep a PSArm, však ke generování šablon ARM používají stejný back-end prostředí.
Instalace PSArm PowerShell modulu
PSArm modul je k dispozici pro instalaci prostřednictvím PowerShell Gallery a vyžaduje minimální verzi PowerShell 5.1.
Nainstalujete jej stejně jako jakýkoli jiný modul Galerie prostředí PowerShell pomocí příkazu Install-Module. Protože je však modul v alfa verzi, přidáte parametr -AllowPrelease.
Install-Module -Name PSArm -AllowPrelease
Struktura a Syntaxe
ARM šablony píšeme jako jakýkoli jiný PowerShell skript. ARM šablony mají příponu .psarm.ps1.
V rámci souboru PowerShell definujeme prostředky Azure uvnitř bloku ARM pomocí složených závorek.
Arm {}
Dále pak v rámci tohoto bloku definujeme zdroje pomoci klíčového slova Resource. Následují pak atributy, které chceme definovat.
Název
Namespace, například: ‘Microsoft.Storage’ nebo ‘Microsoft.Network’)
Druh zdroje, například ‘storageAccounts’ nebo ‘virtualNetworks’
Verze Api
Lokalita
Podle mě je taková syntaxe výrazně jednodušší než ARM JSON. Zde je příklad pro vytvoření jednoduchého Storage Accountu:
Resource '<name>' -Namespace Microsoft.Storage -Type storageAccounts -ApiVersion '<version>' -Kind '<type>' -Location '<region>' {}
Vidíte, že způsob psaní tohoto příkazu, se neliší od běžného PowerShell skriptu, který všichni známe a používáme.
Pro porovnání, zde je definice vlastností stejného typu zdroje pomocí ARM template:
{
"name": "<name>",
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "<version>",
"kind": "<type>",
"location": "<region>"
}
Vidíte, že v PSArm definujeme stejné vlastnosti jako v ARM Templates, jen je pak celková konstrukce výrazně přehlednější.
Již u prvního příkladu ale narazíme na omezení, že ne všechny properties definujeme přímo v části Resources. Myslím si, že tpoužití modulu se tím trochu komplikuje, ale vzhledem k velkému množství různých druhů Azure Resources to nešlo udělat jinak. Ostatní nedefinované vlastností pak definujeme uvnitř závorek. Zde je příklad plná definice Storage Accountu:
Arm {
Resource 'armdemo' -Namespace Microsoft.Storage -Type storageAccounts -ApiVersion 2021-01-01 -Kind StorageV2 -Location 'westus2' {
ArmSku Standard_LRS
properties {
accessTier 'Hot'
supportsHttpsTrafficOnly $true
allowBlobPublicAccess $false
minimumTlsVersion 'TLS1_2'
}
}
}
Vidíte, že PSArm přínáší jednodušší a přehlednější syntaxi pro deklarativní definici Azure Resources. Z mého pohledu je další obrovskou výhodou možnost psaní jakéhokoli jiného PowerShell skriptu ve stejném souboru. V našem případě, můžeme na začátek souboru přidat Get-Random příkaz pro generaci unikátního názvu pro Storage Account, nebo provést validaci, jestli tento název již existuje.
$randint = Get-Random -Minimum 1000 -Maximum 9999
$StorageAccountName = ‘armdemo’+$randint
Jako název v Resource části pak použijeme hodnotu proměnné místo psaní konkrétního jména.
Dále můžeme pracovat i s parametry, ale to si ukážeme za chvíli.
Kompilace z PSArm PowerShellu na ARM šablonu
Pro kompilaci nepotřebujeme instalovat žádné další nástroje. PSArm modul již obsahuje cmdlet Publish-PSArmTemplate, který použijeme pro převod souboru .psarm.ps1 na šablonu ARM ve formátu .json. Obsahuje také parametr -Path který rekurzivně shromažďuje všechny soubory ve formátu .psarm.ps1 v uvedené složce a použije je k vytvoření ARM šablon.
Ve výchozím nastavení vytvoří příkaz Publish-PSArmTemplate nový soubor ARM šablony pod názvem template.json. Název výstupního souboru můžete určit pomocí parametru -OutFile. Pokud výstupní soubor již existuje, přepište soubor pomocí parametru -Force.
A protože se jedná o PowerShell, můžeme v tomto našemu kroku.psarm.ps1 souboru podstrčit i parametry.
Zde je příklad:
Publish-PSArmTemplate -Path .\newStorageAccount.psarm.ps1 -Parameters @{
storageAccountName = 'storageName'
location = 'location'
}
Rád bych ještě zmínil, že vytvořením souboru ve formátu ARM šablony nedochází k automatickému nasazení do Azure. Získáme tímto pouze ARM šablonu, kterou do Azure deployujeme stejným způsobem jako je tomu do teď.
Například nasazením v Azure Portálu, nebo příkazem New-AzResourceGroupDeployment.
New-AzResourceGroupDeployment -ResourceGroupName myRG -TemplateFile .\template.json
Využití PSArm v praxi
Vytváření nových resources v Azure manuálně může mít negativní dopad na konzistenci a zabezpečení zdrojů často to může negativně ovlivnit i náklady na provoz. Je snadné udělat chybu při pojmenování, nebo při výběru správné velikosti a regionu. Řešením může být právě vytváření prostředků pomocí nástrojů Infrastructure as a Code.
PSArm nám zjednodušuje a přibližuje využívání Azure Resource Manager Templates, a nemusíme se učit složitou syntaxi nebo nový jazyk.
Myslím si, že se PSArm má velký potenciál, protože je postaven na jazyce PowerShell, který nesmí chybět žádnému IT správci. Ale vzhledem k tomu, že se stale jedná o experimentalní nepodporovanou verzi, ještě není připraven pro nasazování v produkčním prostředi.
Sdílej v médiích