云计算自动化运维——SaltStack详解

一、认识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主机上:

在这里插入图片描述

发布了170 篇原创文章 · 获赞 7 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/CapejasmineY/article/details/103303409