SaltStack

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需要安装的应用
master192.168.58.120salt-master、salt-minion
minion192.168.58.121salt-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异步执行
-vverbose模式,详细显示执行过程
–username=USERNAME指定外部认证用户名
–password=PASSWORD指定外部认证密码
–log-file=LOG_FILE指定日志记录文件
  •                                常用target参数
    
参数注释
-E正则匹配
-L列表匹配
-SCIDR匹配网段
-Ggrains匹配
–grain-pcregrains加正则匹配
-N组匹配
-R范围匹配
-C综合匹配(指定多个匹配)
-Ipillar值匹配

示例

匹配 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
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值