Python批量更新nginx配置文件51CTO博客 - 凯时娱乐

Python批量更新nginx配置文件51CTO博客

2019-01-03 14:04:55 | 作者: 昂然 | 标签: 文件,装备,增加 | 浏览: 1749

   工作需求查看线上一切服务器ngxin的host装备,是否都增加制止拜访目录中带/.svn/和以tar.gz、tar、zip、等结束url,假如没有则增加,由于线上Nginx服务器将近百台,每台的nginx装备至少10几个,手艺查看太慢了,自己也不想糟蹋太多时刻做这些无用功。故用python写了一个检测脚本。来完结这些无聊工作。

    想用python完结这些工作,思路大约为:先备份每台服务器本来的装备,然后遍历每台服务器内一切host装备,正则匹配host装备看是否现已增加相关装备,如有则越过,遇到有但不全或没有的则在对应的方位上刺进相应的装备。除文本刺进时我遇到一个问题外,其他比较简单。由于python现在没有对文本进行刺进操作的模块。整个刺进进程需求自己一步一步完结。

    其时我考虑文本刺进思路:把原装备文件载入内存,正则找到要刺进的方位,以此中心把原文件分红两部分,拓荒新内存空间按次序先寄存第一部内容,然后寄存出刺进的内容,然后寄存第二部内容。最终flush到硬盘。即浅显说法把原装备依据正则进行重定向。

    我了解完结这种重定向有两个办法,第一种: 翻开原文件,依据规矩重定向到新建的文件上。第二种:运用fileinput对原文件重定向。

    下面是代码,完结进程大约为:先判别目录nginx装备目录,假如存在则备份,然后遍历一切装备文件,匹配每个装备文件是否已增加相关内容,假如没有增加或许之前增加了部分内容,找到装备文件第一个花括号“}”,下一行刺进相应的内容。

#!/usr/bin/python
#coding:utf-8
#Author by Qfeian@20140215
"""
First backup file and then update all nginx configure
in the path "/usr/local/nginx/conf/vhosts".
Insert rule is to find the configure of the first "}"
after inserting content
"""
import fileinput
import os
import re
import sys
import string
import time
from subprocess import call
s_all = """
    location ~* ^(.*)\/\.svn\/ {
                deny all;
        }
        location ~* \.(tar|gz|zip|tgz|sh)$ {
                deny all;
        }
"""
s_svn = """
    location ~* ^(.*)\/\.svn\/ {
                deny all;
        }
"""
s_tar = """
        location ~* \.(tar|gz|zip|tgz|sh)$ {
                deny all;
        }
"""
def file_insert(fname, str):
        r = ur}
        f = open(fname)
        old = f.read()
        num = int(re.search(r, old).start())
        f_input = fileinput.input(fname, inplace=1)
        #for line in fileinput.input(fname, inplace=1):
        for line in f_input:
            if r in line:
                print line.rstrip()
                print "\n"+str+"\n"
                f.seek(num+2)
                print f.read()
                break
            else:
                print line.rstrip()
        f.close()
        f_input.close()
        #print "OK! The %s configure has been sucessfull added!" % fname
        print "Ok! 装备文件%s现已增加成功!" % fname
def file_list(f_dir):
    #Check the content of configure,and add the correcsponding content
    rsvn = ur\\\/\\.svn\\\/
    rtar = ur\(tar\|gz\|zip\|tgz\|sh\)
    if os.path.exists(f_dir): #check dir
        for f_name in os.listdir(f_dir): #list the dir all configure file
           f_path = os.path.join(f_dir,f_name) #Get the filename full path
           f1 = open(f_path)
           f1_old = f1.read()
           f1.close()
           if re.findall(rsvn, f1_old) and re.findall(rtar, f1_old):
               #print "Notice!  %s have been added ,ignore this configure ...." % f_path
               print "Notice! %s 已增加过相关的装备,疏忽此装备文件" % f_path
               continue
           elif re.findall(rsvn, f1_old):
               file_insert(f_path, s_tar)
           elif re.findall(rtar, f1_old):
               file_insert(f_path, s_svn)
           else:
               file_insert(f_path, s_all)
    else:
        print "Warnning! dir %s isnt exists!" % f_dir
def file_backup(f_dir):
    # If the file has been backed up with a minute before,will not back up
    bak_dir = "/data/nginx_config_bak/" + time.strftime(%Y%m%d_%H_%M)
    if not os.path.exists(bak_dir):
        os.makedirs(bak_dir)
        if os.path.exists(f_dir):
            cp = "cp -rp"
            cmd = "%s %s %s" % (cp, f_dir, bak_dir)
            call(cmd, shell=True) #backup the configure
if __name__ == "__main__":
    f_dir = "/usr/local/nginx/conf/vhosts"
    file_backup(f_dir)
    file_list(f_dir)
    print "-"*90,"\n一切Nginx装备文件更新完结!\n"



参阅:

http://ryanstd.iteye.com/blog/480781

http://docs.python.org/2/library/fileinput.html


版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表凯时娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章