Zoeken op website

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.