helloGPT SaltStack教程

SaltStack 是一个用于远程命令执行与配置管理的工具,本教程带你从架构到实战:安装部署(Master/Minion 与无主机模式)、核心概念(Grains、Pillars、States、Modules)、SLS 与 Jinja 模板写法、常见操作命令、自动化流程与排错技巧,配合示例让你能在真实环境快速上手并避免常见坑。

helloGPT SaltStack教程

先说清楚:SaltStack 是什么(想清楚再做事)

把 SaltStack 想成运维里的“遥控器 + 配方书”。它能同时向成百上千台机器下命令(遥控器),也能把系统变成你想要的样子(配方书,称为 States/SLS)。理解这两件事,就抓住了 Salt 的精髓。

核心概念一览(要能解释给别人听)

  • Master:集中控制节点,接收并下发任务;
  • Minion:被控制的服务器,执行 Master 的命令;
  • Salt SSH:无代理模式,通过 SSH 管理主机;
  • State(SLS):声明式配置文件,描述目标系统应该是什么样;
  • Grains:静态主机信息(类似主机标签),例如操作系统、CPU;
  • Pillar:针对主机或主机组的敏感或特定数据(比如密码);
  • Execution Modules:可执行的命令模块,比如 pkg.install、service.running;
  • Runners / Engines / Reactors:在 Master 上运行的任务引擎,支持事件驱动与编排;
  • Syndic:多级 Master 架构,适合跨数据中心管理。

为什么要用 Salt 而不是只用脚本(别急着复制粘贴)

脚本直接、灵活,但难以保证幂等性和状态一致。Salt 的优势是声明式(你只描述想要的最终状态)、高并发(ZeroMQ 支撑的大规模并发执行)、以及丰富模块生态(操作系统、云厂商、数据库都有现成模块)。我常常把 Salt 想成“有记忆的脚本”,它知道要把系统变成什么样。

快速上手:安装与基本配置(可复制的步骤)

1. 系统准备

示例基于常见 Linux 发行版(Ubuntu/CentOS)。确保 Python 与网络连通,防火墙允许 Master 与 Minion 的通信端口(默认 4505、4506)。

2. 安装(Master 与 Minion)

最常用的安装方式是使用发行版包管理器或官方仓库。安装后主要文件位置:

  • /etc/salt/master —— Master 配置;
  • /etc/salt/minion —— Minion 配置;
  • /srv/salt —— 默认的 State 存放位置;
  • /srv/pillar —— 默认的 Pillar 存放位置。

示例命令(根据系统调整):

sudo apt-get update
sudo apt-get install -y salt-master salt-minion

3. 配置与密钥接受

Minion 启动后会生成公钥并发送给 Master,在 Master 上查看并接受:

salt-key -L       # 列出待接收的 key
salt-key -a   # 接受

接受后可以用 salt ‘*’ test.ping 来检测连通性。

SLS(State)基础与示例:把机器变成“我想要的样子”

写 SLS 就是写一份愿景:目标主机应该有哪个包、哪个服务在运行、哪个文件内容是什么。Salt 会确保达成,不会盲目重复执行已完成的步骤(幂等)。下面给出一个最小的示例,创建 /etc/motd 并确保 nginx 安装并运行。

/srv/salt/example.sls

set-motd:
  file.managed:
    - name: /etc/motd
    - source: salt://files/motd
    - user: root
    - group: root
    - mode: '0644'

install-nginx:
  pkg.installed:
    - name: nginx

nginx-running:
  service.running:
    - name: nginx
    - enable: True
    - require:
      - pkg: install-nginx

这个例子有三件事:文件管理、包管理、服务管理。注意 use of require,确保依赖顺序。

Jinja 模板与变量(更灵活的 SLS)

在 SLS 中可以写 Jinja,实现条件逻辑与循环:

/srv/salt/users.sls

{% for user in ['alice', 'bob'] %} create-user-{{ user }}: user.present: - name: {{ user }} - shell: /bin/bash {% endfor %}

把 Pillar 与 Grains 结合进来,就能做出按主机定制的配置。

Pillar 与 Grains:谁放哪儿的原则

  • Grains:主机自身信息,系统自动产生,比如 os_family、ip、roles。只读,适合用于匹配与分组。
  • Pillar:Master 下发的机密或环境特异数据,比如数据库密码、环境变量。Pillar 可以被 SLS 安全引用。

示例:在 /srv/pillar/top.sls 中分配 pillar:

base:
  '*':
    - common
  'web*':
    - match: glob
    - web

然后在 /srv/pillar/web.sls 中定义 web 环境专属配置。

常用命令速查表

命令 功能
salt ‘*’ test.ping 检测所有 minion 是否在线
salt ‘*’ state.apply 在所有匹配主机上应用 SLS(等于 state.highstate 或指定 SLS)
salt ‘‘ cmd.run ‘uptime’ 在指定主机上执行命令
salt-key -L 列出未接收/已接收的 minion key
salt-call –local state.apply 在无 Master 的主机上本地应用 State(masterless)

一些常见进阶功能(你会用的那些)

Orchestrate(编排)

当你有跨主机或跨服务的复杂流程时,Orchestration 能在 Master 上以 SLS 的方式编排步骤,保证先后顺序并能在出错时回滚或通知。

Reactors(事件驱动)

Salt 产生事件总线(event bus)。你可以写 Reactor:当某个事件(比如 minion 下线、某个监控事件)发生时,触发自动化任务。非常适合自动回复式运维。

Salt SSH(无代理)

不想在每台机器上安装 minion 时,可以用 Salt SSH,基于 SSH 调用命令并在远端临时运行 salt-call。适用于小规模或暂时管理。

安全与多环境管理(必须要写)

  • 启用 TLS(默认已启用),并仅接受已知 key;
  • 使用 Pillar 存放敏感数据,并搭配 external pillar 或加密器(GPG, Vault);
  • 合理划分 environments(base、dev、prod),并用 top.sls 精确控制 SLS 分配;
  • 最小权限:Runner/remote execution 的用户仅授予需要的权限;

性能与扩展(避免踩雷)

当管理节点数达到数千台时,注意几件事:

  • Master 硬件要足够(CPU 与内存);
  • 调整 thread_pool、worker_threads 等 Salt 配置;
  • 使用 Syndic 或多 Master 架构分区管理负载;
  • 合理拆分 state 文件,避免单个 SLS 过大影响解析性能;

常见故障与排错思路(我通常这样查)

  • minion 无法连接:检查防火墙、端口(4505/4506)、DNS/Hosts;
  • 命令不执行或超时:查看 master / minion 日志(/var/log/salt/master, /var/log/salt/minion);
  • State 无法勾上依赖:确认 require/requisite 语法、ID 是否唯一;
  • Pillar 未加载:检查 top.sls 的匹配规则与 Pillar 渲染是否报错(salt ‘*’ pillar.items);

实战示例:用 SLS 部署一个“helloGPT”页面

这是一个完整示例,把一个简单的静态页面放到 nginx 下,展示如何组合文件管理、模板与 service。

# /srv/salt/hello/init.sls
install-nginx:
  pkg.installed:
    - name: nginx

copy-hello: file.managed: - name: /usr/share/nginx/html/index.html - source: salt://hello/index.html - user: root - group: root - mode: '0644' - require: - pkg: install-nginx

nginx-running: service.running: - name: nginx - enable: True - watch: - file: copy-hello

同时在 /srv/salt/hello/index.html 中放置模板内容,可以用 Jinja 动态填值(比如插入 Pillar 提供的欢迎词)。

与其他工具的比较(把选择讲清楚)

简单对比帮助决策:

  • Salt vs Ansible:Salt 支持长期连接(高并发),Ansible 更依赖 SSH,无代理且简单;
  • Salt vs Puppet/Chef:Salt 更注重实时执行与事件驱动,Puppet 更偏向模型驱动的长期合规;

最佳实践清单(实操时把这些放到流程里)

  • 用版本控制管理 /srv/salt 与 /srv/pillar;
  • 把敏感信息放入加密的 Pillar 或外部密钥管理系统;
  • 用 CI/CD 去做 state 的测试与发布(先在 dev 环境测试);
  • 定期清理未使用的 keys 与过期的 Pillar 数据;

补充资源(书名与概念,自己去找来读)

推荐阅读:SaltStack 官方文档(读最新版本)、《Salt Essentials》与社区博客。读这些可以加深对 Reactor、Runner 与 Syndic 的理解。

写到这里有点像在白板上画流程图:先把架构、用途和目标搞明白,再一步步把工具装起来、写 SLS、测试、再扩展成事件驱动或编排。这种思路比盲目复制配置更能帮你把 Salt 用稳,遇到问题也更容易定位。若你想,我可以把上面的示例转成可直接运行的仓库结构,或者按你的环境写一份定制化的 SLS。

返回首页