SaltStack二次开发--restful API环境部署及使用
SaltStack的API是在Master和Minion之外的一个独立的服务,所以需要独立部署,API服务需要部署在Master服务器上。
部署:
1、部署salt-api服务
# 环境准备, 建议对salt-api使用HTTPS, 生成签名证书; 这里我们通过
yum install gcc make python-devel libffi-devel yum install -y python-pip pip-python install PyOpenSSL
#生成证书
salt-call tls.create_self_signed_cert local: Created Private Key: "/etc/pki/tls/certs/localhost.key." Created Certificate: "/etc/pki/tls/certs/localhost.crt."
#安装软件
yum install -y salt-api
2、配置用户和权限
#cat /etc/salt/master.d/eauth.conf external_auth: pam: #认证模式,这里pam用Linux本身的用户认证模式, saltapi: #用户名 - . #用户权限 - '@wheel' - '@runner' #添加用户 useradd -M -s /sbin/nologin saltapi echo "spassword" | passwd saltapi --stdin 备注:由于API可以被远程调用,所以这里会牵涉限制的问题,接近常用的方式就是引入认证,SaltStack支持多种认证,这里我们借助于系统自带的认证:PAM。
3、配置salt-api服务
# cat /etc/salt/master.d/api.conf rest_cherrypy: port: 8000 ssl_crt: /etc/pki/tls/certs/localhost.crt #使用前面生成的证书 ssl_key: /etc/pki/tls/certs/localhost.key
4、启动服务
# /etc/init.d/salt-api restart Stopping salt-api daemon: [FAILED] Starting salt-api daemon: [ OK ] # netstat -lnp | grep 8000 tcp 0 0 0.0.0.0:8000 0.0.0.0: LISTEN 27818/python2.6
5、测试
这里我们curl模仿一个请求,来测试api服务是否正常。 curl -X POST \ -k https://10.0.2.118:8000/login \ -d username='saltapi' \ -d password='spassword' \ -d eauth='pam' | python -mjson.tool 返回值 { "return": [ { "eauth": "pam", "expire": 1430692841.8622849, "perms": [ ".*", "@wheel", "@runner" ], "start": 1430649641.8622839, "token": "3625a48e9976dd76ee10be0f85aac6a0cad60592", # "user": "saltapi" } ] } curl -k https://10.0.2.118:8000/minions -H "Accept: application/x-yaml" -H "X-Auth-Token:e2944550be9120997efc9b4cd49d5a21f750ba5c" return: - minion1: SSDs: [] ... #省略很多很多行 virtual: kvm zmqversion: 3.2.5
使用:
通过restful的api进行基本的日常管理
1)运行远程模块
2)查询指定job
3)运行runner
1、运行远程模块
# curl -k https://10.0.2.118:8000/ \ -H "Accept: application/json" \ #返回信息格式,默认json, -H "X-Auth-Token: eb74373815d94624d3dd05016432a1b385fa43e9" \ # -d client='local' \ #调用的底层salt模块 -d tgt='*' \ #target, 如果不使用默认匹配模式(glob), 添加 -d fun='test.ping' \ #执行函数 | python -mjson.tool #Json格式化输出 { "return": [ { "minion1": true } ] } #通过指定上述的几个参数,基本就实现了salt(/usr/bin/salt)的功能
2、查询指定job
我们一般在其他地方调用salt-api或者通过第三方调用时,很少会直接同步等待Salt的返回;一般情况下我们会使用Salt的异步模块来执行命令获取一个返回的jid(任务ID),然后通过这个jid来获取任务的详细信息。
curl -k https://10.0.2.118:8000/jobs/ \ -H "X-Auth-Token: eb74373815d94624d3dd05016432a1b385fa43e9" | python -mjson.tool { "return": [ { "20150503173832332733": { "Arguments": [], #任务参数 "Function": "test.ping", #任务调用行数 "StartTime": "2015, May 03 17:38:32.332733", "Target": "*", # 任务对象 "Target-type": "glob", #匹配类型 "User": "root" #执行用户 }, ... #省略很多 } ] } 获取jid后,即可获取到该任务的详细情况,代码如下: curl -k https://10.0.2.118:8000/jobs/20150503185955483255 \ -H "X-Auth-Token: eb74373815d94624d3dd05016432a1b385fa43e9" | python -mjson.tool { "info": [ { "Arguments": [], "Function": "test.ping", "Minions": [ "minion1" ], "Result": { "minion1": { "return": true } }, "StartTime": "2015, May 03 18:59:55.483255", "Target": "*", "Target-type": "glob", "User": "root", "jid": "20150503185955483255" } ], "return": [ { "minion1": true } ] }
3、运行runner
curl -k https://10.0.2.118:8000/ \ -H "X-Auth-Token: eb74373815d94624d3dd05016432a1b385fa43e9" \ -d client="runner" \ -d fun="manage.status" | python -mjson.tool { "return": [ { "down": [], "up": [ "minion1" ] } ] }
6、用python调用restful的api接口:
import requests import yaml import json # import urllib3.contrib.pyopenssl # urllib3.contrib.pyopenssl.inject_into_urllib3() def saltapi(tgt,fun,arg): data1 = { 'username': 'saltapi', 'password': 'saltapi', 'eauth': 'pam' } r1 = requests.post('https://192.168.5.11:8080/login', data=data1, verify=False) token = 'ccf4a02329da4ac24bcc069f8ccd5b6b1dbb25b9' headers = { 'Content-Type': 'application/x-yaml', 'X-Auth-Token': 'ccf4a02329da4ac24bcc069f8ccd5b6b1dbb25b9', } data = { 'client': 'local', 'tgt': tgt, 'fun': fun, 'arg': arg } request_data = requests.post('https://192.168.5.11:8080', data=data, verify=False, cookies=r1.cookies.get_dict()) r = json.loads(request_data.text).values() r = list(r)[0][0] return r r = saltapi(tgt='*', fun='cmd.run', arg='df -h') print(type(r)) print(r) print(r['server.example.com'])

浙公网安备 33010602011771号