SaltStack学习

SaltStack 知识点总结

一、SaltStack 基础概念

1. 是什么

SaltStack(简称 Salt)是基于 Python 开发的自动化运维管理工具,可以实现批量远程执行命令、配置管理、状态管理、编排。

同类工具对比:Ansible (无代理)、Puppet (有代理)、SaltStack 支持**Agent (Minion)/ 无 Agent (Salt‑SSH)**两种模式。

2. 架构(C/S 架构)

  • Master(服务端) :主控节点,下发任务、保存状态文件;监听端口 4505(publish)、4506(return),zeromq 消息队列。
  • Minion(客户端 / 代理):被管理机器,安装 agent,主动连接 master,接收任务执行后返回结果。
  • Salt‑SSH:不需要 minion,直接 ssh 远程执行(类似 ansible,性能弱于 minion 模式)。

通信:ZeroMQ 消息框架;加密:AES,minion 启动生成密钥,master 接受密钥认证后才可以管控。

3. 端口

  • TCP 4505:Master 发布消息端口(pub),所有 minion 订阅
  • TCP 4506:返回结果端口(ret),minion 把执行结果回传给 master

二、基础部署与认证流程

  1. minion 配置 master 地址 /etc/salt/minionmaster: 192.168.x.x

  2. 启动 minion 服务,minion 生成密钥,发送公钥到 master

  3. master 查看等待认证的 key:salt‑key -L

  4. master 接受 minion 密钥

    salt-key -a minion_id #接受单个
    salt-key -A #全部接受
    salt-key -d minion_id #删除
    salt-key -D #全部删除

minion_id:默认是主机名,可以在 minion 配置文件指定id: xxx


三、Salt 远程执行(Execution module 执行模块)

语法

复制代码
salt [目标] [模块.函数] [参数]
1. 目标选择(target)
匹配方式 写法 说明
glob(默认) salt '*' test.ping 通配符,minion_id 匹配
List 列表 -L salt -L 'node1,node2' test.ping
正则 -E salt -E 'node[0‑9]' test.ping
Grain -G 基于主机属性过滤
Pillar -I 基于 pillar 数据过滤
Nodegroup -N 预定义主机组,master 配置文件定义分组
2. 常用执行模块
复制代码
salt '*' test.ping                #测试连通性,返回True代表可用
salt '*' cmd.run 'df -h'          #远程执行shell命令 cmd.run
salt '*' cmd.script salt://xxx.sh #推送脚本执行
salt '*' disk.usage               #磁盘信息
salt '*' network.ip_addrs        #获取ip
salt '*' service.status nginx    #服务状态
salt '*' pkg.install nginx        #安装软件包
salt '*' file.copy /a /b         #文件操作

💡执行模块:临时执行,一次性;不保证主机最终状态


四、Grain 和 Pillar(两大数据源)

✅ Grain(静态数据)

  • Grain:Minion 本地静态属性,minion 启动时采集本机信息(CPU、内存、网卡、操作系统、主机名),存在 minion 本地。

  • 默认自带系统 grain;也可以自定义 grain(minion 本地配置 /etc/salt/grains

  • 特点:静态,minion 重启才刷新;保存在每台 minion 本机

    salt '' grains.items #查看全部grain
    salt '
    ' grains.get os #获取单个grain值
    salt '*' -G 'os:CentOS' test.ping #基于grain过滤主机

自定义 grain:minion 端/etc/salt/grains写 yaml,重启 minion 生效。

✅ Pillar(动态变量,master 保存)

  • Pillar 数据保存在 Master 端,下发给 minion;敏感配置放 pillar(密码、密钥),minion 本地不存文件。

  • 数据 master 维护;可以针对不同 minion 分发不同变量。

  • 特点:master 管理;可以刷新,不需要重启 minion

    salt '' pillar.items
    salt '
    ' pillar.get mysql_root_pwd
    salt '' -I 'mysql:root_pwd:123456' test.ping
    #刷新pillar
    salt '
    ' saltutil.refresh_pillar


五、State 状态管理(核心!配置管理)

State:声明式配置管理,描述期望状态,幂等执行。 幂等:多次执行结果不变;如果主机已经达到目标状态,什么都不做。

1. Salt File Root 文件根目录

master 配置:/etc/salt/master

复制代码
file_roots:
  base:
    - /srv/salt

所有 sls 状态文件默认放在 /srv/salt/*.sls,yaml 语法 sls 文件。

2. SLS 文件语法(YAML + Jinja2)

  • sls 后缀;使用 yaml;支持 jinja2 模板,可以引用 Grain/Pillar 变量
  • ID 声明:每一段的 ID 是状态 ID(唯一标识,不是模块名)
  • 格式:状态ID: 模块名.function:

示例 /srv/salt/nginx.sls

复制代码
nginx-install:
  pkg.installed:
    - name: nginx

nginx-service:
  service.running:
    - name: nginx
    - enable: True
    - require:
      - pkg: nginx-install
  • require:依赖;先执行 nginx-install 包安装,再启动服务

其他常用关系声明:

  • require:依赖,本状态执行前先完成另外一个状态
  • watch:监听;当监听资源发生变化时触发动作(配置文件变更重启服务)
  • watch_in:反向监听
  • order:手动指定执行顺序

3. 执行 state

复制代码
#执行单个sls
salt '*' state.sls nginx
#测试运行(只预览变更,不真正执行)
salt '*' state.sls nginx test=True
#执行全部top文件
salt '*' state.highstate

4. Top 文件 /srv/salt/top.sls(入口文件)

top.sls 用于给不同 minion 分配不同 sls 状态;highstate 读取 top.sls

复制代码
base:
  '*':
    - nginx
  'node1':
    - mysql

state.highstate 根据 top.sls 批量推送状态配置。

常用 state 模块

  • pkg.installed:软件包安装
  • pkg.removed:卸载
  • file.managed:分发管理文件(master 下发文件到 minion,支持 jinja 模板 salt:// 路径)
  • service.running:服务启动开机自启
  • service.dead:停止服务
  • user.present:创建用户
  • group.present:创建组

file.managed 示例:

复制代码
nginx-conf:
  file.managed:
    - name: /etc/nginx/nginx.conf
    - source: salt://nginx/nginx.conf
    - user: root
    - group: root
    - mode: '0644'
    - watch:
        - service: nginx-service

watch 监听配置文件,如果文件变更就重启 nginx 服务。

Jinja2 模板在 sls

sls 文件顶部声明 #!jinja|yaml,sls 里面可以读取 grain/pillar 变量

复制代码
#!jinja|yaml
{% set hostname = grains['host'] %}
test-file:
  file.managed:
    - name: /tmp/{{ hostname }}.txt
    - content: "host name is {{ hostname }}"

六、Salt Orchestrate 编排(salt‑orchestrator)

state 是管控 minion;orchestrate 运行在 master 本机,编排多步任务,可以控制 master 本身,也协调多台 minion 先后执行任务

  • 文件存放默认:/srv/salt/orch/*.sls

  • master 需要开启 orchestrate 模块 执行命令:

    salt-run state.orchestrate orch.deploy_test

salt‑run:master 本地运行,不走 minion。适合多节点部署顺序控制,先部署 A 再部署 B。


七、Saltstack Job 作业管理

master 下发任务生成 jid(job id),异步任务

复制代码
salt '*' test.sleep 30 &         #后台长任务
salt‑jobs.active                 #查看正在运行job
salt‑jobs.lookup_jid <jid>       #根据jid拿返回结果

八、Saltstack 运维常见问题

  1. minion 无法连接 master:防火墙 4505/4506 放行;检查 minion 配置 master 地址;selinux;zeromq 版本
  2. key 认证失败:删除 minion /etc/salt/pki;master 删除对应 key,重新认证
  3. state 不生效:yaml 缩进!salt sls 严格 yaml 缩进,空格不能用 tab
  4. pillar 不更新:salt '*' saltutil.refresh_pillar
  5. grain 不更新:重启 minion

九、面试高频考点总结

  1. SaltStack 架构 master/minion;端口 4505、4506,zeromq;salt‑ssh 无代理模式
  2. salt‑key 密钥认证流程
  3. Grain 与 Pillar 区别(必问)存储位置,刷新,用途
  4. state 是声明式、幂等;sls 文件,top.sls highstate
  5. require/watch 状态依赖关系区别
    • require:执行前依赖;先做完 A 再跑 B
    • watch:资源变化触发动作(配置变更重启服务)
  6. file_roots 文件根路径;jinja2 模板读取 grain/pillar
  7. orchestrate 编排,salt‑run 在 master 本机执行,协调多主机顺序部署
  8. target 多种匹配方式 glob /‑L /‑E /‑G /‑I /‑N

=============================

SaltStack 实操演练(CentOS7)

环境规划

  • Master:192.168.10.10
  • Minion01:192.168.10.11
  • Minion02:192.168.10.12

关闭防火墙 + selinux(实验环境)

复制代码
systemctl stop firewalld
systemctl disable firewalld
setenforce 0

0. 安装(所有节点)

yum 源:salt 官方 yum 源(也可用 epel)

Master 节点

复制代码
yum install -y salt-master
systemctl start salt-master
systemctl enable salt-master
#确认端口
ss -tlnp |grep salt
#4505 4506

Minion 节点(两台 minion 都执行)

复制代码
yum install -y salt-minion
#修改minion配置
vim /etc/salt/minion
#找到master,取消注释填写masterIP
master: 192.168.10.10
#可选自定义minion_id
id: minion01   #第二台写minion02

systemctl start salt-minion
systemctl enable salt-minion

1. 密钥认证实操【Master 执行】

复制代码
#查看等待认证的密钥
salt-key -L
#接受单个
salt-key -a minion01
salt-key -a minion02
#或者全部接受 salt-key -A

#查看已经接受
salt-key -L
#验证连通
salt '*' test.ping
#返回True代表ok

2. 远程执行模块实操(master 执行)

复制代码
#ping测试
salt '*' test.ping
#执行shell
salt '*' cmd.run 'hostname && df -h'
#查看内存
salt '*' cmd.run 'free -h'
#安装nginx
salt '*' pkg.install nginx
#停止nginx
salt '*' service.stop nginx
#查看ip
salt '*' network.ip_addrs

✨ Target 目标匹配实操

复制代码
#glob通配
salt '*' test.ping
#列表 -L
salt -L 'minion01' cmd.run 'uptime'
#正则 -E
salt -E 'minion0[12]' test.ping
#Grain过滤 -G,过滤系统是CentOS主机
salt -G 'os:CentOS' cmd.run 'cat /etc/redhat-release'

3. Grain 实操

3.1 查看默认 grain

复制代码
salt '*' grains.items
salt '*' grains.get os
salt '*' grains.get ip4_interfaces

3.2 自定义 Grain(minion 节点操作!)

minion01 上:

复制代码
vim /etc/salt/grains

写入 yaml

复制代码
role: web
env: test

grain 修改重启 minion 生效

复制代码
systemctl restart salt-minion

master 验证:

复制代码
salt '*' grains.get role
#使用自定义grain筛选主机
salt -G 'role:web' cmd.run 'hostname'

小结:Grain 存在 minion 本地,重启 minion 刷新

4. Pillar 实操(master 操作)

pillar 存放敏感变量,master 维护

4.1 修改 master 配置开启 pillar 根

复制代码
vim /etc/salt/master

取消注释 pillar_roots

复制代码
pillar_roots:
  base:
    - /srv/pillar

创建目录,重启 master

复制代码
mkdir -p /srv/pillar
systemctl restart salt-master

4.2 编写 pillar 数据文件 /srv/pillar/mysql.sls

复制代码
mysql_root_password: "MyPass@123"

4.3 pillar 入口 top.sls /srv/pillar/top.sls

复制代码
base:
  '*':
    - mysql

4.4 刷新 pillar,不需要重启 minion

复制代码
salt '*' saltutil.refresh_pillar
#查看pillar变量
salt '*' pillar.get mysql_root_password
#使用pillar过滤主机 -I
salt -I 'mysql_root_password:MyPass@123' test.ping

5. State 状态管理实操(核心)

5.1 准备 file_roots

master 默认配置 file_roots 路径/srv/salt

复制代码
mkdir -p /srv/salt

5.2 写 nginx.sls 状态文件 /srv/salt/nginx.sls

复制代码
#安装nginx
nginx-install:
  pkg.installed:
    - name: nginx

#配置文件分发
nginx-conf:
  file.managed:
    - name: /etc/nginx/nginx.conf
    - source: salt://nginx/nginx.conf
    - user: root
    - group: root
    - mode: '0644'

#启动并开机自启
nginx-service:
  service.running:
    - name: nginx
    - enable: True
    - require:
      - pkg: nginx-install
    - watch:
      - file: nginx-conf

创建存放 nginx 配置的目录

复制代码
mkdir -p /srv/salt/nginx
#复制本机nginx.conf到/srv/salt/nginx/
cp /etc/nginx/nginx.conf /srv/salt/nginx/nginx.conf

5.3 测试执行 state(test=True 只预览,不改动主机)

复制代码
salt '*' state.sls nginx test=True
#正式执行
salt '*' state.sls nginx

5.4 top.sls 入口文件 highstate

/srv/salt/top.sls

复制代码
base:
  'minion01':
    - nginx
  'minion02':
    - nginx

执行 highstate 读取 top.sls 批量下发

复制代码
salt '*' state.highstate

5.5 Jinja2 模板 + Pillar 变量 sls 实操

新建 /srv/salt/mysql.sls

复制代码
#!jinja|yaml
mysql-install:
  pkg.installed:
    - name: mariadb-server

mysql-setpwd:
  cmd.run:
    - name: mysqladmin -uroot password '{{ pillar["mysql_root_password"] }}'
    - require:
      - pkg: mysql-install

执行

复制代码
salt 'minion02' state.sls mysql

6. Orchestrate 编排实操(master 本地 salt‑run)

orch 是 master 本机运行 salt‑run,用来编排多节点顺序任务

复制代码
mkdir -p /srv/salt/orch

/srv/salt/orch/deploy.sls

复制代码
deploy_web:
  salt.state:
    - tgt: 'minion01'
    - sls: nginx

deploy_db:
  salt.state:
    - tgt: 'minion02'
    - sls: mysql
    - require:
      - deploy_web

执行编排

复制代码
salt-run state.orchestrate orch.deploy

7. Job 任务管理实操

复制代码
#后台执行sleep长任务
salt '*' test.sleep 20
#查看活跃job
salt-jobs.active
#根据jid查看结果
salt-jobs.lookup_jid  <你的jid编号>
相关推荐
有毒的教程8 个月前
SaltStack 开源自动化运维工具详细介绍
运维·开源·saltstack
cly18 个月前
SaltStack自动化(一): 原理与安装
运维·自动化·saltstack
凤凰战士芭比Q9 个月前
Saltstack(安装、基本使用)
saltstack
mylinke9 个月前
光伏MPPT控制灰狼优化算法:局部遮阴下阴影变化的优化策略
saltstack
侠***I9 个月前
基于labview的信号发生器 功能介绍:纯软件方面的信号发生器,没有引入NI外部模块,生成的...
saltstack
星哥说事10 个月前
配置管理工具:Puppet/Chef/SaltStack 对比与应用
puppet·saltstack
虔诚的教徒1 年前
saltstack安装部署
saltstack
Linux运维日记2 年前
saltstack 和 ansible 最新比对
github·ansible·saltstack
马立杰2 年前
Ansible的yum和saltstack的哪个功能相似
ansible·saltstack