SaltStack 既支持远程执行,也支持声明式状态管理。Master 接收 Minion 密钥并下发任务;Grains 描述节点事实,Pillar 向目标节点提供受控数据,States 定义期望状态。
## 安装与信任
当前 Salt 官方推荐 onedir 包。安装后分别配置 master 与 minion,Minion 指向 Master 地址并设置唯一 ID:
```bash
systemctl enable --now salt-master
systemctl enable --now salt-minion
salt-key -L
salt-key -a MINION_ID
salt '*' test.ping
```
接受密钥前必须核对指纹和资产来源,不使用 salt-key -A -y 无差别信任未知主机。Master 是高权限控制面,应限制网络、人员和命令审计。
## Grains 与 Pillar
```bash
salt '*' grains.item os osrelease ip4_interfaces
salt 'web*' pillar.items
```
Grains 由 Minion 提供,适合系统类型、角色等目标选择,不应存放密码。Pillar 按 top.sls 定向编译,可存放配置和引用 Secret,但仍需限制缓存、日志和仓库权限。
## States
```yaml
zabbix-agent:
pkg.installed: []
file.managed:
- name: /etc/zabbix/zabbix_agentd.conf
- source: salt://zabbix/files/zabbix_agentd.conf.j2
- template: jinja
- require:
- pkg: zabbix-agent
service.running:
- enable: true
- watch:
- file: zabbix-agent
```
先执行:
```bash
salt 'test-*' state.show_highstate
salt 'test-*' state.apply test=True
salt 'test-*' state.apply
```
Zabbix Agent 自动部署还需验证仓库、服务器地址、TLS PSK/证书、主机名、端口、主动/被动模式和服务注册。配置模板不得包含通用明文密钥。
## Targeting 与批量变更
支持 glob、Grains、Pillar、正则和 compound matcher。生产高危操作先匹配清单,再使用 batch 小批执行:
```bash
salt -C 'G@roles:web and G@os:Ubuntu' test.version
salt -b 10 'web*' state.apply web
```
## 进阶与排障
- 使用 environments 区分 base、dev、prod。
- Formula/State 进入 Git 并代码评审。
- Reactor、Scheduler 和 Orchestrate 要防止事件风暴和递归触发。
- 升级 Master 后刷新 Grains/Pillar 缓存并灰度 Minion。
- 任务失败检查 job cache、Master/Minion 日志、网络、密钥、渲染结果和模块版本。
远程执行成功不等于状态正确;每个 State 都要幂等、可测试、可回滚,并用业务健康检查验收。
参考:https://docs.saltproject.io/salt/install-guide/en/latest/ 和 https://docs.saltproject.io/en/latest/topics/tutorials/states_pt1.html