WORKSHOP 4: Variabelen
In de vorige oefeningen leerden we eenvoudige playbooks op te stellen. Eenmaal we langere en complexere playbooks gaan maken zal de noodzaak groter worden om variabelen te gaan gebruiken.
Doelstelling
In deze workshop leer je:
- Hoe Ansible variable delimiters gebruikt
{{en}}. - Wat
host_varsengroup_varszijn en wanneer deze te gebruiken. - Hoe
ansible_factste gebruiken - Hoe je de
debugmodule kan gebruiken om variabelen naar de console te schrijven.
Workshop
Variabelen kunnen in Ansible playbooks gebruikt worden door een variabele naam tussen dubbele accolades te plaatsen {{ en }}.
Here comes a variable {{ variable1 }}
Variabelen en hun waardes kunnen op veel verschillende plaatsen gedefinieerd worden: de inventory, de playbook zelf, extra files,
command line, etc...
Ansible zal alle mogelijke plaatsen bekijken om mogelijke variabelen op te nemen.
De aanbevolen plaats (best practice en afhankelijk van de situatie) is om bestanden met variabelen te voorzien in de mappen host_vars en group_vars:
- Variabelen definiëren voor een groep
serversdoe je met eenYAML-bestand met de naamgroup_vars/servers. - Variabelen definiëren voor een specifieke host (vb
node1) doe je in een YAML-file met de naamhost_vars/node1.yml.
Hostvariabelen zijn specifieker dan groepsvariabelen. Bijgevolg nemen hostvariabelen dus voorrang op de groepsvariabelen.
Zoals je wel zal gemerkt hebben, werden er reeds enkele variabelen gebruikt in de inventory die we tot nu toe gebruikten.
Stap 1 - Bestand voor variabelen voorzien
Om het gebruik van groeps- en hostvariabelen en de locaties om deze te plaatsen goed te begrijpen werken we onze vorige setup met webservers verder uit.
In deze workshop zullen we inhoud van de index.html laten afhangen van het feit of een webserver voor development(dev) of production(prod) zal gebruikt worden.
-
Creëer alvast eerst de extra mappen onder je Ansible project:
[student@ControlHost ansible-files]$ mkdir host_vars group_vars -
Maak nu twee bestanden aan met de variabele. We definiëren een variabele met de naam
stagedie als waardedevofprodzal meekrijgen. -
in
./ansible-files/group_vars/web.ymlplaats je de volgende YAML-content:web.yml---stage: dev -
in
./ansible-files/host_vars/node2.ymlplaats je volgende content:node2.yml---stage: prod
Bovenstaande betekent dus dat we voor "alle" hosts van de groep web de variabele stage op dev gezet hebben.
Op die manier kunnen we deze hosts aanduiden als onderdeel van de dev-omgeving.
Voor node2 wordt dit dus overschreven door een specifiekere variabele die aangeeft dat de host behoort tot de prod-omgeving.
Stap 2 - web.html bestanden aanmaken
Bedoeling is nu 2 verschillende web.html bestanden aan te maken zodat de content i.f.v. de stage zal aangepast worden.
-
Maak een bestand
prod_web.htmlaan in./ansible-files/files/met onderstaande content:prod_web.html<body><h1>This is a production webserver, take care!</h1></body> -
Maak ook een
dev_web.htmlaan op dezelfde locatie met voglende content:dev_web.html<body><h1>This is a development webserver, have fun!</h1></body>
Stap 3 - Playbook aanmaken
In deze stap maken we een playbook aan die de juiste web.html-file kopieert afhankelijk van de stage variabele.
-
Maak een nieuwe playbook aan met de naam
deploy_index_html.ymlin de map./ansible-files/:deploy_index_html.yml---- name: Copy web.htmlhosts: webbecome: truetasks:- name: Copy web.htmlansible.builtin.copy:src: "{{ stage }}_web.html"dest: /var/www/html/index.html -
Playbook uitvoeren
[student@ControlHost ansible-files]$ ansible-playbook deploy_index_html.yml
Stap 4 - Resultaat testen
De makkelijkste test is uiteraard eens surfen naar de respectievelijke webserver. Ook dit kunnen we dus in Ansible met 1 ad-hoc command snel controleren:
Mocht curl nog niet geïnstalleerd zijn op je nodes om onderstaande playbook uit te voeren, dan kan je dat snel realiseren via het ad hoc command:
ansible web -m apt -a "name=curl state=present" --become
Je zou het ook kunnen toevoegen als een extra task aan je bestaande playbook.
[student@ControlHost ansible-files]$ ansible web -m command -a "curl http://localhost"
node1 | CHANGED | rc=0 >>
<body>
// highlight-next-line
<h1>This is a development webserver, have fun!</h1>
</body> % Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 67 100 67 0 0 13400 0 --:--:-- --:--:-- --:--:-- 13400
node2 | CHANGED | rc=0 >>
<body>
// highlight-next-line
<h1>This is a production webserver, take care!</h1>
</body> % Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 67 100 67 0 0 13400 0 --:--:-- --:--:-- --:--:-- 13400
node3 | CHANGED | rc=0 >>
<body>
// highlight-next-line
<h1>This is a development webserver, have fun!</h1>
</body> % Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 67 100 67 0 0 13400 0 --:--:-- --:--:-- --:--:-- 13400
Bovenstaande manier zal zeker niet de meest efficiënte manier (verschillende, aparte html-files voorzien) zijn om content aan te passen i.f.v. een variabelen. Templates zullen hier geschikter voor zijn (zie Templates - Jinja2).
Stap 5 - Ansible Facts
Ansible Facts zijn variabelen die automatisch "ontdekt" en "ingevuld" worden door Ansible voor elke host.
We kwamen eerder al de impliciete task Gathering Facts tegen telkens bij het uitvoeren van onze playbook.
Het is op dat moment dat Ansible alle info verzamelt van elke host en in gepaste variabelen steekt.
We kunnen ook "manueel" deze variabelen opvragen via een ad-hoc command en de module setup.
-
Om even een idee te hebben van welke informatie door Ansible verzameld wordt per host voer je volgende command uit:
[student@ControlHost ansible-files]$ ansible node1 -m setup -
Zoals je vaststelt is dit gigantisch veel informatie. Die kan je dan beter ook even filteren (bv. netwerk-adapter
ens160, zie documentatie):[student@ControlHost ansible-files]$ ansible node1 -m setup -a "filter=ansible_ens192"
Stap 6 - Nog Facts
- Probeer nu zelf eens via de module
setupde variabele te zoeken die de distributie weergeeft van je hosts. Pas de juiste filter toe...
Oplossing hieronder....
[student@ControlHost ansible-files]$ ansible all -m setup|grep distribution
[student@ControlHost ansible-files]$ ansible all -m setup -a "filter=ansible_distribution"
Stap 7 - Facts gebruiken in Playbooks
Facts kunnen we nu heel handig als variabelen gaan gebruiken in Playbooks.
-
Maak een nieuwe playbook aan met de naam
facts.ymlin de map./ansible-files/:facts.yml---- name: Output facts within a playbookhosts: alltasks:- name: Prints Ansible factsansible.builtin.debug:msg: The default IPv4 address of {{ ansible_fqdn }} is {{ ansible_default_ipv4.address }}
De module debug is zeer handig om te debuggen en om dus waardes, variabelen op de console te zien te krijgen.
[student@ControlHost ansible-files]$ ansible-playbook facts.yml
PLAY [Output facts within a playbook] ****************************************************************************
TASK [Gathering Facts] *****************************************************
ok: [ansible-1]
ok: [node1]
ok: [node2]
ok: [node3]
TASK [Prints Ansible facts] ************************************************
ok: [node1] => {
"msg": "The default IPv4 address of ip6-localhost is X.X.X.X"
}
ok: [node2] => {
"msg": "The default IPv4 address of ip6-localhost is Y.Y.Y.Y"
}
ok: [node3] => {
"msg": "The default IPv4 address of ip6-localhost is Z.Z.Z.Z"
}
ok: [ansible-1] => {
"msg": "The default IPv4 address of localhost.localdomain is A.A.A.A"
}
PLAY RECAP *****************************************************************
ansible-1 : ok=2 changed=0 unreachable=0 failed=0
node1 : ok=2 changed=0 unreachable=0 failed=0
node2 : ok=2 changed=0 unreachable=0 failed=0
node3 : ok=2 changed=0 unreachable=0 failed=0
© Deze workshop werd gebaseerd op de informatie van Red Hat Ansible Automation Platform