A la mayoría de los usuarios les resulta útil comprender qué es Salt y cómo funciona antes de iniciar el proceso de instalación. Salt utiliza un modelo de maestro-cliente en el que un maestro de Salt emite comandos para un cliente y este último ejecuta el comando.

Nota: Como parte de la iniciativa de VMware para eliminar terminología problemática, el término maestro de Salt se reemplazará por uno mejor en SaltStack Config, y en los productos y la documentación relacionados. Esta actualización de terminología puede tardar algunos ciclos de versión en completarse totalmente.

¿Qué es Salt?

SaltStack Config cuenta con tecnología de Salt, un marco de ejecución remota de código abierto basado en Python que se utiliza para:

  • Administración de la configuración
  • Automatización
  • Aprovisionamiento
  • Orquestación

Salt es la tecnología que subyace a la funcionalidad principal de SaltStack Config. SaltStack Config mejora y extiende Salt, lo que proporciona funciones y funcionalidades adicionales que mejoran la facilidad de uso. Para obtener un resumen de la infraestructura de SaltStack Config, consulte Arquitectura del sistema de SaltStack Config.

El siguiente diagrama muestra los componentes principales de la arquitectura básica de Salt:


Arquitectura de Salt

En las siguientes secciones se describen algunos de los componentes principales de la arquitectura de Salt que son relevantes para la instalación de SaltStack Config.

Maestro de Salt y minions de Salt

Salt utiliza el modelo de maestro-cliente en el que un maestro de Salt emite comandos para un cliente y este último ejecuta el comando. En el ecosistema de Salt, el maestro de Salt es un servidor que ejecuta el servicio principal de Salt. Emite comandos para uno o varios minions de Salt, que son nodos que ejecutan el servicio de minion y que están registrados con ese maestro de Salt en particular.

Otra forma de describir Salt es como un modelo de editor-suscriptor. El maestro de Salt publica los trabajos que se deben ejecutar y los minions se suscriben a esos trabajos. Cuando se aplica un trabajo específico a ese minion, este lo ejecuta.

Cuando un minion termina de ejecutar un trabajo, envía los datos devueltos del trabajo al maestro de Salt. Salt tiene dos puertos utilizados de forma predeterminada para que los minions se comuniquen con su maestro de Salt. Estos puertos funcionan en conjunto para recibir y enviar datos al bus de mensajes. El bus de mensajes de Salt es ZeroMQ, el cual crea una topología de red asincrónica para proporcionar la comunicación más rápida posible.

Destinos y granos

El maestro de Salt indica qué minions deben ejecutar el trabajo mediante la definición de un destino. Un destino es el grupo de minions, en uno o varios maestros de Salt, al que se aplica el comando de Salt de un trabajo.

Nota:

Un maestro de Salt también se puede administrar como un minion y puede ser un destino si ejecuta el servicio de minion.

A continuación, se muestra un ejemplo de uno de los tantos tipos de comandos que un maestro de Salt puede emitir para un minion. Este comando indica que todos los minions deben instalar la aplicación Vim:

salt -v '*' pkg.install vim

En este caso, el '*' global es el destino, lo que indica que todos los minions deben ejecutar este comando. Hay muchas otras opciones de destino disponibles, entre las que se incluyen la de apuntar a un mínimo específico por su ID o a varios minions por sus características o rasgos compartidos (denominados "granos en Salt").

Salt incluye una interfaz para obtener información sobre el sistema subyacente. Esto se denomina interfaz de granos, ya que le presenta a Salt granos de información. Se recopilan granos para el sistema operativo, el nombre de dominio, la dirección IP, el kernel, el tipo de SO, la memoria y muchas otras propiedades del sistema. También puede crear sus propios datos de granos personalizados.

Los datos de granos son relativamente estáticos. Sin embargo, estos se actualizan cuando cambia la información del sistema (como la configuración de red) o cuando se asigna un nuevo valor a un grano personalizado.

Abra el sistema de eventos (bus de eventos)

El sistema de eventos se utiliza para la comunicación entre procesos entre el maestro de Salt y los minions. En el sistema de eventos:

  • El maestro y los minions de Salt ven los eventos.
  • Ambos pueden supervisar y evaluar los eventos.

El bus de eventos sienta las bases para la orquestación y la supervisión en tiempo real.

Todos los minions ven los trabajos y los resultados al suscribirse a los eventos publicados en el sistema de eventos. Salt utiliza un sistema de eventos conectable con dos capas:

  • ZeroMQ (0MQ): la biblioteca de nivel de socket predeterminada actual que proporciona una capa de transporte flexible.
  • Tornado: el sistema de eventos de la capa de transporte basado en TCP completo.

Uno de los puntos más sólidos de Salt es la velocidad de ejecución. El bus de comunicación del sistema de eventos es más eficaz que la ejecución de un servicio web de nivel superior (http). El sistema de ejecución remota es el componente en base al cual se crean todos los componentes, lo que permite que la ejecución remota descentralizada reparta la carga entre los recursos.

Estados de Salt

Además de la ejecución remota, Salt proporciona otro método para configurar minions que consiste en declarar en qué estado debe estar un minion, denominado estados de Salt. Los estados de Salt hacen posible la administración de la configuración. Puede utilizar estados de Salt para implementar y administrar la infraestructura con archivos YAML simples. Con los estados, puede automatizar tareas recursivas y predecibles poniendo en cola los trabajos para que Salt los implemente sin necesidad de intervención por parte del usuario. También puede añadir lógica condicional más compleja a los archivos de estado mediante Jinja.

Para ilustrar las sutiles diferencias entre la ejecución remota y la administración de la configuración, tome el comando al que se hace referencia en la sección anterior sobre los destinos y los granos en los que Salt instaló la aplicación Vim en todos los minions:

Metodología

Implementación

Resultado

Ejecución remota

  • Ejecutar salt-v'*'pkg.installvim desde el terminal
  • Instala Vim de forma remota en los minions de destino

Administración de la configuración

  • Escribir un archivo de estado YAML que compruebe si Vim está instalado
  • A continuación, este archivo de estado se aplica a los minions de destino
  • Garantiza que Vim se instale siempre en los minions de destino
  • Salt analiza el archivo de estado y determina qué acciones se deben tomar para garantizar que el minion cumpla con las declaraciones de estado
  • Si Vim no está instalado, automatiza los procesos para instalar Vim en los minions de destino

El archivo de estado que comprueba si Vim está instalado puede verse como el siguiente ejemplo:

# File:/srv/salt/vim_install.sls
install_vim_now:
  pkg.installed:
     -pkgs:
         -vim

Para aplicar este estado a un minion, utilice el módulo state.apply, como en el siguiente ejemplo:

salt '*' state.apply vim_install

Este comando aplica vim_install a todos los minions.

Las fórmulas son colecciones de estados que funcionan en conjunto para configurar una aplicación o un minion. Por ejemplo, un estado puede desencadenar otro estado.

El archivo superior

No resulta práctico ejecutar manualmente cada estado apuntando de forma individual a un minion específico cada vez. Algunos entornos tienen cientos de archivos de estado que apuntan a miles de minions.

Salt ofrece dos funciones que ayudan a solucionar este problema de escalado:

  • El archivo top.sls: asigna estados de Salt a sus minions correspondientes.
  • Ejecución de highstate: ejecuta todos los estados de Salt que se describen en top.sls de una sola vez.

El archivo superior asigna los estados que se deben aplicar a diferentes minions en ciertos entornos. A continuación, se muestra un ejemplo de un archivo superior sencillo:

# File: /srv/salt/top.sls
base:
  '*':
    - all_server_setup
  
  '01webserver':
    - web_server_setup

En este ejemplo, base hace referencia al entorno de Salt, que es el predeterminado. Puede especificar más de un entorno según sea necesario, como prod, dev, QA, etc.

Se especifican grupos de minions en el entorno, y se enumeran los estados para cada conjunto de minions. Este archivo superior indica que se debe aplicar un estado denominado all_server_setup a todos los minions '*' y el estado denominado web_server_setup debe aplicarse al minion 01webserver.

Para ejecutar el comando de Salt, debe utilizar la función state.highstate:

salt \* state.highstate

Este comando aplica el archivo superior a los minions de destino.

Pilar de Salt

La función de pilar de Salt toma los datos definidos en el maestro de Salt y los distribuye a los minions según sea necesario. El pilar se utiliza principalmente para almacenar secretos u otros datos altamente confidenciales, como credenciales de cuenta, claves criptográficas o contraseñas. El pilar también es útil para almacenar datos que no son secretos, pero que no desea colocar directamente en sus archivos de estado, como los datos de configuración.

El pilar de Salt lleva datos al clúster desde la dirección opuesta como granos. Mientras que los granos son datos generados desde el minion, el pilar son datos generados desde el maestro de Salt.

Los pilares se organizan de forma similar a los estados en un árbol de estado del pilar, donde top.sls actúa para coordinar los datos del pilar con los entornos y los minions que conocen los datos. La información transferida mediante el pilar tiene un diccionario generado para el minion objetivo y está cifrada con la clave de ese minion para una transferencia de datos segura. Los datos del pilar se cifran por cada minion, lo que hace que sea útil para almacenar datos confidenciales específicos de un minion en particular.

Señales y reactores

El sistema de señales es una herramienta de supervisión que puede escuchar una variedad de procesos del sistema en los minions. Las señales pueden activar reactores que pueden ayudar a implementar un cambio o solucionar un problema. Por ejemplo, si se agota el tiempo de espera de respuesta de un servicio, el sistema puede reiniciar el servicio.

Las señales se utilizan para una variedad de propósitos, entre los que se incluyen:

  • Informes automatizados
  • Entrega de un registro de errores
  • Supervisión de microservicios
  • Actividad del shell del usuario
  • Supervisión de recursos

Cuando se combinan con los reactores, las señales pueden crear respuestas automatizadas escritas previamente para los problemas de infraestructura y aplicaciones. Los reactores amplían Salt con respuestas automatizadas mediante estados de corrección escritos previamente.

Los reactores pueden aplicarse en una variedad de escenarios:

  • Escalado de infraestructura
  • Notificación a los administradores
  • Reinicio de aplicaciones con errores
  • Reversión automática

Cuando se utilizan tanto señales como reactores juntos, puede crear estados únicos personalizados según sus necesidades específicas.

Ejecutores y orquestación de Salt

Los ejecutores de Salt son aplicaciones convenientes que se ejecutan con el comando salt-run. Los ejecutores de Salt funcionan de forma similar a los módulos de ejecución de Salt. Sin embargo, se ejecutan en el maestro de Salt en lugar de en los minions. Un ejecutor de Salt puede ser una llamada de cliente simple o una aplicación compleja.

Salt ofrece la capacidad de orquestar tareas administrativas del sistema en toda la empresa. La orquestación permite coordinar las actividades de varias máquinas desde un lugar central. Tiene la ventaja adicional de poder controlar la secuencia cuando se producen determinados eventos de configuración. Los estados de orquestación se ejecutan en el maestro de Salt mediante el módulo del ejecutor de estado.

Cuando se ejecuta una instalación de varios nodos, en realidad se ejecuta una orquestación para instalar SaltStack Config. En el escenario de instalación en varios nodos, se ejecuta un highstate de orquestación diseñado por VMware. El highstate se ejecuta en el maestro de Salt y configura el entorno de varios nodos. Instala la arquitectura esencial de SaltStack Config en los otros tres nodos que alojarán PostgreSQL, Redis y RaaS.