关于Saltstack halite 配置管理及二次开发ui [原salt-ui]

简介:

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



先上图~


155857289.jpg


源地址:http://rfyiamcool.blog.51cto.com/1030776/1275443



155857262.jpg



官网是有教程的,但是能按照这个教程做出来的都是神人。。。

总结,有问题

我把官方的配置文档修改下,贴出来


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:
          '*'


160742291.jpg


5 跑起来!

增加一个 rui 的系统账号和密码。

然后   salt-api 跑起来~~~   浏览器就可以访问了~


161745469.jpg


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())


结果是:

162344941.jpg


一个套嵌的

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)


结果:

162543840.jpg


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 ~

162802181.jpg


文件上传的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


084104230.jpg

我用lynx访问的~

1
2
yum -y install lynx
lynx  127.0 . 0.1 : 8080


084104340.jpg

084104255.jpg


halite很多的东西是用angularjs来渲染的,页面太复杂了。。。。

官方也没有写好文档,及开发的日志。。。

090942183.jpg

代码如下:

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,如需转载请自行联系原作者


相关文章
|
应用服务中间件 Apache nginx
|
应用服务中间件 nginx Python