Ansible: Configureren zonder nieuwe dingen te leren
In het kader van de HAN-minor DevOps onderzoek ik de automatiseringstool Ansible. Dit is geen onderwerp tijdens de lessen van de coursefase niet, maar past wel binnen de onderwerpen *Orchestration* en *Continuous Delivery*. Het doel van dit onderzoek is om kennis op te doen over de technologie en om deze technologie toe te kunnen passen binnen een kleinschalig DevOps project. Binnen de Pitstop applicatie kan Ansible worden toegepast om verschillende nodes te deployen en hier de juiste packages voor te installeren.
Dit blog legt eerst uit wat Ansible is en welke problemen het voor je kan oplossen, hierna volgt een hands-on onderdeel met opzet van een Nginx webserver vanuit een Docker container gedeployed naar localhost. Tenslotte een vergelijking van Ansible met andere tools en verschillende redenen gegeven om voor Ansible te kiezen.
Wat is Ansible?
Ansible (RedHat, z.d.) is een automatiseringsplatform dat is opgericht in 2012. Het is oorspronkelijk ontwikkeld door Michael deHaan maar inmiddels is het een gratis open-source tool die beheerd wordt door de Ansible community en wordt het gesponsord door RedHat. Het is hoofdzakelijk geschreven in Python en draait op alle Unix gebaseerde systemen (Linux, MacOs, enz.) en Windows (Wikipedia, 2021).
Ansible is in tegenstelling tot andere configuratiemanagement tools agentless. In plaats hiervan maak je verbinding met de verschillende nodes door middel van een SSH key. Verder maakt Ansible gebruik van YAML bestanden met een taal dat sterk lijkt op Engels (Hummel, 2019) (Higbee, 2020).
Waar kan Ansible bij helpen?
Ansible kan helpen bij het opzetten en beheren van meerdere services door middel van één configuratie. Hierdoor hoeft bij het schalen van services niemand handmatig de server in te richten, maar doet Ansible dit voor je (Orchestration). Door deze aanpak kan een service binnen enkele seconden gebouwd worden.
Verder kan het helpen bij het configureren van de verschillende services. Dit gebeurd op basis van het ‘push’ principe. De main server, vaak een lokale computer, pusht updates van de configuratie naar de follower servers (Configuration management).
Hiernaast kan Ansible je helpen bij het automatiseren van deployments op verschillende omgevingen (Automatic deployment). Hierdoor ontstaat een kortere ‘time to market’ (Hummel, 2019) (simplilearn, 2019) (Higbee, 2020).
Waarom is Ansible een echte DevOps tool?
Ansible is een automatiseringstool die het mogelijk maakt om aan het principe Infrastructure as Code (IaC) te voldoen. IaC is het proces van het beheren en inrichten van computerdatacenters via machineleesbare definitiebestanden, in plaats van fysieke hardware configuratie of interactieve configuratietools. IaC is een best practices in DevOps, het betrekt ontwikkelaars meer bij het definiëren van configuratie en Ops-medewerkers eerder tijdens het ontwikkelingsproces. Automatisering in het algemeen heeft tot doel het verwarrings- en foutgevoelige aspect van handmatige processen weg te nemen en efficiënter en productiever te maken. Dit is ook wat Ansible doet door configuratiefiles te maken. Hierdoor kunnen betere software en applicaties worden gemaakt met flexibiliteit en minder downtime (Ahmed, 2020).
De Ansible configuratiemanager structuur
De configuratiemanager van Ansible heeft een duidelijke en eenvoudige structuur zoals is weergegeven in Afbeelding 1.
Afbeelding 1: Ansible configuratiestructuur
In Afbeelding 1 is te zien dat er één management node is, dit kan gewoon een lokale laptop zijn. Op deze node wordt Ansible geïnstalleerd. Daarnaast worden op deze node een host file en één of meerdere playbooks aangemaakt. Een playbook is de configuratie file voor de services. Binnen deze file worden de taken omschreven die uitgevoerd moeten worden. De Main node maakt vervolgens een connectie naar het IP adres van de follower nodes via een SSH verbinding, de IP adressen van de follower nodes staat beschreven in de host file. De follower nodes hebben hierdoor geen enkele kennis van Ansible en het playbook nodig (Dittrich, z.d.).
Het configureren van twee nodes door middel van Ansible
Zoals eerder besproken, is het mogelijk om de configuratie van alle aangesloten nodes te regelen. In dit hoofdstuk wordt een demo uitgevoerd om een Nginx webserver op te zetten en te deployen op localhost:8080 vanuit een docker container. In deze demo wordt gebruik gemaakt van twee ubuntu:20.04.3 LTS versie nodes (VM). Een van deze virtual machines is als management node (Main) aangewezen en de andere VM is de Follower node.
Het installeren van Ansible
Door middel van een aantal commando's kan Ansible worden geinstalleerd op de Main node. Eerst update je de packagemanager door middel van het commando sudo apt-get update
. Nu kun je Ansible installeren sudo apt install ansible -y
. Om te controleren of Ansible juist geïnstalleerd is kan je het commando ansible –version
uitvoere. Wanneer de response vergelijkbaar is met Afbeelding 2, is Ansible correct geïnstalleerd (Higbee, 2020).
Afbeelding 2: Ansible installed response
Het configureren van Ansible en SSH
Om Ansible te configureren en naar het juiste IP adres van de Follower te laten verwijzen, dien je eerst het IP adres van de Follower op te vragen. Dit kun je doen door het commando ifconfig
uit te voeren op de Follower node. In de onderstaande afbeelding is het IP adres van de service zichtbaar die je later gebruikt in de host file van de Main node.
Afbeelding 3: ifconfig response
Hiernaast dien je een SSH key aan te maken, dit werkt op iedere distributie van Linux anders, voor ubuntu kun je de volgende commando’s uitvoeren op de Follower node
sudo apt-get update
sudo apt-get install openssh-server
sudo systemctl status ssh
sudo ufw allow ssh
ssh username@ip_address
voer ‘yes’ in
voer een wachtwoord in
Hierna dien je te wisselen naar de Main node. Wanneer de wens is dat de configuratie ook op de Main node wordt uitgevoerd, kunn je de bovenstaande stappen ook hierop uitvoeren. Hierna kun je de Ansible host file aanpassen om een connectie te maken met de Follower nodes. Dit kan door sudo nano /etc/ansible/hosts
uit te voeren. In deze file moeten de volgende regels toegevoegd worden. (Linuxize, 2019)
Afbeelding 4: Ansible host file
Het aanmaken van een playbook in Ansible
Het aanmaken van een Ansible playbook kan met elke tekst editor, de structuur van het bestand is makkelijk te begrijpen en de taal lijkt op Engels. Het aanmaken van een playbook.yml gaat door middel van het commando sudo nano playbook.yml
hierna kun je het playbook.yml bestand vullen met een aantal taken die chronologisch worden uitgevoerd. Voor het pullen en deployen van de nginx docker container ziet het playbook.yml er zo uit:
---
- name: docker_install_nginx
hosts: ansible_clients
become: true
tasks:
- name: Install aptitude using apt
apt: name=aptitude state=latest update_cache=yes force_apt_get=yes
- name: Install required system packages
apt: name=docker state=latest update_cache=yes
loop: [ 'apt-transport-https', 'ca-certificates', 'curl', 'software-properties-common', 'python3-pip', 'virtualenv', 'python3-setuptools']
- name: Add Docker GPG apt Key
apt_key:
url: https://download.docker.com/linux/ubuntu/gpg
state: present
- name: Add Docker Repository
apt_repository:
repo: deb https://download.docker.com/linux/ubuntu bionic stable
state: present
- name: Update apt and install docker-ce
apt: update_cache=yes name=docker-ce state=latest
- name: Install Python pip
apt: name=pip update_cache=true state=present force_apt_get=yes
with_items:
- python-pip
- python3-pip
become: true
- name: Install Docker Module for Python
pip:
name: docker
- name: Pull nginx Docker image
docker_image:
name: "nginx"
source: pull
- name: Create default containers
docker_container:
name: "nginx_container"
image: "nginx"
state: started
recreate: yes
published_ports:
- "8080:80"
Elke playbook file moet beginnen met ---
hierna volgt de host informatie (deze is gelijk aan de groep name uit de host file). Hierna volgt het keyword tasks met daaronder alle taken die beginnen met een -
. Eerst worden een aantal packages geïnstalleerd die nodig zijn om Docker te installeren. Vervolgens wordt Docker zelf geïnstalleerd en wordt de Nginx image opgehaald. Tenslotte wordt een container gestart op poort 8080. Let op dat voor iedere OS of distributie de commando’s om te installeren anders kunnen zijn. Verder dien je tekst te laten inspringen in de playbook file. (Kataria, z.d.) (simplilearn, 2019)
Het uitvoeren van een playbook in Ansible
Het uitvoeren van een playbook in Ansible gaat door middel van het commando ansible-playbook playbook.yml -kK
. Na het uitvoeren van het commando is een soort gelijk scherm te zien als in Afbeelding 5. (simplilearn, 2019)
Afbeelding 5: Ansible run playbook response
Vervolgens kan je een browser openen op de Follower node en http://localhost:8080
bezoeken. Daar zie je dan de startpagina van nginx:
Afbeelding 6: Nginx running op localhost:8080
Waarom kiezen voor Ansible?
Een van de grootste voordelen aan Ansible vergeleken met andere configuratiemanagement tools is dat Ansible agentless is. Dat wil zeggen dat je op de follower nodes geen agent hoeft te installeren. Hier zitten twee voordelen aan:
- Er blijft meer ruimte en kracht over op de follower node, hier draait immers geen agent die deze ruimte opvult
- De follower nodes hebben geen enkele kennis van Ansible en kun je direct vervangen zonder ze verder in te stellen
Een ander voordeel is dat playbooks gemakkelijk te lezen en schrijven zijn. Dit komt omdat ze geschreven worden in bijna natuurlijk Engels. Andere tools gebruiken hiervoor vaak programmeertalen wat het ingewikkelder maakt.
Ook is Ansible open-source, heeft het een grote community en het wordt gesponsord door RedHat. Hierdoor is er veel onderhoud en zijn er veel nieuwe features.
In vergelijking met andere tools is Ansible declaratief en niet procedureel. Dit betekent dat de beschrijving de eindtoestand van de machine bevat en dat Ansible alle nodige stappen onderneemt om aan die beschrijving te voldoen. Door op deze manier te werken, kunnen playbooks meerdere keren worden toegepast zonder dat dit bijwerkingen oplevert (Delgehier, 2020).
Een laatste voordeel is dat Ansible ook beschikt over een user interface, namelijk Ansible Tower. Ansible Tower is de extra ‘laag’ bovenop Ansible die complexe IT-infrastructuren inzichtelijk en beheersbaar maakt. De voordelen van Ansible Tower zijn:
- Ultieme controle over uw IT infra met een helder, visueel dashboard
- Role-based access control
- Taakverdeling
- Gecentraliseerde logging
- Ingebouwde notificaties
- Mogelijkheid om Tower overal te integreren met behulp van de API
Een groot nadeel aan Ansible Tower is dat het niet gratis is en dat het flink in de kosten kan lopen (Proxy, 2020).
Is Ansible de onmisbare DevOps tool?
Kortom, Ansible is de onmisbare configuratiemanagement tool. Een configuratiemanagement tool is binnen de wereld van DevOps van ultiem belang en Ansible biedt flink wat voordelen tegenover traditionele configuratiemanagement tools. Een aantal van die voordelen zijn:
- Agentless.
- Playbooks in natuurlijk Engels.
- Playbooks zijn declaratief en kunnen meerdere keren worden toegepast zonder bijwerkingen.
- Open-source en gesponsord door RedHat.
Zoals in de demo zichtbaar, is het super eenvoudig om meerdere servers te configureren en hier op te bouwen, installeren of deployen, zonder kennis te hebben van al deze commando’s. Verder maakt Ansible gebruik van het ‘push’ principe met een connectie via SSH waardoor de follower nodes geen kennis hoeven te hebben van Ansible.
Bronnen
- RedHat. (z.d.). Ansible is Simple IT Automation. Ansible. Geraadpleegd op 6 oktober 2021 van https://www.ansible.com/
- Wikipedia. (2021, 3 oktober). Ansible. Geraadpleegd op 6 oktober 2021 van https://en.wikipedia.org/wiki/Ansible_(software)
- Hummel, G. (2019, 18 september). What is Ansible? Cloud Academy. Geraadpleegd op 6 oktober 2021 van https://cloudacademy.com/blog/what-is-ansible/
- simplilearn. (2019, 27 november). Ansible Full Course | Ansible Tutorial For Beginners | Learn Ansible Step By Step | Simplilearn [Video]. YouTube. Geraadpleegd op 6 oktober 2021 van https://www.youtube.com/watch?v=EcnqJbxBcM0
- Ahmed, R. (2020, 16 september). What Is Ansible? – Configuration Management And Automation With Ansible. Edureka. Geraadpleegd op 6 oktober 2021 van https://www.edureka.co/blog/what-is-ansible/#ansible_in_devops
- Kataria, J. A. A. (z.d.). Managing Docker containers using Ansible. Axelerant. Geraadpleegd op 7 oktober 2021 van https://www.axelerant.com/blog/managing-docker-containers-using-ansible
- Linuxize. (2019, 2 augustus). How to Enable SSH on Ubuntu 18.04. Geraadpleegd op 7 oktober 2021 van https://linuxize.com/post/how-to-enable-ssh-on-ubuntu-18-04/
- Higbee, W. (2020, 13 januari). Getting Started with Ansible [Video]. Pluralsight. Geraadpleegd op 6 oktober 2021 van https://www.pluralsight.com/courses/getting-started-ansible
- Dittrich, D. (z.d.). 2. Ansible and Configuration Management — D2 Ansible playbooks. Davedittrich. Geraadpleegd op 7 oktober 2021 van https://davedittrich.readthedocs.io/projects/ansible-dims-playbooks/en/latest/ansible.html
- Delgehier, C. (2020, 24 april). Why and How We Use Ansible. OpenIO Object Storage. Geraadpleegd op 7 oktober 2021 van https://www.openio.io/blog/why-and-how-we-use-ansible
- Proxy. (2020, 30 juni). Ansible Tower - Geavanceerde IT Automation Proxy Services. Geraadpleegd op 7 oktober 2021 van https://www.proxy.nl/ansible-tower/