在线修改ha.proxy配置文件

简介:

最近在学习Python的过程中老师布置的作业在线修改haproxy配置文件,写了好久终于有点思路,这里将代码记录如下:

#!/usr/bin/env python

# -*- coding:utf8 -*-

import os

import json


def fetch(backend):

fetch_list = []

with open('ha') as obj:

flag = False

for line in obj:

# line 每一行,

if line.strip() == "backend %s" % backend:

flag = True

continue

# 判断,如果当前是 backend开头,不再放

if flag and line.strip().startswith('backend'):

break

if flag and line.strip():

fetch_list.append(line.strip())

return fetch_list


#result = fetch("buy.oldboy.org")

#print result

def adds(dict_info):

    #s = '{"backend": "www.oldboy.org","record":{"server": "100.1.7.9","weight": 20,"maxconn": 30}}'

backend_title = dict_info.get('backend')

current_title = "backend %s" % backend_title

current_record = "server %s %s weight %s maxconn %s" % (dict_info['record']['server'],dict_info['record']['server'],dict_info['record']['weight'],dict_info['record']['maxconn'])

# 获取制定backend下的所有记录

fetch_list = fetch(backend_title)

        #print fetch_list

# backend是否存在

if fetch_list:

#pass # 存在backend,则只需再添加记录

# 1,要插入的记录,存在

# 2,要插入的记录,不存在

if current_record in fetch_list:

pass

else:

             fetch_list.append(current_record)#如果不存在直接将current_record追加到fetch_list中

# 此时fetch_list为处理完的新列表

with open('ha') as read_obj, open('ha.new', 'w') as write_obj:

flag = False

has_write = False

for line in read_obj:#读取原配置文件

if line.strip() == current_title:#如果读取的行内容与current_title相等,则把current_title写入到文件中,然后就跳出本次循环,

write_obj.write(line)

flag = True

continue

if flag and line.strip().startswith('backend'):#如果flag为真并且读取的line.strip内容是以"backend开头",则将flag置False

flag = False

if flag:

#如果flag为True新列表fetch_list所有数据一行一行的写入到新配置文件,即遍历原配置文件中current_title标签下的current_record记录,如果curent_record有三条,则循环三次,每循环一次就将fetch_list完整遍历一次的一条一条地写入到新配置文件,所以这里要用一个标识符has_write作为判断是否写入,如果已经写入了就不再继续往新配置文件中写入

if not has_write:

    for new_line  in fetch_list:

        temp = "%s %s \n" %(" "*8, new_line)

  write_obj.write(temp)

has_write = True

else:

# 不满足以上的各种情况则直接将内容写入新配置文件

write_obj.write(line)

else:

#pass,如果不存在backend,则添加backend和current_record

# current_title,current_record

# 直接打开文件

with open('ha') as read_obj, open('ha.new', 'w') as write_obj:

for line in read_obj:

write_obj.write(line)

write_obj.write('\n')

write_obj.write(current_title+'\n')

temp = "%s %s \n" %(" "*8, current_record)

write_obj.write(temp)



#s = '{"backend": "test.oldboy.org","record":{"server": "10.10.10.9","weight": 20,"maxconn": 3000}}'

#data_dict = json.loads(s)

#adds(data_dict)


def remove(dict_info):

    backend_title = dict_info.get('backend')

    current_title = "backend %s" % backend_title

    current_record = "server %s %s weight %s maxconn %s" % (dict_info['record']['server'],dict_info['record']['server'],dict_info['record']['weight'],dict_info['record']['maxconn'])

    # 获取制定backend下的所有记录

    fetch_list = fetch(backend_title)

    if fetch_list:

       pass

    else:

         if current_record not in fetch_list:

            pass

         else:

            fetch_list[fetch_list.index(current_record)]

            if len(fetch_list) > 0:

                fetch_list.insert(0, backend_title)

         with open('ha') as read_file, open('ha.new', 'w') as write_file:

            flag = False

            has_write = False

            for line in read_file:

                line_strip = line.strip()

                if line_strip == backend_title:

                    flag = True

                    continue

                if flag and line_strip.startswith('backend'):

                    flag = False

                if not flag:

                    write_file.write(line)

                else:

                    if not has_write:

                        for i in fetch_list:

                            if i.startswith('backend'):

                                write_file.write(i+'\n')

                            else:

                                write_file.write("%s%s\n" % (8*" ", i))

                    has_write = True

       

       

os.rename("ha", 'ha.bak')

os.rename("ha.new", 'ha')

       



if  __name__ == '__main__':

    

    print '1、获取;2、添加;3、删除'

    num = raw_input('请输入序号:')

    data = raw_input('请输入内容:')

    if num == '1':

        fetch(data)

    else:

        dict_data = json.loads(data)

        if num == '2':

            add(dict_data)

        elif num == '3':

            remove(dict_data)

        else:

            pass




      本文转自027ryan  51CTO博客,原文链接:http://blog.51cto.com/ucode/1727039,如需转载请自行联系原作者



相关文章
|
23天前
|
NoSQL 安全 Redis
深入了解Redis:配置文件、动态修改和安全设置
深入了解Redis:配置文件、动态修改和安全设置
|
6月前
|
前端开发 Cloud Native 应用服务中间件
深入解析 Nginx 代理配置:从 server 块到上游服务器的全面指南
深入解析 Nginx 代理配置:从 server 块到上游服务器的全面指南
305 0
|
分布式计算 Java Hadoop
集群搭建:配置文件修改&启动|学习笔记
快速学习集群搭建:配置文件修改&启动
89 0
集群搭建:配置文件修改&启动|学习笔记
|
分布式计算 资源调度 Hadoop
Hadoop运行模式(二)、SSH无密登录配置、生成公钥和私钥、集群配置、集群部署规划、默认配置文件、核心配置文件、HDFS配置文件、YARN配置文件、MapReduce配置文件、在集群上分发配置好的
ssh文件夹下(~/.ssh)的文件功能解释、ssh连接时出现Host key verification failed的解决方法、免密登录原理、将公钥拷贝到要免密登录的目标机器上、NameNode和SecondaryNameNode不要安装在同一台服务器、ResourceManager也很消耗内存,不要和NameNode、SecondaryNameNode配置在同一台机器上、Hadoop配置文件分两类:默认配置文件和自定义配置文件,只有用户想修改某一默认配置值时,才需要修改自定义配置文件,更改相应属性值、.
380 1
Hadoop运行模式(二)、SSH无密登录配置、生成公钥和私钥、集群配置、集群部署规划、默认配置文件、核心配置文件、HDFS配置文件、YARN配置文件、MapReduce配置文件、在集群上分发配置好的
|
监控 负载均衡 网络协议
|
XML 前端开发 JavaScript
nginx.conf 主配置文件信息
nginx.conf 主文件引用子站点参考:https://developer.aliyun.com/article/779676?spm=a2c6h.13262185.0.0.7ec9d850xw8y5S
208 0
基于自定义配置文件初始化ElasticSearch客户端方法介绍
基于自定义配置文件初始化ElasticSearch客户端方法介绍 bboss es booter初始化的时候会按顺序扫描默认加载以下3个配置文件: conf/elasticsearch.properties,application.
1754 0