Cómo crear obras de teatro y libros de jugadas 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 las diversas tareas que pueden realizar 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 en RedHat como en Debian.

Son relativamente fáciles de adivinar. Existe el módulo apto 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

La reproducción anterior elimina de forma recursiva 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. Se asume que la fuente de compresión que existe está presente en el destino de destino. Después del archivo, 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 de 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, lo guiamos a través de 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, usará 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 llamado a nuestro libro de jugadas check_disk_space.yml.

# ansible-playbook check_disk_space.yml

Como ha visto, la salida está desordenada y dificulta su seguimiento.

Para alinear la salida y facilitar su lectura, reemplace el valor de retorno de stdout con 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 utiliza 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 el 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

Cree 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 debemos 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 resulta ú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.