Wanneer je online zoekt, vind je verschillende blogposts, documentatie en tutorials over Azure DevOps. Al deze items zijn waardevolle bronnen, maar zelden leidt er een je door een real-world scenario. Velen gaan kort door de bocht met het beveiligingsaspect en laten wachtwoorden in duidelijke tekst achter voor eenvoud of een eindproduct dat in essentie niets doet. Laten we dat veranderen.
In dit artikel/deze tutorial ga je van a tot z leren hoe je een echte Azure DevOps release pipeline bouwt die infrastructuur automatiseert. Meer specifiek ga je leren hoe je Azure DevOps kunt gebruiken om een continue deployment pipeline te bouwen voor het voorzien van Azure virtuele machines.
Tegen het einde van dit project heb je een volledig functionerende Azure pipeline. Vanuit een enkele GitHub repo commit zal het:
- Bouw een tijdelijke Azure resource groep
- Voorzie een Azure VM via een ARM template
- Zet het genoemde ARM template op in een CI/CD pipeline
- Bij elke verandering aan het template, start een template validatietest
- Implementeer het ARM template naar Azure
- Test de geïmplementeerde infrastructuur
- Breek alle Azure resources af
Laten we er meteen induiken!
Project Overzicht
Dit project wordt opgedeeld in zes hoofdsecties. Deze zijn:
Azure resource voorbereiding
In deze sectie leer je hoe je alle vooraf vereiste resources in Azure opzet. Hier zul je:
- Maak een Azure service principal aan voor verschillende taken in de pipeline
- Zet een Azure Key Vault op met geheimen die de pipeline kan gebruiken
- Stel de juiste toegangsbeleidsregels in voor ARM-implementaties en het gebruik van de pipeline
Azure DevOps-voorbereiding
Zodra alle Azure-resources zijn ingesteld, is het tijd om Azure DevOps voor te bereiden op uw pipeline. In deze sectie zult u:
- Installeer de Pester Test Runner build-taak in uw Azure DevOps-organisatie
- Maak servicekoppelingen om Azure DevOps te voorzien van vereiste toegang tot resources
- Maak een Azure DevOps-variabelengroep die een key vault koppelt om toegang te krijgen tot Azure Key Vault-geheimen
Overzicht van script/sjabloon
Er zijn verschillende artefacten die bij dit project horen, waaronder het ARM-sjabloon om de server te bouwen en de Pester-tests. In deze sectie zullen we kort bespreken wat het sjabloon aan het voorzien is en wat precies Pester test in de pipeline.
Pijplijncreatie
In deze sectie begint het echte plezier. Je begint met het opzetten van de daadwerkelijke pijplijn. Hier leer je hoe je deze hele orchestratie opzet via een enkel YAML-bestand.
Je zult de pijplijn bouwen met behulp van de Multi-Stage Pipeline UI-ervaring. Op het moment van schrijven is deze functie in voorbeeldweergave.
Pijplijndemonstratie
Zodra de pijplijn is gebouwd, moet je hem zien draaien! In deze sectie leer je hoe je de pijplijn kunt activeren en eenvoudig kunt kijken hoe de magie gebeurt.
Opruimen
En tot slot, omdat dit slechts een demonstratie is, krijg je toegang tot een script om alles af te breken wat tijdens de tutorial is gebouwd.
Klinkt dit als veel? Dat is het! Maar maak je geen zorgen, je leert stap voor stap terwijl je elke taak één voor één aanvalt.
Als je een script wilt met alle Azure CLI-commando’s die worden gebruikt om deze pijplijn te bouwen, kun je het vinden in de ServerAutomationDemo GitHub-repo als demo.ps1.
Vereisten
Je gaat veel leren, maar er wordt ook van je verwacht dat je met een paar dingen komt. Als je van plan bent om mee te doen, zorg er dan voor dat je het volgende hebt:
- Een Azure DevOps-organisatie – Bekijk de Microsoft QuickStart-gids voor instructies over hoe je dit kunt doen. In dit artikel ga je werken met een project genaamd ServerAutomationDemo.
- A GitHub repo – In this article, you’ll be learning from a GitHub repo called ServerAutomationDemo. Sorry, we’re not using Azure repos in this article.
- A GitHub personal access token – Be sure to create the token with the permissions of admin:repo_hook, all repo and all user options.

- Cloud Shell of PowerShell 6+ indien lokaal uitgevoerd – Voorbeelden kunnen werken in Windows PowerShell, maar zijn niet getest. Alle voorbeelden worden lokaal uitgevoerd via een PowerShell-console, maar de Cloud Shell werkt even goed. Je gaat de pijplijn automatiseren.
- Azure CLI geïnstalleerd (indien lokaal uitgevoerd) – Je leert hoe je taken in dit artikel kunt uitvoeren met de Azure CLI. Dezelfde procedures kunnen echter ook worden uitgevoerd via de Azure Portal, PowerShell of de Azure SDK.
Waarschuwing: De handelingen die je gaat uitvoeren, kosten echt geld, tenzij je wat Azure-tegoed hebt. De meest kostbare bronnen die je in Azure zult implementeren, zijn een VM, maar slechts tijdelijk.
Voor je begint
Je gaat veel configuratiewerk doen in deze tutorial. Zorg ervoor dat je voordat je begint, de volgende items bij de hand hebt.
- De naam van het Azure-abonnement waarop de resources worden geïmplementeerd – de voorbeelden zullen Adam the Automator gebruiken.
- ID van het abonnement
- De Azure AD tenant-ID
- De naam van de DevOps-organisatie – de voorbeelden zullen adbertram gebruiken.
- De regio waarin u resources plaatst – de voorbeelden zullen eastus gebruiken.
- De naam van de Azure-resourcegroep om de tijdelijke key vault in te plaatsen – de voorbeelden zullen ServerAutomationDemo gebruiken.
- A password to assign to the local administrator account on a deployed VM – the examples will use “I like azure.”.
- De URL naar de GitHub-repository – de voorbeelden zullen https://github.com/adbertram/ServerAutomationDemo gebruiken.
Inloggen met de Azure CLI
Wees voorbereid om veel te werken met de Azure CLI in het artikel. Ik ben dol op de Azure PowerShell-cmdlets, maar de Azure CLI is momenteel in staat om meer DevOps-taken uit te voeren.
Uw eerste taak is om naar een PowerShell 6+ console te gaan. Eenmaal in de console, authenticeert u zich bij Azure met het commando az login
. Dit commando opent een browservenster en vraagt u om uw accountgegevens.
Zodra u geauthenticeerd bent, zorg ervoor dat u uw abonnement instelt als standaard. Dit voorkomt dat u het constant moet specificeren.
Voorbereiden van Azure-resources
Eenmaal ingelogd met de Azure CLI, is het tijd om aan de slag te gaan. Een Azure Pipeline heeft veel verschillende afhankelijkheden en verschillende instellingen om aan te passen. In dit eerste gedeelte ga je leren hoe je wat voorbereidingen treft en je omgeving gereedmaakt voor je pipeline.
Het installeren van de Azure CLI DevOps-extensie
Je hebt een manier nodig om de verschillende Azure DevOps-componenten te bouwen met behulp van de Azure CLI. Standaard is deze functionaliteit niet inbegrepen. Om Azure DevOps te beheren vanuit de Azure CLI, moet je de DevOps-extensie installeren.
Gelukkig is het installeren van de extensie slechts één regel, zoals hieronder getoond.
Zodra de extensie is geïnstalleerd, stel dan je organisatie in als de standaard om herhaaldelijk specificeren te voorkomen.
Het aanmaken van de resourcegroep
Hoewel de pipeline een tijdelijke resourcegroep zal aanmaken, zou je er ook een moeten aanmaken voor eventuele resources die in deze demo worden gebruikt. Meer specifiek is deze resourcegroep waar je een Azure Key Vault zult aanmaken.
Het aanmaken van de Azure Service Principal
De volgende taak is het maken van een Azure-serviceprincipe. U hebt een Azure-serviceprincipe nodig om te authenticeren bij de Azure Key Vault. U zult dit serviceprincipe ook gebruiken om een serviceverbinding te authenticeren. Maak het serviceprincipe aan voor zowel de sleutelkluis als voor de uiteindelijke ARM-implementatie zoals hieronder weergegeven.
Op dit punt is het een goed idee om de waarde van
$sp.appId
ergens op te slaan. Wanneer u later de pijplijn gaat bouwen, heeft u dit nodig!
U zult enkele PowerShell-opdrachten opmerken in de voorbeelden, bijv.
ConvertFrom-Json
. Aangezien de Azure CLI alleen JSON-strings retourneert, is het gemakkelijker om eigenschappen te refereren als ze zijn geconverteerd naar een PowerShell-object.
Het bouwen van de sleutelkluis
De pijplijn in deze zelfstudie moet verwijzen naar een paar wachtwoorden. In plaats van wachtwoorden in platte tekst op te slaan, doen we het op de juiste manier. Alle gevoelige informatie wordt opgeslagen in een Azure Key Vault.
Gebruik de az keyvault create
opdracht zoals hieronder weergegeven om de sleutelkluis te maken. Deze opdracht maakt de sleutelkluis aan in de eerder aangemaakte resourcegroep. Let ook op de enabled-for-template-deployment
schakelaar. Hiermee wordt het toegangsbeleid voor de sleutelkluis gewijzigd om toekomstige ARM-implementaties toegang te geven tot de sleutelkluis.

Het maken van sleutelkluisgeheimen
Zodra de sleutelkluis is aangemaakt, is het tijd om de geheimen aan te maken. Voor deze demo, maak twee geheimen aan genaamd ServerAutomationDemo-AppPw en StandardVmAdminPassword. Het wachtwoord AppPw is het wachtwoord voor de service-principal. Het VM-wachtwoord zal worden toegewezen aan het lokale beheerdersaccount op de gedeployde VM.
Merk op dat je in dit voorbeeld eerder gedefinieerde PowerShell-variabelen gebruikt. Hier geef je het wachtwoord van de service-principal (
$sp.password
) door dat eerder is verkregen.
De pijplijn toegang geven tot de sleutelkluis
Als volgende stap heeft de pijplijn toestemming nodig om toegang te krijgen tot de sleutelkluis. Ontspan het toegangsbeleid van de sleutelkluis een beetje. Geef de aangemaakte service-principal get– en list-machtigingen om de geheimen van de sleutelkluis te beheren.
Voorbereiden van Azure DevOps
Je hebt nu al het voorbereidende werk voor de Azure-resources gedaan. Het is tijd om wat voorbereidend werk te doen in Azure DevOps.
Installeren van de Pester-extensie
De eerste taak die moet worden uitgevoerd, is het installeren van de PesterRunner-Azure DevOps-extensie. De pijplijn gaat twee sets Pester-tests uitvoeren om ervoor te zorgen dat de VM ARM-implementatie succesvol was. Een van de gemakkelijkste manieren om Pester-tests uit te voeren, is met de PesterRunner-extensie.
Installeer de extensie met het onderstaande commando.
Het Azure DevOps-project maken
Het is nu tijd om het project te maken waarin de pipeline zal worden aangemaakt. Het maken van een Azure DevOps-pipeline is een fluitje van een cent met de Azure CLI. Voer eenvoudigweg de onderstaande commando’s uit om het project te maken en het project als standaard in te stellen.
Het maken van de serviceverbindingen
Uw pipeline moet authenticeren bij twee services – ARM en uw GitHub-repo. Hiervoor moeten twee serviceverbindingen worden gemaakt.
Maak eerst de ARM-service-eindpunt aan. Het onderstaande commando zal vragen om het wachtwoord van de service principal. Zorg ervoor dat u het eerst op het console weergeeft en kopieert naar uw klembord.
Zorg ervoor dat u uw abonnements-ID, tenant-ID invult en de abonnementsnaam hieronder vervangt.
Vervolgens maakt u een serviceverbinding voor GitHub. Aangezien de pipeline wordt geactiveerd via een Git-commit, moet deze toegang hebben tot het lezen van het repo.
Op dit punt komt die GitHub-persoonlijke toegangstoken van pas. Hieronder moet u ook het wachtwoord van de service principal opnieuw plakken. U gebruikt dezelfde service principal voor beide serviceverbindingen.
Het maken van de variabele groep
De pijplijn zal verwijzen naar sleutelkluisgeheimen voor twee wachtwoorden. Om dit veilig te doen, moet je een variabelengroep aanmaken en deze koppelen aan de sleutelkluis.
Eerst moet je de variabelengroep aanmaken zoals hieronder weergegeven.
Let op de
foo=bar
variabele? Deze wordt niet gebruikt, maar er is wel een enkele variabele nodig om de variabelengroep aan te maken.
De variabelengroep koppelen aan een sleutelkluis
Op dit punt moet je helaas naar het Azure DevOps-portaal gaan. Op het moment van schrijven heeft de Azure CLI geen manier om een sleutelkluis aan een variabelengroep te koppelen.
Navigeer naar het Azure DevOps-project en klik op Bibliotheek. Je zou dan de variabelengroep ServerAutomationDemo moeten zien zoals hieronder weergegeven. Klik op de variabelengroep ServerAutomationDemo.

Eenmaal in de variabelengroep, klik op Koppelen van geheimen uit een Azure-sleutelkluis als variabelen. Zodra je dit doet, krijg je een waarschuwing dat je alle variabelen zult wissen en klik op Bevestigen. Je zult zien hoe je dit hieronder kunt doen. Deze actie is prima omdat de foo variabele toch tijdelijk was.

Zodra bevestigd, selecteer de ARM serviceverbinding en de eerder aangemaakte ServerAutomationDemo-KV sleutelkluis zoals hieronder weergegeven. Klik op Toevoegen.

Controleer nu beide eerder aangemaakte geheimen zoals hieronder weergegeven en klik op OK en Opslaan om de wijzigingen op te slaan.

Overzicht van Projectbestanden
Als je het tot hier hebt gehaald, gefeliciteerd! Je bent nu klaar om te beginnen met het bouwen van de pipeline. Maar wacht… er is meer!
Om het bouwen van een Azure Pipeline realistisch te maken, bouwt deze tutorial een pipeline compleet met “unit” en “acceptance” tests. Dit maakt de tutorial interessanter, maar rechtvaardigt ook wat extra uitleg over wat er gebeurt.
In de GitHub repository voor deze tutorial vind je een paar bestanden zoals hieronder weergegeven. Nu is een goed moment om deze repository te klonen of je eigen versie te bouwen vanuit de bestanden.

- azure-pipelines.yml – De uiteindelijke YAML-pipeline
- connect-azure.ps1 – PowerShell-script om aan te melden bij een Azure-abonnement
- server.infrastructure.tests.ps1 – Een eenvoudige Pester-test om te bevestigen dat de VM-configuratie goed is
- server.json – Een Azure ARM-sjabloon om een VM te provisioneren
- server.parameters.json – Een Azure ARM-parametersjabloon die de ARM-sjabloon van parameterwaarden voorziet.
Zorg ervoor dat je je abonnements-ID en key vault-naam vervangt voor de key vault IT in het bestand server.parameters.json.
- server.templates.tests.ps1 – Pester “unit” tests om te bevestigen dat de ARM-sjabloon geldig is
Je zult zien hoe elk van deze bestanden samenkomt in de pipeline zo meteen.
Het Aanmaken van de Pipeline
Als je mijn GitHub repo hebt gekloond of er zelf een hebt opgezet, is het tijd om de pipeline te maken! Voer hiervoor het az pipelines create
commando uit. Het onderstaande commando maakt een pipeline genaamd ServerAutomationDemo aan met het opgegeven GitHub repo als trigger. Het zal kijken naar de master branch en de eerder gebouwde serviceverbinding gebruiken.
Afhankelijk van of je het bestand azure-pipelines.yml in je GitHub repo hebt, krijg je wel of geen feedback zoals hieronder. Hoe dan ook, je console zal er vergelijkbaar uitzien. Zorg ervoor dat je je GitHub persoonlijke toegangstoken gereed hebt!

YAML Pipeline Beoordeling
Op dit punt is je pipeline klaar om te draaien, maar het is belangrijk om eerst de YAML pipeline te begrijpen. Bekijk het azure-pipelines.yml bestand. Dit bestand is de pipeline bij het gebruik van de multi-stage YAML pipeline functie.
Laten we de verschillende componenten die deze YAML pipeline vormen eens nader bekijken.
De Trigger
Aangezien je een CI pipeline aan het bouwen bent die automatisch wordt uitgevoerd, heb je een trigger nodig. De onderstaande triggerinstructie geeft aan dat de pipeline moet worden uitgevoerd wanneer er een commit wordt gedetecteerd in de Git master branch.
Let ook op de paden
sectie. Standaard wordt de pipeline uitgevoerd wanneer een commit wordt gedaan op een bestand, tenzij specifiek bestanden of mappen zijn in- of uitgesloten in de CI-build. Omdat dit project volledig is gebouwd rond een ARM-template, wil je de pipeline niet uitvoeren als je bijvoorbeeld een aanpassing hebt gemaakt aan een Pester-test.
De Pool
Elke build heeft een agent nodig. Elke build-agent moet worden uitgevoerd op een VM. In dit geval maakt de VM gebruik van de ubuntu-latest
VM-image. Deze image is de standaardimage die werd gedefinieerd toen de build oorspronkelijk werd gemaakt. Het is niet gewijzigd vanwege de “eenvoud” van deze pipeline.
Variabelen
Hierna hebben we alle variabelen en de variabelengroep. De verschillende taken in deze pipeline vereisen het lezen van waarden zoals het Azure-abonnements-ID, tenant-ID en de toepassings-ID voor de service principal enzovoort. In plaats van statische waarden te repliceren in elke taak, worden ze gedefinieerd als variabele.
Let ook op het group
-element. Dit element verwijst naar de variabelengroep die je eerder hebt gemaakt. Zorg ervoor dat je op dit moment de waarden van subscription_id
en tenant_id
vervangt.
Herinner je je nog dat je in de sectie Het maken van de Azure-serviceprincipaal werd herinnerd om de waarde van $sp.appId
ergens op te slaan? Hier heb je die nodig. Wijs de waarde van die toepassings-ID van de service principal toe aan application_id
zoals hieronder weergegeven.
Merk de waarde op van de variabele
azure_resource_group_name
. Binnen die waarde ziet u$(Build.BuildId)
. Dit is een systeemvariabele die het build-ID van de huidige taak vertegenwoordigt. In deze context wordt het gebruikt om ervoor te zorgen dat de tijdelijke resourcegroep die wordt gemaakt uniek is.
PowerShell voorbereidingstaken
De volgende set taken roept PowerShell-code aan. Dit pijplijnvoorbeeld gebruikt PowerShell om een tijdelijke resourcegroep te maken en te verwijderen voor testdoeleinden. In deze implementatietaken ziet u twee voorbeelden van het aanroepen van PowerShell-code.
De eerste taak roept een script aan met de naam connect-azure.ps1 dat zich in de GitHub-opslagplaats bevindt. Deze taak verifieert de Azure-abonnement voor de daaropvolgende Azure PowerShell-opdrachten.
Deze Azure PowerShell-verbindingsopdracht roept het script aan en geeft een key vault-geheime waarde (ServerAutomationDemo-AppPw
) en de pijplijnvariabelen subscription_id
, application_id
en tenant_id
door.
De tweede taak voert PowerShell-code inline uit, wat betekent dat er geen script bestaat. In plaats daarvan wordt PowerShell-code gedefinieerd in het YAML-pijplijnbestand zelf met behulp van de waarde van de pijplijnvariabele azure_resource_group_name
.
Pester Template Test
Als volgende hebben we de eerste Pester-test. In een CI/CD-pijplijn zoals deze is het belangrijk om verschillende lagen van tests te hebben. Als u een pijplijn voor een softwareproject zou maken, kunt u verschillende unit tests maken.
sinds deze voorbeeld-pijplijn is opgebouwd rondom een enkele implementatie van een ARM VM, zullen de eerste “unit”-tests dienen om de geldigheid van het JSON-sjabloon te testen. In het bestand server.templates.tests.ps1 kunt u zoveel verschillende tests toevoegen aan het ARM-sjabloonbestand als u wilt.
Let op, de pijplijn gebruikt verschillende systeemvariabelen. Deze variabelen verwijzen naar de bestandslocatie van de bestanden zodra ze op de build-agent zijn beland.
De PesterRunner-taak stuurt de testresultaten naar een XML-bestand dat later in de pijplijn zal worden gelezen.
De implementatie van de ARM VM
We zijn nu aangekomen bij de implementatie van ARM. Aangezien de hele pijplijn is gebouwd rond de mogelijkheid om een VM te implementeren, is deze taak belangrijk! Deze taak implementeert het ARM-sjabloon met alle vereiste attributen die nodig zijn om dit te laten gebeuren.
Merk op de deploymentOutputs: arm_output
attribuut. In de volgende stap moet een taak verbinding maken met de zojuist geïmplementeerde VM. Een goede manier om de DNS-naam of het IP-adres van deze VM te verkrijgen, is door het via de ARM-implementatie terug te geven. De deploymentOutputs
optie maakt een pijplijnvariabele aan die kan worden geraadpleegd in andere taken.
Pester “Acceptance” Test
Zodra de VM is geïmplementeerd, moet u ervoor zorgen dat dit correct is gebeurd met een “integratie” of “acceptatie” test. Deze PesterRunner-taak roept Pester op en voert een andere reeks infrastructuur-gerelateerde tests uit om ervoor te zorgen dat de VM succesvol is geïmplementeerd.
Let op dat we de waarde van de uitvoer van de ARM-implementatie doorgeven via de parameter ArmDeploymentJsonOutput
. Het Pester-testscriptbestand heeft een gedefinieerde parameter die de waarde ontvangt en de DNS-hostnaam van de VM leest.
Hieronder zie je hoe het PowerShell-script server.infrastructure.tests.ps1 eruitziet. Merk op dat het de DNS-hostnaam van de VM leest om vervolgens een eenvoudige open poortcontrole uit te voeren.
“Acceptance” Testopruiming
De enige reden dat de pijplijn infrastructuur implementeerde, was om de geldigheid van het ARM-sjabloon te testen. Omdat deze infrastructuur slechts tijdelijk is, moet deze worden opgeruimd. In de laatste PowerShell-taak verwijdert de pijplijn de eerder aangemaakte resourcegroep en alles daarin.
Pester Testpublicatie
En tot slot zijn we aangekomen bij de laatste reeks taken. Azure Pipelines heeft een taak genaamd Publiceer testresultaten. Deze taak leest een XML-bestand op de build-agent en toont testresultaten in Azure DevOps. Dit is een handige manier om eenvoudig de resultaten van alle uitgevoerde tests te zien.

Gebruik van de Azure DevOps-pijplijn
Ten slotte, zijn we klaar om de pijplijn uit te voeren en te zien hoe het werkt. In de Azure DevOps-web-UI, zorg ervoor dat je in het project ServerAutomationDemo bent. Klik hier op Pijplijnen en dan zou je de pijplijn ServerAutomationDemo moeten zien.
Een manier om de pijplijn uit te voeren, is door te klikken op de drie puntjes aan de uiterste rechterkant, zoals hieronder weergegeven. Klik vervolgens op Pijplijn uitvoeren. Dit zal de automatiseringsmogelijkheden starten.

De pijplijn zal voortbewegen en elke taak uitvoeren zoals geïnstrueerd. Tegen het einde zou je voor elke taak die door de job is uitgevoerd, groene vinkjes moeten zien, zoals hieronder weergegeven.

Opschonen
Zodra je wat hebt geëxperimenteerd met de pijplijn en alles wat je hier hebt bereikt, moet je de zaken opruimen. Per slot van rekening was dit slechts bedoeld als een tutorial en niet als een productietaak!
Hieronder vind je enkele commando’s om alles op te ruimen wat in dit artikel is opgebouwd. Deze code verwijdert de service principal, Azure AD-toepassing, de resourcegroep en alles daarin, en het Azure DevOps-project.
Samenvatting
Deze tutorial was bedoeld om je een kijkje te geven in het bouwen van een echte Azure DevOps-infrastructuurautomatiseringspijplijn. Hoewel er ontelbare andere manieren zijn om pijpleidingen te bouwen zoals deze, zouden de vaardigheden die je in deze tutorial hebt geleerd je moeten helpen bij veel verschillende configuraties.
Nu eropuit gaan en beginnen met meer automatiseren!