Akemi

SaltStack部署与key操作

2025/09/04

SaltStack是一个功能极其强大的基础设施自动化与管理平台。它的核心设计目标是速度可扩展性智能化,能够轻松管理从几十台到数万台服务器的环境。

早期运维人员会根据自己的生产环境来写shell脚本完成大量重复性工作,shell脚本复杂并且难以维护,几乎除了函数之外没有一丁点可复用性

salt和ansible对比

特性 Salt (SaltStack) Ansible
架构模式 C/S 架构 (主从模式) 无代理架构 (基于SSH)
通信方式 长连接、加密的消息队列 短连接、SSH协议
工作模式 Master 将任务发布到消息总线,Minions 主动拉取并执行。 控制机通过SSH主动推送任务到目标节点执行。
速度关键 极高。连接已建立,通信开销极小,支持真正的并行。 较慢。每次执行都需要建立新的SSH连接,存在开销。
扩展性 极强。专为万级以上节点设计,速度衰减不明显。 良好。但在大规模节点下,SSH连接管理和时间推移会成为瓶颈。
首次连接 需要安装和配置Minion,并与Master建立连接,初始设置稍复杂 非常简单,只需SSH凭据即可开始管理。

salt基本架构

三种工作方式

  • Local:本地运行,自己管理自己
  • Master-Minion:主从架构(推荐)
  • Salt SSH:与ansible一样,不需要代理

salt安装部署

salt目前支持的系统版本:

Salt supported operating systems - Salt install guide

以3006版本为例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
10.163.2.100 master
10.163.2.128 minion1
10.163.2.102 minion2
10.163.2.129 minion3

centos:
curl -fsSL https://github.com/saltstack/salt-install-guide/releases/latest/download/salt.repo | sudo tee /etc/yum.repos.d/salt.repo
yum -y install salt-master
yum -y install salt-minion
yum -y install salt-ssh
yum -y install salt-syndic
yum -y install salt-cloud
yum -y install salt-api

ubuntu:
# Ensure keyrings dir exists
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://packages.broadcom.com/artifactory/api/security/keypair/SaltProjectKey/public | sudo tee /etc/apt/keyrings/salt-archive-keyring.pgp
curl -fsSL https://github.com/saltstack/salt-install-guide/releases/latest/download/salt.sources | sudo tee /etc/apt/sources.list.d/salt.sources
sudo apt update
echo 'Package: salt-*
Pin: version 3006.*
Pin-Priority: 1001' | sudo tee /etc/apt/preferences.d/salt-pin-1001

sudo apt-get install salt-master
sudo apt-get install salt-minion
sudo apt-get install salt-ssh
sudo apt-get install salt-syndic
sudo apt-get install salt-cloud
sudo apt-get install salt-api

systemctl enable salt-master --now
systemctl enable salt-minion --now

# 仅测试环境
systemctl disable firewalld.service --now
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disable/' /etc/selinux/config

ufw disable

salt安全通信

slat使用publish-subscribe发布订阅模式,连接由minion启动,所以只需要master监听端口,master默认使用4505和4506端口

  • minion给master的4505端口发送消息建立连接
  • master通过4506端口发布消息广播,minion接受消息

salt认证过程

  • minion启动时,会搜索网络中名为salt(根据/etc/salt/minion定义)的主机
  • 找到后与master建立tcp连接,并将其公钥发送给master
  • 在master上使用salt-key命令(或自动化机制,通过/etc/salt/master配置)接受minion的公钥
  • 接收minion密钥后,返回master的公钥和一个轮转的AES密钥,用于对master发送的消息进行加密解密
  • 每次删除minion都需要重新验证,重启master不需要

实现master与minion通信

minion发起连接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
minion中配置文件的默认master为"salt",所以需要改下解析
也可以直接改minion配置文件,一样的,改配置文件需要重启服务

grep '#master:' /etc/salt/minion
#master: salt

cat >/etc/hosts <<EOF
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.163.2.100 master salt
10.163.2.128 minion1
10.163.2.102 minion2
10.163.2.129 minion3
EOF

scp /etc/hosts minion1:/etc/
scp /etc/hosts minion2:/etc/
scp /etc/hosts minion3:/etc/

# master
salt-key -L
Accepted Keys:
Denied Keys:
Unaccepted Keys:
minion1
minion2
minion3

master会提取minion的主机名作为能看到的名称
这里可以看到三个都已经收到了,且状态为未认证

salt-key操作

由于salt默认不使用ssh,salt在cs架构中有专门实现安全通信的方法
salt-key就是实现master和minion安全通信的密钥,默认是没有的,需要创建

key的增删改查

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
key的查看:
salt-key -L
Accepted Keys: # 已通过认证的key
Denied Keys: # 拒绝的key
Unaccepted Keys: # 未通过认证的key
Rejected Keys: # 吊销的key

key的存放位置:
tree /etc/salt/pki/
/etc/salt/pki/
└── master
├── master.pem
├── master.pub
├── minions
├── minions_autosign # 启动注册的key
├── minions_denied # 拒绝的key
├── minions_pre # 未通过认证的key
│   ├── minion1
│   ├── minion2
│   └── minion3
└── minions_rejected # 吊销的key

key检查:
就是检查指纹
# master检查指纹
salt-key -f minion1
Unaccepted Keys:
minion1: af:df:20:11:cb:a7:93:b3:56:c5:0e:e6:11:a5:39:fe:b5:5a:33:1d:ee:62:0c:24:7b:f4:89:8f:62:3c:4c:7b
# minion检查自己指纹
salt-call --local key.finger
local:
af:df:20:11:cb:a7:93:b3:56:c5:0e:e6:11:a5:39:fe:b5:5a:33:1d:ee:62:0c:24:7b:f4:89:8f:62:3c:4c:7b

删除key
如果是已经接受的key被删除了,则需要进行重认证,需要重启minion
salt-key -d # 删除指定minion的key
salt-key -d minion1 -y
salt-key -D # 删除全部key

拒绝key
拒绝之后就会放到Rejected Keys中
salt-key -r # 拒绝指定minion的key
salt-key -R # 拒绝所有未接受的key

拒绝key与恢复

如果master拒绝了minion的公钥

  • 在master上删除这个公钥,然后重启minion
  • 以open mode重启master(不推荐)
1
2
3
4
5
6
7
8
9
10
删除master上的密钥
salt-key -R
ls /etc/salt/pki/master/minions_rejected/
minion1 minion2 minion3
rm -rf /etc/salt/pki/master/minions_rejected/*

这一步minion进程就自杀了
所以需要重启所有的minion服务
systemctl restart salt-minion

key的接受与自动接受

手动接受

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
salt-key -a # 接受单个key
salt-key -A # 接受所有key

salt-key -a minion1
salt-key -L
Accepted Keys:
minion1
Denied Keys:
Unaccepted Keys:
minion2
minion3
Rejected Keys:

netstat -tunp |grep salt
tcp 0 0 10.163.2.100:4505 10.163.2.128:59678 ESTABLISHED 13762/salt-master P
tcp 0 0 10.163.2.100:4506 10.163.2.128:50734 ESTABLISHED 13768/salt-master R
tcp 0 0 10.163.2.100:4506 10.163.2.102:57206 ESTABLISHED 13768/salt-master R
tcp 0 0 10.163.2.100:4506 10.163.2.129:59850 ESTABLISHED 13768/salt-master R

自动接受(不推荐)

如果配置了自动接受key,就认为网络环境绝对安全

1
2
3
4
5
6
7
8
9
10
配置文件/etc/salt/master

自动接受开关
auto_accept: False

白名单
autosign_file: /etc/salt/autosign.conf

黑名单
autoreject_file: /etc/salt/autoreject.conf
CATALOG
  1. 1. salt安装部署
  2. 2. salt安全通信
    1. 2.1. salt认证过程
    2. 2.2. 实现master与minion通信
  3. 3. salt-key操作
    1. 3.1. key的增删改查
    2. 3.2. 拒绝key与恢复
    3. 3.3. key的接受与自动接受