Automatisering: waar is het goed voor? #
Automatisering ontstaat wanneer iemand stuit op een probleem dat diegene nooit meer handmatig wil oplossen. :-)
Stel je de taak voor om een complexe softwareapplicatie uit te rollen over een groot aantal servers. Als dit handmatig gebeurt, vereist het enorme nauwkeurigheid en uren werk, en blijft het gevoelig voor menselijke fouten. Dankzij automatisering kan de uitrol niet alleen aanzienlijk worden versneld, maar ook talloze keren met precies dezelfde nauwkeurigheid worden herhaald. Die herhaalbaarheid is een groot voordeel, vooral in omgevingen waar consistentie cruciaal is, zoals bij IT-productiesystemen.
Laten we een praktijkvoorbeeld nemen: stel dat je systeembeheerder bent en een serveromgeving met ongeveer 100 servers beheert. Elke week moet je een reeks taken uitvoeren, zoals het aanmaken van gebruikers, het patchen van systemen, het inrichten van servers, het aanmaken van nieuwe virtuele machines (VM’s), het configureren van switchpoorten en het aanpassen van configuratiebestanden.
Je zou al deze taken zelf kunnen uitvoeren, server voor server, maar dat kost veel tijd en kan overweldigend zijn… of… je kunt het automatiseren!
Automatisering werkt als een takenlijst waarop je precies aangeeft wat er moet gebeuren en in welke volgorde. Je kunt taken automatiseren op één enkele server of op honderden servers tegelijk, zoals het installeren van software-updates of het wijzigen van systeemconfiguraties. Automatisering helpt ervoor te zorgen dat alles efficiënt en consistent gebeurt, zonder dat je elke taak handmatig hoeft uit te voeren.
Op deze manier maakt automatisering het beheer en onderhoud van een groot netwerk van servers en netwerkapparatuur eenvoudiger.
Waarom automatiseren? #
- Efficiëntie: Automatisering helpt taken en processen te stroomlijnen, waardoor ze sneller en efficiënter verlopen. Dit bespaart tijd en verkleint de kans op fouten.
- Consistentie: Automatisering zorgt ervoor dat taken en processen altijd op dezelfde manier worden uitgevoerd; dit is belangrijk voor het behoud van kwaliteit en naleving van regels (compliance).
- Schaalbaarheid: Automatisering maakt het eenvoudiger om naar behoefte op- of af te schalen, wat vooral nuttig is in snel veranderende omgevingen. - Kostenbesparingen: Hoewel de initiële opzet van automatisering kosten met zich meebrengt, zijn de besparingen op de lange termijn aanzienlijk. Minder handmatige tussenkomst betekent minder tijd besteed aan routinetaken, waardoor IT-professionals zich kunnen richten op meer strategische activiteiten.
- Grotere werktevredenheid en betere focus: Door IT-professionals te ontlasten van monotone en repetitieve taken, kunnen zij zich concentreren op uitdagendere en lonendere projecten. Dit kan leiden tot een hogere werktevredenheid en een lager risico op burn-out.
- Verbeterde betrouwbaarheid: Automatisering helpt het risico op menselijke fouten te verkleinen, wat de betrouwbaarheid van systemen en processen ten goede komt.
- Toewijzing van middelen: Dankzij automatisering kunnen middelen (zoals rekenkracht of bandbreedte) optimaal en op basis van de vraag worden toegewezen, zonder menselijke tussenkomst. Deze dynamische toewijzing kan leiden tot kostenbesparingen en betere systeemprestaties.
Dus, over dat Ansible… #
Ansible is een veelgebruikte open-source tool waarmee je taken kunt automatiseren, zoals het uitrollen van software, het wijzigen van systeemconfiguraties of het beheren van systemen. Ansible wordt vaak gezien als een tool voor configuratiebeheer. Het kan diverse taken uitvoeren op doelsystemen om ervoor te zorgen dat de configuratie altijd consistent blijft. Dit noemen we policy enforcement (het afdwingen van beleid). Een ander voordeel is dat het pakketversies kan afdwingen; zo kun je er bijvoorbeeld voor zorgen dat op alle doelsystemen dezelfde versie van Apache is geïnstalleerd.
Ansible is een push-gebaseerd systeem. Dit betekent dat Ansible de verbinding initieert met je servers of switches en daarop taken uitvoert (waarvoor je Ansible-modules en -playbooks gebruikt). Het kan worden ingezet om uiteenlopende taken te automatiseren, waaronder het installeren van software, het aanpassen van configuratiebestanden en meer.
Een van de belangrijkste voordelen van Ansible is dat het eenvoudig in gebruik is en geen specifieke programmeerkennis vereist. Het maakt gebruik van een eenvoudige taal genaamd “YAML” om de taken te beschrijven die Ansible moet uitvoeren. Bovendien kun je er taken mee automatiseren op één enkele server of op honderden servers tegelijk.
Ansible wordt voornamelijk gebruikt door systeembeheerders, netwerk- en beveiligingsbeheerders en DevOps-engineers om de uitrol en het beheer van applicaties en systemen te automatiseren. Het is echter geschikt voor iedereen die taken op een of meer servers wil automatiseren.
Ansible blijft open-source, maar is ook overgenomen door Red Hat. Red Hat heeft Ansible opgenomen in zijn dienstenaanbod en biedt ondersteuning voor zakelijke klanten (enterprise-klanten).
Red Hat biedt een enterprise-versie van Ansible aan, genaamd het Ansible Automation Platform (voorheen bekend als Ansible Tower). Naast extra functionaliteiten, zoals de ansible-navigator, beschikt deze versie ook over een grafische gebruikersinterface. Hierover later meer in de cursus!
Toepassingen van Ansible #
Ansible is een krachtige tool voor het automatiseren van de configuratie en het beheer van servers en andere infrastructuur. Enkele veelvoorkomende toepassingen van Ansible zijn:
- Provisioning en configuratiebeheer: Ansible kan worden gebruikt om het opzetten en configureren van servers te automatiseren, inclusief het installeren van software en het configureren van services.
- Orchestrator: Ansible kan worden ingezet om taken op meerdere systemen tegelijk uit te voeren, in een specifieke volgorde die door een beheerder is vastgelegd. Een voorbeeld hiervan is het installeren van NGINX op een systeem, waarna de nieuwe server aan een bestaande load balancer wordt toegevoegd.
- Applicatiedeployment: Ansible kan worden gebruikt om het proces van het uitrollen (deployen) en schalen van applicaties over meerdere servers te automatiseren.
- Cloud-provisioning: Ansible kan worden gebruikt voor het provisioneren en beheren van resources op cloudplatforms zoals AWS en GCP.
- Netwerkautomatisering: Ansible kan worden gebruikt om de configuratie en het beheer van netwerkapparatuur, zoals routers en switches, te automatiseren.
- Beveiligingsautomatisering: Ansible kan worden gebruikt om beveiligingstaken te automatiseren, zoals het instellen van firewalls en het implementeren van compliance-beleid.
- Continuous Integration/Continuous Deployment (CI/CD): Ansible kan dienen als tool om het proces van het bouwen, testen en uitrollen van software te automatiseren.
Kort gezegd… schrijf het script één keer en pluk er voor altijd de vruchten van!
Ansible-architectuur #
Overzicht #

Agentless #
Een van de belangrijkste voordelen van Ansible is dat het agentless is. Dit maakt het ook eenvoudig op te zetten en te gebruiken binnen een organisatie. Ansible vereist geen speciale agents of software op de servers die het beheert.
Dit betekent dat Ansible kan worden gebruikt op een grote verscheidenheid aan tools en systemen. Naast servers kunnen ze ook worden gebruikt om acties te automatiseren op netwerkapparatuur zoals switches, routers en firewalls! Andere tools die met agents werken, zouden netwerkapparaten niet kunnen configureren, omdat er op deze systemen geen agent kan worden geïnstalleerd.
Daarentegen vereisen veel andere automatiseringstools (zoals Chef & Puppet) dat er agents worden geïnstalleerd op de servers die worden beheerd; dit kan tijdrovend en complex zijn.
Bij Ansible hoef je de software slechts op één machine te installeren – de zogenaamde “control machine” – waarna je deze kunt gebruiken om al je servers te beheren.
Een ander voordeel van het feit dat Ansible agentless (zonder agents) werkt, is dat het minder zwaar is voor de systeembronnen. Omdat er geen agents op de beheerde servers geïnstalleerd hoeven te worden, verbruikt het geen extra resources zoals CPU en geheugen. Dit kan vooral belangrijk zijn in omgevingen waar de beschikbare middelen beperkt zijn.
Al met al maakt het agentless-karakter van Ansible het tot een eenvoudige, lichtgewicht en effectieve tool voor het automatiseren van taken in uiteenlopende omgevingen.
Ansible in het kort: #
- Taal & ontwerp: Ansible-playbooks worden geschreven in YAML, een voor mensen leesbare standaard voor dataserialisatie. Hierdoor is het voor mensen zonder programmeerervaring eenvoudiger om Ansible-configuraties te begrijpen en te schrijven.
- Zonder agent (agentless): Ansible vereist geen agent op de beheerde nodes. Voor de communicatie wordt doorgaans SSH (of WinRM voor Windows-hosts) gebruikt; er is dus geen extra software nodig op de nodes die worden beheerd.
- Push-gebaseerd: Ansible maakt gebruik van een push-mechanisme, waarbij de control-machine de configuratie naar de nodes pusht.
- Statusbeheer: Ansible kan worden gebruikt voor zowel configuratiebeheer (om de gewenste systeemstatus te behouden) als voor het uitvoeren van ad-hoc taken. Meer hierover bij ‘idempotentie’!
Idempotentie #
Wanneer we zeggen dat Ansible idempotent is, betekent dit dat je hetzelfde playbook of dezelfde taak meerdere keren op hetzelfde systeem kunt uitvoeren. Na de eerste succesvolle uitvoering zullen volgende uitvoeringen geen wijzigingen meer aanbrengen, tenzij er iets aan het systeem is veranderd ten opzichte van de gewenste status. Ansible zorgt ervoor dat het systeem in de opgegeven status blijft, zonder acties onnodig te herhalen.
Waarom is idempotentie belangrijk? #
- Consistentie: Zorgt voor consistente configuraties, zelfs als playbooks meerdere keren worden uitgevoerd.
- Efficiëntie: Voorkomt overbodige handelingen. Als een taak een systeem al in de gewenste status heeft gebracht, is het niet nodig om die taak opnieuw uit te voeren.
- Veiligheid: Vermindert het risico op onbedoelde bijwerkingen die kunnen ontstaan bij het herhaaldelijk uitvoeren van commando’s.
- Voorspelbaarheid: Systeembeheerders en ontwikkelaars kunnen erop vertrouwen dat het uitvoeren van een playbook geen onverwachte gevolgen heeft als het systeem zich al in de gewenste status bevindt.
Voorbeelden #
- Bestand aanmaken: Als je in Ansible een taak hebt die ervoor zorgt dat een bestand bestaat, zal Ansible dat bestand de eerste keer dat de taak wordt uitgevoerd mogelijk aanmaken. Bij volgende uitvoeringen zal Ansible echter herkennen dat het bestand al bestaat en niet proberen het opnieuw aan te maken, tenzij bepaalde kenmerken van het bestand (zoals rechten of inhoud) afwijken van de gewenste status.
- Pakketinstallatie: Als je een taak hebt om een softwarepakket te installeren, zal Ansible het pakket de eerste keer dat je de taak uitvoert, installeren. Bij volgende uitvoeringen ziet Ansible dat het pakket al is geïnstalleerd en slaat het de installatiestap over, tenzij de versie moet worden gewijzigd of het pakket moet worden verwijderd.
Ansible-Core installeren #
In deze cursus richten we ons op het installeren van Ansible op Linux. Het is echter ook mogelijk om Ansible op Windows Server te installeren! Voor deze cursus gebruiken we RHEL (Red Hat Enterprise Linux) versie 9. Dit werkt ook op CentOS (de gratis open-source community-editie). Ik heb ook de installatiecommando’s voor op Debian gebaseerde systemen, zoals Ubuntu, opgenomen.
Met de volgende commando’s (open hier de vervolgkeuzelijst) installeer je Ansible-Core. Zoals we in een eerder hoofdstuk hebben gezien, is Ansible-Core de CLI-versie. De open-source (en gratis) versie van Ansible is hieromheen gebouwd. We richten ons op het CLI-gedeelte van Ansible, maar we leren ook hoe we gebruikersinterfaces (UI’s) voor Ansible kunnen installeren. #### Installatie-instructies
Op RHEL gebaseerd (8 en hoger)
sudo dnf install ansible-coreTest en controleer of Ansible werkt
ansible localhost -m pingOp Debian gebaseerd
sudo apt update
sudo apt install software-properties-common
sudo add-apt-repository --yes --update ppa:ansible/ansible
sudo apt install ansibleTest en controleer of Ansible werkt
ansible localhost -m pingAuthenticatie via SSH-sleutelparen #
Nu we ons verdiepen in de wereld van automatisering – met name op het gebied van serverbeheer en orkestratie – is het belangrijk om inzicht te krijgen in de verschillende methoden waarmee we veilig toegang kunnen krijgen tot en controle kunnen uitoefenen over onze externe machines. Een van de fundamentele onderdelen van veilig beheer op afstand is het gebruik van SSH-sleutelparen.
Terugblik: wat is SSH? #
SSH, wat staat voor Secure Shell, is een cryptografisch netwerkprotocol dat veilig inloggen en het uitvoeren van opdrachten op een externe machine mogelijk maakt. Velen van jullie zijn wellicht al bekend met het gebruik van SSH om toegang te krijgen tot externe servers met behulp van een gebruikersnaam en wachtwoord. Er bestaat echter een veiligere en efficiëntere methode: authenticatie via sleutelparen.
Begrip van sleutelparen #
Sleutelparen bestaan uit twee delen:
- Privésleutel (Private Key): Dit is de sleutel die je geheimhoudt; deze wordt vaak veilig opgeslagen op je computer of in een beveiligde opslaglocatie. Zie het als een digitale handtekening.
- Publieke sleutel (Public Key): Zoals de naam al doet vermoeden, kan deze sleutel met de buitenwereld worden gedeeld. Deze wordt doorgaans aan externe servers toegevoegd om toegang te verlenen aan iedereen die over de bijbehorende privésleutel beschikt.
Wanneer je verbinding probeert te maken met een server, gebruikt je SSH-client de privésleutel om een digitale handtekening te genereren. De server verifieert deze
Praktijktoepassing: Ansible #
Ansible is een van de toonaangevende automatiseringstools in de IT-wereld. Het kan systemen configureren, software uitrollen en complexere IT-taken orkestreren. Ansible gebruikt SSH om verbinding te maken met en commando’s uit te voeren op externe servers. Door authenticatie via een sleutelpaar (keypair) in te stellen, geef je Ansible naadloze toegang om servers efficiënt en veilig te beheren.
Een sleutelpaar genereren en gebruiken #
Voer op je lokale machine (of de machine die als Ansible-control node fungeert) het volgende commando uit:
ssh-keygen -t rsa -b 4096Hiermee wordt een sleutelpaar gegenereerd en opgeslagen in de homedirectory van de gebruiker, in de verborgen map .ssh. Standaard worden de volgende sleutels aangemaakt:
~/.ssh/id_rsa # Dit is de privésleutel; deze blijft te allen tijde op het apparaat staan
~/.ssh/id_rsa.pub # Dit is de publieke sleutel; dit deel wordt naar externe servers gekopieerdDe publieke sleutel verspreiden #
Om Ansible verbinding te laten maken met externe hosts, moet je de gegenereerde publieke sleutel (id_rsa.pub) toevoegen aan het bestand ~/.ssh/authorized_keys op elke doelhost.
Je kunt het bestand handmatig bewerken en je publieke sleutel op een nieuwe regel in het bestand plakken.
nano ~/.ssh/authorized_keysAls je al een host hebt die toegang heeft tot de externe doelhost, kun je een nieuwe sleutel kopiëren met het volgende commando:
ssh-copy-id -i ~/.ssh/id_rsa.pub user@target_host
voorbeeld:
ssh-copy-id -i ~/.ssh/id_rsa.pub davy.cavens@5.75.2.6Hiermee wordt de sleutel ‘id_rsa.pub’ gekopieerd naar de externe doelhost 5.75.2.6. ### Belangrijke aandachtspunten
- Bescherm altijd uw privésleutel. Deel of verspreid deze niet.
- Maak regelmatig back-ups van uw privésleutel, maar zorg ervoor dat deze veilig worden opgeslagen.
- Overweeg periodiek om uw sleutels te roteren om veiligheidsredenen.
- Bij gebruik van cloudservices bieden veel aanbieders manieren om automatisch publieke SSH-sleutels in nieuwe instances of VM’s te injecteren, wat de distributiestap vereenvoudigt (of gebruik Terraform, zoals we later in deze cursus zullen zien!).
- Als best practice dient u de rechten van de privésleutel te beperken met het commando chmod 600 ~/.ssh_id.rsa
Alternatieven voor Ansible #
Er zijn ook andere tools die vergelijkbare taken uitvoeren, al maken de meeste daarvan gebruik van agents die op de eindpunten moeten worden geïnstalleerd.
Puppet #
Puppet is een open-source tool voor configuratiebeheer die de provisioning en het beheer van infrastructuur automatiseert. Puppet is ontwikkeld in Ruby en stelt beheerders in staat om de gewenste status van hun infrastructuur te definiëren met behulp van een declaratieve taal. Zodra deze gewenste status is vastgelegd, zorgt Puppet ervoor dat de infrastructuur hieraan voldoet en corrigeert het eventuele afwijkingen. Een grote kracht van Puppet is het volwassen ecosysteem, met een schat aan vooraf gedefinieerde modules die beschikbaar zijn in de Puppet Forge. Organisaties gebruiken Puppet om consistentie te waarborgen, beveiligingsbeleid af te dwingen en de provisioning van nieuwe servers en applicaties te versnellen.
Samenvattend:
- Taal & ontwerp: Puppet-configuraties worden geschreven in een declaratieve, domeinspecifieke taal. Hiermee kunnen gebruikers aangeven ‘wat’ ze willen bereiken, zonder noodzakelijkerwijs in detail te treden over ‘hoe’ dit moet gebeuren.
- Agent-gebaseerd: Puppet vereist doorgaans een agent op elke beheerde node. Deze agent meldt zich periodiek bij de master voor configuratie-updates.
- Pull-gebaseerd: Puppet werkt meestal volgens een pull-model, waarbij de agents configuraties ophalen van de masterserver.
- Volwassen ecosysteem: Puppet Forge biedt een uitgebreide verzameling vooraf gedefinieerde modules.
Chef #
Chef is een andere krachtige open-source automatiseringstool die infrastructuur beheert als code (Infrastructure as Code). In tegenstelling tot de declaratieve aanpak van Puppet hanteert Chef een procedurele stijl, waarbij beheerders ‘recipes’ (recepten) in Ruby schrijven om te specificeren hoe een bepaald onderdeel van de infrastructuur moet worden geconfigureerd. Deze recepten worden vervolgens gebundeld in ‘cookbooks’ (kookboeken) om de gewenste configuratie tot in detail te beschrijven. Chef blinkt uit in flexibiliteit, wat verregaande aanpassingen en nauwkeurige controle over systemen mogelijk maakt. De ‘knife’-commandlinetool en Chef Supermarket – waar door de community bijgedragen kookboeken te vinden zijn – vormen belangrijke onderdelen van het Chef-ecosysteem.
Een kort overzicht:
- Taal & ontwerp: Chef gebruikt Ruby voor het schrijven van configuraties, specifiek in een procedurele stijl. Beheerders beschrijven via ‘recipes’ precies ‘hoe’ het systeem de gewenste status moet bereiken.
- Agent-gebaseerd: Chef vereist een agent, de zogenaamde Chef-client, op elke beheerde node.
- Pull-gebaseerd: Net als Puppet werkt Chef voornamelijk volgens een pull-model, waarbij de Chef-client de nieuwste ‘cookbooks’ van de Chef-server ophaalt.
- Flexibele aanpasbaarheid: De procedurele stijl biedt nauwkeurige controle over de systeemconfiguratie, wat ideaal is voor gebruikers met programmeerkennis.