什么是运行器?

Semaphore UI 运行器是一个不带 UI 的独立 Semaphore 实例。它会连接到主 Semaphore 服务器,接收任务并执行。运行器可以部署在任何地区或网络中的独立服务器上,与 Semaphore UI 所在的位置完全解耦。

它解决了什么问题?

如果没有运行器,所有自动化任务都会在同一台服务器上运行。起初这没有问题,但随着团队规模,或者团队数量,持续增长,通常会出现三个问题:

  • 负载。 大量任务争抢同一台服务器的资源,会让一切都变慢。
  • 隔离。 当多个团队共享同一个执行环境时,一个损坏的流水线可能会影响所有人。
  • 地理位置。 Ansible 通过 SSH 连接到你的服务器。如果你的基础设施在悉尼,而 Semaphore 实例在法兰克福,那么每次部署都要经过跨洲连接。 运行器可以同时解决这三个问题。

全局运行器 vs 项目运行器

Semaphore 提供两种运行器,如果你正在评估 Pro 计划,这个区别很重要。

功能 全局运行器 (OSS) 项目运行器 (Pro)
可用版本 OSS (免费) Pro
负载分发
网络隔离
基于标签的路由
按项目控制

全局运行器会在所有项目之间随机分配。它很适合做负载分发,但你无法控制哪个运行器会接手哪个任务。项目运行器则允许你给任意 Template 或 Inventory 添加标签,然后把特定任务路由到特定运行器。这正是实现隔离和按地理位置路由的关键。

使用运行器的 3 个真实场景

  1. 多个团队,互不干扰 你的平台团队和产品团队都在使用 Semaphore。它们彼此独立工作,有不同的项目、不同的服务器、不同的风险承受能力。使用项目运行器后,每个团队都有自己的运行器。即使一个团队的运行器宕机,另一个团队也不会察觉。

  2. 跨区域的分布式基础设施 你的网站运行在纽约的数据中心,而某个后端服务运行在澳大利亚。如果欧洲只有一个集中式运行器,那么每次部署都要通过 SSH 跨越半个地球,既慢又没必要。

    在纽约部署一个运行器,在澳大利亚再部署一个,并为你的 Inventory 打上对应标签。这样每个任务都会在本地、同一网络内连接并执行,速度更快,同时还能缩小攻击面。

  3. 通过 Webhook + AWS Lambda 降低云成本 这一点值得慢一点讲,因为它是很有价值的成本优化。运行器支持两个事件的 webhook:任务开始和任务结束。你可以利用它们自动启动和关闭云资源。

    配置方式如下:你的运行器运行在 AWS EC2 实例上。实例运行时会产生费用,停止时则不花钱。

    • 任务开始时 -> webhook 触发一个 Lambda 函数 -> Lambda 启动 EC2 实例 -> 运行器上线,连接到 Semaphore,并接手任务
    • 任务结束时 -> webhook 触发另一个 Lambda -> Lambda 停止 EC2 实例

    你的运行器只会在真正工作时运行。对于任务负载并不连续的团队来说,仅这一点就可能足以证明 Pro 计划是值得的。

如何设置项目运行器

  1. 打开项目设置并进入 Runners 标签页。你会在这里看到现有运行器列表。

  2. 点击 New Runner。给它设置一个名称和标签,例如 new-york

  3. 保存后,Semaphore 会生成两份凭证:一个是保存在两端、用于身份识别的 token,另一个是只保存在运行器端、用于加密传输数据的私钥。下载这个私钥,你会在下一步用到它。

  4. 在目标服务器上部署运行器。最简单的方法是使用 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
    

    你也可以使用交互式设置命令:

    semaphore runner setup
    
  5. 回到 Semaphore,打开任意 Template 或 Inventory,并为其分配运行器标签 new-york。这样该任务之后就会始终在你的纽约运行器上执行。

不只是给 Template 打标签,也可以给 Inventory 打标签

如果你的服务器是按地区或网络分组的,那么有一种更聪明的任务路由方式。你不必逐个给 Template 打标签,而是可以直接把运行器标签分配给 Inventory。

在 Semaphore 中,Inventory 是 Ansible 用来连接服务器的一组 IP 地址列表。如果你知道某一组服务器位于纽约,就给这个 Inventory 打上 new-york 标签。从那一刻起,任何使用该 Inventory 的 Template 都会自动在纽约运行器上执行,不再需要逐个 Template 配置。

当你新增 Template 时,这种方式尤其有用。你只需要选对 Inventory,运行器路由就会自动生效。

还有一点:并发限制

如果你想限制并发量,可以为每个运行器设置最大并行任务数。默认值是无限制 (0)。如果你把它设置为 5,并且该运行器已经很忙,Semaphore 就会把任务路由到另一个带有相同标签的运行器。

准备好试试看了吗?

项目运行器可在 Semaphore Pro 计划中使用。如果你的团队正面临上面提到的任何一种情况,比如不断增长的任务队列、多个团队协作,或者分布式基础设施,那就很值得进一步了解。