saltstack官方有个web ui 叫 halite 一个在页面执行管理的ui。后端用的是saltstack api
补充saltstack api的相关文档:
http://rfyiamcool.blog.51cto.com/1030776/1345518
前段时间我一直在自己写ui,用flask和metro 。 项目也放一边了,懒得动弹了 。 今个看到官网的ui的工具,虽然功能都很不全,但是基本的执行,状态查看还是有的。
我们先把halite给搭建出来,然后我们在上面做一些功能上的开发。。。。
这是地址哈:
https://github.com/saltstack/halite
先上图~
源地址:http://rfyiamcool.blog.51cto.com/1030776/1275443
官网是有教程的,但是能按照这个教程做出来的都是神人。。。
总结,有问题。
我把官方的配置文档修改下,贴出来
1 克隆地址,你懂的:
1
|
git clone https:
//github.com/saltstack/halite
|
2 生成index.html文件:
1
2
|
cd halite/halite
./genindex.py -C
|
3 安装salt-api
看这个安装
https://github.com/saltstack/salt-api
或者你直接yum install salt-api
4 配置master文件
我们配置salt的master文件,有访问的ip和端口,以及路径。
1
2
3
4
5
6
7
8
9
10
|
rest_cherrypy:
host:
0.0
.
0.0
port:
8080
debug:
true
static
: /ui/halite/halite
app: /ui/halite/halite/index.html
external_auth:
pam:
admin:
-
'*'
|
5 跑起来!
增加一个 rui 的系统账号和密码。
然后 salt-api 跑起来~~~ 浏览器就可以访问了~
halite 可以跑了~ saltstack halite 是基于cherrypy web框架开发的ui。既然是cherrypy写的,那咱们就要学这个框架。
我用cherrypy简单写了个常用的demo 感觉他的用法挺稀奇的,是默认CherryPy将URI映射到Python可调用对象(Python callable)。当然 CherryPy 还提供其他分派机制。
先来一个hello的demo ~
1
2
3
4
5
6
|
import
cherrypy
class
HelloWorld:
def index(self):
return
"Hello world!"
index.exposed = True
cherrypy.quickstart(HelloWorld())
|
结果是:
一个套嵌的
1
2
3
4
5
6
7
8
9
10
11
12
|
import
cherrypy
class
OnePage(object):
def index(self):
return
"one page!"
index.exposed = True
class
HelloWorld(object):
onepage = OnePage()
def index(self):
return
"hello world"
index.exposed = True
root = HelloWorld()
cherrypy.quickstart(root)
|
结果:
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
|
#coding:utf-
8
import
cherrypy
import
os,sys
#curl http:
//localhost:8080 or /index
class
HelloWorld:
def index(self):
return
"Hello world!"
index.exposed = True
root = HelloWorld()
''
'
def foo():
return
'Foo!'
foo.exposed = True
root.foo = foo
''
'
''
'
dir 是路由地址
''
'
#curl http:
//localhost:8080/dir
def dir():
return
'%s'
%os.popen(
'dir'
).read()
dir.exposed = True
root.dir = dir
def foo(year, month, day):
return
'\n\n第一个:%s \n第二个: %s \n第三个: %s\n\n'
%(year, month, day)
foo.exposed = True
root.foo = foo
#@cherrypy.expose
def xiaorui(form):
#
return
'{}{}'
.format(form[
'username'
], form[
'password'
])
return
'%s %s'
%(form[
'username'
],form[
'password'
])
xiaorui.exposed = True
root.xiaorui = xiaorui
''
'
conf = {
'global'
: {
'server.socket_host'
:
'0.0.0.0'
,
'server.socket_port'
:
1970
,
'tools.encode.on'
:True,
'tools.encode.encoding'
:
'utf8'
,
},
}
''
'
#cherrypy.quickstart(root,
'/'
,conf)
cherrypy.quickstart(root)
|
我测试接口用的demo ~
文件上传的demo ~
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
|
import
os
localDir = os.path.dirname(__file__)
absDir = os.path.join(os.getcwd(), localDir)
import
cherrypy
class
FileDemo(object):
def index(self):
return
""
"
<html><body>
<h2>Upload a file</h2>
<form action=
"upload"
method=
"post"
enctype=
"multipart/form-data"
>
filename: <input type=
"file"
name=
"myFile"
/><br />
<input type=
"submit"
/>
</form>
<h2>Download a file</h2>
<a href=
'download'
>This one</a>
</body></html>
""
"
index.exposed = True
def upload(self, myFile):
out =
""
"<html>
<body>
myFile length: %s<br />
myFile filename: %s<br />
myFile mime-type: %s
</body>
</html>
""
"
size =
0
while
True:
data = myFile.file.read(
8192
)
if
not data:
break
size += len(data)
return
out % (size, myFile.filename, myFile.content_type)
upload.exposed = True
tutconf = os.path.join(os.path.dirname(__file__),
'tutorial.conf'
)
if
__name__ ==
'__main__'
:
cherrypy.quickstart(FileDemo())
else
:
cherrypy.tree.mount(FileDemo(), config=tutconf)
|
源地址:http://rfyiamcool.blog.51cto.com/1030776/1275443
我用lynx访问的~
1
2
|
yum -y install lynx
lynx
127.0
.
0.1
:
8080
|
halite很多的东西是用angularjs来渲染的,页面太复杂了。。。。
官方也没有写好文档,及开发的日志。。。
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<div
class
=
"row-fluid"
>
<div
class
=
"span12"
>
<a href=
"checkacceptkey"
class
=
"btn btn-primary"
>已经认证的key </a>
<a href=
"acceptkey"
class
=
"btn btn-success"
>执行全部认证</a>
<br/><br/>
<div
class
=
'well'
id=
'jieguo'
>
</div>
<br/><br/>
<form action=
"rmkey"
method=
'post'
>
<input type=
"text"
class
=
"input-medium search-query"
>
<button type=
"submit"
class
=
"btn btn-danger"
>删除认证</button>
</form>
</div>
</div><!-- /row-fluid -->
|
源地址: http://rfyiamcool.blog.51cto.com/1030776/1275443
现在前端偶了,我居然找不到他给js框架提供的CRUD接口。。。。
坑爹呀。。。。 继续找
官方既然用js的框架,那我也就用这个框架。。。
本文转自 rfyiamcool 51CTO博客,原文链接:http://blog.51cto.com/rfyiamcool/1275443,如需转载请自行联系原作者