SaltStack es una herramienta de automatización y gestión de infraestructura IT que permite a los administradores de sistemas controlar y configurar servidores y servicios de manera eficiente y escalable. Se clasifica como un MDA (Motor de Automatización), similar a otras herramientas como Puppet o Ansible.
SaltStack es usado principalmente para:
Gestión de Configuración: Permite mantener la configuración de múltiples servidores de manera consistente y automatizada. Puedes definir configuraciones en archivos YAML que luego son aplicados a tus servidores de forma centralizada.
Orquestación: Automatiza la ejecución de tareas complejas en toda la infraestructura, como el despliegue de aplicaciones, actualizaciones de software o reinicios programados.
Administración remota: Proporciona un control remoto avanzado, permitiendo ejecutar comandos en servidores específicos o en grupos de servidores a través de su sistema de agentes.
Monitorización y reparación automática: Puedes definir condiciones bajo las cuales SaltStack monitorea el estado de los sistemas y actúa automáticamente en caso de que algo falle (por ejemplo, reiniciar un servicio).
SaltStack sigue una arquitectura maestro/agente (master/minion):
- Salt Master: El nodo principal que coordina y gestiona los comandos enviados a los servidores.
- Salt Minion: Los nodos que ejecutan las órdenes enviadas desde el Salt Master.
En comparación con otras herramientas como Ansible o Puppet, SaltStack se destaca por su velocidad (usa ZeroMQ para la comunicación), y su capacidad para realizar tanto tareas de administración de configuración como de orquestación, con una arquitectura modular y flexible.
Escalabilidad y Rendimiento:
- SaltStack es extremadamente eficiente en la comunicación gracias a su uso de ZeroMQ, un protocolo de mensajería asíncrono. Esto le permite gestionar miles de minions a la vez con latencias mínimas, haciéndolo adecuado para grandes despliegues en la nube.
Altamente Modular:
- SaltStack es muy modular, lo que significa que puedes seleccionar y cargar solo los módulos que necesites. Si no quieres usar el modo maestro/minion, SaltStack también soporta un modo sin agente (agentless), similar a Ansible, donde el Master puede ejecutar comandos directamente vía SSH.
Orquestación:
- SaltStack no solo gestiona configuraciones de servidores, sino que también puede orquestar tareas complejas en varios servidores a la vez. Esto es útil para ejecutar despliegues multinodo, como el aprovisionamiento de bases de datos o clusters de aplicaciones.
Monitorización Reactiva:
- SaltStack puede usar un sistema llamado Salt Reactors, que responde a eventos en tiempo real. Por ejemplo, si un servicio cae, el reactor puede automáticamente reiniciar el servicio o disparar una alerta.
Integración con otras Herramientas:
- SaltStack se integra bien con una variedad de herramientas populares de la industria, como Docker, Kubernetes, VMware, AWS, y muchos otros. Esto facilita la gestión de entornos híbridos.
Despliegue de Software:
- Imagina que tienes 100 servidores y necesitas instalar y configurar un servidor web en cada uno. SaltStack permite definir un estado con la configuración necesaria, y luego simplemente aplicar ese estado a todos los servidores. Salt se encarga de asegurar que todos los servidores tengan la misma configuración.
Parcheo de Seguridad Automático:
- Con SaltStack, puedes automatizar el proceso de parcheo de seguridad en tus servidores. Por ejemplo, podrías definir un cron job que periódicamente aplique actualizaciones de seguridad y luego reinicie los servicios necesarios.
Orquestación Compleja:
- En un despliegue multinodo (por ejemplo, un clúster de bases de datos distribuidas), SaltStack puede gestionar el orden en que los nodos deben configurarse o reiniciarse, asegurando que no haya interrupciones en el servicio.
Monitoreo y Reparación en Tiempo Real:
- SaltStack puede monitorear continuamente los estados de los servidores. Si un servicio como Apache falla en un servidor, SaltStack puede detectar el problema y reiniciar automáticamente el servicio sin intervención manual.
Ventajas:
- Velocidad: ZeroMQ permite que SaltStack sea extremadamente rápido en la comunicación con los servidores.
- Escalabilidad: Puede gestionar miles de servidores de manera eficiente.
- Flexibilidad: Soporta tanto un enfoque con agentes como sin agentes, y es muy personalizable.
- Reactividad: Los reactores permiten acciones automáticas en base a eventos, útil para la autorreparación.
Desventajas:
- Curva de aprendizaje: Aunque potente, SaltStack puede tener una curva de aprendizaje pronunciada debido a la cantidad de funcionalidades y su arquitectura flexible.
- Complejidad en configuraciones grandes: En infraestructuras muy grandes, con muchos estados y minions, puede volverse difícil mantener un control preciso de todo lo que ocurre.
Profundizando en SaltStack, vale la pena destacar sus componentes clave, su modo de funcionamiento y algunas características avanzadas que lo hacen tan potente para la automatización de infraestructuras.
Salt Master:
- Es el nodo central de la arquitectura. Aquí es donde se definen los estados, los archivos de configuración, y desde donde se envían los comandos a los Salt Minions. Los administradores pueden interactuar con el Salt Master utilizando la línea de comandos (CLI) o una API REST llamada Salt API para realizar automatizaciones a nivel de aplicación.
Salt Minion:
- Cada máquina administrada tiene un Salt Minion instalado. Este agente se comunica con el Salt Master, recibe comandos y ejecuta las tareas correspondientes en el servidor donde reside. Los Minions también pueden comunicarse entre sí para orquestar tareas complejas de manera distribuida.
Grains:
- Los grains son datos estáticos que describen el entorno y la configuración de un minion, como su sistema operativo, direcciones IP, y arquitectura. Estos datos son útiles para agrupar minions y aplicar configuraciones o comandos específicos según las características del sistema.
Pillars:
- Son variables de configuración que se pueden definir de manera segura y que están asociadas a uno o más Minions. Esto permite administrar configuraciones sensibles como contraseñas o claves privadas de forma segura.
States (Estados):
- En SaltStack, los states son declaraciones de cómo debería estar configurado un sistema. Se escriben en archivos YAML y definen qué software debe estar instalado, cómo deben configurarse los servicios, qué archivos deben existir, etc. Los estados son idempotentes, lo que significa que se pueden aplicar múltiples veces sin cambiar el resultado una vez que el estado deseado ha sido alcanzado.
Modules:
- SaltStack ofrece una gran cantidad de módulos que proporcionan funcionalidades específicas, como instalar paquetes, manejar servicios o administrar usuarios. Los módulos permiten extender las capacidades de SaltStack a través de código Python.
Runners:
- Los runners son scripts que se ejecutan en el Salt Master y que permiten llevar a cabo tareas avanzadas de orquestación o administrar Minions a gran escala, como sincronizar estados o reiniciar servicios en varias máquinas.
Para empezar a usar SaltStack, necesitas instalar el Salt Master y los Salt Minions. Aquí te detallo los pasos básicos para configurar y utilizar SaltStack en una infraestructura estándar con un maestro y varios minions.
Instalación del Salt Master:
# Agregar el repositorio de SaltStack
wget -O - https://repo.saltproject.io/py3/ubuntu/20.04/amd64/latest/SALTSTACK-GPG-KEY.pub | sudo apt-key add -
sudo echo "deb http://repo.saltproject.io/py3/ubuntu/20.04/amd64/latest focal main" > /etc/apt/sources.list.d/saltstack.list
# Actualizar los repositorios e instalar salt-master
sudo apt-get update
sudo apt-get install salt-master
Una vez instalado, asegúrate de que el servicio está activo:
sudo systemctl start salt-master
sudo systemctl enable salt-master
Instalación del Salt Minion (en los servidores que vas a gestionar):
# Agregar el repositorio de SaltStack en el minion
wget -O - https://repo.saltproject.io/py3/ubuntu/20.04/amd64/latest/SALTSTACK-GPG-KEY.pub | sudo apt-key add -
sudo echo "deb http://repo.saltproject.io/py3/ubuntu/20.04/amd64/latest focal main" > /etc/apt/sources.list.d/saltstack.list
# Actualizar los repositorios e instalar salt-minion
sudo apt-get update
sudo apt-get install salt-minion
Configura el Salt Minion para que se comunique con el Salt Master. Edita el archivo de configuración /etc/salt/minion y especifica la IP o nombre del servidor del Master:
sudo nano /etc/salt/minion
# Dentro del archivo, busca y cambia la línea:
master: <IP_o_nombre_del_salt_master>
Luego, inicia el servicio del minion:
sudo systemctl start salt-minion
sudo systemctl enable salt-minion
Instalación del Salt Master:
# Agregar el repositorio de SaltStack
sudo yum install https://repo.saltproject.io/py3/redhat/salt-repo-latest.el7.noarch.rpm
# Instalar salt-master
sudo yum install salt-master
Instalación del Salt Minion:
# Agregar el repositorio de SaltStack en el minion
sudo yum install https://repo.saltproject.io/py3/redhat/salt-repo-latest.el7.noarch.rpm
# Instalar salt-minion
sudo yum install salt-minion
Configura la IP o el nombre del Salt Master en el archivo /etc/salt/minion, como en Ubuntu, y luego inicia el servicio del minion.
Los Salt Minions deberán solicitar ser aceptados por el Salt Master. Para ver qué minions están solicitando conexión, en el Salt Master ejecuta:
sudo salt-key -L
Te mostrará algo como esto:
Unaccepted Keys:
minion1
minion2
Accepted Keys:
(minions ya aceptados)
Para aceptar a todos los minions:
sudo salt-key -A
Para aceptar un minion específico:
sudo salt-key -a minion1
Una vez que los minions han sido aceptados, puedes empezar a ejecutar comandos desde el Salt Master. SaltStack utiliza una sintaxis de comandos sencilla:
sudo salt '*' test.ping
Este comando le pedirá a todos los minions (* significa todos los minions) que respondan con un "pong" si están activos. Deberías ver algo como:
minion1:
True
minion2:
True
Puedes ejecutar cualquier comando en los minions utilizando cmd.run. Por ejemplo, para obtener la fecha en los servidores minions:
sudo salt '*' cmd.run 'date'
Los states en SaltStack permiten aplicar configuraciones declarativas a los minions. Estos se escriben en archivos YAML y definen el estado deseado de un sistema. Un estado básico podría ser la instalación de un paquete.
sudo mkdir -p /srv/salt
apache.sls para definir la instalación de Apache:sudo nano /srv/salt/apache.sls
apache2:
pkg.installed: []
apache_service:
service.running:
- name: apache2
- enable: True
Este archivo le dice a los minions que aseguren que el paquete apache2 esté instalado, y que el servicio esté en ejecución y habilitado para arrancar al inicio.
sudo salt '*' state.apply apache
Esto instalará Apache y activará el servicio en todos los minions.
sudo salt '*' grains.items
Esto mostrará información como el sistema operativo, la IP y la arquitectura de cada minion.
SaltStack también permite orquestar tareas complejas en múltiples servidores de forma secuencial o en paralelo. Puedes definir un runner para ejecutar acciones específicas, como realizar un despliegue multinodo de una aplicación.
Este es un esquema que resume los módulos de SaltStack y sus principales comandos:
SaltStack Módulos y Comandos
1. Módulo `test` (Pruebas y chequeos básicos)
├── `test.ping`: Verifica si un minion responde.
├── `test.version`: Muestra la versión de Salt instalada.
├── `test.echo`: Devuelve el mensaje dado.
├── `test.sleep`: Hace que los minions esperen un tiempo específico.
├── `test.fib`: Calcula el número de Fibonacci.
├── `test.rand_sleep`: Pausa de tiempo aleatorio.
2. Módulo `cmd` (Ejecución de comandos remotos)
├── `cmd.run`: Ejecuta un comando y devuelve solo stdout.
├── `cmd.run_all`: Ejecuta un comando y devuelve stdout, stderr y retcode.
├── `cmd.run_stderr`: Devuelve solo stderr.
├── `cmd.run_stdout`: Devuelve solo stdout.
├── `cmd.has_exec`: Verifica si un comando existe.
├── `cmd.retcode`: Devuelve el código de retorno de un comando.
├── `cmd.shell`: Ejecuta un comando usando una shell específica.
3. Módulo `pkg` (Gestión de paquetes)
├── `pkg.install`: Instala un paquete.
├── `pkg.remove`: Elimina un paquete.
├── `pkg.latest`: Actualiza un paquete a su última versión.
├── `pkg.upgrade`: Actualiza todos los paquetes del sistema.
4. Módulo `service` (Gestión de servicios)
├── `service.start`: Inicia un servicio.
├── `service.stop`: Detiene un servicio.
├── `service.restart`: Reinicia un servicio.
├── `service.status`: Verifica si un servicio está corriendo.
5. Módulo `file` (Gestión de archivos y directorios)
├── `file.manage`: Copia archivos desde el Salt Master.
├── `file.remove`: Elimina un archivo.
├── `file.mkdir`: Crea un directorio.
├── `file.exists`: Verifica si un archivo o directorio existe.
├── `file.replace`: Reemplaza texto en un archivo.
6. Módulo `user` (Gestión de usuarios)
├── `user.add`: Añade un nuevo usuario.
├── `user.delete`: Elimina un usuario.
├── `user.info`: Muestra información de un usuario.
├── `user.chpasswd`: Cambia la contraseña de un usuario.
7. Módulo `cron` (Gestión de tareas programadas)
├── `cron.list_tab`: Lista las tareas cron de un usuario.
├── `cron.set_job`: Añade una tarea cron.
├── `cron.rm_job`: Elimina una tarea cron.
8. Módulo `network` (Gestión de red)
├── `network.interfaces`: Muestra las interfaces de red.
├── `network.ping`: Realiza un ping a una dirección IP.
├── `network.traceroute`: Realiza un traceroute.
├── `network.is_port_open`: Verifica si un puerto está abierto.
9. Módulo `grains` (Datos estáticos de los minions)
├── `grains.items`: Muestra todos los grains de un minion.
├── `grains.get`: Obtiene un valor específico de los grains.
10. Módulo `pillar` (Datos sensibles y configuraciones)
├── `pillar.items`: Muestra todos los datos del pilar.
├── `pillar.get`: Obtiene un valor específico del pilar.
11. Módulo `system` (Gestión del sistema)
├── `system.reboot`: Reinicia el sistema.
├── `system.shutdown`: Apaga el sistema.
├── `system.halt`: Detiene el sistema sin apagarlo.
├── `system.version`: Muestra la versión del sistema operativo.
testEl módulo test contiene comandos que permiten probar funcionalidades básicas y realizar chequeos en los minions.
test.ping:Ejemplo:
sudo salt '*' test.ping
minion1:
True
minion2:
True
test.version:
Ejemplo:
sudo salt '*' test.version
minion1:
3004
minion2:
3004
test.echo:
Ejemplo:
sudo salt '*' test.echo 'Hola, SaltStack'
minion1:
Hola, SaltStack
minion2:
Hola, SaltStack
test.sleep:
Ejemplo:
sudo salt '*' test.sleep 5
test.fib:
Ejemplo:
sudo salt '*' test.fib 10
minion1:
55
minion2:
55
test.rand_sleep:
sudo salt '*' test.rand_sleep 10
cmdEl módulo cmd permite ejecutar comandos directamente en los minions. Es útil para administrar servidores de manera remota.
cmd.run:Ejemplo:
sudo salt '*' cmd.run 'uname -a'
uname -a en todos los minions, devolviendo información sobre el sistema operativo.
cmd.run_all:
Ejemplo:
sudo salt '*' cmd.run_all 'df -h'
df -h (para mostrar el uso del disco) en todos los minions y devolverá la salida completa.
Respuesta esperada:
minion1:
----------
pid:
12345
retcode:
0
stderr:
stdout:
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 50G 10G 40G 20% /
cmd.run_stderr:
Ejemplo:
sudo salt '*' cmd.run_stderr 'ls /invalid-directory'
cmd.run_stdout:
Ejemplo:
sudo salt '*' cmd.run_stdout 'ls /home'
/home.
cmd.has_exec:
Ejemplo:
sudo salt '*' cmd.has_exec 'git'
git está instalado y disponible en los minions.
Respuesta esperada:
minion1:
True
minion2:
False
cmd.retcode:
Ejemplo:
sudo salt '*' cmd.retcode 'service apache2 status'
service apache2 status y devuelve solo el código de retorno, donde 0 significa éxito y 1 indica algún problema.
cmd.shell:
sudo salt '*' cmd.shell 'bash' 'echo $HOME'
echo $HOME usando bash como shell en lugar de la shell predeterminada.cmd.run y cmd.run_allcmd.run solo devuelve la salida estándar (stdout), sin detalles como códigos de salida o mensajes de error.cmd.run_all devuelve información más detallada, como el código de salida (retcode), la salida estándar (stdout) y la salida de error estándar (stderr), lo que lo hace útil para debugging o análisis más detallados.pkg (gestión de paquetes)Este módulo es utilizado para gestionar paquetes en los sistemas operativos de los minions. Es compatible con varios gestores de paquetes como apt (Debian/Ubuntu), yum (RHEL/CentOS), y zypper (SUSE).
pkg.install: Instala un paquete.Ejemplo:
sudo salt '*' pkg.install apache2
pkg.remove: Elimina un paquete.
Ejemplo:
sudo salt '*' pkg.remove apache2
pkg.latest: Actualiza un paquete a su versión más reciente.
Ejemplo:
sudo salt '*' pkg.latest apache2
pkg.upgrade: Actualiza todos los paquetes del sistema.
sudo salt '*' pkg.upgrade
service (gestión de servicios)El módulo service es crucial para iniciar, detener y gestionar servicios en los servidores.
service.start: Inicia un servicio.Ejemplo:
sudo salt '*' service.start apache2
service.stop: Detiene un servicio.
Ejemplo:
sudo salt '*' service.stop apache2
service.restart: Reinicia un servicio.
Ejemplo:
sudo salt '*' service.restart apache2
service.status: Verifica si un servicio está en ejecución.
sudo salt '*' service.status apache2
file (gestión de archivos y directorios)Este módulo se usa para manejar archivos y directorios en los sistemas de los minions.
file.manage: Copia archivos a los minions desde el Salt Master.Ejemplo:
sudo salt '*' file.manage /etc/motd source=/srv/salt/files/motd
file.remove: Elimina un archivo.
Ejemplo:
sudo salt '*' file.remove /tmp/archivo.txt
file.mkdir: Crea un directorio.
Ejemplo:
sudo salt '*' file.mkdir /tmp/nuevo_directorio
file.exists: Verifica si un archivo o directorio existe.
Ejemplo:
sudo salt '*' file.exists /etc/hosts
file.replace: Reemplaza texto en un archivo.
sudo salt '*' file.replace /etc/motd pattern='Old Message' repl='New Message'
user (gestión de usuarios)Este módulo es útil para gestionar usuarios y grupos en los sistemas de los minions.
user.add: Añade un nuevo usuario al sistema.Ejemplo:
sudo salt '*' user.add nuevo_usuario
user.delete: Elimina un usuario.
Ejemplo:
sudo salt '*' user.delete viejo_usuario
user.info: Muestra información sobre un usuario.
Ejemplo:
sudo salt '*' user.info nuevo_usuario
user.chpasswd: Cambia la contraseña de un usuario.
sudo salt '*' user.chpasswd nuevo_usuario 'password_nueva'
cron (gestión de cron jobs)Permite gestionar tareas programadas (cron jobs) en los sistemas.
cron.list_tab: Lista las tareas cron de un usuario.Ejemplo:
sudo salt '*' cron.list_tab root
cron.set_job: Añade una tarea cron.
Ejemplo:
sudo salt '*' cron.set_job root '*/5 * * * * /usr/bin/python /path/al/script.py'
cron.rm_job: Elimina una tarea cron.
sudo salt '*' cron.rm_job root '*/5 * * * * /usr/bin/python /path/al/script.py'
network (gestión de red)Este módulo permite gestionar configuraciones de red y obtener información sobre la red.
network.interfaces: Muestra la información de las interfaces de red.Ejemplo:
sudo salt '*' network.interfaces
network.ping: Hace un ping a una dirección IP desde los minions.
Ejemplo:
sudo salt '*' network.ping 8.8.8.8
network.traceroute: Realiza un traceroute a una dirección IP.
Ejemplo:
sudo salt '*' network.traceroute 8.8.8.8
network.is_port_open: Verifica si un puerto está abierto.
sudo salt '*' network.is_port_open 22
grains (gestión de datos estáticos de los minions)El módulo grains permite consultar información estática sobre los minions, como el sistema operativo, la arquitectura, las direcciones IP, y más.
grains.items: Muestra todos los grains de un minion.Ejemplo:
sudo salt '*' grains.items
grains.get: Obtiene un valor específico de los grains.
sudo salt '*' grains.get os
pillar (gestión de datos sensibles)El módulo pillar es útil para acceder a configuraciones específicas definidas en el Salt Master que pueden contener datos sensibles, como contraseñas o claves API.
pillar.items: Muestra todos los datos del pilar asignados a un minion.Ejemplo:
sudo salt '*' pillar.items
pillar.get: Obtiene un valor específico del pilar.
sudo salt '*' pillar.get database_password
system (gestión del sistema en general)Este módulo permite gestionar varios aspectos del sistema de los minions, como el reinicio, apagado, y verificación del estado general.
system.reboot: Reinicia el sistema.Ejemplo:
sudo salt '*' system.reboot
system.shutdown: Apaga el sistema.
Ejemplo:
sudo salt '*' system.shutdown
system.halt: Detiene el sistema sin apagarlo por completo.
Ejemplo:
sudo salt '*' system.halt
system.version: Muestra la versión del sistema operativo.
sudo salt '*' system.version
Hoy en día, existen varias herramientas de gestión de configuración y orquestación que, al igual que SaltStack, facilitan la automatización de la administración de infraestructuras de TI. Estas herramientas permiten administrar servidores, aplicaciones y servicios a gran escala, asegurando que todos los sistemas estén configurados de manera consistente. A continuación, te menciono algunas de las herramientas más populares y sus características:
| Herramienta | Tipo | Enfoque | Agent-based | Lenguaje | Casos de Uso |
|---|---|---|---|---|---|
| Ansible | Gestión Configuración | Sin agentes, simple | No | YAML | Configuración de servidores, aprovisionamiento |
| Puppet | Gestión Configuración | Escalabilidad, compliance | Sí | Puppet DSL | Gestión de configuraciones complejas |
| Chef | Gestión Configuración | Flexibilidad, cloud | Sí | Ruby | Aprovisionamiento, automatización |
| Terraform | Infraestructura como código (IaC) | Orquestación multi-cloud | No | HCL | Orquestación de infraestructuras |
| Kubernetes | Orquestación de contenedores | Gestión de aplicaciones contenedorizadas | No | YAML | Microservicios, escalabilidad de aplicaciones |
| Rudder | Gestión Configuración | Enfoque en cumplimiento | Sí | DSL Rudder | Compliance, auditoría de configuraciones |
| CFEngine | Gestión Configuración | Escalabilidad y seguridad | Sí | DSL CFEngine | Grandes infraestructuras seguras |
| Vagrant | Aprovisionamiento | Entornos de desarrollo | No | Vagrantfile | Desarrollo, entornos reproducibles |