最近和同事在搞一个nginx的配置api接口,项目用tornado redis yaml来实现,我这里就简单分享下关于nginx配置api实现。以前看过我以前的博文,应该会发现,我主张的是配置的渲染,用模板去定制舒展,而不是用正则去匹配然后做一些修正。
#coding:utf-8 #xiaorui.cc import tornado.httpserver import yaml import tornado.gredis import tornado.ioloop import tornado.web import redis import gevent from gevent.queue import Queue, Empty from gevent.pool import Group from gevent import getcurrent from gevent.coros import BoundedSemaphore # define one "add" 在模板传递两个数,他会自己做运算,这个和jinja2的filter很像 def add(x, y): return (x+y) class MainHandler(tornado.web.RequestHandler): def get(self): print self.get_argument('nginxid') f=open('%s.yaml'%self.get_argument('nginxid')) ldata=yaml.load(f) f.close() print ldata items = ["item1","item2","item3"] # 可以直接传递list和字典 self.render("templates/nginx.upstream", items=items, add=add,ldata=ldata) application = tornado.web.Application([ (r"/nginxupstream", MainHandler), ]) if __name__ == "__main__": http_server = tornado.httpserver.HTTPServer(application) http_server.listen(8889) tornado.ioloop.IOLoop.instance().start()
后端的模板程序
upstream {{ ldata['upstream_name'] }} { {{ ldata['upstream_mode'] }}; {% for i in ldata['upstream_rs'] %} {% if i['server_info']['kp'] %}keepalive {{ i['server_info']['kp'] }};{% end %} {% for a in i['server_info']['rs'] %} server {{ a['real_server']['ip'] }} {{ a['real_server']['port'] }}; {% end %} {% end %} }
通过tornado的api 去做get请求,返回的不同主机的 nginx upstream的操作块配置。
Hello,更多的tornado和运维开发的资料,请移步到 blog.xiaorui.cc
这里是服务器端的日志打印情况。可以看到yaml loads之后,他就是一个很大的json串 。
已经把很多服务器nginx的upstream集群池配置导入到了yaml配置里面。python提供了好用的模块,可以舒服的针对yaml增删改查。
咱们来看看nginx的yaml的格式,配置。 你自己可以做更多的扩展,比如在upstream里面的backup,max_fails,fail_timeout等参数。
这样的方式下发配置,在我多方面的实战下,还是靠谱的。 最少我已经把lvs、nginx的配置应用进去了,只要做好数据的校验,别关顾着reload,结果傻x了。
其他的想法,这个方法可以用在saltstack上面的,看到我写的关于salt lvs的文章,大家会有思路的。不想用yaml的话,可以换成mongodb做落地。
import tornado.httpserverimport yamlimport tornado.gredisimport tornado.ioloopimport tornado.webimport redisimport geventfrom gevent.queue import Queue, Emptyfrom gevent.pool import Groupfrom gevent import getcurrentfrom gevent.coros import BoundedSemaphore这些gevent的引入没用吧?
这个例子下,这些是没用的。