- Azure IaaS (1) – první VM z grafického portálu
- Azure IaaS (2) – první VM z PowerShell
- Azure IaaS (3) – první VM z Azure CLI
- Azure IaaS (4) – první VM z ARM šablony
- Azure IaaS (5) – Network security group
- Azure IaaS (6) – vlastní image
- Azure IaaS (7) – automatizace stavu VM při vytvoření
- Azure IaaS (8) – Availability Set aneb jak je to s SLA
- Vytváření VM krok za krokem v GUI může být nuda a pokud to děláme často, snadno se stane chyba. Skripty v PowerShellu nebo CLI jsou opakovatelnější a rychlejší, ale pro někoho možná hůře čitelné. Dnes se proto podíváme na ARM šablonu, tedy Desired state model. Popíšeme co chceme a necháme Azure, ať nás do tohoto stavu dostane. Nemusíme řešit co v jakém pořadí vytvářet, jen popíšeme co chceme. To jsou ARM šablony.
Naše první ARM šablona
ARM šablony se tvoří v JSON formátu, který je velmi populární a dobře čitelný (mezi klíčem a hodnotou je dvojtečka, objekty se zavírají do hranatých závorek a výčet či chcete-li pole je řešené hranatou závorkou). Na GitHub najdete velké množství příkladů a navíc Azure portál umí vygenerovat šablonu ze zdrojů, které vytvoří ručně klikáním. Nicméně pro začátek to nedoporučuji, protože pak člověku snadno unikne pochopení toho, co se tam děje.
V naší první šabloně použijeme čtyři základní sekce – parameters, variables, resources a outputs. V části Parameters definujeme otázky, na které odpoví ten, co bude šablonu nasazovat. Tyto položky se například objeví v GUI a budeme je moci vyplnit. V našem případě to bude název VM, DNS jméno, administrátorské jméno a veřejný SSH klíč. Je možné omezit uživatelský vstup (například povolit jen výčet nějakých možností, stanovit minimální délku vstupu apod.) nebo dát výchozí hodnotu.
Část variables definuje proměnné, které jsou později v šabloně použité, ale nejsou přímo editované při deploymentu šablony. Jde tady především o to, aby bylo možné jednoduše šablonu upravit, aniž by se například název sítě objevoval natvrdo někde v jejím těle. Je dobrou praxí všechna nastavení zdrojů (názvy, IP adresy, …) uvádět jako parameters nebo variables.
Sekce Resources předepisuje samotnou infrastrukturu. V našem případě jde o storage account, síťařinu a VM, ale tady popíšete prakticky všechno, co Azure nabízí – load balancer, databázi, message bus, webovou aplikaci apod.
Poslední část Outputs říká, jaký výstup se má vrátit (například zobrazit v GUI).
Podívejte se na šablonu, kterou dnes použijeme:
{ "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "vmName": { "type": "string", "metadata": { "description": "Jméno VM." } }, "adminUsername": { "type": "string", "metadata": { "description": "Nastav user name pro VM." } }, "sshKeyData": { "type": "string", "metadata": { "description": "Řetězec veřejného SSH klíče." } }, "dnsLabelPrefix": { "type": "string", "metadata": { "description": "Přiřaď unikátní DNS jméno pro veřejnou IP adresu této VM." } } }, "variables": { "storageAccountName": "[concat(uniquestring(resourceGroup().id), 'mojestorage')]", "imagePublisher": "Canonical", "imageOffer": "UbuntuServer", "ubuntuOSVersion": "16.04.0-LTS", "OSDiskName": "mujosdisk", "nicName": "mujnic", "addressPrefix": "10.0.0.0/16", "subnetName": "mujsubnet", "subnetPrefix": "10.0.0.0/24", "storageAccountType": "Standard_LRS", "publicIPAddressName": "mojeip", "publicIPAddressType": "Dynamic", "vmStorageAccountContainerName": "vhds", "vmName": "mojeUbuntuVM", "vmSize": "Standard_DS1", "sshKeyPath": "[concat('/home/',parameters('adminUserName'),'/.ssh/authorized_keys')]", "virtualNetworkName": "mujnet", "vnetID": "[resourceId('Microsoft.Network/virtualNetworks',variables('virtualNetworkName'))]", "subnetRef": "[concat(variables('vnetID'),'/subnets/',variables('subnetName'))]" }, "resources": [ { "type": "Microsoft.Storage/storageAccounts", "name": "[variables('storageAccountName')]", "apiVersion": "2016-01-01", "location": "[resourceGroup().location]", "sku": { "name": "[variables('storageAccountType')]" }, "kind": "Storage", "properties": {} }, { "apiVersion": "2016-09-01", "type": "Microsoft.Network/publicIPAddresses", "name": "[variables('publicIPAddressName')]", "location": "[resourceGroup().location]", "properties": { "publicIPAllocationMethod": "[variables('publicIPAddressType')]", "dnsSettings": { "domainNameLabel": "[parameters('dnsLabelPrefix')]" } } }, { "apiVersion": "2016-09-01", "type": "Microsoft.Network/virtualNetworks", "name": "[variables('virtualNetworkName')]", "location": "[resourceGroup().location]", "properties": { "addressSpace": { "addressPrefixes": [ "[variables('addressPrefix')]" ] }, "subnets": [ { "name": "[variables('subnetName')]", "properties": { "addressPrefix": "[variables('subnetPrefix')]" } } ] } }, { "apiVersion": "2016-09-01", "type": "Microsoft.Network/networkInterfaces", "name": "[variables('nicName')]", "location": "[resourceGroup().location]", "dependsOn": [ "[resourceId('Microsoft.Network/publicIPAddresses/', variables('publicIPAddressName'))]", "[resourceId('Microsoft.Network/virtualNetworks/', variables('virtualNetworkName'))]" ], "properties": { "ipConfigurations": [ { "name": "ipconfig1", "properties": { "privateIPAllocationMethod": "Dynamic", "publicIPAddress": { "id": "[resourceId('Microsoft.Network/publicIPAddresses',variables('publicIPAddressName'))]" }, "subnet": { "id": "[variables('subnetRef')]" } } } ] } }, { "apiVersion": "2016-03-30", "type": "Microsoft.Compute/virtualMachines", "name": "[variables('vmName')]", "location": "[resourceGroup().location]", "dependsOn": [ "[resourceId('Microsoft.Storage/storageAccounts/', variables('storageAccountName'))]", "[resourceId('Microsoft.Network/networkInterfaces/', variables('nicName'))]" ], "properties": { "hardwareProfile": { "vmSize": "[variables('vmSize')]" }, "osProfile": { "computerName": "[parameters('vmName')]", "adminUsername": "[parameters('adminUsername')]", "linuxConfiguration": { "disablePasswordAuthentication": "true", "ssh": { "publicKeys": [ { "path": "[variables('sshKeyPath')]", "keyData": "[parameters('sshKeyData')]" } ] } } }, "storageProfile": { "imageReference": { "publisher": "[variables('imagePublisher')]", "offer": "[variables('imageOffer')]", "sku": "[variables('ubuntuOSVersion')]", "version": "latest" }, "osDisk": { "name": "osdisk", "vhd": { "uri": "[concat(reference(concat('Microsoft.Storage/storageAccounts/', variables('storageAccountName')), '2016-01-01').primaryEndpoints.blob, variables('vmStorageAccountContainerName'),'/',variables('OSDiskName'),'.vhd')]" }, "caching": "ReadWrite", "createOption": "FromImage" } }, "networkProfile": { "networkInterfaces": [ { "id": "[resourceId('Microsoft.Network/networkInterfaces',variables('nicName'))]" } ] }, "diagnosticsProfile": { "bootDiagnostics": { "enabled": "true", "storageUri": "[concat(reference(concat('Microsoft.Storage/storageAccounts/', variables('storageAccountName')), '2016-01-01').primaryEndpoints.blob)]" } } } } ], "outputs": { "hostname": { "type": "string", "value": "[reference(variables('publicIPAddressName')).dnsSettings.fqdn]" } } }
Deployment šablony z portálu
Přes symbol + vyhledejte deployment šablony.
Začneme šablonou samotnou.
Prázdnou šablonu …
… přepište naší šablonou. Všimněte si, že protože máme vše syntakticky správně, portál pozná jaké chceme zdroje, parametry, proměnné.
Vyplňte naše parametry a všimněte si nápovědy, kterou jsme zadali jako součást šablony.
Teď už můžeme deployment spustit, v mém případě v nové Resource Group.
Po nějaké době najdeme zdroje vytvořené.
Podívejme se na Deployments a všimněte si i Outputs.
Klidně se k VM připojte a pak celou Resource Group zrušíme.
Deployment šablony z PowerShell
Šablony můžeme využít i bez grafického portálu a ukážeme si variantu s PowerShell. Nejprve vytvořte novou Resource Group.
New-AzureRmResourceGroup -Name shelltemp -Location westeurope
Vyberte si jednu z následujících možností, jak vyplnit vstupní parametry. Můžete jednoduše šablonu spustit a PowerShell se bude interaktivně ptát.
New-AzureRmResourceGroupDeployment -ResourceGroupName temptest -TemplateFile "C:\Azure\Simple VM\template.json" cmdlet New-AzureRmResourceGroupDeployment at command pipeline position 1 Supply values for the following parameters: (Type !? for Help.) vmName: ...
Pro případ, že má jít o automatizovaný proces bez lidského zásahu, připravte si parameters soubor. Půjde o jednoduchý JSON dokument, ve kterém budou dosazeny potřebné parametry. Vypadat bude takhle:
{ "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#", "contentVersion": "1.0.0.0", "parameters": { "vmName": { "value": "mojeubuntuvm" }, "adminUsername": { "value": "tomas" }, "sshKeyData": { "value": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDFhm1FUhzt/9roX7SmT/dI+vkpyQVZp3Oo5HC23YkUVtpmTdHje5oBV0LMLBB1Q5oSNMCWiJpdfD4VxURC31yet4mQxX2DFYz8oEUh0Vpv+9YWwkEhyDy4AVmVKVoISo5rAsl3JLbcOkSqSO8FaEfO5KIIeJXB6yGI3UQOoL1owMR9STEnI2TGPZzvk/BdRE73gJxqqY0joyPSWOMAQ75Xr9ddWHul+v//hKjibFuQF9AFzaEwNbW5HxDsQj8gvdG/5d6mt66SfaY+UWkKldM4vRiZ1w11WlyxRJn5yZNTeOxIYU4WLrDtvlBklCMgB7oF0QfiqahauOEo6m5Di2Ex Generated-by-Nova" }, "dnsLabelPrefix": { "value": "tomasdemovm" } } }
Nasaďme tedy deployment.
New-AzureRmResourceGroupDeployment -ResourceGroupName shelltemp -TemplateFile "C:\Azure\Simple VM\template.json" -TemplateParameterFile "C:\Azure\Simple VM\parameters.json" DeploymentName : template ResourceGroupName : shelltemp ProvisioningState : Succeeded Timestamp : 26.09.2016 4:13:37 Mode : Incremental TemplateLink : Parameters : Name Type Value =============== ========================= ========== vmName String mojeubuntuvm adminUsername String tomas sshKeyData String ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDFhm1FUhzt/9roX7SmT/dI +vkpyQVZp3Oo5HC23YkUVtpmTdHje5oBV0LMLBB1Q5oSNMCWiJpdfD4VxURC31yet4mQxX2DFYz8oEUh0Vpv+9YWwkEhyDy4AVmVKVoI So5rAsl3JLbcOkSqSO8FaEfO5KIIeJXB6yGI3UQOoL1owMR9STEnI2TGPZzvk/BdRE73gJxqqY0joyPSWOMAQ75Xr9ddWHul+v//hKji bFuQF9AFzaEwNbW5HxDsQj8gvdG/5d6mt66SfaY+UWkKldM4vRiZ1w11WlyxRJn5yZNTeOxIYU4WLrDtvlBklCMgB7oF0QfiqahauOEo 6m5Di2Ex Generated-by-Nova dnsLabelPrefix String tomasdemovm Outputs : Name Type Value =============== ========================= ========== hostname String tomasdemovm.westeurope.cloudapp.azure.com DeploymentDebugLogLevel :
Uložte si šablonu v portálu
Editor nám umožnil parsovat šablonu, přidávat zdroje a různě ji upravovat. V nějaký okamžik to ale budete mít odladěné a bude nepohodlné vždy do GUI kopírovat text. Jasně, můžete použít PowerShell, jak už jsme si vyzkoušeli, ale co si šablonu uložit přímo v GUI tak, že k ní budeme mít rychlý přístup? A nebo ji dokonce sdílet s kolegy? Najděte si ve službách Template.
Přidejte naší šablonu.
Jakmile ji máme vloženou, jednoduše spustíme její deployment, kdykoli budeme potřebovat.
Ukázali jsme si hned několik způsobů, jak vytvořit jednoduchou VM včetně storage a sítě. Použili jsme grafický portál, PowerShell, CLI a šablonu (a existují ještě možnosti typu přímý přístup do RESTful API nebo SDK do různých programovacích jazyků jako je Python nebo Ruby). Myslím, že stojí za to kromě GUI prozkoumat i další metody – jsou opakovatelnější, zkušenost snadněji předáte kolegovi a je to obvykle celkově rychlejší.
Chcete pomoci s návrhem on-premise řešení IaaS postaveným na Azure Pack/Stack, OpenStack nebo VMware? Potřebujete poradit s migrací aplikací a nasazením v Azure cloudu? HPE má certifikované Microsoft architekty a konzultanty a můžete také využít plně konvergovaných systémů pro vaše on-premise potřeby.