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: Siyes, crea una copia de seguridad del archivo de destino si existe.content: Permite especificar el contenido del archivo directamente, sin necesidad de un archivosrc.remote_src: Siyes,srcse 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: Siyes, el archivo se guarda directamente endest. Sino(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:presentpara crear,absentpara 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: Siyes,srcse refiere a un archivo en el host remoto. Por defecto esno(el archivo está en el nodo de control).list_files: Siyes, 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) opull(del remoto al nodo de control).delete: Siyes, 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: Siyes, el cambio es persistente.state:enabled(permitir),disabled(denegar).immediate: Siyes, 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 enfstab.present: Solo inserta una entrada enfstab, no monta inmediatamente.unmounted: Desmonta el sistema de archivos, pero mantiene la entrada enfstab.absent: Desmonta y elimina la entrada defstab.
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: Siyes, 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: Siyes, 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: Siyes, 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: Siyes, crea una copia de seguridad del archivo antes de modificarlo.create: Siyes, crea el archivo si no existe.state:present(asegura la línea),absent(elimina la línea que coincide conregexp).backrefs: Siyesy se usaregexp, permite usar grupos de captura enline(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: Siyes, 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"