¿Qué es un ejecutor?

Un ejecutor de Semaphore UI es una instancia independiente de Semaphore sin interfaz de usuario. Se conecta a tu servidor principal de Semaphore, recoge tareas y las ejecuta. Los ejecutores pueden alojarse en servidores separados en cualquier región o red, completamente independientes de donde viva tu interfaz de Semaphore.

¿Qué problema resuelve?

Sin ejecutores, todas tus tareas de automatización se ejecutan en un solo servidor. Eso funciona bien al principio, pero a medida que tu equipo, o la cantidad de equipos, crece, suelen aparecer tres problemas:

  • Carga. Una cola grande de tareas compitiendo por los recursos de un solo servidor ralentiza todo.
  • Aislamiento. Cuando varios equipos comparten el mismo entorno de ejecución, una canalización rota puede afectar a todos los demás.
  • Geografía. Ansible se conecta a tus servidores por SSH. Si tu infraestructura está en Sídney pero tu instancia de Semaphore está en Frankfurt, cada despliegue avanza por una conexión transcontinental. Los ejecutores resuelven los tres.

Ejecutores globales vs. ejecutores de proyecto

Semaphore ofrece dos tipos de ejecutores, y la diferencia importa si estás evaluando el plan Pro.

Función Ejecutores globales (OSS) Ejecutores de proyecto (Pro)
Disponible en OSS (gratis) Pro
Distribución de carga
Aislamiento de red
Enrutamiento por etiquetas
Control por proyecto

Los ejecutores globales se asignan aleatoriamente entre todos los proyectos. Son excelentes para distribuir la carga, pero no puedes controlar qué ejecutor recoge qué tarea. Los ejecutores de proyecto te permiten adjuntar una etiqueta a cualquier plantilla o inventario y luego dirigir tareas concretas a ejecutores concretos. Eso es lo que hace posible el aislamiento y el enrutamiento geográfico.

3 casos de uso reales para los ejecutores

  1. Varios equipos, cero interferencias Tu equipo de plataforma y tu equipo de producto usan Semaphore. Trabajan de forma independiente: proyectos distintos, servidores distintos y tolerancias al riesgo distintas. Con ejecutores de proyecto, cada equipo obtiene su propio ejecutor. Si el ejecutor de un equipo deja de funcionar, el otro ni se entera.

  2. Infraestructura distribuida en varias regiones Tu sitio web se ejecuta en un centro de datos de Nueva York. Un servicio backend se ejecuta en Australia. Con un solo ejecutor centralizado en Europa, cada despliegue hace SSH a través del planeta: lento e innecesario.

    Configura un ejecutor en Nueva York y otro en Australia. Etiqueta tus inventarios en consecuencia. Ahora cada tarea se conecta localmente, dentro de la misma red y a plena velocidad. Despliegues más rápidos y una superficie de ataque menor como ventaja adicional.

  3. Reducir costes en la nube con webhooks + AWS Lambda Vale la pena detenerse un momento aquí, porque es una optimización de costes importante. Los ejecutores admiten webhooks para dos eventos: inicio de tarea y fin de tarea. Puedes usarlos para encender y apagar recursos en la nube automáticamente.

    Así es la configuración: tu ejecutor vive en una instancia EC2 de AWS. Mientras está en ejecución, cuesta dinero. Cuando está detenido, no cuesta nada.

    • Al iniciar una tarea -> un webhook activa una función Lambda -> Lambda inicia la instancia EC2 -> el ejecutor se conecta a Semaphore y recoge la tarea
    • Al finalizar una tarea -> otro webhook activa otra Lambda -> Lambda detiene la instancia EC2

    Tu ejecutor solo está en marcha cuando realmente está trabajando. Para equipos con cargas esporádicas, solo esto ya puede justificar el plan Pro.

Cómo configurar un ejecutor de proyecto

  1. Ve a la configuración de tu proyecto y abre la pestaña Runners. Verás aquí los ejecutores existentes.

  2. Haz clic en New Runner. Dale un nombre y una etiqueta, por ejemplo, new-york.

  3. Después de guardar, Semaphore genera dos credenciales: un token, almacenado en ambos lados y usado para la identificación, y una clave privada, almacenada solo en el ejecutor y usada para cifrar los datos en tránsito. Descarga la clave privada: la necesitarás en el siguiente paso.

  4. Despliega el ejecutor en tu servidor de destino. La forma más sencilla es con Docker:

    docker run \
    -e SEMAPHORE_WEB_ROOT=https://semaphore.example.com \
    -e SEMAPHORE_RUNNER_TOKEN=/ADwjSWmWV8FZB4pwQaaEOWgqIdOR+oDOeOXe2a3JD0= \
    -e SEMAPHORE_RUNNER_PRIVATE_KEY_FILE=/config.runner.key \
    -v "/path/to/private/key:/config.runner.key" \
    -d semaphoreui/runner:v2.17.28
    

    También puedes usar el comando de configuración interactiva:

    semaphore runner setup
    
  5. De vuelta en Semaphore, abre cualquier plantilla o inventario y asígnale la etiqueta de ejecutor new-york. Esa tarea se ejecutará siempre en tu ejecutor de Nueva York.

Etiquetar inventarios, no solo plantillas

Hay una forma más inteligente de enrutar tareas si tienes servidores agrupados por región o red. En lugar de etiquetar cada plantilla individualmente, puedes asignar una etiqueta de ejecutor directamente a un inventario.

Un inventario en Semaphore es una lista de direcciones IP que Ansible usa para conectarse a tus servidores. Si sabes que un determinado grupo de servidores está en Nueva York, etiqueta ese inventario con new-york. A partir de ese momento, cualquier plantilla que use ese inventario se ejecutará automáticamente en el ejecutor de Nueva York, sin necesidad de configuración por plantilla.

Esto es especialmente útil cuando incorporas nuevas plantillas. Eliges el inventario adecuado y el enrutamiento del ejecutor simplemente funciona.

Una cosa más: límites de concurrencia

Si quieres limitar la concurrencia, establece un número máximo de tareas paralelas por ejecutor. Por defecto es ilimitado (0). Si lo estableces en 5 y ese ejecutor ya está ocupado, Semaphore enviará la tarea a otro ejecutor con la misma etiqueta.

¿Listo para probarlo?

Los ejecutores de proyecto están disponibles en el plan Semaphore Pro. Si tu equipo está viviendo alguno de los escenarios anteriores - colas de tareas crecientes, varios equipos o infraestructura distribuida - vale la pena explorarlo.