Ansible variables

Instellingen en configuraties voor de verschillende hosts (nodes) van Ansible hebben allen een set aan variables die gebruikt kunnen worden in playbooks en roles. Variables binnen ansible starten altijd met een letter en de reeds aanwezige variables starten met ansible_

Uiteraard kun je ook zelf variabelen maken en/of vullen met waardes die dan weer gebruikt kunnen worden. Een veel gebruikt voorbeeld is om een aantal packages te installeren met yum (of apt) en dan deze packages in een item-lijst op te nemen waarbij ‘item‘ dan de variabele is. Bijvoorbeeld:

tasks
  - name: Installatie basic packages
    yum: name="{{ item }}" state="latest"
    with_items:
      - ntp
      - vim
      - cron

facts

Ook de nodes zelf hebben allerlei variabelen die opgevraagd worden zodra een play gestart wordt. Deze heten dan ‘facts’ en kunnen met het volgende commando opgehaald worden:

ansible huiskamer -m setup | less

Een voorbeeld om packages te installeren waarbij de methode afhankelijk is van het OS van de node:

tasks:
  - name: installeer Apache op CentOS
    yum: name=httpd
    when: ansible_os_family == "CentOS"
 
  - name: installeer Apache op Ubuntu
    apt:  name=apache2
    when: ansible_os_family == "Ubuntu"

local_vars

Variabelen die niet standaard aanwezig zijn maar je toch wilt gebruiken kunnen op de nodes toegevoegd worden in een bestand in de directory /etc/ansible/facts.d We noemen deze dan ‘local_vars‘.

Bijvoorbeeld op de node ‘huiskamer’ staat een bestand /etc/ansible/facts.d/digitalhifi.fact met de volgende inhoud:

[adres]
bedrijfsnaam=Digital Hifi
straatnaam=Straatnaam 123
postcode=1234 AB
plaatsnaam=Woonplaats
telefoon=06-98765432

We zien deze dan terug als we de setup-module aanroepen:

ansible huiskamer -m setup

En hier zie je de lokale variables in 'ansible_local‘ en omdat het bestand de naam ‘digitalhifi.facts’ heeft zal deze getoond worden met de ‘key’ genaamd ‘digitalhifi’

"ansible_local": {
    "digitalhifi": {
        "adres": {
           "bedrijfsnaam": "Digital Hifi",
           "plaatsnaam": "Woonplaats",
           "postcode": "1234 AB",
           "straatnaam": "Straatnaam 123",
           "telefoon": "06-98765432"
    }
},

defaults, vars, group_vars en host_vars

Verder kunnen variabelen gebruikt worden in de playbooks en roles en hiervoor zijn een aantal directories bepaald. Deze zijn genaamd:

  • defaults
  • vars
  • group_vars
  • host_vars

De bestanden in deze directories kunnen variabelen bevatten die dus gebruikt kunnen worden in de diverse play’s. Hierbij kunnen de variabelen in defaults overschreven worden door vars, deze weer door group_vars en die dan weer door host_vars.

Bijvoorbeeld defaults/main.yml

http_port: 80
https_port: 443

Als dan in group_vars/all het volgende staat:

http_port: 8080

Dan zal het resultaat zijn dat http_port op poort 8080 staat gedefinieerd.

CLI vars

Variabelen die op de Command Line worden meegegeven hebben de hoogste prioriteit en krijgen dus altijd voorrang. Bijvoorbeeld:

ansible-playbook voorbeeld.yml -e http_port=8009

Nesten van variablen

Variablen kunnen ‘genest‘ worden. Als voorbeeld een vars/main.yml:

---
java_package:
jre:
6: java-1.6.0-openjdk
7: java-1.7.0-openjdk
8: java-1.8.0-openjdk
jdk:
6: java-1.6.0-openjdk-devel
7: java-1.7.0-openjdk-devel
8: java-1.8.0-openjdk-devel
...

Het type en de versie kunnen dan in defaults/main.yml gedefinieerd worden:

---
java_type: jre
java_version: 8
...

De package die we willen hebben is dan bijvoorbeeld {{ java_package.jre.8 }} maar we gebruiken variables dus wordt dit genest tot:

{{ java_package[java_type][java_version] }}

hetgeen zal resulteren in java-1.8.0-openjdk