目录
一、salstack简介
1、简介
2、原理
3、特性
4、ZeroMQ介绍
二、Saltack服务的安装
步骤一:
1、在阿里云上查看相关的下载地址
2、安装salstack yum 源文件
步骤二:
1、复制官网的命令之后会自动生成一个yum源文件信息
2、因为从官网上下载镜像速度很慢,所以根据阿里云上的要求将路径改变为自己阿里云自己的镜像仓库路径
3、在server1上安装salt-master、 在server2、server3上安装salt-minion
步骤三:
1、查看认证名单
2、添加认证
3、测试
4、如果minion端的主机修改主机名 服务无法连接master的解决方法
5、查看证书所在的路径
6、master端和minion端彼交换公钥来完成加密通信的
三、用 Saltstack 命令行和编辑master文件的方式来部署服务
(一)、远程执行获取server2系统磁盘的信息的目录文件
步骤一: 查看salt相关的文档信息
步骤二: 远程部署软件包
步骤三: 自己定义编辑master配置文件
1、创建模块目录
2、编写模块文件、同步模块
3、运行模块
(二)、通过编写sls方式来进行
步骤一 :安装apache服务
1、配置文件的书写格式
2、使用子目录来做组织是个最好的选择
(三)、远程安装httpd服务
步骤一: 编辑sls文件
步骤二: 修改模板信息
步骤三: 编译、测试
一、salstack简介
1、简介
SaltStack时一种配置管理系统,能够维护预定义状态的远程节点
SaltStack时一种分布式的远程执行系统,用来在执行远程节点都上执行命令和查询的数据
SaltStack时运维人员提高工作效率,规范业务配置与操作的利器ZeroMQ
使命令发送到的远程系统时并行的步是串行的
使用安全加密的协议
使用最小最快的网络模块载荷
提供简单的编程接口ZeroMQ
Salt同样引入了更加细致化的领域控制系统来远程执行,使得系统成功的为目标不止可以通过主机名,还可以通过系统属性
知识点:
[root@server2 ~]# cd /var/cache/salt/minion/
[root@server2 minion]#
[root@server2 minion]# tree .
.
├── extmods
└── proc
2 directories, 0 files
salt在推送数据的时候会存放到远端的 /var/cache/salt/minion/ 目录下
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已经互信,监听的是4505端口 Salt Master 运行的第二网络服务就是ZeroMQ REP系统,默认监听的是4506端口
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):
- 请求回应模型
由请求端发起请求,然后等待回应端应答。一个请求必须对应一个回应,从请求端的角度来看是发-收配对,从回应端的角度是收-发对。跟python-setproctitle.x86_64一对一结对模型的区别在于请求端可以是1~N个。该模型主要用于远程调用及任务分配等。Echo服务就是这种经典模型的应用。
- 发布订阅模型
发布端单向分发数据,且不关心是否把全部信息发送给订阅端。如果发布端开始发布信息时,订阅端尚未连接上来,则这些信息会被直接丢弃。订阅端未连接导致信息丢失的问题,可以通过与请求回应模型组合来解决。订阅端只负责接收,而不能反馈,且在订阅端消费速度慢于发布端的情况下,会在订阅端堆积数据。该模型主要用于数据分发。天气预报、微博明星粉丝可以应用这种经典模型。
- ansible-playbook文件编译主机的任务的数量
[ansible@server1 ~]$ cat apache.yml
---
- hosts: all
serial: 1 ##控制滚动更新的数量数表示一个个的执行 为2表示两个两个的值只执行
roles:
- role: apache
when: ansible_hostname in groups['webservers']
[ansible@server1 ~]$ time ansible-playbook apache.yml -f 1 ##表示开一个进程
- 实验环境
主机名 | ip | 服务 |
---|---|---|
server1 | 172.25.6.1 | 服务端 salt-master |
server2 | 172.25.6.2 | 客户端 salt-minion |
server3 | 172.25.6.3 | 客户端 salt-minion |
二、Saltack服务的安装
步骤一:
查看官网信息配置yum源
saltstack 官网:https://www.saltstack.com/
阿里云上的镜像仓库的位置:https://developer.aliyun.com/mirror/saltstack
1、在阿里云上查看相关的下载地址
主下载镜像是使用的是阿里云的镜像 因为下载的速度快,如果是官网下载的速度慢
2、安装salstack yum 源文件
复制阿里云上yum源文件的安装地址
[root@server1 ~]# yum install https://mirrors.aliyun.com/saltstack/yum/redhat/salt-repo-latest-2.el7.noarch.rpm
步骤二:
在相应的主机上安装 salt-master、salt-minion 软件
1、复制官网的命令之后会自动生成一个yum源文件信息
在server1、server2、server3节点上进行
(注:生成的文件信息yum源的地址为官网的地址)
2、因为从官网上下载镜像速度很慢,所以根据阿里云上的要求将路径改变为自己阿里云自己的镜像仓库路径
在server1、server2、server3节点上进行
[root@server1 yum.repos.d]# sed -i "s/repo.saltstack.com/mirrors.aliyun.com\/saltstack/g" /etc/yum.repos.d/salt-latest.repo ##修改访问镜像仓库的路径
3、在server1上安装salt-master、 在server2、server3上安装salt-minion
3.1、在server1上:
3.1.1、安装salt-master
[root@server1 ~]# yum install -y salt-master
/var/cache/salt/minion/extmods/modules/mydisk.py
3.1.2、开启 salt-maaster 服务
[root@server1 ~]# systemctl start salt-master.service ##重启
3.1.3、salt默认配置文件存放的路径
[root@server1 ~]# cd /etc/salt/
3.1.4、开启 salt-maaster 服务 后系统会开启4505、4506 端口
[root@server1 ~]# yum install net-tools -y ##安装netstat软件
[root@server1 ~]# netstat -antlp ##查看服务的端口信息
tcp 0 0 0.0.0.0:4505 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:4506 0.0.0.0:* LISTEN
3.1.5、安装可以显示salt与python进程的关系的软件
[root@server1 ~]# yum list python-* ##搜索与python相关的软件
[root@server1 ~]# yum install -y python-setproctitle.x86_64 ##安装salt与python进程的关系的软件
ps ax查看进程的关系
3.1.6、监测mater和minion相连接的情况
安装lsof软件 可以查看到后台主机与本机之间的连接情况
[root@server1 ~]# yum install -y lsof ##安装lsof可以
[root@server1 ~]# lsof -i : 4505 ##查看4505端口被外部端口连接的情况
3.2、在server2、server3主机上
/var/cache/salt/minion/extmods/modules/mydisk.py3.2.1、安装salt-minion
[root@server2 ~]# yum install -y salt-minion ##安装salt-minion软件
3.2.2、配置minion文件
[root@server2 ~]# vim /etc/salt/minion ##配置minion文件
...
master: 172.25.6.1 ##连接主节点的主机
...
/var/cache/salt/minion/extmods/modules/mydisk.py
3.2.3、开启salt-minion
[root@server2 ~]# systemctl start salt-minion ##开启服务
步骤三:
在进行上边的操作之后server2、server3、就可以server1进行连接
测试
1、查看认证名单
[root@server1 ~]# salt-key -L ##查看认证名单
(认证没有出现server2、server3说明了server2、server3主机没有连上)
1.2、解决思路:
重启动服务——>查看minion配置文件——>查看防火墙是否开启
关闭三台主机的防火墙服务
[root@server1 ~]# systemctl disable --now firewalld ##关闭防火墙服务
[root@server1 ~]# systemctl restart salt-master.service ##重启服务
再次查看 :
(因为防火墙的原因!!!)
2、添加认证
[root@server1 ~]# salt-key -A ##添加认证
The following keys are going to be accepted:
Unaccepted Keys:
server2
server3
Proceed? [n/Y] y ##是否认证授权
Key for minion server2 accepted.
Key for minion server3 accepted.
3、测试 :
[root@server1 ~]# salt '*' test.ping ##查看server2、server3和server1是否能导通
[root@server1 ~]# lsof -i :4505 ##查看4505端口的连接情况
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
/usr/bin/ 30202 root 15u IPv4 350714 0t0 TCP *:4505 (LISTEN)
/usr/bin/ 30202 root 17u IPv4 354483 0t0 TCP server1:4505->server3:43992 (ESTABLISHED)
/usr/bin/ 30202 root 18u IPv4 354484 0t0 TCP server1:4505->server2:55152 (ESTABLISHED)
[root@server1 ~]# lsof -i :4506 ##4506端口反馈结果
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
/usr/bin/ 30208 root 23u IPv4 351515 0t0 TCP *:4506 (LISTEN)
4、如果minion端的主机修改主机名 服务无法连接master的解决方法
[root@server3 salt]# cat /etc/salt/minion_id ##存放minion主机和master主机相连的身份认证文件
server3
如果minion端修改主机名后无法与master'端进行连接 只需要把/etc/salt/minion_id文件删除掉 让系统重新生一个新的文件即可 !!!
5、查看证书所在的路径
[root@server1 ~]# cd /etc/salt/pki/ ##查看证书所在的路径
[root@server1 minions]# vim /etc/salt/pki/master/minions/server2 ##查看证书的加密文件
/var/cache/salt/minion/extmods/modules/mydisk.py
6、master端和minion端彼交换公钥来完成加密通信的
6.1、在server1上:
[root@server1 ~]# md5sum /etc/salt/pki/master/minions/server2 ##查看server2的为公钥
e184f16bcac07ba4f6590440feba5620 /etc/salt/pki/master/minions/server2
[root@server1 ~]#
[root@server1 ~]# md5sum /etc/salt/pki/master/minions/server3 ##查看server3的公钥
3eec0c20750eb90c4f79bcc71208eab2 /etc/salt/pki/master/minions/server3
6.2、在server2上查看公钥
[root@server2 ~]# md5sum /etc/salt/pki/minion/minion.pub
e184f16bcac07ba4f6590440feba5620 /etc/salt/pki/minion/minion.pub
[root@server2 ~]#
6.3、在server3上查看公钥
[root@server3 minion]# md5sum minion.pub
3eec0c20750eb90c4f79bcc71208eab2 minion.pub
结论:
server2、server3从节点上的公钥和server1主节点上的公钥一致,所以他们之间是通过文件加密的放是来进行连接的
三、 用 Saltstack 命令行和编辑master文件的方式来部署服务
编写远程执行模块步骤:
创建模块目录——>编写模块文件——>同步模块——>运行模块
Salt语法的编写规则
- 规则一:缩进
Salt需要每个缩进级别由两个空格组成,不要使用tabs。
- 规则二:冒号
字典的key在YAML中的表现形式是以一种冒号结尾的字符串
my_key: my_value
- 规则三:短横杠
想要表示列表项,使用一个短横杠加一个空格。
- list_value_one
- list_value_two
(一)、远程执行获取server2系统磁盘的信息的目录文件
例:以查看系统的磁盘信息为例(详见步骤三)
步骤一 :
查看salt相关的文档信息
[root@server1 ~]# salt 'server2' sys.doc pkg ##查看文档
步骤二:
远程部署软件包
[root@server1 ~]# salt 'server2' pkg.install httpd ##远程安装软件的命令
[root@server1 ~]# salt 'server2' pkg.remove httpd ##远程删除软件的命令
(蓝色表示进行的操作已经存在!!)
步骤三 :
自己定义编辑master配置文件(想改别的目录就要修改主配置文件)
1、创建模块目录
1.1、创建 /srv/salt 目录默认没有得自己创建
[root@server1 ~]# mkdir /srv/salt
1.2、想要修改别的目录需要变更主配置文件
[root@server1 ~]# vim /etc/salt/master ##编辑主配置文件
2、编写模块文件、同步模块
目录要以默认的方式来创建目录的格式为下划线开头
[root@server1 ~]# mkdir /srv/salt/_modules ##创建的目录
[root@server1 ~]# vim /srv/salt/_modules/mydisk.py ##编辑文件
[root@server2 minion]# cat /var/cache/salt/minion/extmods/modules/mydisk.py
def df(): ##定义一个空的函数
return __salt__['cmd.run']('df -h') ##提取系统的磁盘信息
[root@server1 ~]# salt server2 saltutil.sync_modules ##将数据同步在server2上
server2:
- modules.mydisk ##表示同步成功
2.1、在server2查看数据的同步
[root@server2 ~]# cd /var/cache/salt/minion/ ##数据存放的目录
[root@server2 minion]#
[root@server2 minion]# tree .
.
├── extmods
└── proc
2 directories, 0 files
[root@server2 minion]#
[root@server2 minion]# tree .
.
├── extmods
│ └── modules
│ └── mydisk.py
├── files
│ └── base
│ └── _modules
│ └── mydisk.py
├── module_refresh
└── proc
3、运行模块
[root@server1 _modules]# salt server2 mydisk.df ##调用mydisk文件中的df函数
3.2、运行结束后会在cd /var/cache/salt/minion/ 目录下生成 mydisk.pyc 文件
(二)、通过编写sls方式来进行
Salt 系统的核心状态是SLS,或者叫State文件
SLS表示系统将会是一个什么样的一种状态,而且是以一种很简单的格式来包含这些数据,常叫做配置管理、
sls文件命名:
sls文件以".sls" 后缀结尾,但在调用是不用写此后缀的
使用子目录来做组织是个最好的选择
init.sls 在一个子目录里面表示引导文件,也表示子目录本身,所以 " apache/init.sls " 就表示 " apache".
如果同时存在 apache.sls 和 apache/init.sls 则apache.sls 被忽略,apache.sls 将被用来表示apache
例1:
安装apache服务
步骤一 :
安装apache服务
1.1、编写sls文件
[root@server1 salt]# vim apache.sls
httpd: ##ID
pkg.installed ##动作
1.2、测试
[root@server1 salt]# salt server2 state.sls apache ##测试
例2:高级推(给各个节点上的服务i都推相同的服务)
1、配置文件的书写格式
[root@server1 salt]# cat top.sls
base:
'*': ##表示全部主机上都进行的动作
- apache
[root@server1 salt]# salt '*' state.highstate ##高级推 " * " 对应的是salt-key中的值
2、使用子目录来做组织是个最好的选择
init.sls 在一个子目录里面表示引导文件,也表示子目录本身,所以 " apache/init.sls " 就表示 " apache".
如果同时存在 apache.sls 和 apache/init.sls 则apache.sls 被忽略,apache.sls 将被用来表示apache
实验:
[root@server1 salt]# mkdir apache ##创建目录
[root@server1 salt]# mv apache.sls apache/ ##将apach.sls目录移动到apache目录下
[root@server1 salt]# cd apache/
[root@server1 apache]# ls
apache.sls
[root@server1 apache]# mv apache.sls init.sls ##重命名 (在子目录中运行文件必须是init.sls文件名 否则系统无法识别)
[root@server1 apache]# salt '*' state.highstate ##测试高级推
没有修改init.sls和修改之后进行对比
(三)、远程安装httpd服务
步骤一:
编辑sls文件
[root@server1 ~]# vim /srv/salt/apache/init.sls ##编辑sls文件
install-apache: ##文件的ID
pkg.installed: ##要进行的动作
- pkgs:
- httpd: ##安装的软件服务
- httpd-tools
- php
service.running: ##开启httpd服务
- name: httpd
- enable: True ##开机自启
- watch:
- file: /etc/httpd/conf/httpd.conf ##监控此文件的内容如果有变化就重启httpd服务
/etc/httpd/conf/httpd.conf: ##模块的目录名称
file.managed:
- source: salt://apache/httpd.conf ##读取的模板文件
模板中监控的内容的读取是 - file: /etc/httpd/conf/httpd.conf 读取/etc/httpd/conf/httpd.conf 文件中的内容,/etc/httpd/conf/httpd.conf 在通过file读取salt://apache/httpd.conf 中的模板
步骤二:
修改模板信息
[root@server1 apache]# cp /etc/httpd/conf/httpd.conf . ##将httpd配置文件模板复制到当前的目录下
[root@server1 apache]# vim httpd.conf ##修改端口为8080
...
Listen 8080
...
步骤三:
1、编译 :
[root@server1 apache]# salt server2 state.sls apache ##编译文件
2、测试
在server2上:
2.1查看配置文件的信息有没有发生改变
[root@server2 ~]# vim /etc/httpd/conf/httpd.conf
(配置哦文件的端口已经改为8080)
2.2、查看server2上的端口信息
[root@server2 ~]# netstat -anltp ##查看端口信息
(httpd的服务端口已经变为8080)