SaltStack:高速配置管理与远程执行

FreeGuideOnline 最新 2026-07-03

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.managedsource 指向 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