SaltStack详解及部署
文档适用场景:适用于Linux服务器集群自动化运维、批量配置管理、远程命令执行、服务自动化部署,聚焦Master-Minions主从架构完整部署流程,适配CentOS 7/8/9、Ubuntu 20.04/22.04系统,全网段统一采用10.0.0.0/24。
一、SaltStack核心基础认知
1.1 工具定义与核心定位
SaltStack(简称Salt)是基于Python开发、采用ZeroMQ高性能异步通信协议的开源企业级自动化运维平台,核心解决大规模服务器集群的批量管控、配置一致性维护、自动化部署与事件驱动运维问题。相较于同类工具,它兼顾高性能并发与易用性,既支持Master-Minions主从架构(适合大规模固定集群),也支持Salt SSH无代理模式(适合临时管控、无法安装客户端的场景),完美对标Ansible,且在大规模节点并发执行场景下性能优势显著,是中大型企业集群运维的核心工具之一。
1.2 核心架构(Master-Minions主从)
- Salt Master(主控节点):集群管控核心,负责指令下发、Minion密钥认证管理、配置文件存储、执行结果收集与汇总,默认监听4505/tcp(消息发布端口)和4506/tcp(数据请求回复端口),是整个集群的控制中枢。
- Salt Minion(被控节点):部署在所有需要被管理的服务器上,主动发起对Master的连接请求,无需额外开放入站端口,接收Master下发的指令并本地执行,执行完成后同步返回结果,全程被动响应、主动上报。
- 密钥认证机制:Salt集群的安全核心,Minion首次启动会自动生成密钥并向Master发送认证请求,Master手动授权通过后,双方才可建立加密通信链路,未授权节点无法接入集群,杜绝非法访问。
1.3 核心优势
- 高性能并发:基于ZeroMQ长连接通信,批量执行命令速度远超传统SSH工具,支持数千台节点同时管控,无明显性能瓶颈。
- 双模式灵活适配:主从架构保障大规模集群性能,Salt SSH无代理模式适配特殊场景,无需安装客户端即可临时管控。
- 语法低门槛:配置文件采用YAML+Jinja2语法,书写格式贴近Ansible Playbook,运维人员无需深厚编程基础即可快速上手。
- 功能全覆盖:涵盖远程命令执行、软件批量安装、配置文件推送、服务状态管理、系统信息采集、API二次开发等全场景运维需求。
- 跨平台兼容:完美支持Linux全发行版、Windows Server、主流网络设备,适配多云、混合云集群统一管控。
1.4 核心组件与常用命令速览
salt-master:主控端服务程序,负责集群管控与任务调度salt-minion:被控端客户端程序,负责本地指令执行salt:Master端核心命令,用于下发远程执行指令salt-key:Minion密钥认证专用命令,管理节点接入权限salt-call:Minion端本地调试命令,用于本地测试模块执行salt-run:Master端全局任务执行命令,处理集群级调度任务
二、部署前环境准备(10.0.0.0/24网段)
2.1 服务器规划(最小化生产/测试集群)
| 角色 | 主机名 | IP地址 | 操作系统 | 核心服务 | 配置建议 |
|---|---|---|---|---|---|
| Salt Master(主控) | salt-master | 10.0.0.10 | CentOS 7/8/9、Ubuntu 20.04+ | salt-master | 2核4G及以上,稳定运行 |
| Salt Minion-01(被控) | salt-minion-01 | 10.0.0.11 | CentOS 7/8/9、Ubuntu 20.04+ | salt-minion | 1核2G及以上 |
| Salt Minion-02(被控) | salt-minion-02 | 10.0.0.12 | CentOS 7/8/9、Ubuntu 20.04+ | salt-minion | 1核2G及以上 |
2.2 基础环境配置(所有节点必须执行)
部署前统一优化基础环境,避免因防火墙、SELinux、时间不同步等问题导致集群通信失败,所有操作在root用户下执行:
2.2.1 防火墙配置(生产优先放行端口,测试可直接关闭)
- CentOS/RHEL系统操作: 测试环境:临时关闭并禁用防火墙 systemctl stop firewalld systemctl disable firewalld
生产环境:仅放行Salt Master核心端口,禁止直接关闭防火墙
firewall-cmd –permanent –add-port=4505/tcp firewall-cmd –permanent –add-port=4506/tcp firewall-cmd –reload
验证端口放行状态
firewall-cmd –list-ports
- Ubuntu/Debian系统操作: 测试环境:关闭UFW防火墙 ufw disable
生产环境:放行核心端口
ufw allow 4505/tcp ufw allow 4506/tcp ufw reload
2.2.2 关闭SELinux(CentOS/RHEL专属)
# 临时关闭SELinux
setenforce 0
# 永久关闭SELinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
# 验证SELinux状态,输出Disabled即为正常
getenforce
2.2.3 主机名与Hosts解析配置
# Master节点执行,设置专属主机名
hostnamectl set-hostname salt-master
# Minion-01节点执行
hostnamectl set-hostname salt-minion-01
# Minion-02节点执行
hostnamectl set-hostname salt-minion-02
# 所有节点执行,添加Hosts解析,避免DNS解析故障或等待超时
cat >> /etc/hosts <<EOF
127.0.0.1 localhost localhost.localdomain
10.0.0.10 salt-master
10.0.0.11 salt-minion-01
#10.0.0.12 salt-minion-02
EOF
2.2.4 同步系统时间
时间不同步会直接导致Minion密钥认证失败,必须同步集群时间:
# CentOS/RHEL系统
yum install chrony -y
systemctl enable --now chronyd
# Ubuntu/Debian系统
apt install chrony -y
systemctl enable --now chronyd
# 验证时间同步状态
timedatectl status
三、部署流程
3.1 Master节点部署(主控端,10.0.0.10)
3.1.1 安装SaltStack
# 安装依赖
yum install -y python36 python36-setuptools python36-pip libsodium zeromq
[root@salt-master saltstack]#tree .
.
├── salt-3006.3-0.x86_64.rpm
├── salt-master-3006.3-0.x86_64.rpm
└── salt-minion-3006.3-0.x86_64.rpm
0 directories, 3 files
# 下载离线包
Master 节点(10.0.0.10)
# 一次性安装三个包,yum 自动处理依赖
yum localinstall -y *.rpm
Minion 节点(10.0.0.11/12)
# 只需要安装核心包 + minion 包
yum localinstall -y salt-3006.3-0.x86_64.rpm salt-minion-3006.3-0.x86_64.rpm
#本地安装(不依赖任何 YUM 源)
#rpm -ivh salt-*.rpm --force --nodeps
3.1.2 优化Master核心配置
备份默认配置文件,替换为生产稳定版配置,屏蔽冗余参数,聚焦核心通信与目录配置,适配10.0.0.0/24网段:
# 备份默认配置,防止配置失误无法回滚
cp /etc/salt/master /etc/salt/master.bak
# 写入核心配置,所有参数适配生产环境
cat > /etc/salt/master << EOF
# 监听所有网卡,适配10.0.0.0/24网段内网通信
interface: 0.0.0.0
# 消息发布端口,固定4505
publish_port: 4505
# 数据回复端口,固定4506
ret_port: 4506
# 以root用户运行服务,保障权限充足
user: root
# 工作线程数,根据服务器配置调整,默认10满足中小集群需求
worker_threads: 10
# SLS配置文件根目录,存放自动化部署、配置管理脚本
file_roots:
base:
- /srv/salt
# 敏感数据存储目录,存放密码、密钥等隐私配置
pillar_roots:
base:
- /srv/pillar
# 生产环境禁用自动授权,必须手动认证Minion密钥,保障安全
auto_accept: False
EOF
3.1.3 创建工作目录
# 创建配置文件与敏感数据目录
mkdir -p /srv/salt /srv/pillar
# 配置目录权限,仅root可读写,保障安全
chown -R root:root /srv/salt /srv/pillar
chmod 755 /srv/salt /srv/pillar
3.1.4 启动服务并设置开机自启
# 启动salt-master服务
systemctl start salt-master
# 设置开机自启,服务器重启后自动恢复集群
systemctl enable salt-master
# 查看服务状态,确保显示active (running)
systemctl status salt-master
# 验证端口监听状态,确认4505、4506端口正常监听
netstat -lntp | grep salt
[root@salt-master saltstack]#ss -tnulp|grep salt
tcp LISTEN 0 128 *:4505 *:* users:(("/opt/saltstack/",pid=17231,fd=44))
tcp LISTEN 0 128 *:4506 *:* users:(("/opt/saltstack/",pid=17237,fd=73))
3.2 Minion节点部署(被控端,10.0.0.11/12)
所有Minion节点部署流程完全一致,仅需修改本机唯一ID,依次在10.0.0.11、10.0.0.12节点执行以下操作:
3.2.1 安装salt-minion服务
3.2.2 配置Minion指向Master(核心步骤)
配置Minion连接的Master地址为10.0.0.10,设置本机唯一ID(不可重复,建议和主机名一致):
# 备份默认配置
cp /etc/salt/minion /etc/salt/minion.bak
# 写入核心配置,以Minion-01为例,Minion-02需修改id为salt-minion-02
cat > /etc/salt/minion << EOF
# 指定Master节点IP,固定为10.0.0.10
master: 10.0.0.10
# 本机唯一ID,不可重复,Minion-01设为salt-minion-01,Minion-02设为salt-minion-02
id: salt-minion-01
# 开启密钥自动生成
autosign_grains_dir: /etc/salt/minion.d
EOF
3.2.3 启动Minion服务
# 启动salt-minion服务
systemctl start salt-minion
# 设置开机自启
systemctl enable salt-minion
# 查看服务状态,确认正常运行
systemctl status salt-minion
Minion启动后,会自动向Master节点(10.0.0.10)发送密钥认证请求,等待Master授权。
3.3 Minion密钥认证(Master节点执行,核心安全步骤)
Minion接入集群必须完成密钥授权,未授权节点无法接收指令,全程在Master节点操作:
3.3.1 查看待授权密钥
# 列出所有密钥状态,分为已授权、待授权、拒绝、过期四类
[root@salt-master saltstack]#salt-key -L
Accepted Keys:
Denied Keys:
Unaccepted Keys:
salt-minion-01
Rejected Keys:
3.3.2 授权Minion密钥
授权单个指定节点(生产推荐,精准管控):
授权salt-minion-01
[root@salt-master saltstack]#salt-key -a salt-minion-01 -y
The following keys are going to be accepted:
Unaccepted Keys:
salt-minion-01
Key for minion salt-minion-01 accepted.
[root@salt-master saltstack]#salt-key -L
Accepted Keys:
salt-minion-01
Denied Keys:
Unaccepted Keys:
Rejected Keys:
授权salt-minion-02
salt-key -a salt-minion-02 -y
批量授权所有待授权节点(测试环境快速部署):
salt-key -A -y
3.3.3 验证授权结果
salt-key -L
确认Minion ID已移动至Accepted Keys列表,即为授权成功。
3.4 集群连通性测试
授权完成后,在Master节点执行连通性测试,验证集群通信是否正常:
# 测试所有已授权节点连通性,返回True即为正常
salt '*' test.ping
# 测试单个指定节点
salt 'salt-minion-01' test.ping
# 批量测试通配符匹配的节点
salt 'salt-minion-*' test.ping
所有节点返回True,代表SaltStack集群部署完成,可正常执行运维任务。
[root@salt-master saltstack]#salt '*' test.ping
salt-minion-01:
True
四、基础运维实战与常用命令
4.1 远程批量执行命令
# 查看所有节点系统版本
salt '*' cmd.run 'cat /etc/redhat-release'
[root@salt-master saltstack]#salt '*' cmd.run 'cat /etc/redhat-release'
salt-minion-01:
CentOS Linux release 7.9.2009 (Core)
# 查看所有节点内存使用情况
salt '*' cmd.run 'free -h'
# 查看所有节点磁盘使用情况
salt '*' cmd.run 'df -h'
# 批量安装Nginx
salt '*' pkg.install nginx
# 批量启动并设置Nginx开机自启
salt '*' service.running nginx enable=True
4.2 配置管理(SLS文件实战)
SaltStack通过SLS文件实现配置管理,类似Ansible Playbook,实现自动化部署与配置一致性维护,以批量部署Nginx为例:
# 在Master节点创建Nginx部署SLS文件
vim /srv/salt/nginx_install.sls
写入以下内容:
# 安装Nginx软件包
nginx-install:
pkg.installed:
- name: nginx
# 启动Nginx服务并设置开机自启
nginx-service:
service.running:
- name: nginx
- enable: True
- reload: True
执行SLS文件,批量部署Nginx:
salt '*' state.sls nginx_install
4.3 密钥管理常用命令
salt-key -d 节点ID:删除指定已授权节点salt-key -D:删除所有已授权节点salt-key -r 节点ID:拒绝指定待授权节点
五、生产环境部署注意事项
核心注意事项:
- 生产环境严禁开启auto_accept: True,必须手动授权Minion密钥,杜绝非法节点接入。
- Master节点建议部署高可用架构,避免单点故障,核心数据定期备份。
- 防火墙仅放行4505、4506端口,禁止直接关闭防火墙,保障服务器安全。
- Minion ID必须唯一,严禁重复,否则会导致集群通信混乱。
- 集群所有节点必须同步系统时间,防止密钥认证失败。
- Master与Minion版本必须保持一致,避免因版本差异导致功能异常。
六、常见故障排查
- Minion无法认证:检查Master IP配置是否为10.0.0.10、防火墙是否放行端口、时间是否同步。
- 执行命令无响应:确认Minion服务正常运行、密钥已授权、网络互通。
- 端口无法监听:检查SELinux是否关闭、配置文件参数是否有误、服务是否正常启动。