博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
saltstack二次开发构建自己的api
阅读量:6935 次
发布时间:2019-06-27

本文共 3514 字,大约阅读时间需要 11 分钟。

看看salt能干什么呢

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

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

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

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

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

   views.py的内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# 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 
in 
[
'id'
,
'status'
]:
            
if 
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 
in 
[
'servicename'
]:
                
if 
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 
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接口。

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

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

好了,本文已经结束。

本文转自it你好 51CTO博客,原文链接:http://blog.51cto.com/itnihao/1336699,如需转载请自行联系原作者

你可能感兴趣的文章
自动监控linux服务器负载并重启Web服务的脚本
查看>>
四、Windows Server 2012R2 Hyper-v虚拟交换机的创建与管理
查看>>
java 运算顺序
查看>>
天涯LVS部署
查看>>
eclipse不能自动编译工程的解决方法
查看>>
最好用的cisco路由模拟器 debianIOL
查看>>
Shpinx在PHPCMS里的使用及配置
查看>>
Linux Oracle Rac 10G 搭建& Patch
查看>>
django models.py模块的外部引用
查看>>
VMware虚拟化技术培训(8) 虚拟机管理之二
查看>>
spring内部各模块jar包依赖
查看>>
Apache与Nginx网络模型对比
查看>>
Java 二重循环实现对象去重
查看>>
Supporting Python 3(支持python3)——序
查看>>
从零开始-打造自己的虚拟实验室-2
查看>>
js 完美兼容浏览器的复制功能
查看>>
jdk1.6下使用sardine和jackrabbit-webdav的问题
查看>>
[Unity3d]socket通信 切换到web版本时报错SecurityException解决办法
查看>>
[Unity3D插件]2dtoolkit系列二 动画精灵的创建以及背景图的无限滚动
查看>>
谈谈spring中bean的名字
查看>>