Saltstack安装及二次开发说明书
1 Saltstack介绍
SaltStack是一个服务器基础架构集中化管理平台,具备配置管理、远程执行、监控等功能,一般可以理解为简化版的puppet和加强版的func。SaltStack基于Python语言实现,结合轻量级消息队列(ZeroMQ)与Python第三方模块(Pyzmq、PyCrypto、Pyjinjia2、python-msgpack和PyYAML等)构建。
通过部署SaltStack环境,我们可以在成千上万台服务器上做到批量执行命令,根据不同业务特性进行配置集中化管理、分发文件、采集服务器数据、操作系统基础及软件包管理等,SaltStack是运维人员提高工作效率、规范业务配置与操作的利器。
Minion(被管理节点)与master(管理节点)之间的通信模式如下:
2 Saltstack安装包下载
saltstack添加包,RPM包已在:http://172.17.31.171/salt/,TA可以直接配置在repo源内,进行安装。
3 Saltstack安装部署
3.1 服务器端安装
[root@saltstack ~]# yum install salt-master –y
3.2 安装客户端
[root@saltstack ~]# yum install salt-minion –y
3.3 配置客户端服务端
由于每台客户端的配置文件中,默认配置的服务器名为salt。因此可以在客户端和服务器端配置一个host文件,映射salt 为服务器端,这样每台客户端无需配置任何,便可以与服务端通信。
[root@saltstack ~]# echo "172.17.32.86 salt" >>/etc/hosts
二选一,或者直接在客户端配置服务器端地址即可,如下:
(注意master:与IP间,中间有空格)
服务器端配置:
3.4 设置开机启动
由于salt是最底层的服务,因此需要开机启动,且必须在root用户下安装,这样可以管理任何用户下的软件。
服务端执行命令:[root@saltstack ~]# chkconfig salt-master on
客户端执行命令:[root@saltstack ~]# chkconfig salt-minion on
3.5 启动服务
启动服务端: [root@saltstack ~]# service salt-master start
启动客户端: [root@saltstack ~]# service salt-minion start
3.6 服务端接收客户端认证
默认情况下,客户端启动后,便向服务端发出认证请求。因此在服务端和客户端启动后。
服务端查看,被管理的客户端请求的服务器名:
查看所有的客户端认证命令:[root@saltstack ~]# salt-key –L
接受所有客户端的认证命令:[root@saltstack ~]# salt-key –A
接受单个客户端的认证命令:[root@saltstack ~]# salt-key -a key
[root@saltstack ~]# salt-key -D //删除所有KEY,[root@saltstack ~]# salt-key -d key //删除单个key
下图绿色的表示被接受的客户端服务器名,红色表示尚未接收和认证的客户端名,蓝色表示拒绝的服务器名,其中服务器名便是master认证的key,因此服务器名不能重复。
3.7 测试验证
[root@saltstack ~]# salt '*' test.ping //此命令向每台服务器ping一下
[root@saltstack ~]# salt "*" cmd.run "ifconfig" //查看每个客户端的IP
4 Saltstack二次开发
4.1 在master节点安装salt-api包
[root@yun11 yum.repos.d]# yum install salt-api –y
4.2 启动服务
[root@yun7 salt-rest-api]# ./app.py
Bottle v0.13-dev server starting up (using WSGIRefServer())...
Listening on http://0.0.0.0:8818/
Hit Ctrl-C to quit.
此服务相当于一个微服务,仅仅提供单一的功能,接收客户端的一个rest请求,返回数据。
这个二次开发接口,使用了bottle的rest框架。由于botle是python包,因此无需安装任何东西,直接运行app.py即可,当服务端接收到每条rest的命令请求是,都会返回信息。
4.3 接口通信协议及使用说明
仅一个接口,接收post请求的服务。
TYPE:POST
Data: {"servers":"******,******","cmd":"cat /etc/issue"}
//servers:是向哪台服务器发送指令,cmd:是具体的指令信息。
Return:json格式数据。
{ "return":
{
"**********": "CentOS release 6.5 (Final) Kernel \r on an \m",
"********": "CentOS release 6.5 (Final) Kernel \r on an \m"
}
}
4.4 代码示例:
[root@yun7 salt-rest-api]# ./app.py
其中app.py的代码如下:
[root@yun7 salt-rest-api]# cat app.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
#########################################################################
# File Name: app.py
# Author: DRUNK
# Created Time: Sun 26 Apr 2015 07:52:05 PM PDT
#########################################################################
from bottle import Bottle, run, route, request, response
from bottle import static_file
#引入saltstack 的包
import salt.client
try:
import simplejson as json
except ImportError as ex:
import json
app = Bottle()
@app.post('/run')
def saltrun():
data = request.body.read()
try:
jd = json.loads(data)
servers = jd['servers']
cmd = jd['cmd']
print(cmd)
local = salt.client.LocalClient()
results = local.cmd(servers, 'cmd.run', [cmd], expr_form='list')
return {"return": results}
except Exception, e:
print(e)
return {"return":"Something is error!"}
# 设置route页面
@app.route('/')
def index():
return 'Hello,saltstack'
# 设置服务器和端口
run(app, host='0.0.0.0', port=8818)
4.5 测试
查看127.0.0.1服务器的IP
获取所有认证客户端和为认证客户端: