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.