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

先说清楚: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 ‘ |
在指定主机上执行命令 |
| 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。