name: inverse layout: true class: center, middle, inverse --- # Introduksjon til # Azure Resource Manager Templates ## Joar Øyen - Acando ## @joaroyen ## https://github.com/joaroyen ??? Tittel: Hvordan kan vi be Azure om å opprette det du trenger av ressurser? Abstrakt: Azure Resource Manager (ARM) lar deg håndtere Azure ressursene du trenger i din sky-applikasjon som en enhet uten behov for klikking i Azure portalen. Ved å deklarere hva du trenger av ressurser i en mal, kan du be ARM om å opprette og konfigurere ressurs gruppen slik du ønsker. Malene har typisk parametre med miljøspesifikke verdier og kan dermed brukes for automatisk oppretting av egne instanser av ressursgruppen for forskjellige formål. I denne sesjonen vil vi vise hvordan du går frem for å lage maler for dine løsninger, hvilke verktøy som er tilgjengelig og ikke minst tips og triks basert på en nybegynners erfaringer med bruk av ARM-maler. ARM er per i dag en løsning som ikke dekker alle behov 100% og dere vil få vite om hvilke hull som må tettes på andre måter og når ARM maler eventuelt ikke er egnet. Demo skript: PowerShell: Login-AzureRmAccount Select-AzureRmSubscription -SubscriptionName Mine Get-Command *rmresource* Get-AzureRmResourceProvider -ListAvailable Linker: https://www.azurelens.net/ https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-manager-supported-services https://github.com/Azure/azure-quickstart-templates/tree/master/docker-neo4j --- layout: true class: center, middle --- layout: false # Innhold 1. Hva er Azure Resource Manager (ARM) 2. Hva er ARM Templates 3. Verktøy 4. Tips og triks 5. Utfordringer 6. Oppsummering --- class: center, middle, inverse # .icon[![](icons\ResourceGroup_COLOR.png)] Hva er Azure Resource Manager (ARM) --- # .icon[![](icons\ResourceGroup_COLOR.png)] Kontainer for en applikasjons livsløp ![image](images\ResourceGroups.png) ??? * Livsløp: utvikling, oppdatering, sletting * Identitet: kommunikasjon mellom ressurser * Prising: Kostnader og begrensninger --- # .icon[![](icons\ResourceGroup_COLOR.png)] Konsistent administrasjon ![image](images\ConsistentManagement.png) ??? * Portal (kun i den nye) * PowerShell * API --- # .icon[![](icons\ResourceGroup_COLOR.png)] Utvidelser og integrasjoner * Inkluder egen kode og data * Scripting * Integrasjoner med andre verktøy * Virtual Machine Manager * PowerShell Desired State Configuration * Kildekode kontroll * Chef * Puppet * Octopus Deploy --- class: center, middle, inverse # .icon[![](icons\Document DB file.svg)] Hva er Azure Resource Manager Templates --- # .icon[![](icons\Document DB file.svg)] Deklarativ spesifikasjon ![image](images\ResourceGroupTemplate.png) --- # .icon[![](icons\Document DB file.svg)] Struktur ``` json { "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { }, "variables": { }, "resources": [{ "type": "...", "name": "...", "tags": {}, "properties": {}, "resources": [], "dependsOn": [] }, ... ], "outputs": { } } ``` --- # .icon[![](icons\Document DB file.svg)] Deployment strategier * Inkrementell * Nye ressurser opprettes * Eksisterende ressurser endres --- # .icon[![](icons\Document DB file.svg)] Deployment strategier * Inkrementell * Nye ressurser opprettes * Eksisterende ressurser endres * Komplett * Nye ressurser opprettes * Eksisterende ressurser endres * Ressurser som ikke er i malen **slettes** --- # .icon[![](icons\Document DB file.svg)] Deployment strategier * Inkrementell * Nye ressurser opprettes * Eksisterende ressurser endres * Komplett * Nye ressurser opprettes * Eksisterende ressurser endres * Ressurser som ikke er i malen **slettes** * Inkrementell kan kombineres med PowerShell for eksplisitt sletting av ressurser --- class: center, middle, inverse # .icon[![](icons\Tools.svg)] Verktøy ** Eksemplene i presentasjonen er ikke komplette og heller ikke 100% korrekte. ** --- # .icon[![](icons\Tools.svg)] Kommandolinje * PowerShell ``` posh C:\> Test-AzureRmResourceGroupDeployment ``` * Kryssplattform CLI ``` bash $ azure group template validate ``` --- # .icon[![](icons\Tools.svg)] API * .NET ``` C# var resourceManagementClient = new ResourceManagementClient(credentials); ... var deployment = new Deployment(); deployment.Properties = new DeploymentProperties { Mode = DeploymentMode.Incremental, Template = templateFileContents, Parameters = parameterFileContents }; var deploymentResult = resourceManagementClient.Deployments.CreateOrUpdate( resourceGroupName, deploymentName, deployment); ``` * Kan også benytte REST API direkte --- # .icon[![](icons\Tools.svg)] Eksport fra Azure portalen ![](images\AzurePortalAutomationScriptExport.png) --- # .icon[![](icons\Tools.svg)] Eksport fra Azure portalen ![](images\AzurePortalAutomationScriptExport-ErrorDetails.png) --- # .icon[![](icons\Tools.svg)] Visual Studio Code [Azure Resource Manager Tools for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=msazurermtools.azurerm-vscode-tools) ![](images\AzureResourceManagerToolsInVisualStudioCode.png) Installation tips:[https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-manager-vs-code](https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-manager-vs-code) --- # .icon[![](icons\Tools.svg)] Visual Studio Code * Hjelp ![](images\Visual Studio Code ARM hjelp.png) * Intellisense ![](images\Visual Studio Code ARM Intellisense.png) --- # .icon[![](icons\Tools.svg)] Visual Studio [Azure Resource Manager Visual Studio Project](https://azure.microsoft.com/en-us/documentation/articles/vs-azure-tools-resource-groups-deployment-projects-create-deploy/) ![](images\Visual Studio ARM prosjekt.png) --- # .icon[![](icons\Tools.svg)] On-line visualisering og editering * ARM Visualiser [http://armviz.io/designer](http://armviz.io/designer) * Azure Lens [https://www.azurelens.net/](https://www.azurelens.net/) --- class: center, middle, inverse # Tips og triks --- # Tips og triks * Legg malen i kildekodekontroll * Start med en mal eller en eksport fra portalen * Bruk et verktøy med intellisense og snippets * Valider templaten ``` posh C:\> Test-AzureRmResourceGroupDeployment ``` * Bryt ned oppgaven --- # Tips og triks: Parametre * Bruk så få parametre som mulig ``` json "parameters": { "tenant": { "type": "string" }, "environment": { "type": "string", "defaultValue": "test", "allowedValues": [ "dev", "test", "prod" ], "metadata": { "description": "The named environment for this deployment" } } } ``` --- # Tips og triks: Variabler * Avled andre variable basert på parametre, funksjoner og konvensjoner ``` json "variables": { "jobs": { "someJob": { "name": "[concat(variables('jobCollection-name'), '/convention-SomeJobName-', parameters('tenant'), '-', parameters('environment'))]" } }, "serviceBusNamespace": { "name": "[concat('convention-', parameters('tenant'), '-', parameters('environment'))]" }, "storageAccount-name": "[concat('prefix', parameters('tenant'), '1', parameters('environment'))]", "location": "[resourceGroup().location]", "sbVersion": "2015-08-01", "authRuleResourceId": "[resourceId('Microsoft.ServiceBus/namespaces/authorizationRules', variables('serviceBusNamespace').name, variables('defaultSASKeyName'))]" } ``` --- # Tips og triks: Duplisering av ressurser ``` json "parameters": { "numberOfWebsites": { "type": "int", "defaultValue": 2 } }, "resources": [ { "name": "[concat('website-', copyIndex())]", ... "copy": { "name": "websitescopy", "count": "[parameters('numberOfWebsites')]" } } ] ``` --- # Tips og triks: Output * For eksempel vil oppretting av Service Bus Namespace gi en connection string du kan benytte i en Azure Scheduler trigger ``` json { "type": "Microsoft.Scheduler/jobCollections/jobs", "name": "[variables('jobs').someJob.name]", "properties": { "action": { "request": { "uri": "[listkeys(variables('authRuleResourceId'), variables('sbVersion')).primaryConnectionString]", ... ``` --- # Tips og triks: Output * Output kan også benyttes videre i PowerShell ``` json "outputs": { "namespaceConnectionString": { "type": "string", "value": "[listkeys(variables('authRuleResourceId'), variables('sbVersion')).primaryConnectionString]" } } ``` ``` posh $tempVar = New-AzureRmResourceGroupDeployment -ResourceGroupName $resourceGroupName -TemplateFile $templateFilePath -TemplateParameterFile $parametersFilePath; $sbqconstr = [string]$tempVar.Outputs["namespaceConnectionString"].Value; ``` --- # Tips og triks: Avhengigheter * Avhengigheter må angis selv om en ressurs ligger inn under en annen ``` json { "comments": "Servicebus", "type": "Microsoft.ServiceBus/namespaces", ... "name": "[variables('serviceBusNamespace').name]", "resources": [{ "name": "[variables('serviceBusQueue-name')]", "type": "Queues", ... "dependsOn": [ "[concat('Microsoft.ServiceBus/namespaces/', variables('serviceBusNamespace').name)]" ] }] , "dependsOn": [] } ``` --- class: center, middle, inverse # Utfordringer --- # Begrensninger: Enkelte ressurser kan ikke administreres av ARM * Ressurstyper som betegnes som "classic" * Storage (Storage Account kan opprettes ved hjelp av ARM) * Nye ressurstyper i preview --- # Utfordringer: Genererte maler fra portalen... * er vanskelig å vedlikeholde * En-gangs generering * Lite inteligent bruk av parametre * Ingen bruk av variable * Ingen nøsting av ressurser * inneholder unødvendige instillinger * inneholder feil * Status navnerom til service bussettes som aktiv, og gjør at oppretting av topics og køer feiler --- # Utfordringer: Utviklng * Det kan være vanskelig å finne hjelp on-line * StackOverflow har få spørsmål og ennå færre [svar](http://stackoverflow.com/questions/tagged/azure-resource-manager) * Prøving og feiling tar lang tid * Om du ikke passer på kan du opprette flere ressurser enn det du hadde tenkt * Ved duplisering * Etter å ha endret navn --- class: center, middle, inverse # Ressurser --- # Ressurser .left-column[ Start her ] .right-column[ [Authoring Azure Resource Manager templates](https://azure.microsoft.com/en-us/documentation/articles/resource-group-authoring-templates/) ![](images\Authoring Azure Resource Manager templates.png) ] --- # Ressurser .left-column[ .gray[Start her] Community maler ] .right-column[ [Azure Resource Manager Quickstart Templates](https://azure.microsoft.com/en-us/documentation/templates/) ![](images\Azure Resource Manager Quickstart Templates.png) ] --- # Ressurser .left-column[ .gray[Start her] .gray[Community maler] Pluralsight kurs ] .right-column[ [Azure Resource Manager Deep Dive](https://app.pluralsight.com/library/courses/azure-resource-manager-deep-dive/table-of-contents) ![](images\Azure Resource Manager Deep Dive.png) ] --- # Ressurser .left-column[ .gray[Start her] .gray[Community maler] .gray[Pluralsight kurs] Andre ressurser ] .right-column[ * [Resource Manager providers, regions, API versions and schemas](https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-manager-supported-services) Med linker til skjema for de forskjellige ARM ressursene. * [Patterns for designing Azure Resource Manager templates](https://docs.microsoft.com/en-us/azure/azure-resource-manager/best-practices-resource-manager-design-templates) ] --- class: center, middle, inverse # Oppsummering --- # Hvorfor ARM-maler * Deklarativ syntaks: Du beskriver hva, ikke hvordan * Storsatsing fra Microsoft * Oppretting og konfigurasjon kan automatiseres og repeteres * Lett tilgjengelige eksemper --- # Hvorfor ARM-maler * Deklarativ syntaks: Du beskriver hva, ikke hvordan. * Storsatsing fra Microsoft * Oppretting og konfigurasjon kan automatiseres og repeteres * Lett tilgjengelige eksemper # Hvorfor ikke ARM-maler * Deklarativ syntaks: Mister muligheter du har gjennom API og PowerShell * JSON syntaksen er lesbar for mennesker, men kompleksiteten gjør at ARM-maler bør lages og oppdateres av utviklingsprosjektet * Enkelte ressurse lar seg foreløpig ikke administreres av ARM --- class: center, middle, inverse # Spørsmål ?