从零到生产:Salt状态模块(SLS)完全教程
【免费下载链接】saltSoftware to automate the management and configuration of infrastructure and applications at scale.项目地址: https://gitcode.com/gh_mirrors/sa/salt
Salt 状态模块(SLS,Salt State)是开源配置管理工具 Salt 的核心能力,帮你用声明式的 YAML 文件定义"系统应该长什么样",然后一条命令把几十甚至上千台服务器批量推进到目标状态。本教程面向新手,带你从零搭建第一个 SLS 状态文件,掌握依赖关系、Jinja 模板、多环境发布等关键技巧,最终形成一套可上生产环境的自动化配置管理流程。
一、为什么选择 Salt 状态管理?
传统运维靠"人肉登录每台机器执行命令",而Salt 状态模块(SLS)把配置写成版本可控的文本文件:
- ✅声明式:只描述"期望状态"(装好 Apache、服务在运行),不关心具体步骤
- ✅幂等性:反复执行结果一致,已满足的状态会自动跳过
- ✅可追溯:SLS 文件可纳入版本控制,谁改了什么一目了然
- ✅规模化:一条命令
salt '*' state.apply即可覆盖全部主机
Salt 由 Master(中心管理)和 Minion(被管节点)组成,SLS 状态文件存放在 Master 的文件服务器上,按需下发到 Minion 执行。整体架构可参考项目文档 doc/_static/salt-architecture.png。
二、30 秒理解 SLS 的核心概念
SLS =SaltLanguageState,本质上是一组普通的数据文件(默认是 YAML + Jinja 格式),放在 Master 的文件根目录(file_roots,默认/srv/salt)中。
一个典型的状态树结构:
top.sls ← 总入口:决定哪台 Minion 应用哪些状态 ssh.sls ← 普通状态文件 users/init.sls ← init.sls 等价于父目录名(users 状态) salt/master.sls ← 点号命名:salt.master 状态三个关键规则(出自官方参考 doc/ref/states/index.rst):
top.sls是调度中枢:把 Minion 匹配表达式与 SLS 文件映射起来- 目录即命名空间:
users/admin.sls→ 状态名users.admin init.sls代表所在目录:web/init.sls→ 状态名web
三、快速上手:第一个 SLS 状态
步骤 1:确认文件服务器配置
在 Master 配置 conf/master 中确认file_roots:
file_roots: base: - /srv/salt步骤 2:编写 top.sls
在/srv/salt/top.sls中声明"给所有主机应用 webserver 状态":
base: '*': - webserver步骤 3:编写 webserver.sls
apache: pkg.installed: []步骤 4:执行状态
salt '*' state.applyMinion 会自动下载top.sls、匹配表达式、拉取对应 SLS 并执行。完整步骤见官方教程 doc/topics/tutorials/states_pt1.rst。
执行成功后,目标主机上就保证了 Apache 已安装——这正是 SLS "声明结果而非过程"的体现:
四、状态文件三要素
每一行 SLS 都由三部分构成,记住"ID → 状态 → 函数"的口诀:
apache: # ① ID 声明:任意标识符 pkg.installed: [] # ② 状态声明 + ③ 函数声明 service.running: # 同一个 ID 可挂多个状态 - require: - pkg: apache- ID 声明:任意标识符,常用作资源名
- 状态声明:使用哪个内置状态模块(
pkg、file、service、user…,源码位于 salt/states/,130+ 个现成模块) - 函数声明:该状态模块的具体函数(
installed、managed、running)
五、依赖关系(Requisites):让配置按序执行
真实场景需要"先装包、再放文件、最后起服务"。Salt 通过Requisites(先决条件)表达依赖:
| 关键字 | 作用 | 典型场景 |
|---|---|---|
require | 必须先成功完成 | 装完包再启服务 |
watch | 被监视对象变化时触发动作 | 配置文件更新 → 重启服务 |
before/order | 控制执行顺序 | 精细排序 |
onchanges | 仅在变化时执行 | 变更联动 |
/etc/nginx/nginx.conf: file.managed: - source: salt://nginx/conf/nginx.conf - watch: - service: nginx nginx: service.running: []官方把这部分称为"Requisites",示例参考 doc/_incl/requisite_incl.rst,完整教程见 doc/topics/tutorials/states_pt2.rst。
六、Jinja 模板 + Grains/Pillar:一份 SLS 适配所有机器
不同发行版包名不同、不同角色配置不同——硬编码不可行。SLS 文件默认先经过Jinja2 模板渲染再解析为 YAML:
apache: pkg.installed: {% if grains['os_family'] == 'RedHat' %} - name: httpd {% elif grains['os_family'] == 'Debian' %} - name: apache2 {% endif %}两大内置数据源:
- Grains:主机自身信息(OS、内核、CPU),静态且自动采集
- Pillar:用户自定义的敏感/角色数据(数据库密码、环境参数),由 Master 侧下发
模板与环境变量的写法详解见 doc/topics/tutorials/states_pt3.rst 和 doc/topics/tutorials/pillar.rst。
七、多环境管理:从开发到生产
file_roots天然支持多环境(dev / qa / prod),配合top.sls中的环境声明,实现状态文件的逐级晋升:
file_roots: base: - /srv/salt/prod qa: - /srv/salt/qa- 同一相对路径出现在多个 root 时,列表靠前者生效
- 生产环境只从
base拉取,测试环境可用salt -e qa指定环境执行
这是 Salt 实现"配置即代码 + 环境隔离"的关键机制,详见 doc/topics/tutorials/states_pt4.rst。
八、进阶:用 SPM 打包共享 SLS 模块
当 SLS 状态在团队/公司间共享时,可以把 SLS 和 Pillar 文件打包成SPM 包,通过仓库系统分发到 Master 的/srv/spm/salt目录:
SPM 命令与包格式参考 doc/topics/spm/ 目录下的文档。
总结:你的 Salt SLS 学习路线
| 阶段 | 目标 | 对应资料 |
|---|---|---|
| 入门 | 跑通第一个state.apply | doc/topics/tutorials/states_pt1.rst |
| 进阶 | 掌握 Requisites 与模板 | doc/topics/tutorials/states_pt2.rst、doc/topics/tutorials/states_pt3.rst |
| 生产 | 多环境晋升与编排 | doc/topics/tutorials/states_pt4.rst、doc/ref/states/index.rst |
核心记忆点:SLS 文件 = YAML + Jinja;top.sls管分发;Requisites 管顺序;Grains/Pillar 管差异;file_roots多环境管发布。把这五点吃透,你就已经具备用 Salt 状态模块管理生产环境的全部基础 🚀
【免费下载链接】saltSoftware to automate the management and configuration of infrastructure and applications at scale.项目地址: https://gitcode.com/gh_mirrors/sa/salt
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考