10 módulos importantes para Ansible

Seguimos la senda que iniciamos el año pasado hablando de la plataforma de automatización y gestión de infraestructura IT llamada Ansible. Antes de nada, para ponernos en situación, hay que recordar que ya hemos contestado la pregunta: ¿En qué consiste Ansible?, además de ver su instalación, los primeros pasos en su uso y como crear nuestro primer Playbook.

La intención de esta entrada es ver como funcionan los módulos en Ansible, que no dejan de ser scripts independientes que podemos utilizar dentro de un Playbook (libro de jugadas), como ya hemos visto. Mostrando los más interesantes a la par de utilizados.

Recuerda que Ansible tiene tres archivos principales que debemos tener en cuenta:

  • El fichero de inventario, que contiene la lista de nodos que deben gestionarse.
  • El fichero Ansible.cfg: ubicado de forma predeterminada en “/etc/ansible/ansible.cfg”, tiene las opciones necesarias respecto al escalado de privilegios y la ubicación del archivo de inventario.
  • El fichero principal: un Playbook y libro de jugadas que indica los módulos que realizan diversas tareas en un host incluido en un inventario de archivo de hosts.

Módulo 1: Gestor de paquetes

Existe un módulo para los gestores de paquetes más populares, como DNF o APT, que nos permite instalar cualquier paquete en el sistema. Esta funcionalidad depende complemente del administrador de paquetes, pero generalmente estos módulos pueden instalar, actualizar, degradas, eliminar y enumerar paquetes. Los nombres de los módulos relevantes son fáciles de adivinar, por ejemplo, el módulo DNF es «dnf_module«, el antiguo módulo YUM sería «yum_module«, mientras al respecto de APT sería «apt_module«, por hablar de los más habituales.

Veamos algunos ejemplos:

Ejemplo 1:

- name: Instalar la ultima versión de Apache y MariaDB
  dnf:
    name:
     - httpd
      - mariadb-server
    state: latest

Ejemplo 2:

- name: Instalar una lista de paquetes
  yum:
    name:
     - nginx
      - postgresql
      - postgresql-server
    state: present

Módulos 2: Service

Después de instalar un paquete, necesita un módulo para iniciarlo. El módulo service nos permite iniciar, detener y volver cargar los paquetes instalados.

Ejemplo 1:

- name: Encender el servicio foo, basado en el proceso /usr/bin/foo
  service:
    name: foo
    pattern: /usr/bin/foo
    state: started

Ejemplo 2:

- name: Reinciar el servicio de red en la interfaz eth0
  service:
    name: network
    state: restarted
    args: eth0

Módulo 3: Copy

Este módulo copia un archivo desde la máquina local o remota a una ubicación en la máquina remota.

Ejemplo 1:

- name: Copia el fichero "ntp.conf" en la ubicacion, copia de seguridad del original si difiere de la versión copiada
  copy:
    src: /mine/ntp.conf
    dest: /etc/ntp.conf
    owner: root
    group: root
    mode: '0644'
    backup: yes

Ejemplo 2:

- name: Copia el archivo con el propietario y el permiso, utilizando una representación simbólica
  copy:
    src: /srv/myfiles/foo.conf
    dest: /etc/foo.conf
    owner: foo
    group: foo
    mode: u=rw,g=r,o=r

Módulo 4: Debug

El módulo debug imprime declaraciones durante la ejecución y puede ser útil para depurar variables o expresiones sin tener que detener el libro de jugadas.

Ejemplo 1:

name: Muestra las variables / acciones conocidas para un host
  debug:
    var: hostvars[inventory_hostname]
    verbosity: 4

Ejemplo 2:

- name: Escribir algún contenido en un archivo /tmp/foo.txt
  copy:
    dest: /tmp/foo.txt
    content: |
     Good Morning!
      Awesome sunshine today.
    register: display_file_content
- name: Debug display_file_content
    debug:
      var: display_file_content
      verbosity: 2

Esto registra el contenido de la salida del módulo de copia y lo muestra solo cuando especifica verbosidad como 2.

Por ejemplo:

ansible-playbook demo.yaml -vv

Módulo 5: File

El módulo file maneja los ficheros y sus propiedades

  • Establece atributos de archivos, enlaces simbólicos o directorios
  • También elimina archivos, enlaces simbólicos o directorios.

Ejemplo 1:

- name: Cambia el propietario, grupo y permisos
  file:
    path: /etc/foo.conf
    owner: foo
    group: foo
    mode: '0644'

Esto crea un archivo llamado foo.conf y establece el permiso en 0644.

Ejemplo 2:

- name: Crea un directorio si este no existe
  file:
    path: /etc/some_directory
    state: directory
    mode: '0755'

Esto crea un directorio llamado some_directory y establece el permiso en 0755.

Módulo 6: Lineinfile

El módulo lineinfile maneja líneas de texto en un fichero.

  • Asegura que una línea particular esté en un archivo o reemplaza una línea existente usando una expresión regular referenciada hacia atrás.
  • Es principalmente útil cuando desea cambiar solo una línea en un archivo.

Ejemplo 1:

- name: Indica el modo enforcing para SELINUX
  lineinfile:
    path: /etc/selinux/config
    regexp: '^SELINUX='
    line: SELINUX=enforcing

Establece el valor SELINUX=enforcing

Ejemplo 2:

- name: Agrega una línea a un archivo si el archivo no existe, sin pasar regexp
  lineinfile:
    path: /etc/resolv.conf
    line: 192.168.1.99 foo.lab.net foo
    create: yes

Añade una entrada para IP y nombre de host en el fichero resolv.conf

Módulo 7: Git

El módulo git gestiona las revisiones de git contra los repositorios para implementar archivos o software.

Ejemplo 1:

# Crear el fichero Git desde el repo
- git:
    repo: https://github.com/ansible/ansible-examples.git
    dest: /src/ansible-examples
    archive: /tmp/ansible-examples.zip

Ejemplo 2:

- git:
    repo: https://github.com/ansible/ansible-examples.git
    dest: /src/ansible-examples
    separate_git_dir: /src/ansible-examples.git

Este último ejemplo se encarga de clonar un repositorio en un directorio separado de Git.

Módulo 8: Cli_command

El módulo cli_command, disponible desde la versión de Ansible 2.7, proporciona una forma independiente de la plataforma de enviar configuraciones basadas en texto a dispositivos de red a través del complemento de conexión network_cli

Ejemplo 1:

- name: Commit con comentario
  cli_config:
    config: set system host-name foo
    commit_comment: this is a test

Esto establece el nombre de host para un switch y muestra un mensaje de confirmación.

Ejemplo 2:

name: Configure la ruta del backup
  cli_config:
    config: "{{ lookup('template', 'basic/config.j2') }}"
    backup: yes
    backup_options:
      filename: backup.cfg
      dir_path: /home/user

Esto hace una copia de seguridad de una configuración en un archivo de destino diferente.

Módulo 9: Archive

El módulo archive crea un archivo comprimido de uno o más archivos. Por defecto, supone que la fuente de compresión existe en el destino.

Ejemplo 1:

- name: Comprime el directorio /path/to/foo/ en /path/to/foo.tgz
  archive:
    path: /path/to/foo
    dest: /path/to/foo.tgz

Ejemplo 2:

- name: Crear un fichero comprimido bz2, en la ruta /path
  archive:
    path:
   - /path/to/foo
    - /path/wong/foo
    dest: /path/file.tar.bz2
    format: bz2

Módulo 10: Command

Uno de los módulos más básicos pero útil, el módulo command toma el nombre del comando seguido de una lista de argumentos delimitados por espacios.

Ejemplo 1:

- name: return motd to registered var
  command: cat /etc/motd
  register: mymotd

Ejemplo 2:

- name: Cambia el directorio de trabajo a somedir/ y ejecuta el comando db_owner si /path/to/database no existe.
  command: /usr/bin/make_database.sh db_user db_name
  become: yes
  become_user: db_owner
  args:
    chdir: somedir/
    creates: /path/to/database

Conclusión

Hay toneladas de módulos disponibles en Ansible, pero estos diez son los más básicos y potentes que podemos utilizar para un trabajo de automatización. A medida que cambian sus requisitos, podemos obtener información sobre otros módulos útiles ingresando ansible-doc nombre-módulo en la línea de comandos o puedes consultar la documentación oficial.

Esta entrada es una adaptación al castellano de la entrada escrita en inglés por el autor Shashank Hegde en la plataforma Opensource.com, llamada: 10 Ansible modules you need to know