首先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能干什么呢
也就是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页面的交互操作,再者,上面的例子是没有考虑到用户认证和安全等因素的。
开始模拟测试了
换其他参数
执行命令里面返回了结果,一个类restful api接口。
以上只是抛砖引玉的一段实现代码,希望对大家有所帮助,更详细的内容就不写了。
大家可以多研究下官方文档,去实现更多功能。
好了,本文已经结束。