Ansible playbooks

Om lekker met Ansible te kunnen werken is het gebruik van playbooks aan te raden.
Een eenvoudig playbook, met toch een aantal leuke features kan er als volgt uit zien:

--- # Test playbook
- hosts: '{{ myhosts }}'
  remote_user: ansible
  become: yes
  become_method: sudo
  connection: ssh
  gather_facts: '{{ gather }}'
  vars:
    myhosts: test12
    gather: yes
    pkg: telnet
  tasks:
  - name: Some description of what we are doing
    yum:
      name: '{{ pkg }}'
      state: '{{ mystate }}'

Zoals je kunt zien zijn er een aantal dingen. Als eerste gebruiken we een aantal variables. Hiermee kunnen we dus leuke dingen doen, maar zoals je ook kunt zien wordt er 1 variable niet gezet. Dat leg ik later uit.
Regel 2. Hier geven we met een variabele aan welke host we willen gaan gebruiken.
Regel 3-6. Hiermee regelen we dat we met privileged rechten dingen kunnen doen, doormiddel van sudo.
Regel 7. Hiermee halen we informatie op vanuit onze hosts
Regel 8-11. Hier declareren we de variabelen. Zoals je kunt zien 1 minder dan je zou verwachten.
Regel 12-16. Geven we de taak aan, het installeren van het pakket dat we onder de variable pkg gedeclareerd hebben.
Sla vervolgens dit bestand op onder /home/ansible/ansible/playbook/test.yaml

Wat is hier nou het idee van. Ik wil dat ik snel telnet kan installeren maar ook weer kan deinstalleren. Dit doen we door het volgende commando te geven.

ansible-playbook test.yaml --extra-vars "mystate=latest"

Hiermee wordt telnet op alle hosts geïnstalleerd. Daarna kunnen we de volgende opdracht geven, waarna telnet op alle hosts weer gedeïnstalleerde wordt.

ansible-playbook test.yaml --extra-vars "mystate=absent"

Probleem is nu dat we alleen maar kunnen zien dat een tasks wel op niet gelukt is, we kunnen echter niet zien wat er precies wordt uitgevoerd. Dit kunnen we realiseren door een aantal regels toe te voegen aan het playbook.

--- # Test playbook
- hosts: '{{ myhosts }}'
  remote_user: ansible
  become: yes
  become_method: sudo
  connection: ssh
  gather_facts: '{{ gather }}'
  vars:
    myhosts: test12
    gather: yes
    pkg: telnet
  tasks:
  - name: Some description of what we are doing
    yum:
      name: '{{ pkg }}'
      state: '{{ mystate }}'
    register: result
  - debug: var=result

Hiermee maken we een nieuwe task welke de debug informatie over onze andere task ophaalt.

Ook kan het wel eens nodig zijn om wat meer controle te krijgen over of task wel of niet gestart moeten worden. Dit kan met behulp van notification en handlers. Het idee hierbij is dat een handler gestart wordt aan de hand van de status van een task.

Een playbook kan er dan als volgt uitzien. Sla dit bestand op als nginx.yaml

--- # Test playbook
- hosts: '{{ myhosts }}'
  remote_user: ansible
  become: yes
  become_method: sudo
  connection: ssh
  gather_facts: '{{ gather }}'
  vars:
    myhosts: test12
    gather: yes
  tasks:
  - name: Some description of what we are doing
    yum:
      name: nginx
      state: latest
    notify: 
    - restart nginx
  handler:
  - name: restart nginx
    service: 
      name: nginx
      enable: yes
      state: restart

Hierbij zien we dus dat nginx gestart wordt en als dat gebeurd is, dan pas wordt de service nginx herstart.
Als we nu dit playbook start met

ansible-playbook nginx.yaml

Dan zullen we zie dat nginx geinstalleerd en gestart wordt, de handler wordt uitgevoerd. Als we nogmaals het commando geven zullen we zien dat alleen de task uitgevoerd wordt maar de handler niet. We hebben dus een soort if…then… statement gemaakt.
Als je nginx vervolgens toch wil deinstalleren, kun je het volgende commando gebruiken:

ansible -s -m yum -a "name=nginx state=absent"