tornado+ansible+twisted+mongodb运维自动化系统开发(二)

源码:

#!/usr/bin/env python
#coding:utf-8
import os.path
import tornado.locale
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
from tornado.options import define, options
import pymongo

define("port", default=8000, help="run on the given port", type=int)

class Application(tornado.web.Application):
    def __init__(self):
        #初始化一些东西
        handlers = [
            #url匹配
            (r"/", MainHandler),
            (r"/index.html", MainHandler),
            (r"/add.html", AddHandler),
            (r"/listhost.html",List_hostHandler),
            (r"/delete.html", delete_hostHandler),
            (r"/module_action.html", Module_actionHandler),

        ]
        settings = dict(
            #程序设置,字典形式
            template_path=os.path.join(os.path.dirname(__file__), "templates"),
            #设置模板文件路径
            static_path=os.path.join(os.path.dirname(__file__), "static"),
            #设置静态文件路径,如css\jpg\gif等
            # ui_modules={"Book": BookModule},
            #设置ui模块,可以用字典添加多个
            debug=True,
        )
        conn = pymongo.Connection("localhost", 27017)
        #初始化数据库连接
        self.db = conn["waitfish"]
        #选择mongodb集合
        tornado.web.Application.__init__(self, handlers, **settings)
        #传入设置配置

class MainHandler(tornado.web.RequestHandler):
    #主页函数方法
    def get(self):
        #设置httpget方法函数
        self.render(
            "index.html",
        )


class AddHandler(tornado.web.RequestHandler):
    #添加主机页面
    def get(self):
        self.render(
            "add.html",
        )




class List_hostHandler(tornado.web.RequestHandler):
    #主机列表页面,get方式现实全部主机
    def get(self, *args, **kwargs):
        coll = self.application.db.waitfish
        hosts = coll.find()
        self.render(
            "listhost.html",
            hosts = hosts
        )

    def post(self):
        #post方法现实post的主机
        coll = self.application.db.waitfish
        #初始化数据库连接
        hostname = self.get_argument('hostname')
        #从post中获取主机名
        ipadd = self.get_argument('ipadd')
        #获取主机ip地址
        username = self.get_argument('username')
        #获取主机用户名
        password = self.get_argument('password')
        #获取密码
        post_dic = {'hostname':hostname, 'ipadd':ipadd, 'username':username, 'password':password}
        #生成要存入数据库的内容
        hosts = coll.find({'hostname':hostname})
        #根据主机名判断是否已经存在该主机
        if hosts:
            #如果不存在
            import ansible.runner
            #对主机进行初始化,复制公钥到受管主机,(添加ip地址和主机名对到本机的hosts文件和ansible的hosts文件)
            runner_copy_autherized_keys = ansible.runner.Runner(
                    module_name = 'copy',
                    module_args = "src=~/.ssh/id_rsa.pub  dest=~/.ssh/authorized_keys owner=%s group=%s mode=644 backup=yes" %(username, username),
                    remote_user = username,
                    remote_pass = password,
                    sudo = 'yes',
                    sudo_pass =password,
                    pattern = hostname,
            )
            b = runner_copy_autherized_keys.run()
            print b

            runner = ansible.runner.Runner(
                module_name = 'shell',
                module_args = "echo '%s' >>/etc/ansible/hosts"% ipadd,
                sudo = 'yes',
                sudo_pass = 'xxxxxxx',
                transport = 'local',
                pattern = '127.0.0.1',
            )
            #异步执行该操作,防止web页面被卡住
            runner.run_async(30)
            coll.save(post_dic)
            #保存主机信息到数据库
            self.render(
            "listhost.html",
            #调用主机列表模板显示被添加的主机信息
            hosts = hosts,
        )
        else:
            #如果存在,则更新主机信息
            coll.update(post_dic,post_dic)
            self.render(
            # "listhost.html",
            # hosts = hosts,
        )


class delete_hostHandler(tornado.web.RequestHandler):
    #定义删除主机的函数
    def post(self, *args, **kwargs):
        hostnames = self.get_arguments('hostname')
        # 根据checkbox得到hostname的列表
        coll = self.application.db.waitfish
        #获得数据库游标
        for host in hostnames:
            coll.remove({"hostname":host})
            #根据主机名删除
        self.render(
            "delete_info.html",
            message = "%s is removed!"% hostnames,
            #给出消息
        )


class Module_actionHandler(tornado.web.RequestHandler):
    #定义模块操作函数方法
    def get(self, *args, **kwargs):
        coll = self.application.db.waitfish
        #初始化数据库连接
        hosts = coll.find({}, {'hostname':1,'ipadd':1,"_id":0})
        #这里hostname:1 表示返回hostname列,由于_id列每次都返回所以用0禁用掉,模板还可以一样
        modulenames = ['ping', 'setup', 'copy','shell']
        #现实我们定义的操作
        self.render(
            "module_action.html",
            hosts = hosts,
            modulenames = modulenames,
        )

    def post(self, *args, **kwargs):
        ipadd = self.get_arguments('ipadd')[0]
        #获取主机名
        module = self.get_arguments('modulename')[0]
        #获取模块名
        arg = self.get_arguments('args')[0]
        #获取参数
        coll = self.application.db.waitfish
        #初始化数据库
        user = coll.find_one({'ipadd':'%s'%ipadd})['username']
        hostname = coll.find_one({'ipadd':'%s'%ipadd})['hostname']
        #从数据库找到主机的用户名信息
        import ansible.runner
        runner = ansible.runner.Runner(
            #根据ansible的api来运行脚本
            module_name = module,
            module_args = arg,
            remote_user = user,
            #设定操作远程受管主机的用户名
            pattern = ipadd,
            #设定要操作主机名
        )
        result = runner.run()
        #得到返回结果,这里是同步执行,下个版本改进异步
        def pars_result(result):
            # 定义一个判断结果的函数
            if len(result['dark'])>0:
                # dark返回不为空则表示操作失败了
                return result['dark'],'失败!'
            else:
                return result['contacted'],'成功!'
        result = pars_result(result)
        self.render(
            "message.html",
            hostname = hostname,
            message = result[0],
            jieguo = result[1]
        )

if __name__ == "__main__":
    tornado.options.parse_command_line()
    http_server = tornado.httpserver.HTTPServer(Application())
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。