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'])

 

posted @ 2018-03-20 09:08  大梦初醒lf  阅读(222)  评论(0)    收藏  举报