一、SaltStack介绍

  SaltStack,一种全新的基础设施管理方式,部署轻松,在几分钟内可运行起来,扩展性好,很容易管理上万台服务器,速度够快,服务器之间秒级通讯。
  SaltStack是使用Python语言开发,同时提供Rest API方便二次开发以及和其它平台进行集成。SaltStack底层采用动态的连接总线, 使其可以用于编配, 远程执行, 配置管理等等。

  Saltstack是基于Python开发的一套C/S架构,具备Puppet、Ansible功能于一身的配置管理工具,功能十分强大,各模块融合度及复用性极高;使用SSL证书签方的方式进行认证管理,使用号称世界上最快的消息队列ZeroMQ使得Saltstack能够秒级在数万台服务器上进行各种操作,而且使用RAS Key方式确认身份,传输采用AES加密,安全性能更高。
  Saltstack不仅仅是一款配置管理工具,还是一款做云计算和数据中心架构编排利器。目前Salt-cloud项目也已经合并到Saltstack主项目里,Saltstack已经支持Docker相关模块,在友好地支持各大云平台之后,配合Saltstack的Mine实现各云平台业务自动扩展。
  其它详细介绍:http://docs.saltstack.cn/topics/index.html
  官方网站:http://www.saltstack.com
  官方文档:http://docs.saltstack.com
  GitHub:https://github.com/saltstack
  中国SaltStack用户组:http://www.saltstack.cn

二、SaltStack功能

  1. Saltstack最主要的两个功能是:配置管理与远程执行
  2. Saltstack不只是一个配置管理工具,还是一个云计算与数据中心架构编排的利器
  3. Saltstack已经支持Docker相关模块
  4. 在友好地支持各大云平台之后,配合Saltstack的Mine实时发现功能可以实现各种云平台业务的自动扩展

  SaltStack对于常用操作系统都支持。windows不支持Slat-master。

三、SaltStack架构

  Saltstack最传统的运行方式还是C/S模式,服务端称为Master,客户端称为Minion。因此需要在被管理节点上安装Minion客户端;其实Saltstack也支持SSH方式,无需安装Agent,通过SSH实现管理。

  • Local # 这种方式适合调试
  • Master/Minion # 传统运行方式
  • Salt SSH # 适合于不便安装minion端的环境

  SaltStack可以实现传统处理方式,即:客户端发送请求给服务器,服务器收到请求后处理请求,再将结果返回。也可以使用消息队列中的发布与订阅(pub/sub)服务模式:

  SaltStack具体执行步骤如下:比如salt "*" cmd.run "ls /root"

  • SaltStack的master与minion之间通过ZeroMq进行消息传递,使用了ZeroMq的发布-订阅模式,连接方式包括tcp,ipc。
  • master接收到命令后,将要执行的命令发送给客户端minion。
  • minion从消息总线上接收到要处理的命令,交给minion._handle_aes处理。
  • minion._handle_aes发起一个本地线程调用cmdmod执行ls命令。线程执行完ls后,调用minion._return_pub方法,将执行结果通过消息总线返回给master。
  • master接收到客户端返回的结果,调用master._handle_aes方法,将结果写的文件中。
  • salt.client.LocalClient.cmd_cli通过轮询获取Job执行结果,将结果输出到终端。

四、SaltStack工作机制

  • Master和Minion都以守护进程的方式运行
  • Master监听配置文件里定义的ret_port(接收minion请求),和publish_port(发布消息)的端口
  • 当Minion运行时,它会自动连接到配置文件里定义的Master地址ret_port端口进行连接认证
  • 当Master和Minion可以正常通信后,就可以进行各种各样的配置管理工作了

五、SaltStack安装

  本文的安装方式采取C/S架构:Matser–Minion端。通过官方yum源来yum安装salt-master和salt-minion。

5.1 软件依赖

  saltstack对于python版本和python模块有一定的要求:

  • Python # 版本大于2.6或版本小于3.0
  • msgpack-python # saltstack消息交换库
  • YAML # saltstack配置解析定义语法
  • Jinja2 # saltstack states配置模板
  • MarkupSafe # Python unicode转换库
  • apache-libcloud # saltstack对云架构编排库
  • Requests # HTTP Python库
  • ZeroMQ # saltstack消息系统
  • pyzmq # ZeroMQ Python库
  • PyCrypto # Python密码库
  • M2Crypto # Openssl Python包装库

5.2 环境介绍

1
2
[root@test ~]# cat /etc/redhat-release 
CentOS Linux release 7.4.1708 (Core)

5.3 安装官方yum源

  Centos6,使用python2.6:

yum install https://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el6.noarch.rpm -y
yum clean expire-cache

  Centos7,使用python2.6:

yum install https://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm -y
yum clean expire-cache

  yum安装salt的时候,因为使用python编写的,会把对应版本的python底层库给覆盖掉,导致库版本会有变更或删除,因此安装时检查是否有项目依赖此版本的python。

5.4 安装salt-master

1
2
3
[root@test ~]# yum install -y salt-master
[root@test ~]# systemctl enable salt-master
[root@test ~]# systemctl start salt-master

  SaltStack服务端的配置文件是/etc/salt/master ,服务端配置文件可以不用修改,默认情况下salt-master在所有接口上监听4505和4506两个端口,如果想绑定某个具体的ip,需要对/etc/salt/master配置文件中interface做出修改,修改后需要重启服务。

5.5 安装salt-minion

  本文主要介绍在linux中如何安装salt-minion,windows平台可以从 http://repo.saltstack.com/#windows 下载安装包。

1
2
3
4
5
[root@test ~]# yum install -y salt-minion
[root@test ~]# systemctl enable salt-minion
[root@test ~]# sed -i 's/#master: salt/master: 192.168.0.2/g' /etc/salt/minion # 修改为master端IP地址
[root@test ~]# sed -i "s/#id:/id: 192.168.0.4/g" /etc/salt/minion # 修改minion端key名为IP地址
[root@test ~]# systemctl start salt-minion

  如果minion配置文件中的id参数配置的是主机名,需要在master端hosts文件中配置解析。配置的是IP地址,就不需要加解析了。

5.6 认证

  此时距离使用saltstack管理minion还差最后一步,master想要和minion通信还需要在服务端配置客户端的key认证。
  minion在启动时,会在/etc/salt/pki/minion/下自动生成 minion.pem 和 minion.pub(私钥和公钥),并且会将minion.pub文件发送到master的/etc/salt/pki/master/minions_pre/目录下等待服务端进行确认。此时只需要在服务端使用salt-key命令确认认证就可以对minion端发送指令操控了。

1
2
3
4
5
6
7
8
9
[root@test ~]# salt-key -h
-L: 列出密钥
-a key名: 接受一个密钥
-A: 接受全部密钥
-D: 删除全部密钥
[root@test ~]# salt-key -A -y # 接收所有密钥
[root@test ~]# salt '192.168.0.4' test.ping # 测试是否通信成功
192.168.1.4:
True

  认证之后,将minion的公钥从/etc/salt/pki/master/minions_pre/放到/etc/salt/pki/master/minions/下,并将其改名为id的名字(如果配置文件里没有修改,默认主机名),master端还会将其公钥文件发给minion端,做双向认证。

六、遇到的问题

6.1 minion提示pid文件存在

  日志里报错:salt-minion dead but pid file exists。
  原因:出现这种情况是因为之前minion端ID修改了,导致公钥更新无法和master端验证。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@test ~]# salt-minion -l debug                       # minion端调试
[INFO ] Setting up the Salt Minion "namenode"
[DEBUG ] Created pidfile: /var/run/salt-minion.pid
[DEBUG ] Reading configuration from /etc/salt/minion
[DEBUG ] Attempting to authenticate with the Salt Master at 192.168.0.2
[DEBUG ] Initializing new SAuth for ('/etc/salt/pki/minion', 'namenode', 'tcp://192.168.0.2:4506')
[ERROR ] The master key has changed, the salt master could have been subverted, verify salt master's public key
[CRITICAL] The Salt Master server's public key did not authenticate!
The master may need to be updated if it is a version of Salt lower than 2015.5.5, or
If you are confident that you are connecting to a valid Salt Master, then remove the master public key and restart the Salt Minion.
The master public key can be found at:
/etc/salt/pki/minion/minion_master.pub
[root@test ~]# rm -rf /etc/salt/pki/minion/minion_master.pub # 删除minion端密钥
[root@test ~]# systemctl salt-minion restart # 重启minion端

6.2 修改minon-id

  在日常运维中,可能存在机器主机名变更的情况,因此需要重新修改minion端的id。

1
2
3
4
5
6
[root@test ~]# systemctl salt-minion stop                                              # 停止salt-minion服务
[root@test ~]# rm -rf /etc/salt/pki/minion/minion.pem /etc/salt/pki/minion/minion.pub # 删除salt-minion公钥文件
[root@test ~]# sed -i "s/id: oldID/id: newID/g" /etc/salt/minion # 修改新minion_id
[root@test ~]# salt-key -d oldId # master上删除旧的key
[root@test ~]# salt-minion:/etc/init.d/salt-minion start # minion端重新启动
[root@test ~]# salt-key -a NewId