SaltStack 开源自动化运维工具详细介绍

文章目录

    • [一、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 协议管理节点,适合临时运维场景。

核心通信流程:

  1. Minion 启动后自动向 Master 发送认证请求;
  2. Master 批准认证后,Minion 与 Master 建立加密连接;
  3. 管理员通过 Master 下发指令(命令/States);
  4. 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,若被占用则停止占用进程。

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 + 静态网页,步骤如下:

  1. 创建静态网页文件 /srv/salt/nginx/files/index.html:
html 复制代码
<!DOCTYPE html>
<html>
<head><title>SaltStack 部署示例</title></head>
<body><h1>Hello SaltStack!</h1></body>
</html>
  1. 创建 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
  1. 执行部署命令:
bash 复制代码
salt '*' state.sls web
  1. 验证结果:
    在本地浏览器访问 Minion 节点 IP(如 192.168.1.101),可看到"Hello SaltStack!"页面,说明部署成功。
相关推荐
大房身镇、王师傅2 小时前
【VirtualBox】VirtualBox 7.1.6 RockyLinux10 配置增强功能 设置共享目录
运维·服务器·virtualbox·rockylinux10
betazhou2 小时前
rsync使用案例分析
linux·运维·服务器·rsync·同步数据
minglie14 小时前
谷歌浏览器搜索技巧
运维
脑子进水养啥鱼?4 小时前
Linux find 命令
linux·运维
CoderJia程序员甲4 小时前
GitHub 热榜项目 - 日榜(2026-01-20)
开源·大模型·llm·github·ai教程
曹天骄4 小时前
Cloudflare Worker 关联域名访问后出现301 / 308
运维·云计算
EverydayJoy^v^4 小时前
RH124简单知识点——第8章——配置和保护SSH
linux·运维·ssh
@zulnger5 小时前
数据提取_1
运维·服务器
淮北4945 小时前
GDB在ubuntu上的安装与使用
linux·运维·ubuntu