文章目录
-
- [一、SaltStack 核心概念与架构](#一、SaltStack 核心概念与架构)
-
- [1. 核心术语(必懂)](#1. 核心术语(必懂))
- [2. 架构原理](#2. 架构原理)
- [二、环境搭建(CentOS 7 为例)](#二、环境搭建(CentOS 7 为例))
-
- [1. 准备工作](#1. 准备工作)
- [2. 安装 SaltStack(Master 与 Minion 均需操作)](#2. 安装 SaltStack(Master 与 Minion 均需操作))
-
- [步骤1:安装官方 YUM 源](#步骤1:安装官方 YUM 源)
- [步骤2:安装 Master 与 Minion](#步骤2:安装 Master 与 Minion)
- [3. 配置 Master 节点](#3. 配置 Master 节点)
-
- [步骤1:修改主配置文件 /etc/salt/master](#步骤1:修改主配置文件 /etc/salt/master)
- [步骤2:创建 States 目录](#步骤2:创建 States 目录)
- [步骤3:启动 Master 服务并设置开机自启](#步骤3:启动 Master 服务并设置开机自启)
- [4. 配置 Minion 节点](#4. 配置 Minion 节点)
-
- [步骤1:修改主配置文件 /etc/salt/minion](#步骤1:修改主配置文件 /etc/salt/minion)
- [步骤2:启动 Minion 服务并设置开机自启](#步骤2:启动 Minion 服务并设置开机自启)
- [5. 验证集群连接](#5. 验证集群连接)
- 三、核心功能实操
-
- [1. 远程命令执行(salt 命令)](#1. 远程命令执行(salt 命令))
- [2. Grains 静态属性查询](#2. Grains 静态属性查询)
-
- [示例:筛选 CentOS 7 系统的节点并执行命令](#示例:筛选 CentOS 7 系统的节点并执行命令)
- [3. States 配置管理(自动化部署核心)](#3. States 配置管理(自动化部署核心))
-
- [示例1:通过 States 批量安装 Nginx](#示例1:通过 States 批量安装 Nginx)
-
- [步骤1:创建 States 配置文件 /srv/salt/nginx/install.sls](#步骤1:创建 States 配置文件 /srv/salt/nginx/install.sls)
- [步骤2:执行 States 部署](#步骤2:执行 States 部署)
- [示例2:通过 States 同步配置文件(Nginx 配置)](#示例2:通过 States 同步配置文件(Nginx 配置))
-
- [步骤1:创建 Nginx 配置文件](#步骤1:创建 Nginx 配置文件)
- [步骤2:创建 States 配置文件 /srv/salt/nginx/config.sls](#步骤2:创建 States 配置文件 /srv/salt/nginx/config.sls)
- 步骤3:执行配置同步
- [4. Pillar 敏感数据管理](#4. Pillar 敏感数据管理)
-
- [示例:定义数据库密码并在 States 中引用](#示例:定义数据库密码并在 States 中引用)
-
- [步骤1:创建 Pillar 配置文件 /srv/pillar/db.sls](#步骤1:创建 Pillar 配置文件 /srv/pillar/db.sls)
- [步骤2:修改 Pillar 主配置 /etc/salt/master](#步骤2:修改 Pillar 主配置 /etc/salt/master)
- [步骤3:刷新 Pillar 数据(Master 端)](#步骤3:刷新 Pillar 数据(Master 端))
- [步骤4:在 Minion 端验证 Pillar 数据](#步骤4:在 Minion 端验证 Pillar 数据)
- [步骤5:在 States 中引用 Pillar 数据](#步骤5:在 States 中引用 Pillar 数据)
- 四、常见问题与避坑指南
-
- [1. Minion 认证失败(salt-key 看不到节点)](#1. Minion 认证失败(salt-key 看不到节点))
- [2. 执行 salt 命令提示"Connection refused"](#2. 执行 salt 命令提示“Connection refused”)
- [3. States 执行失败(提示"File not found")](#3. States 执行失败(提示“File not found”))
- [4. Pillar 数据未更新](#4. Pillar 数据未更新)
- [五、实战案例:批量部署 Web 服务](#五、实战案例:批量部署 Web 服务)
SaltStack 是一款基于 Python 开发的开源自动化运维工具,核心优势是 高效批量管理、配置自动化、远程命令执行 ,支持上万台服务器的并发管理,广泛应用于服务器集群部署、配置同步、软件安装、监控告警等场景。本文从基础概念、环境搭建、核心功能到实战案例,系统讲解 SaltStack 的使用逻辑,所有操作步骤均经过实操验证,适合运维新手快速入门。
一、SaltStack 核心概念与架构
1. 核心术语(必懂)
- Master:控制节点(管理端),负责发送指令、管理 Minion 节点,可部署在任意服务器(推荐 2C4G 以上);
- Minion:被控节点(客户端),安装在需要管理的服务器上,接收 Master 指令并执行;
- States:配置管理核心,通过 YAML 文件定义服务器的"期望状态"(如安装 Nginx、配置防火墙),实现自动化部署;
- Grains:Minion 端的静态属性(如操作系统、IP 地址、硬件配置),用于目标节点筛选;
- Pillar:Master 端存储的敏感数据(如密码、密钥),仅对指定 Minion 可见,保障数据安全;
- Command:远程命令执行模块,支持实时批量执行命令(如查看磁盘使用率、重启服务)。
2. 架构原理
SaltStack 采用 C/S 架构,通信基于 ZeroMQ 消息队列,支持两种运行模式:
- 客户端/服务器模式(默认):Master 与 Minion 建立长连接,指令下发延迟低(毫秒级);
- 无 Master 模式(Salt SSH):无需部署 Minion,通过 SSH 协议管理节点,适合临时运维场景。
核心通信流程:
- Minion 启动后自动向 Master 发送认证请求;
- Master 批准认证后,Minion 与 Master 建立加密连接;
- 管理员通过 Master 下发指令(命令/States);
- Minion 执行指令并返回结果至 Master。
二、环境搭建(CentOS 7 为例)
1. 准备工作
- 服务器要求:Master 与 Minion 网络互通,关闭防火墙或开放 4505、4506 端口(SaltStack 默认端口);
- 系统要求:CentOS 7/8、Ubuntu 16.04+,推荐 Python 2.7/3.6+;
- 主机规划:
- Master:192.168.1.100(管理端);
- Minion1:192.168.1.101(被控端);
- Minion2:192.168.1.102(被控端)。
2. 安装 SaltStack(Master 与 Minion 均需操作)
步骤1:安装官方 YUM 源
bash
# 安装 EPEL 源(依赖)
yum install -y epel-release
# 安装 SaltStack YUM 源(CentOS 7)
yum install -y https://repo.saltproject.io/py3/redhat/salt-py3-repo-latest.el7.noarch.rpm
步骤2:安装 Master 与 Minion
- Master 节点:安装 salt-master
bash
yum install -y salt-master
- Minion 节点:安装 salt-minion
bash
yum install -y salt-minion
3. 配置 Master 节点
步骤1:修改主配置文件 /etc/salt/master
bash
vi /etc/salt/master
核心配置(取消注释并修改):
yaml
# 监听地址(默认0.0.0.0,无需修改)
interface: 0.0.0.0
# 自动接受 Minion 认证(测试环境用,生产环境建议手动认证)
auto_accept: True
# 配置文件根目录(States 存放路径)
file_roots:
base:
- /srv/salt
步骤2:创建 States 目录
bash
mkdir -p /srv/salt
chmod 755 /srv/salt
步骤3:启动 Master 服务并设置开机自启
bash
systemctl start salt-master
systemctl enable salt-master
# 查看服务状态(确保 running)
systemctl status salt-master
4. 配置 Minion 节点
步骤1:修改主配置文件 /etc/salt/minion
bash
vi /etc/salt/minion
核心配置:
yaml
# 指定 Master 节点 IP
master: 192.168.1.100
# Minion 标识(建议用主机名,便于识别)
id: minion-101 # Minion1 用 minion-101,Minion2 用 minion-102
步骤2:启动 Minion 服务并设置开机自启
bash
systemctl start salt-minion
systemctl enable salt-minion
# 查看服务状态
systemctl status salt-minion
5. 验证集群连接
在 Master 节点执行以下命令,查看已认证的 Minion:
bash
salt-key -L # 列出所有 Minion 认证状态
输出结果(显示 minion-101、minion-102 已认证):
Accepted Keys:
minion-101
minion-102
Denied Keys:
Unaccepted Keys:
Rejected Keys:
测试 Master 与 Minion 通信(执行 ping 命令):
bash
salt '*' test.ping # * 表示所有 Minion,也可指定单个节点(如 salt 'minion-101' test.ping)
成功输出:
minion-101:
True
minion-102:
True
三、核心功能实操
1. 远程命令执行(salt 命令)
SaltStack 支持批量执行 shell 命令,核心语法:
bash
salt '目标节点' cmd.run '命令'
常用示例:
- 查看所有 Minion 的磁盘使用率:
bash
salt '*' cmd.run 'df -h'
- 在 minion-101 上安装 Nginx:
bash
salt 'minion-101' cmd.run 'yum install -y nginx'
- 重启所有 Minion 的 Nginx 服务:
bash
salt '*' cmd.run 'systemctl restart nginx'
目标节点筛选规则:
*:所有节点;minion-101:指定单个节点;minion-10*:匹配 minion-101、minion-102 等;G@os:CentOS:筛选操作系统为 CentOS 的节点(利用 Grains)。
2. Grains 静态属性查询
Grains 是 Minion 的静态信息,可用于节点筛选、配置差异化部署,查询命令:
bash
# 查看单个 Minion 的所有 Grains 属性
salt 'minion-101' grains.items
# 查看所有 Minion 的操作系统
salt '*' grains.get os
# 查看所有 Minion 的 IP 地址
salt '*' grains.get ip4
示例:筛选 CentOS 7 系统的节点并执行命令
bash
salt -G 'os:CentOS' cmd.run 'cat /etc/redhat-release'
3. States 配置管理(自动化部署核心)
States 是 SaltStack 的核心功能,通过 YAML 文件定义"状态",实现软件安装、配置文件同步、服务管理等自动化操作。
示例1:通过 States 批量安装 Nginx
步骤1:创建 States 配置文件 /srv/salt/nginx/install.sls
yaml
# 定义状态名称(自定义,需唯一)
install_nginx:
pkg.installed: # 状态模块:安装软件包
- name: nginx # 软件包名称
start_nginx:
service.running: # 状态模块:管理服务
- name: nginx
- enable: True # 设置开机自启
- require: # 依赖关系:先安装再启动
- pkg: install_nginx
步骤2:执行 States 部署
bash
salt '*' state.sls nginx.install # nginx.install 对应 /srv/salt/nginx/install.sls
执行成功后,所有 Minion 都会安装并启动 Nginx 服务。
示例2:通过 States 同步配置文件(Nginx 配置)
步骤1:创建 Nginx 配置文件
在 Master 节点的 /srv/salt/nginx/files 目录下放置 Nginx 配置文件(nginx.conf):
bash
mkdir -p /srv/salt/nginx/files
vi /srv/salt/nginx/files/nginx.conf # 写入自定义 Nginx 配置
步骤2:创建 States 配置文件 /srv/salt/nginx/config.sls
yaml
sync_nginx_config:
file.managed: # 状态模块:管理文件
- name: /etc/nginx/nginx.conf # Minion 端目标路径
- source: salt://nginx/files/nginx.conf # Master 端文件路径(salt:// 对应 /srv/salt)
- user: root
- group: root
- mode: 644 # 文件权限
restart_nginx:
service.running:
- name: nginx
- watch: # 监听配置文件变化,变化则重启
- file: sync_nginx_config
步骤3:执行配置同步
bash
salt '*' state.sls nginx.config
执行后,Master 会将 nginx.conf 同步到所有 Minion 的 /etc/nginx/ 目录,并重启 Nginx 服务。
4. Pillar 敏感数据管理
Pillar 用于存储敏感数据(如数据库密码、API 密钥),仅授权的 Minion 可访问。
示例:定义数据库密码并在 States 中引用
步骤1:创建 Pillar 配置文件 /srv/pillar/db.sls
bash
mkdir -p /srv/pillar
vi /srv/pillar/db.sls
写入敏感数据:
yaml
db:
username: root
password: 12345678 # 实际生产环境建议用加密方式存储
port: 3306
步骤2:修改 Pillar 主配置 /etc/salt/master
bash
vi /etc/salt/master
添加 Pillar 根目录配置:
yaml
pillar_roots:
base:
- /srv/pillar
步骤3:刷新 Pillar 数据(Master 端)
bash
salt '*' saltutil.refresh_pillar
步骤4:在 Minion 端验证 Pillar 数据
bash
salt 'minion-101' pillar.items # 查看所有 Pillar 数据
salt 'minion-101' pillar.get db:password # 查看指定数据
步骤5:在 States 中引用 Pillar 数据
创建 /srv/salt/db/config.sls:
yaml
config_db:
file.managed:
- name: /etc/db.conf
- content: |
username: {{ pillar['db']['username'] }}
password: {{ pillar['db']['password'] }}
port: {{ pillar['db']['port'] }}
- user: root
- mode: 600
执行后,Minion 端的 /etc/db.conf 会自动填充 Pillar 中的数据库信息。
四、常见问题与避坑指南
1. Minion 认证失败(salt-key 看不到节点)
- 原因 :
- Minion 配置中 master IP 错误;
- 防火墙未开放 4505/4506 端口;
- Minion 服务未启动。
- 解决 :
- 核对 Minion 配置文件 /etc/salt/minion 中的 master 字段;
- 开放端口:
firewall-cmd --add-port=4505-4506/tcp --permanent && firewall-cmd --reload; - 重启 Minion 服务:
systemctl restart salt-minion。
2. 执行 salt 命令提示"Connection refused"
- 原因:Master 服务未启动,或端口被占用;
- 解决 :
- 启动 Master 服务:
systemctl start salt-master; - 查看端口占用:
netstat -tuln | grep 4505,若被占用则停止占用进程。
- 启动 Master 服务:
3. States 执行失败(提示"File not found")
- 原因 :
- States 配置文件路径错误;
- 源文件(如 nginx.conf)未放在指定目录;
- 解决 :
- 确认配置文件路径与
salt://对应(如salt://nginx/files/nginx.conf对应 /srv/salt/nginx/files/nginx.conf); - 核对文件权限(Master 端文件需 Minion 可读取)。
- 确认配置文件路径与
4. Pillar 数据未更新
- 原因:Minion 未刷新 Pillar 缓存;
- 解决 :执行
salt '*' saltutil.refresh_pillar强制刷新缓存。
五、实战案例:批量部署 Web 服务
需求:在所有 Minion 节点部署 Nginx + 静态网页,步骤如下:
- 创建静态网页文件 /srv/salt/nginx/files/index.html:
html
<!DOCTYPE html>
<html>
<head><title>SaltStack 部署示例</title></head>
<body><h1>Hello SaltStack!</h1></body>
</html>
- 创建 States 总配置文件 /srv/salt/web.sls:
yaml
# 安装 Nginx
install_nginx:
pkg.installed:
- name: nginx
# 同步 Nginx 配置文件
sync_nginx_conf:
file.managed:
- name: /etc/nginx/nginx.conf
- source: salt://nginx/files/nginx.conf
- user: root
- mode: 644
# 同步静态网页
sync_index_html:
file.managed:
- name: /usr/share/nginx/html/index.html
- source: salt://nginx/files/index.html
- user: root
- mode: 644
# 启动并设置 Nginx 开机自启
start_nginx:
service.running:
- name: nginx
- enable: True
- require:
- pkg: install_nginx
- watch:
- file: sync_nginx_conf
- file: sync_index_html
- 执行部署命令:
bash
salt '*' state.sls web
- 验证结果:
在本地浏览器访问 Minion 节点 IP(如 192.168.1.101),可看到"Hello SaltStack!"页面,说明部署成功。