Módulos Fundamentales de Ansible para la Gestión de Infraestructura

Gestión de Usuarios con el Módulo user

El módulo user de Ansible es esencial para la administración de cuentas de usuario en sistemas remotos. Permite crear, modificar y eliminar usuarios, así como controlar sus propiedades como el UID, GID, directorio de inicio, shell y grupos secundarios.

Creación de Usuarios

Para crear un nuevo usuario de forma ad-hoc, se puede utilizar el siguiente comando. Aquí, crearemos un usuario llamado devops_user con un comentario descriptivo:

ansible host_remoto -m user -a "name=devops_user comment='Usuario para Operaciones DevOps'"

La salida confirmará los cambios y mostrará los atributos asignados al nuevo usuario, como el UID y el directorio de inicio por defecto.

Para verificar que el usuario ha sido creado correctamente, podemos consultar el archivo /etc/passwd en el host remoto:

ansible host_remoto -m shell -a "grep devops_user /etc/passwd"

Este comando devolverá la línea correspondiente al usuario en /etc/passwd, confirmando su existencia y configuración.

Eliminación de Usuarios y Gestión de Grupos

El módulo user también facilita la eliminación completa de usuarios, incluyendo sus directorios de inicio y spools de correo. Además, permite añadir usuarios a grupos secundarios.

Para eliminar completamente un usuario, incluyendo su directorio de inicio y spools:

ansible host_remoto -m user -a "name=devops_user state=absent remove=yes"

Para añadir un usuario existente a un grupo secundario (por ejemplo, al grupo webserver), es crucial usar append=yes para no sobrescribir los grupos existentes:

ansible host_remoto -m user -a "name=existing_user groups=webserver append=yes"

Módulos para la Manipulación de Archivos

Ansible ofrece varios módulos para gestionar archivos y directorios en los hosts controlados.

Módulo file: Gestión de Archivos y Directorios

Este módulo es versátil para crear, modificar o eliminar archivos, directorios, enlaces simbólicos y enlaces duros. Sus parámetros clave incluyen:

  • path: Ruta al archivo o directorio.
  • state: Define el estado deseado (present, absent, directory, link, hard, touch).
  • mode: Permisos del archivo (ej. 0644).
  • owner: Propietario del archivo.
  • group: Grupo propietario del archivo.
  • src: Ruta de origen para enlaces simbólicos o duros.
  • dest: Ruta de destino para enlaces.

Ejemplo: Crear un enlace simbólico de /etc/hosts a /var/tmp/host_info:

ansible host_remoto -m file -a "src=/etc/hosts dest=/var/tmp/host_info state=link"

Módulo copy: Transferencia de Archivos del Nodo de Control

El módulo copy transfiere archivos o directorios del nodo de control a los hosts administrados. Parámetros importantes:

  • src: Ruta del archivo en el nodo de control.
  • dest: Ruta de destino en el host remoto.
  • backup: Si yes, crea una copia de seguridad del archivo de destino si existe.
  • content: Permite especificar el contenido del archivo directamente, sin necesidad de un archivo src.
  • remote_src: Si yes, src se refiere a un archivo ya existente en el host remoto (útil para mover o renombrar archivos en el mismo host).

Ejemplo: Copiar un archivo de configuración del nodo de control a un host remoto:

ansible host_remoto -m copy -a "src=/home/devops/config_app.ini dest=/etc/app/config.ini backup=yes"

Ejemplo: Crear un archivo con contenido específico directamente:

ansible host_remoto -m copy -a "content='SERVER_NAME=api.example.com\nPORT=8081' dest=/etc/app/settings.conf"

Módulo fetch: Recuperación de Archivos al Nodo de Control

El módulo fetch realiza la operación inversa a copy: trae archivos de los hosts remotos al nodo de control. Solo puede copiar archivos, no directorios.

  • src: Ruta del archivo en el host remoto.
  • dest: Directorio de destino en el nodo de control.
  • flat: Si yes, el archivo se guarda directamente en dest. Si no (por defecto), se crea una estructura de directorios que incluye el nombre del host remoto.

Ejemplo: Descargar un log de un host remoto al nodo de control, manteniendo la estructura por nombre de host:

ansible host_remoto -m fetch -a "src=/var/log/nginx/access.log dest=/tmp/logs_remotos"

Ejemplo: Descargar el mismo log, pero directamente al directorio de destino (flat=yes):

ansible host_remoto -m fetch -a "src=/var/log/nginx/error.log dest=/tmp/logs_remotos/ flat=yes"

Módulos de Gestión de Software

Módulo yum_repository: Configuración de Repositorios YUM/DNF

Este módulo permite gestionar los archivos de configuración de repositorios YUM o DNF.

  • name: Identificador único del repositorio.
  • description: Descripción del repositorio.
  • baseurl: URL base del repositorio.
  • enabled: Habilita (yes) o deshabilita (no) el repositorio.
  • file: Nombre del archivo .repo (sin la extensión).
  • state: present para crear, absent para eliminar.
ansible host_remoto -m yum_repository -a "name=app_repo description='Repositorio de Aplicaciones Personalizado' baseurl='http://repo.example.com/app/' enabled=yes file=custom_repos"

Módulo yum: Instalación y Eliminación de Paquetes

El módulo yum (o dnf en sistemas más modernos) instala, actualiza o elimina paquetes en sistemas basados en RPM.

  • name: Nombre del paquete o grupo de paquetes (ej. nginx, @Development Tools).
  • state: present (instala), absent (elimina), latest (asegura la última versión).
# Instalar el servidor web Nginx
ansible host_remoto -m yum -a "name=nginx state=present"

# Eliminar un paquete
ansible host_remoto -m yum -a "name=httpd state=absent"

# Asegurar la última versión de un paquete
ansible host_remoto -m yum -a "name=firewalld state=latest"

Módulos de Gestión de Servicios del Sistema

Módulo service: Control de Servicios Tradicionales

Para servicios gestionados por init.d o sysvinit, el módulo service es el indicado.

  • name: Nombre del servicio.
  • state: started (iniciar), stopped (detener), restarted (reiniciar), reloaded (recargar).
  • enabled: yes (habilitar al inicio), no (deshabilitar al inicio).
ansible host_remoto -m service -a "name=mysqld state=started enabled=yes"

Módulo systemd: Control de Servicios systemd

Similar al módulo service, pero diseñado específicamente para sistemas que utilizan systemd. Sus parámetros son análogos a service.

ansible host_remoto -m systemd -a "name=httpd state=restarted enabled=yes"

Módulo group: Gestión de Grupos de Usuarios

El módulo group permite crear y eliminar grupos de usuarios en los sistemas remotos.

  • name: Nombre del grupo.
  • state: present (crear), absent (eliminar).
  • gid: ID numérico del grupo.
ansible host_remoto -m group -a "name=developers state=present"

Módulo cron: Gestión de Tareas Programadas

El módulo cron permite crear, modificar o eliminar entradas en la tabla de cron de un usuario.

  • name: Nombre descriptivo de la tarea.
  • job: El comando a ejecutar.
  • minute, hour, day, month, weekday: Especifican el horario.
  • user: Usuario bajo el cual se ejecutará la tarea.
  • cron_file: Si se especifica, se creará un archivo cron específico en /etc/cron.d/.
  • state: present (crear/modificar), absent (eliminar).

Ejemplo: Programar un script de limpieza para que se ejecute diraiamente a las 3:00 AM:

ansible host_remoto -m cron -a "name='limpieza_logs' minute='0' hour='3' job='/usr/local/bin/cleanup_logs.sh' user='root'"

Módulo unarchive: Descompresión de Archivos

El módulo unarchive se utiliza para extraer archivos comprimidos (tar, gzip, bzip2, xz) en los hosts remotos.

  • src: Ruta del archivo comprimido. Puede estar en el nodo de control o en el host remoto.
  • dest: Directorio de destino en el host remoto donde se extraerán los contenidos.
  • remote_src: Si yes, src se refiere a un archivo en el host remoto. Por defecto es no (el archivo está en el nodo de control).
  • list_files: Si yes, solo lista los archivos dentro del archivo sin extraerlos.

Ejemplo: Descomprimir un archivo desde el nodo de control al host remoto:

ansible host_remoto -m unarchive -a "src=./aplicacion.tar.gz dest=/opt/aplicacion"

Ejemplo: Descomprimir un archivo ya presente en el host remoto:

ansible host_remoto -m unarchive -a "src=/tmp/backup.zip dest=/var/backups/ restore_dir remote_src=yes"

Módulo synchronize: Sincronización de Archivos y Directorios (rsync)

Este módulo utiliza rsync para sincronizar archivos y directorios entre el nodo de control y los hosts remotos, o entre dos puntos en un host remoto.

  • src: Origen de los archivos.
  • dest: Destino de los archivos.
  • mode: push (por defecto, del nodo de control al remoto) o pull (del remoto al nodo de control).
  • delete: Si yes, elimina archivos en el destino que no existen en el origen.

Ejemplo: Sincronizar el contenido de un directorio web del nodo de control al host remoto (push):

ansible host_remoto -m synchronize -a "src=/var/www/html/ dest=/srv/webapp/ delete=yes"

Ejemplo: Recuperar logs del host remoto al nodo de control (pull):

ansible host_remoto -m synchronize -a "src=/var/log/application/ dest=/tmp/logs_app_remote/ mode=pull"

Módulo get_url: Descarga de Archivos desde una URL

El módulo get_url descarga archivos de una URL a los hosts remotos.

  • url: La URL del archivo a descargar.
  • dest: Ruta de destino en el host remoto.

Ejemplo: Descargar un paquete de instalación de Node.js:

ansible host_remoto -m get_url -a "url=https://nodejs.org/dist/v18.17.0/node-v18.17.0-linux-x64.tar.xz dest=/tmp"

Módulo firewalld: Gestión de FirewallD

Para sistemas con firewalld, este módulo gestiona reglas de firewall.

  • zone: Zona de firewall a modificar.
  • service: Servicio predefinido a permitir/danegar (ej. http, https).
  • port: Puerto y protocolo a permitir/denegar (ej. 8080/tcp).
  • permanent: Si yes, el cambio es persistente.
  • state: enabled (permitir), disabled (denegar).
  • immediate: Si yes, aplica los cambios inmediatamente (equivalente a --reload).

Ejemplo: Permitir el puerto 8080 TCP de forma permanente y aplicar inmediatamente:

ansible host_remoto -m firewalld -a "port=8080/tcp permanent=yes state=enabled immediate=yes"

Módulo mount: Gestión de Puntos de Montaje

El módulo mount gestiona el montaje de sistemas de archivos y las entradas en /etc/fstab.

  • path: Directorio donde se montará el dispositivo.
  • src: Dispositivo o recurso a montar (ej. /dev/sdb1, servidor_nfs:/share).
  • fstype: Tipo de sistema de archivos (ej. ext4, xfs, nfs).
  • state:
    • mounted: Monta el sistema de archivos e inserta una entrada en fstab.
    • present: Solo inserta una entrada en fstab, no monta inmediatamente.
    • unmounted: Desmonta el sistema de archivos, pero mantiene la entrada en fstab.
    • absent: Desmonta y elimina la entrada de fstab.

Ejemplo: Montar una partición y asegurar su persistencia en fstab:

ansible host_remoto -m mount -a "src=/dev/sdb1 path=/data fstype=ext4 state=mounted"

Ejemplo: Desmontar y eliminar una entrada de fstab para un recurso NFS:

ansible host_remoto -m mount -a "src=nas_server:/backup path=/mnt/backup state=absent fstype=nfs"

Módulo parted: Gestión de Particiones de Disco

El módulo parted permite crear, modificar y eliminar particiones en dispositivos de almacneamiento.

  • device: Ruta al dispositivo de disco (ej. /dev/sdb).
  • label: Tipo de tabla de particiones (gpt, mbr).
  • number: Número de partición.
  • part_start, part_end: Rango de inicio y fin de la partición (ej. 1MiB, 10GiB).
  • state: present (crear), absent (eliminar), info (solo obtener información).
  • flags: Establece flags de partición (ej. lvm).

Ejemplo: Crear una partición primaria de 10GB en /dev/sdb:

ansible host_remoto -m parted -a "device=/dev/sdb number=1 state=present fs_type=ext4 part_start=1MiB part_end=10GiB"

Ejemplo: Eliminar la primera partición de /dev/sdb:

ansible host_remoto -m parted -a "device=/dev/sdb number=1 state=absent"

Es importante recordar que después de crear particiones, estas deben ser formateadas con un sistema de archivos antes de poder montarlas y utilizarlas.

Módulos de LVM (Logical Volume Management)

Módulo lvg: Gestión de Grupos de Volúmenes (Volume Groups)

Crea y gestiona grupos de volúmenes LVM.

  • vg: Nombre del grupo de volúmenes.
  • state: present (crear), absent (eliminar).
  • pvs: Lista de volúmenes físicos (particiones o discos) a incluir en el grupo.
  • pesize: Tamaño de las extensiones físicas (PE).
  • force: Si yes, permite eliminar grupos de volúmenes con volúmenes lógicos activos.

Ejemplo: Crear un grupo de volúmenes llamado datos_vg usando la partición /dev/sdb1:

ansible host_remoto -m lvg -a "vg=datos_vg pvs=/dev/sdb1 state=present"

Ejemplo: Eliminar el grupo de volúmenes datos_vg (forzando si hay volúmenes lógicos):

ansible host_remoto -m lvg -a "vg=datos_vg state=absent force=yes"

Módulo lvol: Gestión de Volúmenes Lógicos (Logical Volumes)

Crea y gestiona volúmenes lógicos dentro de un grupo de volúmenes.

  • lv: Nombre del volumen lógico.
  • vg: Nombre del grupo de volúmenes al que pertenece.
  • size: Tamaño del volumen lógico (ej. 10G, 500M).
  • state: present (crear/redimensionar), absent (eliminar).
  • force: Si yes, permite la reducción de tamaño del volumen lógico (con riesgo de pérdida de datos).

Ejemplo: Crear un volumen lógico de 5GB llamado app_data_lv en datos_vg:

ansible host_remoto -m lvol -a "vg=datos_vg lv=app_data_lv size=5g state=present"

Ejemplo: Reducir el tamaño de un volumen lógico (usar con precaución):

ansible host_remoto -m lvol -a "vg=datos_vg lv=app_data_lv size=2g state=present force=yes"

Módulo filesystem: Formateo de Sistemas de Archivos

Después de crear particiones o volúmenes lógicos, necesitan ser formateados para poder almacenar datos.

  • dev: Ruta al dispositivo o volumen (ej. /dev/sdb1, /dev/mapper/datos_vg-app_data_lv).
  • fstype: Tipo de sistema de archivos (ej. ext4, xfs).
  • force: Si yes, fuerza el formateo incluso si hay datos existentes.

Ejemplo: Formatear un volumen lógico como ext4:

ansible host_remoto -m filesystem -a "dev=/dev/mapper/datos_vg-app_data_lv fstype=ext4"

Módulos para la Modificación de Contenido de Archivos

Módulo lineinfile: Modificación de Líneas Específicas

Este módulo es ideal para modificar una sola línea o insertar contenido en un archivo basándose en una expresión regular. Es perfecto para archivos de configuración.

  • path: Ruta al archivo a modificar.
  • regexp: Expresión regular para buscar la línea a modificar. Si no se encuentra, se inserta una nueva línea.
  • line: El contenido de la línea a insertar o con la que reemplazar.
  • insertbefore, insertafter: Expresión regular para insertar la línea antes o después de una coincidencia.
  • backup: Si yes, crea una copia de seguridad del archivo antes de modificarlo.
  • create: Si yes, crea el archivo si no existe.
  • state: present (asegura la línea), absent (elimina la línea que coincide con regexp).
  • backrefs: Si yes y se usa regexp, permite usar grupos de captura en line (ej. \1).

Ejemplo de playbook para modificar una línea en /etc/ssh/sshd_config:

- name: Configurar PermitRootLogin a no
  hosts: servidores_ssh
  tasks:
    - name: Asegurar que PermitRootLogin esté deshabilitado
      ansible.builtin.lineinfile:
        path: /etc/ssh/sshd_config
        regexp: '^#?PermitRootLogin'
        line: 'PermitRootLogin no'
        backup: yes
      notify: Reiniciar sshd

- handlers:
    - name: Reiniciar sshd
      ansible.builtin.service:
        name: sshd
        state: restarted

Ejemplo de playbook para insertar una línea antes de una coincidencia:

- name: Añadir alias antes de una línea
  hosts: localhost
  tasks:
    - name: Insertar un alias antes de la configuración de PATH
      ansible.builtin.lineinfile:
        path: ~/.bashrc
        insertbefore: '^export PATH'
        line: 'alias ll="ls -alF"'
        backup: yes

Módulo blockinfile: Modificación de Bloques de Contenido

Este módulo gestiona bloques de texto multilínea, delimitados por marcadores, útiles para inyectar configuraciones complejas o scripts.

  • path: Ruta al archivo.
  • block: El contenido multilínea a insertar.
  • marker: Una cadena que define los marcadores de inicio y fin del bloque (ej. # {mark} ANSIBLE MANAGED BLOCK). Esto permite gestionar múltiples bloques en el mismo archivo.
  • state: present (asegura el bloque), absent (elimina el bloque).
  • create: Si yes, crea el archivo si no existe.

Ejemplo de playbook para insertar un bloque de configuración en /etc/hosts:

- name: Añadir entradas personalizadas a /etc/hosts
  hosts: localhost
  tasks:
    - name: Insertar bloque de configuración de hosts
      ansible.builtin.blockinfile:
        path: /etc/hosts
        block: |
          # -- INICIO Bloque de hosts personalizados --
          192.168.1.100   webserver.local
          192.168.1.101   dbserver.local
          # -- FIN Bloque de hosts personalizados --
        marker: "# {mark} Bloque de Hosts Gestionado por Ansible"
        create: yes
        backup: yes

Ejemplo de playbook para eliminar un bloque específico:

- name: Eliminar un bloque de configuración de /etc/hosts
  hosts: localhost
  tasks:
    - name: Eliminar el bloque de hosts personalizados
      ansible.builtin.blockinfile:
        path: /etc/hosts
        state: absent
        marker: "# {mark} Bloque de Hosts Gestionado por Ansible"

Etiquetas: Ansible ConfigurationManagement linux SystemAdministration automation

Publicado el 6-3 00:26