Ansible Plays en Playbooks maken - Deel 5
In dit deel 5 van de Ansible-serie leggen we uit hoe je Ansible Plays en Playbooks kunt maken met behulp van Ansible-modules.
Ansible wordt geleverd met zelfstandige scripts, modules genaamd, die worden gebruikt in playbooks voor de uitvoering van gespecialiseerde taken op externe knooppunten.
Modules zijn handig voor het automatiseren van taken zoals pakketbeheer, archiveren en kopiëren van bestanden, om er maar een paar te noemen. Hiermee kunt u configuratiebestanden aanpassen en apparaten beheren zoals routers, switches, load balancers, firewalls en tal van andere apparaten.
Het doel van dit subonderwerp is om u een overzicht te geven van verschillende taken die kunnen worden uitgevoerd door Ansible-modules:
Pakketbeheer in Linux
Pakketbeheer is een van de meest essentiële en frequent voorkomende taken van systeembeheerders. Ansible wordt geleverd met modules waarmee u pakketbeheertaken kunt uitvoeren in zowel RedHat als Debian gebaseerde systemen.
Ze zijn relatief eenvoudig te raden. Er is de apt-module voor APT-pakketbeheer voor op Debian gebaseerd, de oude yum-module voor YUM-pakketbeheer en dnf-module geassocieerd met nieuwere RHEL-distributies .
Hieronder staan een paar voorbeelden van hoe de modules gebruikt kunnen worden in een playbook:
Voorbeeld 1: De Apache-webserver installeren op RHEL 8
---
- name: install Apache webserver
hosts: webservers
tasks:
- name: install httpd
dnf:
name: httpd
State: latest
Voorbeeld 2: Installatie van de Apache Webserver op Debian 10
---
- name: install Apache webserver
hosts: databases
tasks:
- name: install Apache webserver
apt:
name: apache2
State: latest
Servicemodule
Met de servicemodule kunnen systeembeheerders services op het systeem starten, stoppen, bijwerken, upgraden en opnieuw laden.
Voorbeeld 1: Apache Webserver starten
---
- name: Start service httpd, if not started
service:
name: httpd
state: started
Voorbeeld 2: Apache-webserver stoppen
---
- name: Stop service httpd
service:
name: httpd
state: stopped
Voorbeeld 3: Een netwerkinterface enp2s0 opnieuw opstarten
---
- name: Restart network service for interface eth0
service:
name: network
state: restarted
args: enp2s0
Kopieermodule
Zoals de naam al doet vermoeden, kopieert de kopieermodule bestanden van de ene locatie op de externe machine naar een andere locatie op dezelfde machine.
Voorbeeld 1: bestanden kopiëren van lokaal naar extern Linux
---
- name: Copy file with owner and permissions
copy:
src: /etc/files/tecmint.conf
dest: /srv/tecmint.conf
owner: tecmint
group: tecmint
mode: '0644'
Het playbook kopieert het configuratiebestand tecmint.conf van de map /etc/files/ naar de map /srv/ als tecmint > gebruiker met 0644-rechten.
Machtigingen kunnen ook worden weergegeven met behulp van symbolische representatie, zoals weergegeven in de laatste regel.
Voorbeeld 2: bestanden kopiëren van lokaal naar extern Linux
---
- name: Copy file with owner and permissions
copy:
src: /etc/files/tecmint.conf
dest: /srv/tecmint.conf
owner: tecmint
group: tecmint
mode: u=rw, g=r, o=r
De rechten in het vorige voorbeeld kunnen worden weergegeven zoals weergegeven in de laatste regel. De gebruiker krijgt lees en schrijf rechten toegewezen, de groep krijgt schrijfrechten toegewezen, en de rest van de wereld krijgt leesrechten toegewezen.
Bestandsmodule
De bestandsmodule wordt gebruikt om veel bestandsbewerkingen uit te voeren, waaronder het maken van bestanden en mappen, het toewijzen van bestandsrechten en het instellen van symlinks.
Voorbeeld 1: Voer Linux-bestandsrechten uit
---
- name: Change file ownership, group, and permissions
file:
path: /etc/tecmint.conf
owner: tecmint
group: tecmint
mode: '0644'
De bovenstaande weergave maakt een bestand aan met de naam tecmint.conf in de map /etc, waarbij de machtigingen worden ingesteld op 0644.
Voorbeeld 2: Linux-bestand verwijderen
---
- name: Remove file (delete file)
file:
path: /etc/tecmint.conf
state: absent
Hiermee wordt het bestand tecmint.conf verwijderd of verwijderd.
Voorbeeld 3: Maak een map aan
---
- name: create a directory if it doesn’t exist
file:
path: /etc/mydirectory
State: directory
mode: '0777'
Hierdoor wordt een map aangemaakt in de map /etc met de machtigingen voor 0777.
Voorbeeld 4: Recursief een map verwijderen
---
- name: Recursively deleting a directory
file:
path: /etc/tecmint.conf
state: absent
De bovenstaande weergave verwijdert recursief een map.
Lijnbestandsmodule
De module lineinfile is handig als u een enkele regel in een bestand wilt wijzigen. Het kan een bestaande lijn vervangen.
Voorbeeld 1: Bestanden manipuleren in Linux
---
- name: Ensure SELinux is set to enforcing mode
lineinfile:
path: /etc/selinux/config
regexp: '^SELINUX='
line: SELINUX=disabled
De weergave hierboven stelt de waarde van SELINUX in op uitgeschakeld.
SELINUX=disabled
Voorbeeld 2: Bestanden wijzigen in Linux
---
- name: Add a line to a file if the file does not exist, without passing regexp
lineinfile:
path: /etc/hosts
line: 10.200.50.51 linux-console.net
create: yes
Hierdoor wordt de vermelding 10.200.50.51 linux-console.net toegevoegd aan het bestand /etc/hosts.
Archiefmodule
Een Archief module wordt gebruikt voor het creëren van een gecomprimeerd archief van een enkel of meerdere bestanden. Er wordt van uitgegaan dat de compressiebron aanwezig is op de doelbestemming. Na archivering kan het bronbestand later worden verwijderd of verwijderd met behulp van de instructie remove=True
.
Voorbeeld 1: Maak een archiefbestand
- name: Compress directory /path/to/tecmint_dir/ into /path/to/tecmint.tgz
archive:
path: /path/to/tecmint_dir
dest: /path/to/tecmint.tgz
This compresses the /path/to/tecmint_dir directory to /path/to/tecmint.tgz
Voorbeeld 2: Een archiefbestand maken en verwijderen
- name: Compress regular file /path/to/tecmint into /path/to/foo.gz and remove it
archive:
path: /path/to/tecmint
dest: /path/to/tecmint.tgz
remove: yes
In het bovenstaande afspelen wordt het bronbestand /path/to/tecmint verwijderd nadat de archivering is voltooid.
Voorbeeld 3: Maak een archiefbestand
- name: Create a bz2 archive of /path/to/tecmint
archive:
path: /path/to/tecmint
format: bz2
Hierdoor wordt een gecomprimeerd bestand in bz2-indeling gemaakt van het bestand /path/to/tecmint.
Git-module
De module beheert git-checkouts van softwareopslagplaatsen.
Voorbeeld 1: Controleer Git-opslagplaatsen
- git:
repo: 'https://foosball.example.org/path/to/repo.git'
dest: /srv/checkout
version: release-0.22
Commandomodule
Een van de meest gebruikte modules, de command module, neemt de commandonaam aan en later gevolgd door een lijst met argumenten. De opdracht wordt op dezelfde manier doorgegeven als waarop u in een Linux-shell zou typen.
Voorbeeld 1: voer een opdracht uit
- name: Executing a command using the command module
command: cat helloworld.txt
Voorbeeld 2: Controleer de uptime van Remote Linux
---
- name: Check the remote host uptime
hosts: servers
tasks:
- name: Execute the Uptime command over Command module
register: uptimeoutput
command: "uptime"
- debug:
var: uptimeoutput.stdout_lines
De commandomodule haalt de uptime van externe servers op.
Variabelen om de resultaten van uitgevoerde opdrachten op te halen
Meestal worden Ansible-playbooks gebruikt om taken op beheerde hosts uit te voeren zonder de uitvoer op de opdrachtregel weer te geven. Er zijn echter gevallen waarin u mogelijk de uitvoer of resultaten moet vastleggen. In deze sectie laten we u zien hoe u de uitvoer van een draaiboek in een variabele kunt vastleggen en deze later kunt weergeven.
Een weerwerend register wordt gebruikt om de uitvoer van een taak vast te leggen en deze als variabele op te slaan. De variabele zal daarna de stdout van de taak bevatten.
Laten we bijvoorbeeld aannemen dat u het schijfgebruik van beheerde knooppunten in de respectievelijke hoofddirectory's wilt controleren met behulp van de opdracht df -Th /
. Je gaat de ‘command’
module gebruiken om het commando te definiëren en ‘register’
om de std-uitvoer in een variabele op te slaan.
Om de opdracht weer te geven, gebruikt u de ‘debug’
-module naast de stdout-retourwaarde.
---
- hosts: all
become: yes
tasks:
- name: Execute /boot usage on Hosts
command: 'df -Th /'
register: df
- debug: var=df.stdout
Laten we nu het draaiboek uitvoeren. In dit geval hebben we ons speelboek check_disk_space.yml genoemd.
ansible-playbook check_disk_space.yml
Zoals je hebt gezien, is de uitvoer allemaal door elkaar gegooid en is het moeilijk om mee te volgen.
Om de uitvoer uit te lijnen en gemakkelijker leesbaar te maken, vervangt u de retourwaarde stdout door stdout_lines.
---
- hosts: all
become: yes
tasks:
- name: Execute /boot usage on Hosts
command: 'df -Th /'
register: df
- debug: var=df.stdout_lines
Gebruik voorwaardelijke regels om de uitvoering van het spel te controleren
Net als in programmeertalen worden voorwaardelijke uitspraken gebruikt als er meer dan één uitkomst mogelijk is. Laten we eens kijken naar enkele veelgebruikte voorwaardelijke uitspraken in Ansible-playbooks.
Wanneer verklaring
Soms wilt u misschien taken uitvoeren op specifieke knooppunten en niet op andere. De voorwaardelijke instructie 'when'
is vrij eenvoudig te gebruiken en te implementeren in een playbook. Wanneer u de clausule 'when'
gebruikt, declareert u eenvoudigweg de voorwaarde naast de clausule, zoals weergegeven:
when: condition
Wanneer aan de voorwaarde is voldaan, wordt de taak uitgevoerd op het externe systeem.
Laten we een paar voorbeelden bekijken:
Voorbeeld 1: Wanneer-operator gebruiken
---
- hosts: all
tasks:
- name: Install Nginx on Debian
apt: name=nginx state=present
when: ansible_os_family == “Debian”
Het spel hierboven installeert de Nginx webserver op hosts die de Debian-familie van distributies draaien.
U kunt ook de operatoren OR
en AND
gebruiken naast de wanneer de voorwaardelijke instructie.
Voorbeeld 2: AND-operator gebruiken met When
---
- hosts: all
tasks:
- name: Install Nginx on Debian
apt: name=nginx state=present
when: ansible_os_family == “Debian” and
ansible_distribution_version == “18.04”
Wanneer u de operator AND
gebruikt, moet aan beide instructies worden voldaan voordat de taak kan worden uitgevoerd.
In het bovenstaande spel wordt Nginx geïnstalleerd op knooppunten met een Debian-besturingssysteemversie, versie 18.04. Uiteraard zal dit Ubuntu 18.04 zijn.
Voorbeeld 3: OR-operator gebruiken met When
Met de operator OR
wordt de taak uitgevoerd als aan een van de voorwaarden is voldaan.
---
- hosts: all
tasks:
- name: Install Nginx on Debian
apt: name=nginx state=present
when: ansible_os_family == “Debian” or
Ansible_os_family == “SUSE”
Het bovenstaande spel installeert Nginx-webservers op de Debian- of SUSE-familie van besturingssystemen of op beide.
OPMERKING: Zorg er altijd voor dat u het dubbele gelijkheidsteken ==
gebruikt bij het testen van een voorwaarde.
Voorwaardelijke regels in lussen
Conditionals kunnen ook in een lus worden gebruikt. Stel dat u bijvoorbeeld een lijst heeft met meerdere pakketten die op externe knooppunten moeten worden geïnstalleerd.
In het onderstaande speelboek hebben we een array genaamd pakketten met daarin een lijst met pakketten die moeten worden geïnstalleerd. Deze taken worden na elkaar uitgevoerd als de clausule required is ingesteld op True.
---
- name: Install Software packages
hosts: all
vars:
packages:
• name: nginx
required: True
• name: mysql
required: True
• name: apache
required: False
tasks:
• name: Install “{{ item.name }}”on Debian
apt:
name: “{{ item.name }}”
state: present
When: item.required == True
loop: “{{ packages }}”
Configureer foutafhandeling
Soms mislukken taken bij het uitvoeren van draaiboeken. Laten we aannemen dat u 5 taken uitvoert op 3 servers, zoals weergegeven in het onderstaande draaiboek. Als er een fout optreedt bij taak 3 (MySQL starten) op server 2, stopt Ansible met het uitvoeren van de resterende taken op server 2 en probeert hij de resterende taken op de rest van de servers te voltooien.
---
- name: Install Software packages
hosts: server1, server2, server3
tasks:
- name: Install dependencies
<< some code >>
- name: Install MySQL database
<< some code >>
- name: Start MySQL
<< some code >>
- name: Install Nginx
<< some code >>
- name: Start Nginx
<< some code >>
Als je bijvoorbeeld consistentie wilt in de uitvoering van het playbook, stop dan de uitvoering van een playbook. Mocht een van de servers uitvallen, voeg dan de optie toe.
---
- name: Install Software packages
hosts: server1, server2, server3
any_errors_fatal: true
tasks:
Op deze manier zal Ansible, als één taak op één server mislukt, de uitvoering van het volledige playbook op alle servers stoppen en afsluiten.
Als u wilt dat het draaiboek de fouten negeert en doorgaat met het uitvoeren van de resterende reeks taken, gebruikt u de optie ignore_errors: True.
---
- name: Install Software packages
hosts: server1, server2, server3
tasks:
- name: Install dependencies
<< some code >>
ignore_errors: True
Maak draaiboeken om systemen in een bepaalde staat te configureren
In deze sectie bekijken we enkele extra opties die beschikbaar zijn bij het uitvoeren van een draaiboek.
Laten we beginnen met de Check-modus of Dry run-optie. De optie voor proefdraaien of controlemodus wordt gebruikt bij het uitvoeren van een playbook om te controleren of er fouten worden aangetroffen en of er wijzigingen worden aangebracht op de beheerde hosts. Er worden echter geen wijzigingen aangebracht aan de externe knooppunten.
Om bijvoorbeeld een playbook met de naam httpd.yml
droog te draaien, dat de uitvoering van de Apache-webserver installeert en start:
ansible-playbook httpd.yml --check
De andere optie waar we naar moeten kijken is de --start-at-task
optie. Dit wordt gebruikt bij het opgeven van de naam van de taak waarmee het draaiboek moet beginnen of beginnen.
Laten we een voorbeeld nemen: het onderstaande draaiboek beschrijft twee taken: bij het eerste spel wordt de Apache-webserver geïnstalleerd en bij het tweede wordt het htop-hulpprogramma geïnstalleerd.
---
- name: Install httpd
hosts: all
tasks:
yum:
name: httpd
state: Installed
- name: Install htop
yum:
name: htop
state: started
Als u de installatie van de Apache-webserver wilt overslaan en in plaats daarvan het htop-hulpprogramma wilt installeren, voert u het volgende uit:
ansible-playbook playbook.yml --start-at-task “Install htop”
Ten slotte kunt u uw taken of toneelstukken taggen door de optie tags aan uw playbook toe te voegen, zoals weergegeven. Dit is handig als u een vrij groot draaiboek heeft en specifieke taken uit het hele draaiboek wilt uitvoeren.
---
- name: Install httpd
tags: Install and start
hosts: all
tasks:
yum:
name: httpd
state: Installed
tags: Install
• service:
name: httpd
state: started
ansible-playbook playbook.yml -tags "Install"
Om de tags weg te laten, gebruikt u de --skip-tags
opties zoals weergegeven.
ansible-playbook playbook.yml --skip-tags "Install"
Conclusie
In dit onderwerp hebben we u door de veelgebruikte modules in Ansible geleid, hoe u stdout kunt ophalen uit de uitvoering van een playbook voor analyse, hoe u conditionals in het playbook kunt gebruiken en hoe u fouten kunt beheren die kunnen optreden tijdens het uitvoeren taken. Ten slotte hebben we de configuratie van draaiboeken samengevat en hoe u extra opties kunt gebruiken om te beslissen welke taken u wilt uitvoeren als u niet van plan bent het hele draaiboek uit te voeren.