大多数用户发现,在开始安装过程之前了解 Salt 的定义及其工作原理非常有用。Salt 使用主节点-客户端模型,在此模型中,Salt 主节点向客户端发出命令,而客户端执行命令。

注: 作为 VMware 移除有问题术语计划的一部分,Salt 主节点术语将在 SaltStack Config 以及相关产品和文档中替换为更贴切的术语。此术语更新可能需要几个发布周期才能完全完成。

什么是 Salt?

SaltStack Config 由 Salt 提供支持,Salt 是一个基于 Python 的开源远程执行框架,用于:

  • 配置管理
  • 自动化
  • 置备
  • 编排

Salt 是 SaltStack Config 核心功能的底层技术。SaltStack Config 增强并扩展了 Salt,提供了其他功能和特性,改进了易用性。有关 SaltStack Config 基础架构的摘要信息,请参见 SaltStack Config 系统架构

下图显示了基本 Salt 架构的主要组件:


Salt 架构

以下部分介绍了 Salt 架构中与 SaltStack Config 安装相关的一些核心组件。

Salt 主节点和 Salt 工作节点

Salt 使用主节点-客户端模型,在此模型中,Salt 主节点向客户端发出命令,而客户端执行命令。在 Salt 生态系统中,Salt 主节点是运行 Salt 主节点服务的服务器。它向一个或多个 Salt 工作节点发出命令,这些工作节点是运行工作节点服务并在该特定 Salt 主节点中注册的节点。

还可以将 Salt 描述为发布者-订阅者模型。Salt 主节点发布需要执行的作业,而工作节点订阅这些作业。当特定作业应用于工作节点时,该工作节点将执行该作业。

在工作节点完成作业执行后,会将作业返回数据发送回 Salt 主节点。默认情况下,Salt 有两个端口,用于工作节点与其 Salt 主节点进行通信。这些端口协同工作,接收数据以及将数据传送到消息总线。Salt 的消息总线为 ZeroMQ,该总线创建了异步网络拓扑,以提供尽可能最快的通信。

目标和颗粒

Salt 主节点通过定义目标来指示哪些工作节点应执行作业。目标是一个或多个 Salt 主节点中的一组工作节点,会对其应用作业的 Salt 命令。

注:

Salt 主节点也可以像工作节点一样进行管理,如果正在运行工作节点服务,也可以成为目标。

以下示例显示了 Salt 主节点可能向工作节点发出的多种命令中的一个命令。此命令指示所有工作节点都应安装 Vim 应用程序:

salt -v '*' pkg.install vim

在此示例中,glob '*' 是目标,表示所有工作节点都应执行此命令。可以使用许多其他目标设置选项,包括按 ID 将特定工作节点设置为目标,或者按共有特点或特征(在 Salt 中称为颗粒)将多个工作节点设置为目标。

Salt 附带一个接口,用于获取有关底层系统的信息。这称为颗粒接口,因为它向 Salt 提供颗粒信息。会收集操作系统、域名、IP 地址、内核、操作系统类型、内存以及许多其他系统属性的颗粒信息。您还可以创建自己的自定义粒度数据。

颗粒数据相对静态。但是,当系统信息发生更改(如网络设置)或将新值分配给自定义颗粒时,会刷新颗粒数据。

打开事件系统(事件总线)

在 Salt 主节点与工作节点之间进行进程间通信时会使用事件系统。在事件系统中:

  • Salt 主节点和工作节点都会看到事件。
  • 两者都可以监控和评估事件。

事件总线为编排和实时监控奠定了基础。

所有工作节点都通过订阅事件系统上发布的事件来查看作业和结果。Salt 使用包含两层的可插接式事件系统:

  • ZeroMQ (0MQ) - 当前的默认套接字级库,提供灵活的传输层。
  • Tornado - 基于 TCP 的完整传输层事件系统。

Salt 的最大优势之一是执行速度。事件系统的通信总线比运行高级 Web 服务 (http) 更高效。远程执行系统是所有组件所基于的组件,支持分散化远程执行,从而可将负载分布在各个资源上。

Salt 状态

除了远程执行外,Salt 还提供了另一种工作节点配置方法,即声明工作节点应采用的状态,也称为 Salt 状态。Salt 状态使配置管理得以实现。可以使用 Salt 状态通过简单的 YAML 文件部署和管理基础架构。使用状态,可以自动执行递归任务和可预测任务,您可以对 Salt 要实施的作业进行排队,而无需用户输入。此外,还可以使用 Jinja 在状态文件中添加更复杂的条件逻辑。

为说明远程执行和配置管理之间的细微差异,我们以上面关于目标和颗粒部分中引用的命令为例,即 Salt 在所有工作节点上安装 Vim 应用程序:

方法

实施

结果

远程执行

  • 从终端运行 salt-v'*'pkg.installvim
  • 在目标工作节点上远程安装 Vim

配置管理

  • 编写一个 YAML 状态文件以检查是否安装了 Vim
  • 然后,将此状态文件应用于目标工作节点
  • 确保 Vim 始终安装在目标工作节点上
  • Salt 分析状态文件并确定需要采取的操作以确保工作节点符合状态声明
  • 如果未安装 Vim,则会自动执行在目标子对象上安装 Vim 的过程

验证 Vim 是否安装的状态文件类似于以下示例:

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

要将此状态应用于工作节点,将使用 state.apply 模块,如以下示例所示:

salt '*' state.apply vim_install

此命令将 vim_install 状态应用于所有工作节点。

Formula 是协同工作以配置工作节点或应用程序的状态集合。例如,一种状态可能会触发另一种状态。

Top 文件

每次手动运行一个单独以特定工作节点为目标的状态是不切实际的。某些环境具有数百个状态文件,工作节点目标有数千个。

Salt 提供了两个功能,可帮助解决此扩展问题:

  • top.sls 文件 - 将 Salt 状态映射到其适用的工作节点。
  • Highstate 执行 - 在单个执行中运行 top.sls 中概述的所有 Salt 状态。

top 文件描绘了在特定环境中应将哪些状态应用于不同的工作节点。以下是一个 top 文件示例:

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

在此示例中,base 指的是 Salt 环境,这是默认值。可以根据需要指定多个环境,如 prod、dev、QA 等。

在该环境下指定工作节点组,并针对每组工作节点列出状态。此 top 文件指示应将名为 all_server_setup 的状态应用于所有工作节点 '*',而应将名为 web_server_setup 的状态应用于 01webserver 工作节点。

要运行 Salt 命令,将使用 state.highstate 函数:

salt \* state.highstate

此命令将 top 文件应用于目标工作节点。

Salt pillar

Salt 的 pillar 功能采用在 Salt 主节点上定义的数据,并根据需要将其分发给工作节点。Pillar 主要用于存储密钥或其他高度敏感的数据,例如帐户凭据、加密密钥或密码。Pillar 也可用于存储不希望直接放在状态文件的非机密数据(如配置数据)。

Salt pillar 以与颗粒相反的方向将数据带入集群。颗粒是从工作节点生成的数据,而 pillar 是从 Salt 主节点生成的数据。

pillar 的组织方式类似于 Pillar 状态树中的状态,其中 top.sls 的作用是根据环境和工作节点对数据的了解协调 pillar 数据。使用 pillar 传输的信息有一个字典,该字典针对目标工作节点生成,并使用该工作节点的密钥进行加密,以确保数据传输安全。将逐个工作节点对 Pillar 数据进行加密,这对于存储特定于特定工作节点的敏感数据非常有用。

信标和信标

信标系统是一种监控工具,可以侦听工作节点上的各个系统进程。信标可以触发反应器,然后反应器帮助实施更改或对问题进行故障排除。例如,如果某个服务的响应超时,则反应器系统可以重新启动该服务。

信标用于多种用途,其中包括:

  • 自动报告
  • 错误日志传送
  • 微服务监控
  • 用户 shell 活动
  • 资源监控

当与反应器结合使用时,信标可以创建对基础架构和应用程序问题的自动预写响应。反应器使用预写修复状态对 Salt 进行了扩展,使其可自动响应。

反应器可以在各种场景中应用:

  • 基础架构扩展
  • 通知管理员
  • 重新启动失败的应用程序
  • 自动回滚

当信标和反应器结合使用时,可以根据特定需求创建自定义的独特状态。

Salt 运行程序和编排

Salt 运行程序是使用 salt-run 命令的便利应用程序。Salt 运行程序的工作原理与 Salt 执行模块类似。但是,它们在 Salt 主节点(而不是工作节点)上执行。Salt 运行程序可以是简单的客户端调用或复杂的应用程序。

Salt 能够在整个企业内编排系统管理任务。通过编排,可以集中协调多个计算机的活动。它还具备另一项优势:能够控制某些配置事件发生的顺序。编排状态使用状态运行程序模块在 Salt 主节点上执行。

运行多节点安装时,实际上是在运行一个编排来安装 SaltStack Config。在多节点安装方案中,可以运行由 VMware 设计的编排 highstate。Highstate 在 Salt 主节点上运行并设置多节点环境。将在托管 PostgreSQL、Redis 和 RaaS 的其他三个节点上安装核心 SaltStack Config 架构。