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  克隆地址,你懂的:


git clone https://github.com/saltstack/halite


2  生成index.html文件:


cd halite/halite
./genindex.py -C


3   安装salt-api

看这个安装

https://github.com/saltstack/salt-api

或者你直接yum install salt-api


4     配置master文件

我们配置salt的master文件,有访问的ip和端口,以及路径。

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 ~


import cherrypy
class HelloWorld:
    def index(self):
        return "Hello world!"
    index.exposed = True
cherrypy.quickstart(HelloWorld())


结果是:

162344941.jpg


一个套嵌的

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


#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 ~


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访问的~

yum -y install lynx
lynx 127.0.0.1:8080


084104340.jpg

084104255.jpg


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

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

090942183.jpg

代码如下:

<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的框架,那我也就用这个框架。。。