Cómo crear playbooks y playbooks de Ansible - Parte 5
En esta Parte 5 de Ansible Series, explicaremos cómo crear Ansible Plays y Playbooks usando módulos de Ansible.
Ansible se envía con scripts independientes llamados módulos que se utilizan en los libros de jugadas para la ejecución de tareas especializadas en nodos remotos.
Los módulos son útiles para automatizar tareas como la administración de paquetes, el archivo y la copia de archivos, por mencionar solo algunos. Le permiten realizar ajustes en los archivos de configuración y administrar dispositivos como enrutadores, conmutadores, equilibradores de carga, cortafuegos y una gran cantidad de otros dispositivos.
El objetivo de este subtema es brindarle una descripción general de varias tareas que se pueden realizar con los módulos de Ansible:
Gestión de paquetes en Linux
La administración de paquetes es una de las tareas más esenciales y frecuentes que realizan los administradores de sistemas. Ansible se envía con módulos que lo ayudan a ejecutar tareas de administración de paquetes tanto en sistemas basados u200bu200ben RedHat como en Debian.
Son relativamente fáciles de adivinar. Existe el módulo apto para la gestión de paquetes APT para Debian, el antiguo módulo yum para la gestión de paquetes YUM y el módulo dnf asociado con las distribuciones RHEL más nuevas.
A continuación se muestran algunos ejemplos de cómo se pueden usar los módulos en un libro de jugadas:
--- - 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ódulo de servicio
El módulo de servicio permite a los administradores del sistema iniciar, detener, actualizar, actualizar y recargar servicios en el 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ódulo de copia
Como sugiere el nombre, el módulo de copia copia archivos de una ubicación en la máquina remota a una ubicación diferente en la misma 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 libro de jugadas copia el archivo de configuración tecmint.conf del directorio/etc/files/al directorio/srv/como usuario tecmint con permisos 0644.
Los permisos también se pueden representar mediante una representación simbólica como se muestra en la última línea.
--- - 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
Los permisos del ejemplo anterior se pueden representar como se muestra en la última línea. Al usuario se le asignan permisos de lectura y escritura, al grupo se le asignan permisos de escritura y al resto del mundo se le asignan permisos de lectura.
Módulo de archivo
El módulo de archivo se utiliza para realizar muchas operaciones de archivo, incluida la creación de archivos y directorios, la asignación de permisos de archivo y la configuración de enlaces simbólicos.
--- - name: Change file ownership, group, and permissions file: path: /etc/tecmint.conf owner: tecmint group: tecmint mode: '0644'
La obra anterior crea un archivo llamado tecmint.conf en el directorio/etc estableciendo permisos en 0644.
--- - name: Remove file (delete file) file: path: /etc/tecmint.conf state: absent
Esto quita o borra el archivo tecmint.conf.
--- - name: create a directory if it doesn’t exist file: path: /etc/mydirectory State: directory mode: '0777'
Esto creará un directorio en el directorio/etc estableciendo los permisos en 0777.
--- - name: Recursively deleting a directory file: path: /etc/tecmint.conf state: absent
El juego anterior borra recursivamente un directorio.
Módulo de archivo de línea
El módulo lineinfile es útil cuando desea cambiar una sola línea en un archivo. Puede reemplazar una línea existente.
--- - name: Ensure SELinux is set to enforcing mode lineinfile: path: /etc/selinux/config regexp: '^SELINUX=' line: SELINUX=disabled
La reproducción anterior establece el valor de SELINUX en deshabilitado.
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 tecmint.com create: yes
Esto agrega la entrada 10.200.50.51 tecmint.com al archivo/etc/hosts.
Módulo de archivo
Un módulo de archivo se utiliza para la creación de un archivo comprimido de uno o varios archivos. Supone que la fuente de compresión que existe está presente en el destino de destino. Una vez archivado, el archivo de origen puede eliminarse o eliminarse posteriormente mediante la instrucción remove u003d 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
En la reproducción anterior, el archivo de origen/ruta/a/tecmint se elimina una vez que se completa el archivo.
- name: Create a bz2 archive of /path/to/tecmint archive: path: /path/to/tecmint format: bz2
Esto crea un archivo comprimido en formato bz2 desde el archivo/ruta/a/tecmint.
Módulo Git
El módulo gestiona las comprobaciones de git de los repositorios de software.
- git: repo: 'https://foosball.example.org/path/to/repo.git' dest: /srv/checkout version: release-0.22
Módulo de mando
Uno de los módulos más utilizados, el módulo de comando toma el nombre del comando y luego lo sigue una lista de argumentos. El comando se pasa de la misma manera que lo escribiría 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ódulo de comando recupera el tiempo de actividad de los servidores remotos.
Variables para recuperar los resultados de los comandos en ejecución
Por lo general, los libros de jugadas de Ansible se utilizan para ejecutar tareas en hosts administrados sin mostrar el resultado en la línea de comando. Sin embargo, hay casos en los que es posible que deba capturar la salida o los resultados. En esta sección, le mostramos cómo puede capturar la salida de un libro de jugadas en una variable y luego mostrarla.
Un registro ansible se utiliza para capturar la salida de una tarea y guardarla como variable. A partir de entonces, la variable contendrá la salida estándar de la tarea.
Por ejemplo, supongamos que desea verificar el uso del disco de los nodos administrados en los respectivos directorios raíz mediante el comando df -Th/
. Va a utilizar el módulo "comando"
para definir el comando y "registrar"
para guardar la salida estándar en una variable.
Para mostrar el comando, utilizará el módulo ‘debug’
junto con el valor de retorno de stdout.
--- - hosts: all become: yes tasks: - name: Execute /boot usage on Hosts command: 'df -Th /' register: df - debug: var=df.stdout
Ahora, ejecutemos el libro de jugadas. En este caso, hemos nombrado nuestro libro de jugadas check_disk_space.yml.
# ansible-playbook check_disk_space.yml

Como ha visto, la salida está mezclada y dificulta su seguimiento.
Para alinear la salida y facilitar la lectura, reemplace el valor de retorno de stdout por stdout_lines.
--- - hosts: all become: yes tasks: - name: Execute /boot usage on Hosts command: 'df -Th /' register: df - debug: var=df.stdout_lines
Usa condicionales para controlar la ejecución del juego
Al igual que en los lenguajes de programación, las declaraciones condicionales se utilizan cuando es posible más de un resultado. Echemos un vistazo a algunas de las declaraciones condicionales de uso común en los libros de jugadas de Ansible.
A veces, es posible que desee realizar tareas en nodos específicos y no en otros. La declaración condicional 'when'
es bastante fácil de usar e implementar en un libro de jugadas. Cuando use la cláusula 'when'
simplemente declare la condición adyacente a la cláusula como se muestra:
when: condition
Cuando se cumple la condición, la tarea se realiza en el sistema remoto.
Veamos algunos ejemplos:
--- - hosts: all tasks: - name: Install Nginx on Debian apt: name=nginx state=present when: ansible_os_family == “Debian”
El juego anterior instala el servidor web Nginx en hosts que ejecutan la familia de distribuciones Debian.
También puede usar el operador OR
y AND
junto con when la declaración condicional.
--- - hosts: all tasks: - name: Install Nginx on Debian apt: name=nginx state=present when: ansible_os_family == “Debian” and ansible_distribution_version == “18.04”
Cuando se usa el operador AND
, ambas declaraciones deben cumplirse para que se ejecute la tarea.
El juego anterior instala Nginx en nodos que ejecutan una familia de sistemas operativos Debian que es la versión 18.04. Obviamente, este será Ubuntu 18.04.
Con el operador OR
, la tarea se ejecuta si se cumple alguna de las condiciones.
--- - hosts: all tasks: - name: Install Nginx on Debian apt: name=nginx state=present when: ansible_os_family == “Debian” or Ansible_os_family == “SUSE”
El juego anterior instala servidores web Nginx en Debian o en la familia de sistemas operativos SUSE o en ambos.
NOTA: Asegúrese siempre de utilizar el signo de doble igualdad u003du003d
cuando pruebe una condición.
Condicionales en bucles
Los condicionales también se pueden utilizar en bucle. Digamos, por ejemplo, que tiene una lista de varios paquetes que deben instalarse en nodos remotos.
En el libro de jugadas a continuación, tenemos una matriz llamada paquetes que contiene una lista de paquetes que deben instalarse. Estas tareas se llevarán a cabo una tras otra si la cláusula requerida se establece 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 }}”
Configurar manejo de errores
A veces, las tareas fallan al ejecutar libros de jugadas. Supongamos que está ejecutando 5 tareas en 3 servidores, como se muestra en el manual a continuación. Si ocurre un error en la tarea 3 (Iniciar MySQL) en el servidor 2, Ansible dejará de ejecutar las tareas restantes en el servidor 2 e intentará completar las tareas restantes en el resto de los servidores.
--- - 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 desea coherencia en la ejecución del libro de jugadas, por ejemplo, detenga la ejecución de un libro de jugadas, si uno de los servidores falla, agregue la opción.
--- - name: Install Software packages hosts: server1, server2, server3 any_errors_fatal: true tasks:
De esta manera, si una tarea falla en un servidor, Ansible detendrá la ejecución de todo el libro de jugadas en todos los servidores y saldrá.
Si desea que el libro de jugadas ignore los errores y proceda a ejecutar el conjunto restante de tareas, utilice la opción ignore_errors: True.
--- - name: Install Software packages hosts: server1, server2, server3 tasks: - name: Install dependencies << some code >> ignore_errors: True
Crear guías para configurar sistemas en un estado específico
En esta sección, analizamos algunas opciones adicionales que están disponibles cuando se ejecuta un libro de jugadas.
Comencemos con el modo de verificación o la opción de ejecución en seco. La opción de ejecución en seco o modo de verificación se utiliza cuando se ejecuta un libro de jugadas para verificar si se encontrarán errores y si se realizarán cambios en los hosts administrados. Sin embargo, no realiza ningún cambio en los nodos remotos.
Por ejemplo, para ejecutar en seco un libro de jugadas llamado httpd.yml
que instala e inicia la ejecución del servidor web Apache:
# ansible-playbook httpd.yml --check

La otra opción que tenemos que mirar es la opción --start-at-task
. Esto se usa al especificar el nombre de la tarea en la que el libro de jugadas debe comenzar o comenzar.
Tomemos un ejemplo: el libro de jugadas a continuación detalla 2 tareas: la primera obra instala el servidor web Apache y la segunda instala la utilidad htop.
--- - name: Install httpd hosts: all tasks: yum: name: httpd state: Installed - name: Install htop yum: name: htop state: started
Si desea omitir la instalación del servidor web Apache y en su lugar instalar la utilidad htop, ejecute:
# ansible-playbook playbook.yml --start-at-task “Install htop”

Por último, puede etiquetar sus tareas o jugadas agregando la opción de etiquetas a su libro de jugadas como se muestra. Esto es útil cuando tiene un libro de jugadas bastante grande y desea ejecutar tareas específicas de todo el libro de jugadas.
--- - 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"
Para omitir las etiquetas, use las opciones --skip-tags
como se muestra.
# ansible-playbook playbook.yml --skip-tags "Install"
En este tema, lo llevamos a través de los módulos de uso común en Ansible, cómo recuperar stdout de la ejecución de un libro de jugadas para su análisis, uso de condicionales en el libro de jugadas y cómo administrar los errores que pueden ocurrir al ejecutar tareas. Por último, recapitulamos la configuración de los libros de jugadas y cómo puede usar opciones adicionales para decidir qué tareas ejecutar si no tiene la intención de ejecutar todo el libro de jugadas.