SaltStack:高速配置管理与远程执行
bash
导入官方 GPG 密钥并添加仓库
rpm --import https://repo.saltproject.io/salt/py3/redhat/9/x86_64/SALT-PROJECT-GPG-PUBKEY-2023.pub curl -fsSL https://repo.saltproject.io/salt/py3/redhat/9/x86_64/3006.repo | tee /etc/yum.repos.d/salt.repo
安装 salt-master
yum install salt-master -y
启动并设置开机自启
systemctl enable salt-master --now
### 3.2 安装 Minion
在每一台被控机器上执行:
```bash
# 使用相同的仓库安装 salt-minion
yum install salt-minion -y
# 编辑 /etc/salt/minion,指定 Master 的 IP 或主机名
# master: 192.168.1.100
systemctl enable salt-minion --now
3.3 接受 Minion 密钥
在 Master 端查看待批准的密钥:
salt-key -L
接受所有待处理密钥:
salt-key -A -y
验证连通性:
salt '*' test.ping
所有已连接的 Minion 应返回 True。
4. 远程执行
4.1 基本远程命令
Salt 最直接的用法就是远程执行命令,格式为 salt <目标> <模块.方法> [参数]。
# 对所有 Minion 执行 ping 测试
salt '*' test.ping
# 在所有 Minion 上查看磁盘使用情况
salt '*' disk.usage
# 对名称匹配 web 的 Minion 运行 shell 命令
salt 'web*' cmd.run 'uptime'
常用目标匹配方式:
'*':所有 Minion'web*':Glob 通配符'G@os:Ubuntu':Grains 匹配(后续章节详解)'E@web\d+\.example\.com':正则匹配-C 'G@os:CentOS and web*':复合条件匹配
4.2 执行模块一览
Salt 内置超过 300 个执行模块,涵盖几乎所有运维需求:
pkg.install/pkg.remove:软件包管理service.start/service.restart:服务管理user.add/user.delete:用户管理file.copy/file.remove:文件操作network.interfaces:网络信息sys.doc:查看模块帮助,如salt '*' sys.doc disk.usage
5. 配置管理(状态系统)
Salt 的配置管理核心是 SLS(SaLt State)文件,使用 YAML + Jinja 编写,声明资源的最终状态,确保系统始终处于期望配置。
5.1 状态树与 top.sls
Master 的默认状态文件根目录为 /srv/salt(可在 Master 配置文件中修改 file_roots)。需要手动创建目录结构:
/srv/salt/
├── top.sls # 入口文件,定义节点与状态的对应关系
├── webserver.sls # 具体状态文件
├── dbserver.sls
└── files/ # 静态文件存放目录
top.sls 示例:
base:
'web*':
- webserver
'db*':
- dbserver
5.2 编写第一个状态文件
创建 /srv/salt/webserver.sls,内容如下:
install_nginx:
pkg.installed:
- name: nginx
nginx_service:
service.running:
- name: nginx
- enable: True
- require:
- pkg: install_nginx
web_root:
file.directory:
- name: /var/www/html
- user: root
- group: root
- mode: 755
index_page:
file.managed:
- name: /var/www/html/index.html
- source: salt://files/index.html
- user: nginx
- group: nginx
- mode: 644
- require:
- file: web_root
说明:
- 每个状态块有一个唯一 ID(如
install_nginx),后面跟状态声明(pkg.installed)。 require定义了依赖关系,确保按顺序执行。file.managed的source指向 Master 状态树下的文件目录(如/srv/salt/files/index.html)。
5.3 应用状态
在 Master 上执行:
# 对匹配 web* 的 Minion 应用 top.sls 中指定的所有状态
salt 'web*' state.apply
# 直接应用指定的 SLS 文件(不依赖 top.sls)
salt 'web*' state.apply webserver
输出将显示每个状态块的执行结果(成功为绿色 ID,失败为红色),并附有变更摘要。
5.4 测试与调试
- 测试运行:
salt 'web*' state.apply test=True,仅模拟执行,不实际更改系统。 - 查看状态依赖关系:
salt 'web*' state.show_sls webserver。 - 执行单个状态块:
salt 'web*' state.apply webserver install_nginx。
6. 数据系统:Grains 与 Pillar
6.1 Grains(静态数据)
Grains 是 Minion 端收集的系统信息,如操作系统、CPU、IP 地址等,属于只读静态数据。
- 查看所有 grains:
salt 'web*' grains.items - 在 SLS 中通过 Jinja 使用 grains 实现条件判断:
{% if grains['os_family'] == 'RedHat' %}
apache_pkg: httpd
{% elif grains['os_family'] == 'Debian' %}
apache_pkg: apache2
{% endif %}
6.2 Pillar(敏感变量与配置中心)
Pillar 是 Master 端定义的键值数据,可以安全地存储密码、许可证、环境差异配置,并以加密方式下发到指定的 Minion。需要在 Master 配置中开启 pillar 并定义 pillar_roots(默认 /srv/pillar)。
创建 /srv/pillar/top.sls:
base:
'web*':
- webconfig
创建 /srv/pillar/webconfig.sls:
nginx:
port: 8080
server_name: www.example.com
在 SLS 中引用 pillar:
listen_port: {{ pillar['nginx']['port'] }}
下发 pillar 数据:salt 'web*' saltutil.refresh_pillar,然后可使用 salt 'web*' pillar.items 查看。
7. 高级特性速览
7.1 无 Master(Masterless)模式
当无法部署中心 Master 或需要在独立环境下拉起配置时,可使用 salt-call --local 直接应用本地的 SLS 文件,无需网络通信。只需在 minion 上安装 salt-minion,复制状态树到 /srv/salt,然后执行:
salt-call --local state.apply