当我们服务器数量只有1台,2台,几台时,我们部署软件工具可以逐台登录服务器操作,但随着企业服务器数量不但增多,显然逐台登录部署已经变得不现实。这时自动化运维管理工具就闪亮登场了,目前比较流行的工具有puppet,ansible,saltstack。我曾经使用过ansible和saltstack,当机器数量较多时,ansible执行比saltstack慢很多,今天主要介绍下saltstack。
1. saltstack介绍
saltstack是由python编写的采用c/s架构的自动化运维工具,由master和minion组成,使用ZeroMQ消息队列pub/sub方式通信,使用SSL证书签发的方式进行认证管理,本身是支持多master的。saltstack除了可以通过在节点安装客户端进行管理还支持直接通过ssh进行管理。运行模式为master端下发指令,客户端接收指令执行。采用yaml格式编写配置文件,支持api及自定义python模块,能轻松实现功能扩展。
saltstack有一个saltstack master,而很多saltstack minon在初始化时会连接到该master上。初始化时,minion会交换一个秘钥建立握手,然后建立一个持久的加密的TCP连接。通常,命令起始于master的命令行中,master将命令分发minion上。saltstack master可以同时连接很多minion而无需担心过载,这都归功于ZeroMQ。由于minion和master之间建立了持久化连接,所以master上的命令能很快的到达minion上。minion也可以缓存多种数据,以便加速执行。
2.安装过程
2.1 环境准备
机器名称 | 机器系统 | 机器ip |
---|---|---|
saltstack-master | centos7.6 | 10.20.3.10 |
saltstack-monion1 | centos7.6 | 10.20.3.11 |
saltstack-monion2 | centos7.6 | 10.20.3.12 |
2.2 安装saltstack
master机器
1.加载saltstack库和密钥
[root@saltstack-master ~]# yum install -y https://repo.saltstack.com/yum/redhat/salt-repo-latest.el7.noarch.rpm
2.清除缓存
[root@saltstack-master ~]# yum clean expire-cache
3.安装salt-master服务
[root@saltstack-master ~]# yum install -y salt-master
4.启动master服务
[root@saltstack-master ~]# systemctl enable salt-master
[root@saltstack-master ~]# systemctl start salt-master
minion机器
1.加载saltstack库和密钥
[root@saltstack-minion1 ~]# yum install -y https://repo.saltstack.com/yum/redhat/salt-repo-latest.el7.noarch.rpm
[root@saltstack-minion2 ~]# yum install -y https://repo.saltstack.com/yum/redhat/salt-repo-latest.el7.noarch.rpm
2.清除缓存
[root@saltstack-minion1 ~]# yum clean expire-cache
[root@saltstack-minion2 ~]# yum clean expire-cache
3.安装salt-minion
[root@saltstack-minion1 ~]# yum install -y salt-minion
[root@saltstack-minion2 ~]# yum install -y salt-minion
4.启动minion
[root@saltstack-minion1 ~]# systemctl enable salt-minion
[root@saltstack-minion1 ~]# systemctl start salt-minion
[root@saltstack-minion2 ~]# systemctl enable stal-minion
[root@saltstack-minion2 ~]# systemctl start salt-minion
服务配置
以下minion配置只以一个讲解,另外一个同理操作
1.master默认在所有网卡监听4505、4506端口,修改配置文件将服务监听在唯一地址
[root@saltstack-master ~]# vim /etc/salt/master
interface: 10.20.3.10
[root@saltstack-master ~]# systemctl restart salt-master
2.修改minion配置文件,加入master地址
[root@saltstack-minion1 ~]# vim /etc/salt/minion
master: 10.20.3.10
[root@saltstack-minion1 ~]# systemctl restart salt-minion
3.建立mater和minion通信秘钥
minion 启动之后会请求 master 为其发送证书,证书签发完成后,表示 master可以加入该 minion
[root@saltstack-master ~]# salt-key -L
可以看到两个 minion 客户端已经和服务端建立了联系,并且 master 已经获取了 minion 的公钥,但master还未接受minion的key,正在等待更多进一步有关是否接受该 minion 的指令
使master接受minion的key
[root@saltstack-master ~]# salt-key -a saltstack-minion1
[root@saltstack-master ~]# salt-key -a saltstack-minion2
此时再查看,master已经接受minion的key
也可以使用如下命令一次接受所有minion的key
salt-key -A -y
4.简单测试
master ping minion
[root@saltstack-master ~]# salt '*' test.ping
查看minion机器负载
[root@saltstack-master ~]# salt '*' cmd.run 'uptime'
至此saltstack搭建完毕
3.saltstack使用
3.1 salt常用命令
salt-key 秘钥管理
salt-key -L # 查看所有minion的key状态
salt-key -a <节点id> # 接受某个minion的key
salt-key -A # 接受所有minion的key
salt-key -d <节点id> # 删除某个minion的key
salt-key -D # 删除所有minion的key
salt-run 执行runner函数
salt-run [option] [runner.func]
salt-run manage.status # 查看所有minion的状态
salt-run manage.down # 查看down掉的minion
salt-run manage.up # 查看up的minion
3.2 grains模块
该模块采集的是系统的静态信息,包括cpu、操作系统、文件系统、硬盘等
显示所有的minion的grians信息
[root@saltstack-master ~]# salt '*' grains.ls
列出所有的minion的grains详细信息
[root@saltstack-master ~]# salt '*' grains.items
grains使用场景
1.查看各minion的操作系统
[root@saltstack-master ~]# salt '*' grains.item os
2.分类查找
如找出cpu架构是x86的机器,查看cpu核数
可以使用-G参数来表示使用grains中变量信息来匹配minion
[root@saltstack-master ~]# salt -G 'cpuarch:x86_64' grains.item num_cpus
可以自定义grains
这里我们自定义minion1的grains
1 修改/etc/salt/minion文件
[root@saltstack-minion1 ~]# vim /etc/salt/minion
grains:
services:
- webserver
- redis
site: beijing1
department: yanfa
[root@saltstack-minion1 ~]# systemctl restart salt-minion
这是再在master查看,可以看到我们自己定义的属性
2 也可以修改/etc/salt/grains文件
[root@saltstack-minion1 ~]# vim /etc/salt/grains
services:
- webserver
- redis
site: beijing1
department: yanfa
3 也可以在master上自己写grains模块
[root@saltstack-master ~]# vim /srv/salt/_grains/test.py
def use():
useage = {}
useage['use'] = 'docker'
return useage
同步到minion上
[root@saltstack-master ~]# salt '*' saltutil.sync_grains
查看
master分发的文件可以在minion /var/cache/salt/minion/files/base/ 里看到
3.3 pillar模块
pillar可以指定一些信息发送到指定的minion上,保存的数据可以是动态的,pillar以sls来写,格式是键值对。
不同于grains模块,grains在master是同步到所有minion上,而pillar只同步到指定minion上。
实现一个pillar流程
创建pillar目录
[root@saltstack-master ~]# mkdir /srv/pillar
创建一个pillar数据文件
[root@saltstack-master ~]# vim /srv/pillar/test.sls
pod: '09'
disk: 'ssd'
创建top file文件(指定哪些minion到pillar数据文件,即需要分发的节点)
base:
'saltstack-minion1':
- test
刷新pillar数据
[root@saltstack-master ~]# salt '*' saltutil.refresh_pillar
查看,可以看到只有我们指定的minion收到了数据
下面在结合grains,利用jinja语法实现另一个pillar流程
创建一个pillar数据文件
[root@saltstack-master ~]# mkdir /srv/pillar/web
[root@saltstack-master ~]# vim /srv/pillar/web/apache.sls
{% if grains['os_family'] == 'RedHat' %}
apache: httpd
{% elif grains['os_family'] == 'RedHat' %}
apache: apache2
{% endif %}
创建top file文件
[root@saltstack-master ~]# vim /srv/pillar/top.sls
base:
'*':
- web.apache
刷新pillar数据
[root@saltstack-master ~]# salt '*' saltutil.refresh_pillar
查看,minion1和minion2都为centos系统所有web都是httpd
4.参考文档
来源:https://blog.51cto.com/13053917/2428384