首先saltstack的介绍这里略去

官方网站http://www.saltstack.com/

github网站https://github.com/saltstack/salt

中文网站http://saltstack.cn/   (@绿小小肥创建的,得到官方认可的中文网站)

国内QQ交流群   294953305(已满员)      220852394(可加入)

salt的python API http://docs.saltstack.com/ref/clients/index.html?highlight=api

看看salt能干什么呢

saltstack二次开发构建自己的api_第1张图片

   也就是salt.states和salt.modules这2部分功能。

   salt-cloud,salt-ssh等众多功能,具有很强大的功能和当下最需要的功能,所以saltstack在当前,以及未来,都有很大的发展空间。

   在这个例子中,是用django+salt来提供api(restful api),方便给其他运维管理系统统一调度

   其实官方是有api的,但是我这里为什么要自己写,是因为官方的api和自己的应用以及想法有出入,所以只能自己造轮子。

   给出一个django views.py的例子,至于django的其他配置,这里不演示,所以本文也只能做部分参考,仅仅是思路(别说照着本文做不出来哦,更多的内容,请学习官方文档)

   views.py的内容如下

# Create your views here.
# coding=utf-8
# author:  itnihao#qq.com
# http://www.itnihao.com
# date: 2013-12-05
from django.http import HttpResponse
from django.contrib import auth
from django.views.decorators.csrf import csrf_exempt
import salt
import json
import yaml
@csrf_exempt
def control(request):
    if request.method == "POST":
        for k in ['id','status']:
            if k not in request.POST:
                data='give arg "{0}" a value'.format(k)
                return HttpResponse(data,mimetype='application/json')
        id=request.POST['id']
        #servicename=request.POST['servicename']
        status=request.POST['status']
        id=str(id)
        #servicename=str(servicename)
        status=str(status)
        result={}
        '''
        必须接的参数是status,可接的参数为id,servicename
        available   服务是否有效,参数id,servicename
        get_all     获取所有的服务状态,参数id
        get_enabled 获取所有已经开启的服务,参数id
        enable      设置开机自启动,参数id,servicename
        enabled     返回开机是否为自启动状态,参数id,servicename
        get_disabled获取所有已经关闭的服务,参数id
        disable     设置开机不自启动,参数id,servicename
        disabled    返回开机是否为不自启动状态,参数id,servicename
        start       开启服务,参数id,servicename
        stop        停止服务,参数id,servicename
        restart     重启服务,参数id,servicename
        reload      热加载配置文件,参数id,servicename
        status      查看服务状态,参数id,servicename
        '''
        if status not in ['get_all','get_disabled','get_enabled','available','disable','disabled','enable','enabled','start','stop','restart','reload','status']:
            data='status must in [available|get_all|get_disabled|disable|disabled|get_enabled|enable|enabled|start|stop|restart|reload|status]'
            return HttpResponse(data,mimetype='application/json')
        cmd='service.{0}'.format(status)
        id=id.split(',')
        if status in ['get_all','get_disabled','get_enabled']:
            ret_dict=salt.client.LocalClient().cmd(id,cmd,expr_form='list',timeout=30) 
        if status in ['available','disable','disabled','enable','enabled','start','stop','restart','reload','status']:
            for k in ['servicename']:
                if k not in request.POST:
                    data='give arg "{0}" a value'.format(k)
                    return HttpResponse(data,mimetype='application/json')
            servicename=request.POST['servicename']
            ret=salt.client.LocalClient().cmd(id,cmd,[servicename],expr_form='list',timeout=300)
            ret_dict={}
            for k in ret.keys():
                is_true=ret[k]
                msg='service name: {0},action: {1},result:  '.format(servicename,status)
                if is_true:
                    s1={'id':k,'status':'1','msg':msg+'ok'}
                    ret_dict.update(s1)
                else:
                    s2={'id':k,'status':'0','msg':msg+'not ok'}
                    ret_dict.update(s2)
        result.update(ret_dict)
        data=json.dumps(result,sort_keys=True,indent=4,separators=(',',':'))
        return HttpResponse(data,mimetype='application/json')
    else:
        return HttpResponse('method is not allowed',mimetype='application/json')


   在浏览器里面执行写好的应用,我这里的地址如下,如图演示的是在火狐浏览器,用插件rest client模拟html提交数据,当然正式的环境是需要给用户一个html页面的交互操作,再者,上面的例子是没有考虑到用户认证和安全等因素的。

   开始模拟测试了

saltstack二次开发构建自己的api_第2张图片

换其他参数

saltstack二次开发构建自己的api_第3张图片

执行命令里面返回了结果,一个类restful api接口。


以上只是抛砖引玉的一段实现代码,希望对大家有所帮助,更详细的内容就不写了。

大家可以多研究下官方文档,去实现更多功能。

好了,本文已经结束。