Een bredere kijk op Ansible

1. Werken met playbooks, plays en tasks

Ansible playbooks zijn kort samengevat voorgeschreven code in een bestand. Vaak zijn dit .yml of .ini bestanden. Playbooks zorgen er voor dat bepaalde taken of code niet steeds opnieuw moeten geschreven worden om herhalende taken uit te voeren op één of meerdere machines. Het schrijven van YAML bestanden gebeurt met indentatie net zoals de programmeer taal python, meer over de YAML syntax kan je hier terug vinden.

ansible-meme

2. Wat is een playbook

Playbooks zijn scripts die bestaan uit een oplijsting van commando’s. Deze commando’s worden doorgestuurd naar externe of lokale machines voor het opbouwen van een geautomatiseerd infrastructuur. Ansible playbooks bieden flexibiliteit en simpliciteit voor het configureren van één of meerdere machines. Op die manier moet men niet steeds handmatig herhalende taken uitvoeren. Men kan de inhoud van een playbook eerder aanzien als een configuratie opstelling dan dat ze geschreven is in een programmeertaal.

Maar wat zit er nu echt in een playbook? Een playbook bestaat een uit één of meerdere plays en een play bestaat op zijn beurt uit één of meerdere tasks. Ansible playbooks zijn lijsten van taken die automatisch worden uitgevoerd op een of meerdere hosts. Plays worden gedefinieerd (starten) met name en krijgt vervolgens een naam/tag met beschrijving tot wat die bepaalde play zal gaan behandelen.

De naam van een playbook is het enige dat kan worden opgeroepen in een commando met het ansible-playbook key-word.

Een playbook uitvoeren kan men met ansible-playbook naam_van_playbook.yml

3. Wat is een play

Plays zijn elementen die roles verbinden met een host (server) waarop ze uitgevoerd moeten worden. Op die manier weet Ansible welke hosts er worden beïnvloed en hoe. Een play kan één of meerdere tasks bevatten. Het host keyword in een play vermeld waar/op welke machine de tasks zullen worden uitgevoerd, de hostnaam dat gelinked is aan het IP-adres (vermeld in de inventory file) zal daar dus worden vermeld. Dan zijn er nog vars deze definieeren variablen zoals je die misschien kent van een programmeer taal zijn ze hier vrij gelijkaardig.

4. Wat is een task

Wat zijn tasks dan nog? Een task is/doet eigenlijk niets meer dan een Ansible module aanspreken. Deze weet hoe dan ook niet waar of op welke host hij wordt opgeroepen. Maar zoals al vermeld is dat de taak van een play.

Standaard wordt elke taak op volgorde van definiëring uitgevoerd. Dit op elke machine dat werd vermeld door het hosts key-word. Eenmaal een taak is uitgevoerd op de doel machine(s) gaat Ansible door naar de volgende taak. Indien een taak faalt op een host, worden voor die bepaalde host geen taken meer uitgevoerd uit de playbook (om verdere conflicten te vermeiden).

5. Roles en handlers

5.1. Roles

Een rol is een appart deel in Ansible en wordt niet gedefinieerd in een playbook. Roles hebben hun eigen sub-mappen onder de map roles. Omdat in meest van de gevallen niet alle hosts dezelfde configuratie nodig hebben is het vaak beter om deze op te splitsen. Hier komen roles in de kijker. Zij zorgen ervoor dat alles geordend blijft en dat elk deel bijvoorbeeld variabelen (vars) in een apart mapje worden gedefinieerd. Als men bijvoorbeeld een task uitvoert zal er automatisch worden gezocht achter de variabele in het bestand van de vars map. Zoals een play definieert een rol de tasks en handlers. Hoe dan ook, rollen bepalen niet op welke hosts de rol zal worden uitgevoerd. Een referentie naar een rol zal dus steeds plaats vinden in een play.

5.2. Handlers

Tasks en handlers zijn eigenlijk bijna identiek. Het enige verschil met handlers is dat ze enkel worden uitgevoerd bij een oproep door het notify key-word. Hoe dan ook zal deze notify enkel worden doorgevoerd indien er veranderingen zijn waargenomen. Dit is bijvoorbeeld handig wanner men aanpassingen heeft gemaakt in de firewall service, en om deze aanpassingen door te voeren moet men de service herstarten.

6. Hiërarchie / mappenstructuur

Om je een beeld te geven van een basis mappen structuur in Anisble kan je refereren naar onderstaande illustratie:

ansible-project/            (hoofdmap)
├── group_vars/              (dir)
├── host_vars/               (dir)
├── roles/                   (dir)
├  └──common/                (dir voorbeeld rol)
├       ├──tasks/            (dir)
├       ├   └──main.yml
├       ├──handlers/         (dir)
├       ├   └──main.yml
├       ├──templates/        (dir)
├       ├   └──conf.j2
├       ├──files/            (dir)
├       ├   └──voorbeeld.txt
├       ├──vars/             (dir)
├       ├   └──main.yml
├       ├──defaults/         (dir)
├       ├   └──main.yml
├       ├──meta/             (dir)
├       ├   └──main.yml
├       ├──library/          (dir)
├       ├──module_utils/     (dir)
├       └──lookup_plugins/   (dir)
├
├── ansible.cfg              (ansible config file)
├── hostsyml                 (hosts config file)
└── playbooks                (playbook file(s))

Meer info over mappen structuur en best practices in Ansible kan je hier terug vinden.

6.1. Voorbeeld structuur (visualisatie)

Playbook bevat plays:

Elke play zal op zijn beurt host(s) en role aanspreken:

image of play

Figuur 1: Playbook met play voorbeeld

De in de rol zullen tasks worden gedefinierd:

role structure

Figuur 2: playbook rollen structuur

7. Wat is een Inventory

In de inventory file worden alle nodes tot een groep toegewezen en krijgen ze elk hun uniek ip adres mee. Op die is er een duidelijke verdeling en kunnen groepen (meerdere nodes) worden aangesproken in een zelfde play zonder dat we alle nodes nogmaals appart moeten gaan opsommen. Een inventory file kan opnieuw geschreven worden in YAML of ini fromaat. Al noemen we het belangrijkste bestand in de Ansible opstelling de "inventory", krijgt het in productie de naam hosts. Omdat we zoals eerder vermeld de nodes/hosts daar zullen vermelden, met welk ip elke host is gekoppeld en zeggen in welke groep ze zitten. Bij installatie van Ansible kan je de inventory standaard in /etc/ansible/hosts terugvinden.

Een basis inventory in ini formaat:

 [all.hosts]
 mail.example.com=null

 [all.children.webservers.hosts]
 foo.example.com=null
 bar.example.com=null

 [all.children.webservers.vars]
 ansible_user=GEBRUIKER
 ansible_password=PASSWORD
 ansible_connection=ssh

 [all.children.dbservers.hosts]
 one.example.com=null
 two.example.com=null
 three.example.com=null

 [all.children.dbservers.vars]
 ansible_user=GEBRUIKER
 ansible_password=PASSWORD
 ansible_connection=ssh

 [vars]
 ansible_port=22

Een basis inventory in YAML formaat:

 ---
 all:
   hosts:
     mail.example.com:
   children:
     webservers:
       hosts:
         foo.example.com:
         bar.example.com:
       vars:
           ansible_user: GEBRUIKER
           ansible_password: PASSWORD
           ansible_connection: ssh
     dbservers:
       hosts:
         one.example.com:
         two.example.com:
         three.example.com:
       vars:
           ansible_user: GEBRUIKER
           ansible_password: PASSWORD
           ansible_connection: ssh
   vars:
     ansible_port: 22

Het formaat dat je uiteindelijk kiest is een persoonlijke voorkeur, beide formaten werken even goed. Om je een idee tegeven van hoe zo een groep of host moet worden aangesproken in een play kan je terug refereren naar (figuur 2) onder het key-word hosts kan men een aantal groep namen terug vinden. Deze groepen (nodes die onder deze groepen vallen) zullen worden beïnvloed door de instructies vermeld in de playbook tasks.

YAML files beginnen steeds met 3 dashes “---”. De indentatie bepaald de hiërarchy, alsook is het belangrijk om te weten dat YAML files gevoelig zijn op een spaties (teveel of te weinig kan fouten geven). Tabs mogen gebruikt worden maar zijn minder betrouwbaar.

Meer details over de inventory kan je terug vinden in de documentatie.

8. Mini cheat sheet

afbeelding ansible cheat-sheet

Een meer uitgebreide cheat sheet vindt je hier.

Als de Linux omgeving nog nieuw of onbekend is voor jou kan je altijd deze Linux cheat sheet raadplegen.

© Gebaseerd op de informatie van: