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: 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-1001sudo 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 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/ 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: Denied Keys: Unaccepted Keys: Rejected Keys: key的存放位置: tree /etc/salt/pki/ /etc/salt/pki/ └── master ├── master.pem ├── master.pub ├── minions ├── minions_autosign ├── minions_denied ├── minions_pre │ ├── minion1 │ ├── minion2 │ └── minion3 └── minions_rejected key检查: 就是检查指纹 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 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 salt-key -d minion1 -y salt-key -D 拒绝key 拒绝之后就会放到Rejected Keys中 salt-key -r salt-key -R
拒绝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 salt-key -A 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