大多数用户发现,在开始安装过程之前了解 Salt 的定义及其工作原理非常有用。Salt 使用主节点-客户端模型,在此模型中,Salt 主节点向客户端发出命令,而客户端执行命令。
什么是 Salt?
SaltStack Config 由 Salt 提供支持,Salt 是一个基于 Python 的开源远程执行框架,用于:
- 配置管理
- 自动化
- 置备
- 编排
Salt 是 SaltStack Config 核心功能的底层技术。SaltStack Config 增强并扩展了 Salt,提供了其他功能和特性,改进了易用性。有关 SaltStack Config 基础架构的摘要信息,请参见 SaltStack Config 系统架构。
下图显示了基本 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 应用程序:
| 方法 |
实施 |
结果 |
|---|---|---|
| 远程执行 |
|
|
| 配置管理 |
|
|
验证 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 架构。