一、SaltStack 是什么?
SaltStack (简称 Salt)是 Salt Project 开源的自动化运维工具,采用 Apache License 2.0 协议。它类似于 Ansible、Puppet 和 Chef,但以 高性能、事件驱动、并行执行 著称。
✅ 核心能力:
| 功能 | 说明 |
|---|---|
| 远程命令执行 | 在成百上千台机器上同时运行命令 |
| 配置管理(State) | 声明式定义系统期望状态(如安装 nginx、启动服务等) |
| 基础设施即代码(IaC) | 自动化部署云资源(通过 salt-cloud) |
| 事件驱动架构 | 系统变化可触发自定义响应(如文件修改 → 重启服务) |
| 跨平台支持 | 支持 Linux、Windows、macOS、BSD 等 |
🌐 典型应用场景:
- 批量服务器初始化:统一设置时区、用户、防火墙规则。
- 应用一键部署:将 Web 应用部署到 100 台服务器。
- 故障排查:快速收集所有服务器的磁盘使用率、进程列表。
- 安全合规检查:定期验证 SSH 配置是否符合公司策略。
- 云资源编排:在 AWS 上自动创建并配置 EC2 实例。
二、SaltStack 的核心组件
| 组件 | 作用 | 是否必须安装 |
|---|---|---|
salt-master |
控制中心,下发任务、接收结果 | 主控端需要 |
salt-minion |
客户端代理,执行命令并返回结果 | 被控端需要 |
salt-ssh |
无需安装 minion,通过 SSH 执行命令(类似 Ansible) | 可选 |
salt-syndic |
构建多级 Master 架构(适合超大规模集群) | 可选 |
salt-cloud |
管理云平台(AWS/Azure/GCP/OpenStack) | 可选 |
salt-api |
提供 REST API,供 Web 或其他系统调用 Salt | 可选 |
三、SaltStack 工作原理
🔧 架构:主从(Master-Minion)
- Master:1 台(或高可用集群)
- Minion:N 台(目标服务器)
📡 通信机制
- 默认使用 ZeroMQ(高性能消息队列)
- 也可切换为 TCP/RAET(较少用)
- 加密方式:AES + 公钥认证
🔐 连接建立流程(信任关系)
管理员 Master Minion 管理员 Master Minion 之后所有通信均加密 启动后连接 4506 端口,发送自身 ID 和公钥 等待手动/自动接受密钥 salt-key -A (接受所有) 返回 Master 公钥 生成 AES 会话密钥,用 Minion 公钥加密后下发 用私钥解密,保存会话密钥
⚙️ 任务执行流程
- 用户在 Master 执行:
salt '*' test.ping - Master 生成唯一 Job ID (JID)
- 通过 4505 端口(发布端口) 广播任务
- 所有匹配的 Minion 接收任务并执行
- 执行结果通过 4506 端口(返回端口) 发回 Master
- Master 汇总结果,输出为 JSON/YAML 格式
📌 端口说明:
- 4505:任务分发(publish_port)
- 4506:结果返回(ret_port)
四、SaltStack 安装部署
Salt 提供多个版本:
- LTS(Long-Term Support) :稳定版,推荐生产环境使用(如
3006.9) - STS(Short-Term Support) :创新版,含新功能,适合测试(如
3007)
方式 1️⃣:通过官方仓库安装(推荐)
▶️ CentOS / RHEL(RPM 包)
bash
# 添加官方仓库
curl -fsSL https://github.com/saltstack/salt-install-guide/releases/latest/download/salt.repo | sudo tee /etc/yum.repos.d/salt.repo
# 安装 Master(主控端)
sudo yum install salt-master -y
# 安装 Minion(被控端)
sudo yum install salt-minion -y
# 查看版本
salt --version
▶️ Ubuntu / Debian(DEB 包)
bash
# 添加官方源
curl -fsSL https://github.com/saltstack/salt-install-guide/releases/latest/download/salt.sources | sudo tee /etc/apt/sources.list.d/salt.sources
# 更新包索引
sudo apt update
# 安装 Master
sudo apt install salt-master -y
# 安装 Minion
sudo apt install salt-minion -y
# 查看版本
salt --version
✅ 优点:自动处理依赖,升级方便
📌 注意:确保
/etc/apt/keyrings/目录存在(Debian 12+ 需要)
方式 2️⃣:通过 pip 安装(适合开发/隔离环境)
bash
# 安装指定 LTS 版本(例如 3006.9)
pip3 install salt==3006.9 -i https://pypi.tuna.tsinghua.edu.cn/simple
# 验证
salt --version
⚠️ 缺点:需手动管理依赖,不推荐生产环境
方式 3️⃣:使用官方 bootstrap 脚本(最灵活)
🔗 脚本地址:
- Linux/macOS:
bootstrap-salt.sh - Windows:
bootstrap-salt.ps1
▶️ 常用参数说明:
| 参数 | 作用 |
|---|---|
-M |
安装 salt-master |
-N |
不安装 salt-minion |
-X |
安装后不启动服务 |
-D |
显示调试信息 |
-P |
使用 pip 安装缺失依赖 |
stable <version> |
安装指定稳定版 |
▶️ 示例命令:
bash
# 仅安装 Minion(默认行为)
./bootstrap-salt.sh stable 3006.9
# 仅安装 Master(不装 Minion)
./bootstrap-salt.sh -M -N stable 3006.9
# 安装 Master + Minion,并指定版本
./bootstrap-salt.sh -M stable 3006.9
# 安装并启用调试模式
./bootstrap-salt.sh -D stable 3006.9
💡 初学者建议:先在一台机器上同时安装 master 和 minion(用于测试)
五、初次使用 SaltStack(快速体验)
步骤 1:启动服务
bash
# 启动 master
sudo systemctl start salt-master
# 启动 minion(注意:需先配置 minion 连接 master)
sudo systemctl start salt-minion
步骤 2:配置 Minion(编辑 /etc/salt/minion)
yaml
master: localhost # 如果 master 在本机
id: my-test-minion # 可选,自定义 minion ID
步骤 3:在 Master 上接受密钥
bash
# 查看待接受的 minion
sudo salt-key -L
# 接受所有(或指定 ID)
sudo salt-key -A
步骤 4:执行第一条命令!
bash
# 测试连通性
salt '*' test.ping
# 查看所有 minion 的内核版本
salt '*' grains.get kernelrelease
# 在所有 minion 上执行 ls /tmp
salt '*' cmd.run 'ls /tmp'
✅ 成功输出表示 SaltStack 已正常工作!
六、练习题(巩固知识)
📝 基础题
- SaltStack 默认使用什么协议进行 Master-Minion 通信?端口号是多少?
salt-ssh和salt-minion的主要区别是什么?- 如何查看当前有哪些 Minion 等待接受密钥?
💻 操作题
- 在一台 Ubuntu 22.04 机器上,使用官方仓库安装 Salt Master 和 Minion,并完成首次
test.ping。 - 使用 bootstrap 脚本安装 Salt 3006.9 版本的 Master(不安装 Minion),并验证版本。
🧠 思考题
- 为什么 Salt 要先建立"信任关系"?如果不接受密钥会发生什么?
- 在拥有 1000 台服务器的场景下,Salt 的"并行执行"相比 Ansible 的"串行/小批量"有何优势?