SaltStack 知识点总结
一、SaltStack 基础概念
1. 是什么
SaltStack(简称 Salt)是基于 Python 开发的自动化运维管理工具,可以实现批量远程执行命令、配置管理、状态管理、编排。
同类工具对比:Ansible (无代理)、Puppet (有代理)、SaltStack 支持**Agent (Minion)/ 无 Agent (Salt‑SSH)**两种模式。
2. 架构(C/S 架构)
- Master(服务端) :主控节点,下发任务、保存状态文件;监听端口
4505(publish)、4506(return),zeromq 消息队列。 - Minion(客户端 / 代理):被管理机器,安装 agent,主动连接 master,接收任务执行后返回结果。
- Salt‑SSH:不需要 minion,直接 ssh 远程执行(类似 ansible,性能弱于 minion 模式)。
通信:ZeroMQ 消息框架;加密:AES,minion 启动生成密钥,master 接受密钥认证后才可以管控。
3. 端口
- TCP 4505:Master 发布消息端口(pub),所有 minion 订阅
- TCP 4506:返回结果端口(ret),minion 把执行结果回传给 master
二、基础部署与认证流程
-
minion 配置 master 地址
/etc/salt/minion→master: 192.168.x.x -
启动 minion 服务,minion 生成密钥,发送公钥到 master
-
master 查看等待认证的 key:
salt‑key -L -
master 接受 minion 密钥
salt-key -a minion_id #接受单个
salt-key -A #全部接受
salt-key -d minion_id #删除
salt-key -D #全部删除
minion_id:默认是主机名,可以在 minion 配置文件指定
id: xxx
三、Salt 远程执行(Execution module 执行模块)
语法
salt [目标] [模块.函数] [参数]
1. 目标选择(target)
| 匹配方式 | 写法 | 说明 |
|---|---|---|
| glob(默认) | salt '*' test.ping |
通配符,minion_id 匹配 |
| List 列表 | -L | salt -L 'node1,node2' test.ping |
| 正则 | -E | salt -E 'node[0‑9]' test.ping |
| Grain | -G | 基于主机属性过滤 |
| Pillar | -I | 基于 pillar 数据过滤 |
| Nodegroup | -N | 预定义主机组,master 配置文件定义分组 |
2. 常用执行模块
salt '*' test.ping #测试连通性,返回True代表可用
salt '*' cmd.run 'df -h' #远程执行shell命令 cmd.run
salt '*' cmd.script salt://xxx.sh #推送脚本执行
salt '*' disk.usage #磁盘信息
salt '*' network.ip_addrs #获取ip
salt '*' service.status nginx #服务状态
salt '*' pkg.install nginx #安装软件包
salt '*' file.copy /a /b #文件操作
💡执行模块:临时执行,一次性;不保证主机最终状态。
四、Grain 和 Pillar(两大数据源)
✅ Grain(静态数据)
-
Grain:Minion 本地静态属性,minion 启动时采集本机信息(CPU、内存、网卡、操作系统、主机名),存在 minion 本地。
-
默认自带系统 grain;也可以自定义 grain(minion 本地配置
/etc/salt/grains) -
特点:静态,minion 重启才刷新;保存在每台 minion 本机
salt '' grains.items #查看全部grain
salt '' grains.get os #获取单个grain值
salt '*' -G 'os:CentOS' test.ping #基于grain过滤主机
自定义 grain:minion 端/etc/salt/grains写 yaml,重启 minion 生效。
✅ Pillar(动态变量,master 保存)
-
Pillar 数据保存在 Master 端,下发给 minion;敏感配置放 pillar(密码、密钥),minion 本地不存文件。
-
数据 master 维护;可以针对不同 minion 分发不同变量。
-
特点:master 管理;可以刷新,不需要重启 minion
salt '' pillar.items
salt '' pillar.get mysql_root_pwd
salt '' -I 'mysql:root_pwd:123456' test.ping
#刷新pillar
salt '' saltutil.refresh_pillar
五、State 状态管理(核心!配置管理)
State:声明式配置管理,描述期望状态,幂等执行。 幂等:多次执行结果不变;如果主机已经达到目标状态,什么都不做。
1. Salt File Root 文件根目录
master 配置:/etc/salt/master
file_roots:
base:
- /srv/salt
所有 sls 状态文件默认放在 /srv/salt/*.sls,yaml 语法 sls 文件。
2. SLS 文件语法(YAML + Jinja2)
- sls 后缀;使用 yaml;支持 jinja2 模板,可以引用 Grain/Pillar 变量
- ID 声明:每一段的 ID 是状态 ID(唯一标识,不是模块名)
- 格式:
状态ID: 模块名.function:
示例 /srv/salt/nginx.sls
nginx-install:
pkg.installed:
- name: nginx
nginx-service:
service.running:
- name: nginx
- enable: True
- require:
- pkg: nginx-install
require:依赖;先执行 nginx-install 包安装,再启动服务
其他常用关系声明:
require:依赖,本状态执行前先完成另外一个状态watch:监听;当监听资源发生变化时触发动作(配置文件变更重启服务)watch_in:反向监听order:手动指定执行顺序
3. 执行 state
#执行单个sls
salt '*' state.sls nginx
#测试运行(只预览变更,不真正执行)
salt '*' state.sls nginx test=True
#执行全部top文件
salt '*' state.highstate
4. Top 文件 /srv/salt/top.sls(入口文件)
top.sls 用于给不同 minion 分配不同 sls 状态;highstate 读取 top.sls
base:
'*':
- nginx
'node1':
- mysql
state.highstate 根据 top.sls 批量推送状态配置。
常用 state 模块
- pkg.installed:软件包安装
- pkg.removed:卸载
- file.managed:分发管理文件(master 下发文件到 minion,支持 jinja 模板 salt:// 路径)
- service.running:服务启动开机自启
- service.dead:停止服务
- user.present:创建用户
- group.present:创建组
file.managed 示例:
nginx-conf:
file.managed:
- name: /etc/nginx/nginx.conf
- source: salt://nginx/nginx.conf
- user: root
- group: root
- mode: '0644'
- watch:
- service: nginx-service
watch 监听配置文件,如果文件变更就重启 nginx 服务。
Jinja2 模板在 sls
sls 文件顶部声明 #!jinja|yaml,sls 里面可以读取 grain/pillar 变量
#!jinja|yaml
{% set hostname = grains['host'] %}
test-file:
file.managed:
- name: /tmp/{{ hostname }}.txt
- content: "host name is {{ hostname }}"
六、Salt Orchestrate 编排(salt‑orchestrator)
state 是管控 minion;orchestrate 运行在 master 本机,编排多步任务,可以控制 master 本身,也协调多台 minion 先后执行任务。
-
文件存放默认:
/srv/salt/orch/*.sls -
master 需要开启
orchestrate模块 执行命令:salt-run state.orchestrate orch.deploy_test
salt‑run:master 本地运行,不走 minion。适合多节点部署顺序控制,先部署 A 再部署 B。
七、Saltstack Job 作业管理
master 下发任务生成 jid(job id),异步任务
salt '*' test.sleep 30 & #后台长任务
salt‑jobs.active #查看正在运行job
salt‑jobs.lookup_jid <jid> #根据jid拿返回结果
八、Saltstack 运维常见问题
- minion 无法连接 master:防火墙 4505/4506 放行;检查 minion 配置 master 地址;selinux;zeromq 版本
- key 认证失败:删除 minion
/etc/salt/pki;master 删除对应 key,重新认证 - state 不生效:yaml 缩进!salt sls 严格 yaml 缩进,空格不能用 tab
- pillar 不更新:
salt '*' saltutil.refresh_pillar - grain 不更新:重启 minion
九、面试高频考点总结
- SaltStack 架构 master/minion;端口 4505、4506,zeromq;salt‑ssh 无代理模式
- salt‑key 密钥认证流程
- Grain 与 Pillar 区别(必问)存储位置,刷新,用途
- state 是声明式、幂等;sls 文件,top.sls highstate
- require/watch 状态依赖关系区别
- require:执行前依赖;先做完 A 再跑 B
- watch:资源变化触发动作(配置变更重启服务)
- file_roots 文件根路径;jinja2 模板读取 grain/pillar
- orchestrate 编排,salt‑run 在 master 本机执行,协调多主机顺序部署
- target 多种匹配方式 glob /‑L /‑E /‑G /‑I /‑N
=============================
SaltStack 实操演练(CentOS7)
环境规划
- Master:192.168.10.10
- Minion01:192.168.10.11
- Minion02:192.168.10.12
关闭防火墙 + selinux(实验环境)
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
0. 安装(所有节点)
yum 源:salt 官方 yum 源(也可用 epel)
Master 节点
yum install -y salt-master
systemctl start salt-master
systemctl enable salt-master
#确认端口
ss -tlnp |grep salt
#4505 4506
Minion 节点(两台 minion 都执行)
yum install -y salt-minion
#修改minion配置
vim /etc/salt/minion
#找到master,取消注释填写masterIP
master: 192.168.10.10
#可选自定义minion_id
id: minion01 #第二台写minion02
systemctl start salt-minion
systemctl enable salt-minion
1. 密钥认证实操【Master 执行】
#查看等待认证的密钥
salt-key -L
#接受单个
salt-key -a minion01
salt-key -a minion02
#或者全部接受 salt-key -A
#查看已经接受
salt-key -L
#验证连通
salt '*' test.ping
#返回True代表ok
2. 远程执行模块实操(master 执行)
#ping测试
salt '*' test.ping
#执行shell
salt '*' cmd.run 'hostname && df -h'
#查看内存
salt '*' cmd.run 'free -h'
#安装nginx
salt '*' pkg.install nginx
#停止nginx
salt '*' service.stop nginx
#查看ip
salt '*' network.ip_addrs
✨ Target 目标匹配实操
#glob通配
salt '*' test.ping
#列表 -L
salt -L 'minion01' cmd.run 'uptime'
#正则 -E
salt -E 'minion0[12]' test.ping
#Grain过滤 -G,过滤系统是CentOS主机
salt -G 'os:CentOS' cmd.run 'cat /etc/redhat-release'
3. Grain 实操
3.1 查看默认 grain
salt '*' grains.items
salt '*' grains.get os
salt '*' grains.get ip4_interfaces
3.2 自定义 Grain(minion 节点操作!)
minion01 上:
vim /etc/salt/grains
写入 yaml
role: web
env: test
grain 修改重启 minion 生效
systemctl restart salt-minion
master 验证:
salt '*' grains.get role
#使用自定义grain筛选主机
salt -G 'role:web' cmd.run 'hostname'
小结:Grain 存在 minion 本地,重启 minion 刷新
4. Pillar 实操(master 操作)
pillar 存放敏感变量,master 维护
4.1 修改 master 配置开启 pillar 根
vim /etc/salt/master
取消注释 pillar_roots
pillar_roots:
base:
- /srv/pillar
创建目录,重启 master
mkdir -p /srv/pillar
systemctl restart salt-master
4.2 编写 pillar 数据文件 /srv/pillar/mysql.sls
mysql_root_password: "MyPass@123"
4.3 pillar 入口 top.sls /srv/pillar/top.sls
base:
'*':
- mysql
4.4 刷新 pillar,不需要重启 minion
salt '*' saltutil.refresh_pillar
#查看pillar变量
salt '*' pillar.get mysql_root_password
#使用pillar过滤主机 -I
salt -I 'mysql_root_password:MyPass@123' test.ping
5. State 状态管理实操(核心)
5.1 准备 file_roots
master 默认配置 file_roots 路径/srv/salt
mkdir -p /srv/salt
5.2 写 nginx.sls 状态文件 /srv/salt/nginx.sls
#安装nginx
nginx-install:
pkg.installed:
- name: nginx
#配置文件分发
nginx-conf:
file.managed:
- name: /etc/nginx/nginx.conf
- source: salt://nginx/nginx.conf
- user: root
- group: root
- mode: '0644'
#启动并开机自启
nginx-service:
service.running:
- name: nginx
- enable: True
- require:
- pkg: nginx-install
- watch:
- file: nginx-conf
创建存放 nginx 配置的目录
mkdir -p /srv/salt/nginx
#复制本机nginx.conf到/srv/salt/nginx/
cp /etc/nginx/nginx.conf /srv/salt/nginx/nginx.conf
5.3 测试执行 state(test=True 只预览,不改动主机)
salt '*' state.sls nginx test=True
#正式执行
salt '*' state.sls nginx
5.4 top.sls 入口文件 highstate
/srv/salt/top.sls
base:
'minion01':
- nginx
'minion02':
- nginx
执行 highstate 读取 top.sls 批量下发
salt '*' state.highstate
5.5 Jinja2 模板 + Pillar 变量 sls 实操
新建 /srv/salt/mysql.sls
#!jinja|yaml
mysql-install:
pkg.installed:
- name: mariadb-server
mysql-setpwd:
cmd.run:
- name: mysqladmin -uroot password '{{ pillar["mysql_root_password"] }}'
- require:
- pkg: mysql-install
执行
salt 'minion02' state.sls mysql
6. Orchestrate 编排实操(master 本地 salt‑run)
orch 是 master 本机运行 salt‑run,用来编排多节点顺序任务
mkdir -p /srv/salt/orch
/srv/salt/orch/deploy.sls
deploy_web:
salt.state:
- tgt: 'minion01'
- sls: nginx
deploy_db:
salt.state:
- tgt: 'minion02'
- sls: mysql
- require:
- deploy_web
执行编排
salt-run state.orchestrate orch.deploy
7. Job 任务管理实操
#后台执行sleep长任务
salt '*' test.sleep 20
#查看活跃job
salt-jobs.active
#根据jid查看结果
salt-jobs.lookup_jid <你的jid编号>