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