文章目录
一、认识SaltStack
1、简介
SaltStack 是一个服务器基础架构集中化管理平台,具备配置管理、远程执行、监控等功能,是基于python开发的一套C/S自动化运维工具,通信采用了zeromq消息队列的(pub/sub),数据传输采用了AES(高级加密)保证安全性,认证采用了SSL方式。
通过部署SaltStack环境,我们可以在成千上万台服务器上做到批量执行命令,根据不同业务特性进行配置集中化管理、分发文件、采集服务器数据、操作系统基础及软件包管理等,SaltStack是运维人员提高工作效率、规范业务配置与操作的利器。
2、原理
SaltStack 采用 C/S模式,server端就是salt的master,client端就是minion,minion与master之间通过ZeroMQ消息队列通信。
minion上线后先与master端联系,把自己的pub key发过去,这时master端通过salt-key -L命令就会看到minion的key,接受该minion-key后,也就是master与minion已经互信。
3、特性
(1)、部署简单、方便;
(2)、支持大部分UNIX/Linux及Windows环境;
(3)、主从集中化管理;
(4)、配置简单、功能强大、扩展性强;
(5)、主控端(master)和被控端(minion)基于证书认证,安全可靠;
(6)、支持API及自定义模块,可通过Python轻松扩展。
4、 ZeroMQ介绍
ZeroMQ是由一套组件组成,内封装的有网络通信,消息队列,线程调度等功能并向上层提供了简洁的API接口,应用程序通过加载库文件,调用API函数来实现高性能网络通信。
ZeroMQ将网络通信分成4种模型,分别是一对一结对模型(Exclusive-Pair)、请求回应模型(Request-Reply)、发布订阅模型(Publish-Subscribe)、推拉模型(Push-Pull)。这4种模型总结出了通用的网络通信模型,在实际中可以根据应用需要,组合其中的2种或多种模型来形成自己的解决方案。
saltstack-master与minion通信就采用了zeromq的请求回应模型(request-reply)和发布订阅模型(publish-subscribe):
- 请求回应模型
由请求端发起请求,然后等待回应端应答。一个请求必须对应一个回应,从请求端的角度来看是发-收配对,从回应端的角度是收-发对。跟一对一结对模型的区别在于请求端可以是1~N个
。该模型主要用于远程调用及任务分配等。Echo服务就是这种经典模型的应用。
- 发布订阅模型
发布端单向分发数据,且不关心是否把全部信息发送给订阅端。如果发布端开始发布信息时,订阅端尚未连接上来,则这些信息会被直接丢弃。订阅端未连接导致信息丢失的问题,可以通过与请求回应模型组合来解决。订阅端只负责接收,而不能反馈,且在订阅端消费速度慢于发布端的情况下,会在订阅端堆积数据。该模型主要用于数据分发。天气预报、微博明星粉丝可以应用这种经典模型。
5、Master与Minion认证
(1)、 minion在第一次启动时,会在/etc/salt/pki/minion/(该路径在/etc/salt/minion里面设置)下自动生成 minion.pem(private key)和 minion.pub(public key),然后将 minion.pub发送给master。
(2)、 master在接收到minion的public key后,通过salt-key命令accept minion public key,这样在master的/etc/salt/pki/master/minions下的将会存放以minion id命名的 public key,然后master就能对minion发送指令了。
后边做验证,服务端和客户端对应文件生成相同的md5值
6、Master与Minion的连接
salt-master启动时会运行两个端口4505和4506
:
4505:他是salt的消息发布,系统底层基于zeromq pub(发布订阅),可以在master的配置文件中publish_port修改参数。
作用:负责下发命令,并且所有的minion都会连接到4505这个端口,可通过lsof -i:4505命令查看,注:可在minion的配置文件修改master参数指定主master。
4506:他是salt消息收集,系统底层基于zeromq REQ/REP(请求回应模型),在master配置文件中ret_port修改参数。
作用:负责接收客户端发送过来的结果。
7、.sls文件执行方式
state.sls默认的运行环境是base环境,但是它并不读取top.sls(top.sls定义了运行环境以及需要运行的sls)。
-
关于state.sls的官方文档说明如下:
salt.modules.state.sls(mods, saltenv=‘base’, test=None, exclude=None, queue=False, env=None,**kwargs)
这里saltenv指的是运行环境,默认是base环境。 -
state.highstate: 这个是全局的所有环境,以及所有状态都生效。它会读取每一个环境的top.sls,并且对所有sls都生效。
后边会以实例说明
二、SaltStack部署
实验环境
主机名 | ip | 服务 |
---|---|---|
server1 | 172.25.1.1 | 服务端 salt-master |
server2 | 172.25.1.2 | 客户端 salt-minion |
server3 | 172.25.1.3 | 客户端 salt-minion |
1、saltstack安装部署
步骤一:三台主机下载所需安装包,并配置好yum源
在服务端(server1)上:
在客户端(server2)上:
在客户端(server3)上:
步骤二:安装服务并修改配置文件
在服务端(server1)上:
yum install salt-master -y
在客户端(server2)上:
yum install salt-minion -y
vim /etc/salt/minion
16 master: 172.25.1.1
在客户端(server3)上:
yum install salt-minion -y
vim /etc/salt/minion
16 master: 172.25.1.1
步骤三:开启服务
在服务端(server1)上:
systemctl start salt-master
systemctl enable salt-master
systemctl status salt-master
在客户端(server2)上:
systemctl start salt-minion
systemctl enable salt-minion
systemctl status salt-minion
在客户端(server3)上:
systemctl start salt-minion
systemctl enable salt-minion
systemctl status salt-minion
步骤四:查看客户端minion生成的 minion.pem(private key)和 minion.pub(public key)
server2:
server3:
步骤五:master端lsof查看端口占用情况
使用lsof -i:port来显示与指定端口相关的网络信息
下载lsof工具包:
yum install -y lsof.x86_64 0:4.87-5.el7
查看4505端口(publish_port ,即saltstack的消息发布系 统端口),4506(ret_port 即saltstack客户端与服务端通信的端口)占用情况:
步骤六:master端连接minion的key
查看一下salt-key的帮助参数:
salt-key --help
-l 显示指定状态的key,支持正则表达式
-L,--list-all 显示所有公钥
-a,ACCEPT 接受指定等待认证的key,支持正则
-A,--accept-all 接受所有等待认证的key
-r REJECT 拒绝等待认证的key,支持正则
-R REJECT-all 拒绝所有等待认证的key
--include-all 显示所有状态的key,包括non-pending状态
-p PRINT 打印指定的公钥,-P打印所有的公钥
-d DELETE 删除指定的key
-D --delete-all 删除所有的key
-f FINGER 显示指定key的指纹信息
-F --finger-all 显示所有key的指定信息
查看所有minion-key:
salt-key -L
接受所有等待认证的key:
salt-key -A
步骤七:检测master-minion连通情况
2、特殊字符使用
*匹配任意字符
salt server* test.ping
salt '*' test.ping # *号是特殊字符,必须用单引号引起来,否则识别不到
salt 特殊字符未使用单引号,报错:
salt * test.ping
当前为空目录时,运行不会报错。
3、查看master主机中存放的minion主机的public key
master在接收到minion的public key后,通过salt-key命令accept minion public key,这样在master的/etc/salt/pki/master/minions下的将会存放以minion id命名的 public key。查看master相应目录下的public key:
cd /etc/salt/pki/master/
tree . #查看当前目录的树形结构
查看对应文件md5值:
saltstack上server2文件md5值:
客户端server2的public key(minion.pub文件)的md5值:
md5sum minion.pub
结论:server2 的md5值==public key 的md5值。即master的/etc/salt/pki/master/minions下存放以minion id命名的 public key文件 server2
。
saltstack上server2文件md5值:
客户端server3的public key(minion.pub文件)的md5值:
md5sum minion.pub
4、查看服务开启进程名称
进程中显示服务名称,方便排错及进程查看。
yum install python-setproctitle -y #下载该服务,可以查看saltstack服务开启进程的名称
原进程查看:
yum install python-setproctitle -y #下载服务
systemctl restart salt-master #重启salt-master服务
ps aux #查看进程
下载服务后查看进程:
5、数据配置文件.sls
- 存放目录为: /srv/salt/
- 使用yaml和jinja语法
回顾一下前面学的YAML语法:
- 空格
使用2个空格表示数据层级。 - 冒号
使用冒号表示K-V数据结构(Python里叫dict)。
例如Key: Value,冒号及冒号之前的String表示key,冒号后面的String表示Value,Key和Value之间以空格(同一行)或者缩进分割(换行)。 - 减号
减号(-)用来表示List的数据结构,语法为减号跟空格,后面是Value的String
回顾一下前面学的jinja语法:
Jinja2是基于Python的模板引擎,Jinja2模板中可以包含变量、表达式等。
SaltStack在管理应用配置文件时,可以基于这个特性,在不同的Targeting生成有针对的配置,比如Keepalived不同节点的配置文件要区分master/backup,被saltstack管理时只需要编写一个模板文件,通过条件判断在不同节点生成不同的配置文件。
- 语法
a) 定义变量
{% set var = ‘value’ %}
b) 引用变量
{{ 我是变量名 }}
c) if条件判断
{% if kenny.sick %}
Kenny is sick.
{% elif kenny.dead %}
You killed Kenny! You bastard!!!
{% else %}
Kenny looks okay — so far
{% endif %}
三、编写apache自动安装文件
.sls文件内容详解:
apache-install: #声明
pkg.installed: #模块
- pkgs: #方法
- httpd #传参
- httpd-tools
file.managed: #file模块managed方法
- name: /etc/httpd/conf/httpd.conf #name:位置
- source: salt://apache/files/httpd.conf #source:来源 salt服务端基于目录/srv/salt
service.running: #service运行服务
- name: httpd #name:服务名称
- reload: true #重启,每次修改配置文件,都会触发重启,可以声明以reload方式重启。
- watch: #监控文件,如果有变化则服务重启
- file: apache-install #到apache-install唯一性文件声明中找file定义
步骤一:编写apache.sls文件
注意路径/srv/salt
,数据配置文件默认存放路径。
步骤二:拷贝配置文件到source指定路径下
- 为统一管理文件,我们在/srv/salt目录下创建files目录,用来存放.sls文件中添加服务需要用到的文件。
- 在任意一台主机上安装httpd服务,将生成的配置文件拷贝到master主机的/srv/salt/files目录下。
我选择我的server3主机安装httpd服务,将配置文件httpd.conf文件拷贝到master主机上
server3:
server1:
server3:
server1查看:
步骤三:执行apache.sls文件
与ansible不同的是:saltstack执行文件时不需要在特定目录下,只需将数据配置文件.sls放到/srv/salt目录下,执行时指定即可。
salt server3 state.sls apache.apache #调用状态模块的sls方法,执行apache目录下的apache文件,appache.sls文件的sls后缀可不写
测试:
在server2主机上: