vieyahn2017 / iBlog

44 stars 0 forks source link

3.27 使用tornado模板引擎配合yaml构建nginx配置接口 [扩展saltstack] #353

Closed vieyahn2017 closed 4 years ago

vieyahn2017 commented 4 years ago

使用tornado模板引擎配合yaml构建nginx配置接口 [扩展saltstack]

https://blog.51cto.com/rfyiamcool/1393371 https://blog.csdn.net/weixin_33694172/article/details/90072113

vieyahn2017 commented 4 years ago

最近同事们在搞一个nginx的配置下发接口,项目用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()
vieyahn2017 commented 4 years ago

后端的模板程序:

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 %}
}
vieyahn2017 commented 4 years ago

通过tornado的api 去做get请求,返回的不同主机的 nginx upstream的操作块配置。

wKioL1NGCluzKqofAADTHgA0_OI044.jpg

wKiom1NGCq-Rv1X3AAFY2Phmyug187.jpg

这里是服务器端的日志打印情况。可以看到yaml loads之后,他就是一个很大的json串 。

wKiom1NGCsHjAjlXAAdtnBJuOOY594.jpg

已经把很多服务器nginx的upstream集群池配置导入到了yaml配置里面。python提供了好用的模块,可以舒服的针对yaml增删改查。

wKioL1NGCrKhtMq1AASc4RjEbg8031.jpg

咱们来看看nginx的yaml的格式,配置。 你自己可以做更多的扩展,比如在upstream里面的backup,max_fails,fail_timeout等参数。

wKioL1NGC9uCbWqWAANjBswesOc789.jpg

原文:http://rfyiamcool.blog.51cto.com/1030776/1393371

这样的方式下发配置,还是很靠谱的,最少我已经把lvs、nginx的配置应用进去了。

其他的想法,这个方法可以用在saltstack上面的,看到我写的关于salt lvs的文章,大家会有思路的。不想用yaml的话,可以换成mongodb做。对于平台来说,mongodb更方便的。

vieyahn2017 commented 4 years ago

问,nginx.conf默认是自定义的模式,也支持yaml了?

看来是别的运行程序,使用yaml去安装部署nginx,比如搜到

【一看必会系列:kubernetes使用yaml部署nginx集群 — CCIE那点事】