设为首页 收藏本站
查看: 1312|回复: 0

[经验分享] tornado+ansible+twisted+mongodb运维自动化系统开发(二)

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-7-25 09:28:42 | 显示全部楼层 |阅读模式
源码:

    #!/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()  


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-22670-1-1.html 上篇帖子: tornado+ansible+twisted+mongodb运维自动化系统开发(一) 下篇帖子: MongoDB:数据模型介绍
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表