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!"页面,说明部署成功。
相关推荐
skywalk81631 小时前
unbound dns解析出现问题,寻求解决之道
运维·服务器·dns·unbound
一只大侠的侠1 小时前
Flutter开源鸿蒙跨平台训练营 Day 5Flutter开发鸿蒙电商应用
flutter·开源·harmonyos
酉鬼女又兒1 小时前
零基础入门Linux指南:每天一个Linux命令_pwd
linux·运维·服务器
云飞云共享云桌面1 小时前
高性能图形工作站的资源如何共享给10个SolidWorks研发设计用
linux·运维·服务器·前端·网络·数据库·人工智能
skywalk81631 小时前
走近科学:unbound dns域名服务器自己本地解析出现问题,寻求解决之道
运维·服务器·dns·unbound
袁煦丞 cpolar内网穿透实验室1 小时前
远程调试内网 Kafka 不再求运维!cpolar 内网穿透实验室第 791 个成功挑战
运维·分布式·kafka·远程工作·内网穿透·cpolar
AZ996ZA1 小时前
自学linux的第二十一天【DHCP 服务从入门到实战】
linux·运维·服务器·php
神梦流2 小时前
GE 引擎的非标准数据流处理:稀疏张量与自定义算子在图优化中的语义保持
linux·运维·服务器
一只大侠的侠2 小时前
Flutter开源鸿蒙跨平台训练营 Day6ArkUI框架实战
flutter·开源·harmonyos
兜兜转转了多少年3 小时前
从脚本到系统:2026 年 AI 代理驱动的 Shell 自动化
运维·人工智能·自动化