Jenkins start ansible-playbook

Ansible is erg handig om een wijziging door te voeren of om een ‘desired-state’ te bewaken/terug te zetten. Nog handiger is het om een ansible playbook automatisch te starten zodra er een wijziging is doorgevoerd op de GitLab server. Jenkins kan daar mee helpen!

Nodes voorbereiding

Jobs die uitgevoerd worden door Jenkins ‘draaien’ als gebruiker ‘jenkins‘ en de SSH key van deze gebruiker moet dan ook op de nodes terecht komen die aangestuurd worden met het ansible playbook. Deze nodes zijn terug te vinden in de ‘inventory‘ file van het ansible project.

Verder is het belangrijk om een ansible-user te gebruiken die geen wachtwoord hoeft in te vullen voor sudo-commando’s. Hiervoor is het noodzakelijk om de volgende regel op te nemen in /etc/sudoers op de hosts die aangepast worden met ansible:

gebruikernaam ALL=(ALL) NOPASSWD:ALL

Jenkins server voorbereiding

Ansible moet geïnstalleerd zijn op de Jenkins-server vóórdat het script door Jenkins wordt gestart. Raadpleeg eventueel de ‘ansible pagina’s‘ voor het installeren van Ansible.

Om de ssh-key aan te maken voor gebruiker ‘jenkins’ op de Jenkins server, log in als root op de Jenkins server en geef het volgende commando om gebruiker jenkins te worden:

su -s /bin/bash jenkins

Hierna kunnen we een ssh-key aanmaken met het volgende commando:

ssh-keygen -t rsa

Accepteer het standaard pad voor de bestanden en sla (eventueel) het wachtwoord over door een enter te geven.

De public key staat nu in /var/lib/jenkins/.ssh/id_rsa.pub en deze moet op de nodes in authorized_keys komen. Dit kun je natuurlijk ook met een Ansible script doen. Ik heb het in mijn project opgenomen en sla deze stap over in de Jenkins job met de parameter –skip-tags=ssh

Jenkins job

Klik op ‘create new jobs’
Kies voor een ‘Freestyle project’

In ‘General’ zie je de GitLab server connectie al ingevuld staan, we gaan naar ‘Source Code Management‘. Hier komt de URL voor het GitLab project met de credentials hiervoor. Dit kan een username/wachtwoord zijn maar beter is om een SSH-keypair te gebruiken. Deze moet dan op je account bij de GitLab server ingesteld zijn. Zorg voor het type ‘Git‘ en vul de gegevens in voor de repository. Kies de gewenste branch die je ‘bewaakt’:

Wat we nu willen is dat Jenkins periodiek gaat controleren of er een nieuwe commit is gepushed op de GitLab repository en de branch die je hebt ingevuld. Daar is dus het gedeelte ‘Build triggers‘ voor.

Kies voor ‘Poll SCM’

Je kunt op het vraagteken-icon klikken voor een uitleg over de ‘schedule‘ die je hier kunt invullen. Ik wil nu elke 5 minuten controleren en dat wordt dan ‘H/5 * * * *

Onder het gedeelte ‘Build‘ komen nu de instructies om het Ansible playbook uit te voeren. Kies voor het type ‘Execute shell‘ en vul de commando’s in:

Als het project wordt geselecteerd verschijnt het volgende menu aan de linker bovenkant:

Door voor ‘Build Now‘ te kiezen wordt de job uitgevoerd en deze verschijnt op het scherm met het build-nummer in de ‘Build History‘.

Door nu op het build nummer te klikken verschijnt een ander menu waaruit we bijvoorbeeld de optie ‘Console Output‘ kunnen kiezen om te zien wat er gebeurt is.

Console Output van mijn MusicPlayers Ansible project

De optie ‘Git Polling Log‘ in het Project-menu, laat zien of Jenkins getriggered is om een nieuwe build te maken.

Als er nu een commit gepushed wordt naar de GitLab server zal dit de trigger activeren om een nieuwe build te maken. Een voorbeeld van mijn ‘MusicPlayers project’:

Geen commit in de laatste 5 minuten
Changes gevonden, nieuwe build wordt gemaakt!

That’s all folks!