Com crear jocs i llibres de jugades Ansible - Part 5


En aquesta part 5 de la sèrie Ansible, explicarem com crear Ansible Plays i Playbooks amb mòduls Ansible.

Ansible s'envia amb scripts autònoms anomenats mòduls que s'utilitzen en llibres de jugades per a l'execució de tasques especialitzades en nodes remots.

Els mòduls són útils per automatitzar tasques com ara la gestió de paquets, arxivar i copiar fitxers, per esmentar-ne només alguns. Us permeten fer retocs als fitxers de configuració i gestionar dispositius com ara encaminadors, commutadors, equilibradors de càrrega, tallafocs i una sèrie d'altres dispositius.

L'objectiu d'aquest subtema és oferir-vos una visió general de les diverses tasques que es poden realitzar amb els mòduls Ansible:

Gestió de paquets a Linux

La gestió de paquets és una de les tasques més essencials i freqüents que duen a terme els administradors de sistemes. Ansible s'envia amb mòduls que us ajuden a executar tasques de gestió de paquets tant en sistemes basats en RedHat com en Debian.

Són relativament fàcils d'endevinar. Hi ha el mòdul apt per a la gestió de paquets YUM i el mòdul dnf associat a les distribucions RHEL més recents.

A continuació es mostren alguns exemples de com es poden utilitzar els mòduls en un llibre de jocs:

---
- name: install Apache webserver
  hosts: webservers

  tasks:
       - name: install httpd
         dnf:  
          name: httpd  
          State: latest
---
- name: install Apache webserver
  hosts: databases

  tasks:
       - name: install Apache webserver
         apt:  
          name: apache2  
          State: latest

Mòdul de servei

El mòdul de servei permet als administradors del sistema iniciar, aturar, actualitzar, actualitzar i tornar a carregar serveis al sistema.

---
- name: Start service httpd, if not started
  service:
    name: httpd
    state: started
---
- name: Stop service httpd
  service:
    name: httpd
    state: stopped
---
- name: Restart network service for interface eth0
  service:
    name: network
    state: restarted
    args: enp2s0

Mòdul de còpia

Com el seu nom indica, el mòdul de còpia copia els fitxers d'una ubicació de la màquina remota a una ubicació diferent de la mateixa màquina.

---
- name: Copy file with owner and permissions
  copy:
    src: /etc/files/tecmint.conf
    dest: /srv/tecmint.conf
    owner: tecmint
    group: tecmint
    mode: '0644'

El llibre de jocs copia el fitxer de configuració tecmint.conf del directori /etc/files/ al directori /srv/ com a usuari de tecmint amb els permisos 0644.

Els permisos també es poden representar mitjançant la representació simbòlica tal com es mostra a l'última línia.

---
- 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

Els permisos de l'exemple anterior es poden representar com es mostra a l'última línia, a l'usuari se li assignen permisos de lectura i escriptura, al grup se li assignen permisos d'escriptura i a la resta del món se li assignen permisos de lectura.

Mòdul Fitxer

El mòdul de fitxers s'utilitza per dur a terme moltes operacions de fitxers, com ara crear fitxers i directoris, assignar permisos de fitxers i establir enllaços simbòlics.

---
- name: Change file ownership, group, and permissions
  file:
    path: /etc/tecmint.conf
    owner: tecmint
    group: tecmint
    mode: '0644'

La reproducció anterior crea un fitxer anomenat tecmint.conf al directori /etc que estableix els permisos a 0644.

---
- name: Remove file (delete file)
  file:
    path: /etc/tecmint.conf
    state: absent

Això elimina o elimina el fitxer tecmint.conf.

---
- name: create a directory if it doesn’t exist
  file:
    path: /etc/mydirectory
    State: directory
    mode: '0777'

Això crearà un directori al directori /etc establint els permisos a 0777.

---
- name: Recursively deleting a  directory
  file:
    path: /etc/tecmint.conf
    state: absent

La reproducció anterior suprimeix de forma recursiva un directori.

Mòdul Lineinfile

El mòdul lineinfile és útil quan voleu canviar una sola línia en un fitxer. Pot substituir una línia existent.

---
 - name: Ensure SELinux is set to enforcing mode
  lineinfile:
    path: /etc/selinux/config
    regexp: '^SELINUX='
    line: SELINUX=disabled

El joc anterior estableix el valor de SELINUX com a desactivat.

SELINUX=disabled
---
- 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

Això afegeix l'entrada 10.200.50.51 linux-console.net al fitxer /etc/hosts.

Mòdul Arxiu

Un mòdul Arxiu s'utilitza per a la creació d'un arxiu comprimit d'un únic o diversos fitxers. Se suposa que la font de compressió que existeix és present a la destinació de destinació. Després de l'arxivat, el fitxer font es pot suprimir o esborrar més tard mitjançant la declaració remove=True.

- 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
- 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

A la reproducció anterior, el fitxer font /path/to/tecmint s'elimina un cop finalitzat l'arxiu.

- name: Create a bz2 archive of /path/to/tecmint
  archive:
    path: /path/to/tecmint
    format: bz2

Això crea un fitxer comprimit en format bz2 a partir del fitxer /path/to/tecmint.

Mòdul Git

El mòdul gestiona les comprovacions git dels dipòsits de programari.

- git:
    repo: 'https://foosball.example.org/path/to/repo.git'
    dest: /srv/checkout
    version: release-0.22

Mòdul de comandaments

Un dels mòduls més utilitzats, el mòdul d'ordres pren el nom de l'ordre i, posteriorment, el segueix una llista d'arguments. L'ordre es passa de la mateixa manera que escriuríeu en un shell de Linux.

- name: Executing a command using the command module
  command: cat helloworld.txt
---
 - 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

El mòdul d'ordres recupera el temps d'activitat dels servidors remots.

Variables per recuperar els resultats de les ordres en execució

Normalment, els llibres de jugades d'Ansible s'utilitzen per executar tasques en amfitrions gestionats sense mostrar la sortida a la línia d'ordres. Hi ha casos, però, en què és possible que se us demani que captureu la sortida o els resultats. En aquesta secció, us expliquem com podeu capturar la sortida d'un llibre de jugades en una variable i mostrar-la més tard.

S'utilitza un registre ansible per capturar la sortida d'una tasca i desar-la com a variable. A continuació, la variable contindrà la sortida estàndard de la tasca.

Per exemple, suposem que voleu comprovar l'ús del disc dels nodes gestionats als directoris arrel respectius mitjançant l'ordre df -Th /. Utilitzareu el mòdul ‘ordre’ per definir l’ordre i ‘registrar’ per desar la sortida std en una variable.

Per mostrar l'ordre, utilitzareu el mòdul ‘debug’ juntament amb el valor de retorn stdout.

---

 - hosts: all
   become: yes

   tasks:
     - name: Execute /boot usage on Hosts
       command: 'df -Th /'
       register: df

     - debug: var=df.stdout

Ara, anem a executar el llibre de jugades. En aquest cas, hem anomenat el nostre playbook check_disk_space.yml.

# ansible-playbook check_disk_space.yml

Com heu vist, la sortida està tot confusa i dificulta el seguiment.

Per alinear la sortida i facilitar la lectura, substituïu el valor de retorn stdout per stdout_lines.

---

 - hosts: all
   become: yes

   tasks:
     - name: Execute /boot usage on Hosts
       command: 'df -Th /'
       register: df

     - debug: var=df.stdout_lines

Utilitzeu condicionals per controlar l'execució del joc

Igual que en els llenguatges de programació, les declaracions condicionals s'utilitzen quan més d'un resultat és possible. Fem una ullada a algunes de les declaracions condicionals d'ús habitual als llibres de jugades d'Ansible.

De vegades, és possible que vulgueu realitzar tasques en nodes específics i no en altres. La sentència condicional quan és bastant fàcil d'utilitzar i d'implementar en un llibre de jugades. Quan utilitzeu la clàusula quan, simplement declareu la condició adjacent a la clàusula tal com es mostra:

when: condition

Quan es compleix la condició, la tasca es realitza al sistema remot.

Vegem uns quants exemples:

---
- hosts: all

  tasks:
  - name: Install Nginx on Debian
     apt: name=nginx state=present
     when: ansible_os_family == “Debian”

El joc anterior instal·la el servidor web Nginx als amfitrions que executen la família de distribucions Debian.

També podeu utilitzar l'operador OR i AND al costat de la sentència condicional 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”

Quan s'utilitza l'operador AND, s'han de complir ambdues declaracions perquè la tasca s'executi.

El joc anterior instal·la Nginx als nodes que executen una família de sistemes operatius Debian que és la versió 18.04. Òbviament, això serà Ubuntu 18.04.

Amb l'operador OR, la tasca s'executa si es compleix alguna de les condicions.

---
- hosts: all

  tasks:
  - name: Install Nginx on Debian
     apt: name=nginx state=present
     when: ansible_os_family == “Debian” or
	      Ansible_os_family == “SUSE”

El joc anterior instal·la servidors web Nginx a la família de sistemes operatius Debian o SUSE o a tots dos.

NOTA: Assegureu-vos sempre d'utilitzar el signe d'igualtat doble == quan proveu una condició.

Condicionals en bucles

Els condicionals també es poden utilitzar en un bucle. Diguem, per exemple, que teniu una llista de diversos paquets que cal instal·lar en nodes remots.

Al llibre de jocs següent, tenim una matriu anomenada paquets que conté una llista de paquets que cal instal·lar. Aquestes tasques es realitzaran una després de l'altra si la clàusula requerida s'estableix en 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 }}”  

Configura la gestió d'errors

De vegades, les tasques fallen quan s'executen llibres de jugades. Suposem que esteu executant 5 tasques en 3 servidors, tal com es mostra al llibre de jugades següent. Si es produeix un error a la tasca 3 (inici de MySQL) al servidor 2, Ansible deixarà d'executar les tasques restants al servidor 2 i intentarà completar les tasques restants a la resta dels servidors.

---
 - 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 >>

Si voleu coherència en l'execució del llibre de jugades, per exemple, atureu l'execució d'un llibre de jugades, si algun dels servidors falla, afegiu l'opció.

---
 - name: Install Software packages
   hosts: server1, server2, server3
   any_errors_fatal:  true
   tasks:

D'aquesta manera, si una tasca falla en un servidor, Ansible aturarà l'execució de tot el llibre de jugades a tots els servidors i sortirà.

Si voleu que el llibre de jocs ignori els errors i procediu a executar el conjunt de tasques restants, feu servir l'opció ignore_errors: True.

---
 - name: Install Software packages
   hosts: server1, server2, server3
   tasks:
- name: Install dependencies
<< some code >>
     ignore_errors: True

Creeu llibres de joc per configurar sistemes a un estat especificat

En aquesta secció, analitzem algunes opcions addicionals que estan disponibles quan s'executa un llibre de jocs.

Comencem amb el mode de comprovació o l'opció d'execució en sec. L'opció de mode d'execució en sec o de comprovació s'utilitza quan s'executa un llibre de jocs per comprovar si es trobaran errors i si hi ha cap canvi que es farà als amfitrions gestionats. Tanmateix, no fa cap canvi als nodes remots.

Per exemple, per executar en sec un llibre de jocs anomenat httpd.yml que instal·la i inicia l'execució del servidor web Apache:

# ansible-playbook httpd.yml --check

L'altra opció que hem de mirar és l'opció --start-at-task. S'utilitza quan s'especifica el nom de la tasca per on ha de començar o començar el llibre de jugades.

Prenguem un exemple: el llibre de jugades següent explica 2 tasques: la primera jugada instal·la el servidor web Apache i la segona instal·la la utilitat htop.

---
 - name: Install httpd

   hosts: all
   tasks:
    yum:	 
name: httpd
     state: Installed

- name: Install htop

      yum:  
      name: htop
      state: started

Si voleu ometre la instal·lació del servidor web Apache i, en canvi, instal·lar la utilitat htop, executeu:

# ansible-playbook playbook.yml --start-at-task “Install htop”

Finalment, podeu etiquetar les vostres tasques o jocs afegint l'opció d'etiquetes al vostre llibre de jugades tal com es mostra. Això és útil quan teniu un llibre de jugades bastant gran i voleu executar tasques específiques de tot el llibre de jocs.

---
 - 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"

Per ometre les etiquetes, utilitzeu les opcions --skip-tags com es mostra.

# ansible-playbook playbook.yml --skip-tags "Install"

En aquest tema, us hem portat a través dels mòduls que s'utilitzen habitualment a Ansible, com recuperar stdout de l'execució d'un llibre de jugades per a l'anàlisi, utilitzant condicionals al llibre de jugades i com gestionar els errors que es poden produir en executar tasques. Finalment, hem resumit la configuració dels llibres de jugades i com podeu utilitzar opcions addicionals per decidir quines tasques executar si no teniu intenció d'executar tot el llibre de jocs.