SaltStack
简介
SaltStack 是一种基于 C/S 架构的服务器基础架构集中化管理平台,管理端称为 Master,客户端称为 Minion。SaltStack 具备配置管理、远程执行、监控等功能,一般可以理解为是简化版的 Puppet 和加强版的 Func。SaltStack 本身是基于 Python 语言开发实现,结合了轻量级的消息队列软件 ZeroMQ 与 Python 第三方模块(Pyzmq、PyCrypto、Pyjinjia2、python-msgpack 和 PyYAML 等)构建。
SaltStack 具有以下特性,帮助企业 IT 更好的实现系统批量管理:
- 部署简单、管理方便;
- 支持大部分的操作系统,如 Unix/Linux/Windows 环境;
- 架构上使用C/S管理模式,易于扩展;
- 配置简单、功能覆盖广;
- 主控端(Master)与被控端(Minion)基于证书认证,确保安全可靠的通信;
- 支持 API 及自定义 Python 模块,轻松实现功能扩展;
SaltStack 的工作原理
SaltStack 采用 C/S 结构来对云环境内的服务器操作管理及配置管理。为了更好的理解它的工作方式及管理模型,本章将通过图形方式对其原理进行阐述。
SaltStack 客户端(Minion)在启动时,会自动生成一套密钥,包含私钥和公钥。之后将公钥发送给服务器端,服务器端验证并接受公钥,以此来建立可靠且加密的通信连接。同时通过消息队列 ZeroMQ 在客户端与服务端之间建立消息发布连接。具体通信原理图,如图 1 所示,命令执行如图 2 所示:
.SaltStack 通信原理图
说明:
- Minion 是 SaltStack 需要管理的客户端安装组件,会主动去连接 Master 端,并从 Master 端得到资源状态信息,同步资源管理信息。
- Master 作为控制中心运行在主机服务器上,负责 Salt 命令运行和资源状态的管理。
- ZeroMQ 是一款开源的消息队列软件,用于在 Minion 端与 Master 端建立系统通信桥梁。
- Daemon 是运行于每一个成员内的守护进程,承担着发布消息及通信端口监听的功能。
SaltStack 操作执行原理图
- Minion 是 SaltStack 需要管理的客户端安装组件,会主动去连接 Master 端,并从 Master 端得到资源状态信息,同步资源管理信息。
- Master 作为控制中心运行在主机服务器上,负责 Salt 命令运行和资源状态的管理。
- Master 上执行某条指令通过队列下发到各个 Minions 去执行,并返回结果。
SaltStack四大功能与四大运行方式
SaltStack有四大功能,分别是:
- 远程执行
- 配置管理/状态管理
- 云管理(cloud)
- 事件驱动
SaltStack可以通过远程执行实现批量管理,并且通过描述状态来达到实现某些功能的目的。
SaltStack四大运行方式:
- local本地运行
- Master/Minion传统方式
- Syndic分布式
- Salt ssh
SaltStack安装
环境说明:
主机名 | ip | 需要安装的应用 |
---|---|---|
master | 192.168.58.120 | salt-master、salt-minion |
minion | 192.168.58.121 | salt-minion |
控制主机安装salt-master、salt-minion
关闭防火墙
[root@master ~]# systemctl disable --now firewalld
[root@master ~]# sed -ri 's/^(SELINUX=).*/\1disabled/g' /etc/selinux/config
[root@master ~]# setenforce 0
配置yum源
[root@master ~]# rpm --import https://repo.saltproject.io/py3/redhat/8/x86_64/latest/SALTSTACK-GPG-KEY.pub
[root@master ~]# curl -fsSL https://repo.saltproject.io/py3/redhat/8/x86_64/latest.repo | tee /etc/yum.repos.d/salt.repo
检测yum源
root@master ~]# dnf list all | grep salt
salt-minion.noarch //只要搜到salt-minion即代表成功 3004-1.el8 salt-latest-repo
salt-ssh.noarch 3004-1.el8 sal
下载salt-master 和 salt-minion
[root@master ~]# dnf -y install salt-master salt-minion
安装过程略....
修改配置文件
[root@master ~]# vim /etc/salt/minion
......
#master: salt
master: 192.168.58.120 //此处添加控制主机ip
......
启动salt-master、salt-minion服务并设置开机自启
[root@master ~]# systemctl enable --now salt-master
[root@master ~]# systemctl enable --now salt-minion
[root@master ~]# ss -anlt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 0.0.0.0:4505 0.0.0.0:* //master 端口号
LISTEN 0 128 0.0.0.0:4506 0.0.0.0:* //master 端口号
LISTEN 0 128 [::]:22 [::]:*
被控主机安装salt-minion
关闭防火墙
[root@minion ~]# systemctl disable --now firewalld
[root@minion ~]# sed -ri 's/^(SELINUX=).*/\1disabled/g' /etc/selinux/config
[root@minion ~]# setenforce 0
配置yum源
[root@minion ~]# rpm --import https://repo.saltproject.io/py3/redhat/8/x86_64/latest/SALTSTACK-GPG-KEY.pub
[root@minion ~]# curl -fsSL https://repo.saltproject.io/py3/redhat/8/x86_64/latest.repo | tee /etc/yum.repos.d/salt.repo
检测yum源
root@minion ~]# dnf list all | grep salt
salt-minion.noarch //只要搜到salt-minion即代表成功 3004-1.el8 salt-latest-repo
salt-ssh.noarch 3004-1.el8 sal
下载salt-minion
[root@minion ~]# dnf -y install salt-minion
安装过程略....
修改配置文件
[root@minion ~]# vim /etc/salt/minion
......
#master: salt
master: 192.168.58.120 //此处添加控制主机ip
......
启动salt-master、salt-minion服务并设置开机自启
[root@minion ~]# systemctl enable --now salt-minion
saltstack配置文件
saltstack的配置文件在/etc/salt目录
saltstack配置文件说明:
配置文件 | 说明 |
---|---|
/etc/salt/master | 主控端(控制端)配置文件 |
/etc/salt/minion | 受控端配置文件 |
配置文件/etc/salt/master默认的配置就可以很好的工作,故无需修改此配置文件。
配置文件/etc/salt/minion常用配置参数
-
master:设置主控端的IP
-
id:设置受控端本机的唯一标识符,可以是ip也可以是主机名或自取某有意义的单词
在日常使用过程中,经常需要调整或修改Master配置文件,SaltStack大部分配置都已经指定了默认值,只需根据自己的实际需求进行修改即可。下面的几个参数是比较重要的 -
max_open_files:可根据Master将Minion数量进行适当的调整
-
timeout:可根据Master和Minion的网络状况适当调整
-
auto_accept和autosign_file:在大规模部署Minion时可设置自动签证
-
master_tops和所有以external开头的参数:这些参数是SaltStack与外部系统进行整合的相关配置参数
SaltStack认证机制
saltstack主控端是依靠openssl证书来与受控端主机认证通讯的,受控端启动后会发送给主控端一个公钥证书文件,在主控端用salt-key命令来管理证书。
salt-minion与salt-master的认证过程:
- minion在第一次启动时,会在/etc/salt/pki/minion/下自动生成一对密钥,然后将公钥发给master
- master收到minion的公钥后,通过salt-key命令接受该公钥。此时master的/etc/salt/pki/master/minions目录将会存放以minion id命名的公钥,然后master就能对minion发送控制指令了
-
salt-key常用选项
参数 | 注释 |
---|---|
-L | 列出所有公钥信息 |
-a minion | 接受指定minion等待认证的key |
-A | 接受所有minion等待认证的key |
-r minion | 拒绝指定minion等待认证的key |
-R | 拒绝所有minion等待认证的key |
-f minion | 显示指定key的指纹信息 |
-F | 显示所有key的指纹信息 |
-d minion | 删除指定minion的key |
-D | 删除所有minion的key |
-y | 自动回答yes |
命令演示
查看当前证书情况
[root@master ~]# salt-key -L
Accepted Keys:
Denied Keys:
Unaccepted Keys:
master
minion
Rejected Keys:
接受指定minion主机的证书
[root@master ~]# salt-key -ya minion
The following keys are going to be accepted:
Unaccepted Keys:
minion
[root@master ~]# salt-key -L
Accepted Keys:
minion
Denied Keys:
Unaccepted Keys:
Rejected Keys:
接受所有的证书
[root@master ~]# salt-key -yA
The key glob '*' does not match any unaccepted keys.
[root@master ~]# salt-key -L
Accepted Keys:
master
minion
Denied Keys:
Unaccepted Keys:
Rejected Keys:
使用tree命令查看salt目录结构
[root@master salt]# tree pki
pki
├── master
│ ├── master.pem
│ ├── master.pub
│ ├── minions
│ │ ├── master //证书
│ │ └── minion //证书
│ ├── minions_autosign
│ ├── minions_denied
│ ├── minions_pre
│ └── minions_rejected
└── minion
├── minion_master.pub
├── minion.pem
└── minion.pub
发现刚刚的证书在pki的接受(minions)目录中
SaltStack远程执行
使用test.ping模块来测试主机是否ping通
[root@master salt]# salt "minion" test.ping
minion:
True
此时我们可以ping通是因为minion证书在接受目录中
若我们使用 命令(mv)将证书文件移动到拒绝(minions_rejected)目录中后,还能ping通嘛?
[root@master ~]# cd /etc/salt/
[root@master salt]# tree pki
pki
├── master
│ ├── master.pem
│ ├── master.pub
│ ├── minions
│ │ ├── master
│ │ └── minion
│ ├── minions_autosign
│ ├── minions_denied
│ ├── minions_pre
│ └── minions_rejected
└── minion
├── minion_master.pub
├── minion.pem
└── minion.pub
7 directories, 7 files
[root@master salt]# mv pki/master/minions/minion /etc/salt/pki/master/minions_rejected/
[root@master salt]# ls /etc/salt/pki/master/minions_rejected/
minion
[root@master salt]# tree pki
pki
├── master
│ ├── master.pem
│ ├── master.pub
│ ├── minions
│ │ └── master
│ ├── minions_autosign
│ ├── minions_denied
│ ├── minions_pre
│ └── minions_rejected
│ └── minion
└── minion
├── minion_master.pub
├── minion.pem
└── minion.pub
7 directories, 7 files
再次ping minion发现ping不通
[root@master salt]# salt "minion" test.ping
No minions matched the target. No command was sent, no jid was assigned.
ERROR: No return received
再将minion证书文件移回去,再ping
[root@master salt]# mv pki/master/minions_rejected/minion /etc/salt/pki/master/minions/
[root@master salt]# tree pki
pki
├── master
│ ├── master.pem
│ ├── master.pub
│ ├── minions
│ │ ├── master
│ │ └── minion
│ ├── minions_autosign
│ ├── minions_denied
│ ├── minions_pre
│ └── minions_rejected
└── minion
├── minion_master.pub
├── minion.pem
└── minion.pub
7 directories, 7 files
测试
[root@master ~]# salt "*" test.ping
minion:
True
master:
True
Salt命令
语法:salt [options] ‘’ <function(函数)> [arguments(参数)]
-
常用的options(选项)
参数 | 注释 |
---|---|
–version | 查看saltstack的版本号 |
–versions-report | 查看saltstack以及依赖包的版本号 |
-h | 查看帮助信息 |
-c CONFIG_DIR | 指定配置文件目录(默认为/etc/salt/) |
-t TIMEOUT | 指定超时时间(默认是5s) |
–async | 异步执行 |
-v | verbose模式,详细显示执行过程 |
–username=USERNAME | 指定外部认证用户名 |
–password=PASSWORD | 指定外部认证密码 |
–log-file=LOG_FILE | 指定日志记录文件 |
-
常用target参数
参数 | 注释 |
---|---|
-E | 正则匹配 |
-L | 列表匹配 |
-S | CIDR匹配网段 |
-G | grains匹配 |
–grain-pcre | grains加正则匹配 |
-N | 组匹配 |
-R | 范围匹配 |
-C | 综合匹配(指定多个匹配) |
-I | pillar值匹配 |
示例
匹配 id可以在被控制机配置文件中的/etc/salt/minion中进行修改,id默认是主机名
因为上面已经生成了密钥,如果直接重启密钥验证无效
修改id
[root@master ~]# salt-key -yd minion
The following keys are going to be deleted:
Accepted Keys:
master
Key for minion node1 deleted.
[root@master ~]# salt-key -L
Accepted Keys:
master
Denied Keys:
Unaccepted Keys:
Rejected Keys:
minion主机上操作
[root@minion minion]# ls
minion_master.pub minion.pem minion.pub
[root@minion minion]# rm -rf *
[root@minion minion]# vim /etc/salt/minion
113 #id:
114 id: 192.168.58.121
[root@minion minion]# systemctl restart salt-minion.service
[root@minion minion]# ls
minion.pem minion.pub
master主机上查看
[root@master ~]# salt-key -L
Accepted Keys:
master
Denied Keys:
Unaccepted Keys:
192.168.58.121
Rejected Keys:
[root@master ~]# salt-key -ya 192.168.58.121
The following keys are going to be accepted:
Unaccepted Keys:
192.168.58.121
Key for minion 192.168.58.121 accepted.
[root@master ~]# salt-key -L
Accepted Keys:
192.168.58.121
master
Denied Keys:
Unaccepted Keys:
Rejected Keys:
[root@master master]# salt -E '192*' test.ping #匹配id为开头为192的
192.168.58.121:
True
[root@master master]# salt -L 192.168.58.121,master test.ping # 可以写多个,逗号隔开
192.168.58.121:
True
master:
True
[root@master master]# salt -S '192.168.58.0/24' test.ping # 匹配一个网段里面的所有
192.168.58.121:
True
master:
True
[root@master master]# salt -G 'os:redhat' test.ping
192.168.58.121:
True
master:
True
[root@master master]# salt -C 'G@os:redhat or L@master' test.ping
master:
True
192.168.58.121:
True
在master配置文件中设置组
[root@master ~]# vim /etc/salt/master
......
12 default_include: master.d/*.conf #取消前面的注释
......
创建相应的目录及文件
[root@master ~]# mkdir -p /etc/salt/master.d
[root@master ~]# touch /etc/salt/master.d/nodegroups.conf
添加新的组和组员(组后的主机,主机名要写salt-key接受的主机名.不需要重启master)
[root@master master]# cat /etc/salt/master.d/nodegroups.conf
nodegroups:
group1: 'master'
[root@master master]# salt -N 'group1' 'test.ping'
master:
True