Blog

Så etablerar du Jenkins Windows-byggagenter med Packer och Terraform

DEC 21, 2017

En metod för oföränderlig infrastruktur

Sami Alajrami

Sami is a DevOps consultant in our Oslo office. He comes from Palestine and has a PhD in Computing Science from Newcastle University. Sami’s previous work focused on cloud-based software development, model-based engineering, and safety-critical systems. He’s also an INTJ.

Immutable infrastructure as code minskar inkonsekvenser och gör driftsättningar snabbare och enklare. Vi kan etablera immutable infrastructure med Packer och Terraform. Låt oss använda dem för att etablera Jenkins-byggagenter för Windows.

I ett tidigare inlägg gick vi igenom hur du driftsätter Jenkins i ett Kubernetes-kluster med Helm och ansluter Windows-byggagenter till det. Eftersom stödet för Windows i k8s fortfarande är omoget placerade vi Windows-byggagenterna i en separat VPC. Att manuellt etablera och starta dessa agenter är dock långt ifrån optimalt i en tid av Continuous Delivery och DevOps. I det här inlägget går vi igenom hur du kan automatisera etableringen av Windows-byggagenter med Packer och Terraform på AWS.

While we use AWS -in this post- as an IaaS provider, both Packer and Terraform support multiple other cloud providers.

Immutable infrastructure

Det går att etablera Windows-byggagenter med verktyg för konfigurationshantering, till exempel Chef eller Puppet. Verktyg för konfigurationshantering skapar en föränderlig infrastruktur där dina servrar med tiden kan hamna ur synk med varandra. Detta kallas Configuration Drift. Packer och Terraform, bland andra verktyg, gör det möjligt att skapa immutable infrastructure. Med Packer kan du skapa en förberedd image med all programvara du behöver. Därefter kan du etablera alla dina molnresurser från dessa images med Terraform. När det är dags för en uppdatering tillämpar du den på dina images och etablerar nya molnresurser. De gamla resurserna tas bort.

You might want to keep your old resources a little longer while you make sure the new -updated- resources are behaving as intended.

Du kan läsa mer om varför du inte bör använda konfigurationshantering här.

Please note that there are cases where configuration management tools are still needed. For example, to install your OS of choice on bare-metal infrastructure.

Med Packer och Terraform

Med Packer kan vi skapa en Windows VM-image som innehåller alla beroenden som krävs för att köra byggagenten. Terraform gör det samtidigt möjligt att starta och hantera instanser på AWS från en Amazon Machine Image (AMI) som skapats med Packer.

Packer används för att generera maskinimages från kodmallar. Mallarna definierar hur imagen ska byggas med builders, som är specifika för målmiljön, till exempel AWS eller VirtualBox, och provisioners som används för att installera programvara och utföra den konfiguration som krävs i imagen. Vi använder en Packer-mall som startar en EC2-instans med den senaste versionen av Windows Server 2016 i AWS och installerar Docker och Java. Den laddar även ner Jenkins slave.jar från Jenkins-mastern och skapar ett skript som startar agenten och ansluter den till mastern. När etableringen är klar registrerar Packer den nya AMI:n i ditt AWS-konto och rensar upp de resurser som har använts.

By installing Docker into the AMI, Jenkins jobs can be executed in containers. This means creating a custom build environment for specific jobs is as simple as creating a Dockerfile and building a Docker image from it.

Terraform är ett infrastructure-as-code-verktyg som används för att bygga, utveckla och versionshantera infrastruktur hos molnleverantörer. Terraform använder versionshanterade kodmallar som gör det möjligt att dela och återanvända infrastrukturen. Med några Terraform-mallar skapar vi en VPC i AWS, startar ett antal Windows-instanser och startar byggagenterna på dem.

provision Jenkins Windows build slaves using Packer and Terraform

Särskilt för Windows vid användning av Packer och Terraform

När vi använder Packer för att skapa Windows-images i stället för Linux-images är den viktigaste skillnaden att kommunikationen med Windows-instansen under konfigurationen sker via WinRM (Windows Remote Management).

Till skillnad från SSH på Linux måste WinRM konfigureras på Windows-instansen innan Packer kan ansluta till den och etablera programvara. Detta görs via user data. När Packer startar en ny instans på AWS för att bygga AMI:n kan det skicka ett user data-skript till AWS, som sedan kör skriptet på instansen medan den startar. Skriptet ec2-userdata.ps1 innehåller WinRM-konfigurationen för att öppna nödvändiga portar och lägga till listeners. Mer information om konfigurationen finns här.

If you face problems with WinRM, and want to check that it is running, have a look at this page for some useful commands.

Administratörslösenord för Windows och user data-skript

Packer skapar AMI:n genom att starta en instans och utföra all nödvändig etablering på den innan den sparas som en image. När en Windows-instans startas för första gången på AWS initieras den med EC2Launch, eller EC2Config för Windows-versioner äldre än Windows Server 2016. Initialiseringen omfattar att skapa ett slumpmässigt administratörslösenord och köra angivna user data-skript. Initialiseringen registreras som en tjänst som körs vid uppstart, och när den är klar avregistreras tjänsten. Det innebär att senare uppstarter av instansen inte skapar nya administratörslösenord eller kör user data-skript.

När du skapar en instans från den Packer-genererade AMI:n ärver den administratörslösenordet från instansen som användes för att skapa AMI:n. Den kör inte heller någon ny user data eftersom initialiseringen, som vi just gått igenom, har avregistrerats. Vad gör du om du vill köra user data-skript på instanserna som du startar från den Packer-genererade AMI:n?

Du måste konfigurera instansen som används för att skapa AMI:n, under Packer-etableringen, så att nästa uppstart behandlas som en ny start. Det innebär att ett nytt slumpmässigt lösenord tilldelas och att nya user data-skript körs. I Windows Server 2016 görs detta med EC2Launch och äldre Windows-versioner konfigureras med EC2Config.

The EC2Launch scripts triggering the instance initialization can be found (on the Windows instance) in C:\ProgramData\Amazon\EC2

Windows\Launch\Scripts\

Du kan konfigurera den Packer-genererade AMI:n så att initialiseringsskripten körs vid nästa uppstart genom att köra följande kommando på Windows-instansen (under Packer-etableringen):

./C:ProgramDataAmazonEC2-WindowsLaunchScriptsInitializeInstance.ps1 -Schedule

Underhåll

Nu har vi en immutable infrastructure som hanteras av Terraform. Vill du uppgradera Java-versionen som används på Windows-instanserna? Uppdatera bara din Packer-mall, bygg en ny AMI och kör sedan Terraform-kommandot ”apply”. Klart! Dina uppgraderade byggagenter är igång inom några minuter.

Vill du ha en anpassad miljö för specifika byggjobb? Bygg en Docker-image med en Dockerfile i din Packer-mall och generera en AMI innan du uppdaterar infrastrukturen med Terraform. Då kan dina byggagenter köra containrar för att tillhandahålla precis den anpassade miljö du behöver. Enkelt!

All kod finns tillgänglig på Github.

  • Cloud
  • CI/CD

Subscribe to our newsletter