news 2026/9/21 7:18:51

从零到生产:Salt状态模块(SLS)完全教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从零到生产:Salt状态模块(SLS)完全教程

从零到生产: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):

  1. top.sls是调度中枢:把 Minion 匹配表达式与 SLS 文件映射起来
  2. 目录即命名空间users/admin.sls→ 状态名users.admin
  3. 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.apply

Minion 会自动下载top.sls、匹配表达式、拉取对应 SLS 并执行。完整步骤见官方教程 doc/topics/tutorials/states_pt1.rst。

执行成功后,目标主机上就保证了 Apache 已安装——这正是 SLS "声明结果而非过程"的体现:

四、状态文件三要素

每一行 SLS 都由三部分构成,记住"ID → 状态 → 函数"的口诀:

apache: # ① ID 声明:任意标识符 pkg.installed: [] # ② 状态声明 + ③ 函数声明 service.running: # 同一个 ID 可挂多个状态 - require: - pkg: apache
  • ID 声明:任意标识符,常用作资源名
  • 状态声明:使用哪个内置状态模块(pkgfileserviceuser…,源码位于 salt/states/,130+ 个现成模块)
  • 函数声明:该状态模块的具体函数(installedmanagedrunning

五、依赖关系(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.applydoc/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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/21 6:59:06

运放+MOS管恒流源电路设计:从原理到调试实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/21 5:25:06

STM32 MC SDK工程结构深度解析:从WorkBench生成到FOC定制

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/21 5:15:45

Scale-up互连协议深度解析:状态机、PBR路由与比特级对比

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/21 5:12:48

嵌入式面试高频失分点:C语言、RTOS、硬件调试与项目深挖实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/21 5:09:39

Flutter鸿蒙适配实战:纯Dart bcrypt守护用户密码安全

项目标题: Flutter for OpenHarmony:Flutter 三方库 bcrypt — 守护鸿蒙应用的用户隐私与密码安全(适配鸿蒙 HarmonyOS Next ohos)关键词: Flutter, OpenHarmony, bcrypt, HarmonyOS Next, ohos, 密码安全, 用户隐私摘要: 在 Flutter 应用向 …

作者头像 李华