📝 Slatstack
← Volver

SaltStack

Introducción

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.

¿Para qué sirve?

SaltStack es usado principalmente para:

  1. 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.

  2. Orquestación: Automatiza la ejecución de tareas complejas en toda la infraestructura, como el despliegue de aplicaciones, actualizaciones de software o reinicios programados.

  3. 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.

  4. 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).

Arquitectura de SaltStack

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.

Casos de uso

Comparativa

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.

Características Avanzadas

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

Ejemplos de Uso

  1. 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.

  2. 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.

  3. 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.

  4. 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 y Desventajas

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.

Comparación con Otras Herramientas

Componentes Clave

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.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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.

  7. 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.

Instalación

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.

1. Instalación de Salt Master y Minions

Instalación en Ubuntu/Debian:

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 en CentOS/RHEL:

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.

2. Aceptar Minions en el Salt Master

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

3. Ejecutar comandos remotos en los Minions

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'

4. Gestión de Configuración usando States

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.

Ejemplo: Instalar Apache en todos los minions

  1. Crea un directorio para los states en el Salt Master:
sudo mkdir -p /srv/salt
  1. Crea un archivo YAML llamado apache.sls para definir la instalación de Apache:
sudo nano /srv/salt/apache.sls
  1. Dentro del archivo, define el estado:
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.

  1. Aplica este estado en los minions:
sudo salt '*' state.apply apache

Esto instalará Apache y activará el servicio en todos los minions.

5. Usar Grains y Pillars para Configuraciones Dinámicas

sudo salt '*' grains.items

Esto mostrará información como el sistema operativo, la IP y la arquitectura de cada minion.

6. Orquestación y Tareas Complejas

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.

Módulos

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.

1. Módulo test

El módulo test contiene comandos que permiten probar funcionalidades básicas y realizar chequeos en los minions.

2. Módulo cmd

El módulo cmd permite ejecutar comandos directamente en los minions. Es útil para administrar servidores de manera remota.

Diferencias entre cmd.run y cmd.run_all

3. Módulo 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).

4. Módulo service (gestión de servicios)

El módulo service es crucial para iniciar, detener y gestionar servicios en los servidores.

5. Módulo file (gestión de archivos y directorios)

Este módulo se usa para manejar archivos y directorios en los sistemas de los minions.

6. Módulo user (gestión de usuarios)

Este módulo es útil para gestionar usuarios y grupos en los sistemas de los minions.

7. Módulo cron (gestión de cron jobs)

Permite gestionar tareas programadas (cron jobs) en los sistemas.

8. Módulo network (gestión de red)

Este módulo permite gestionar configuraciones de red y obtener información sobre la red.

9. Módulo 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.

10. Módulo 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.

11. Módulo 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.

Alternativas

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:

1. Ansible

2. Puppet

3. Chef

4. Terraform

5. Kubernetes (para orquestación de contenedores)

6. Rudder

7. CFEngine

8. JuJu

9. Vagrant

Comparación General:

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 Puppet DSL Gestión de configuraciones complejas
Chef Gestión Configuración Flexibilidad, cloud 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 DSL Rudder Compliance, auditoría de configuraciones
CFEngine Gestión Configuración Escalabilidad y seguridad DSL CFEngine Grandes infraestructuras seguras
Vagrant Aprovisionamiento Entornos de desarrollo No Vagrantfile Desarrollo, entornos reproducibles

Recursos adicionales