关闭

Python学习day3作业-HAproxy配置文件操作

标签: python
782人阅读 评论(0) 收藏 举报
分类:

Python days3作业-HAproxy配置文件操作

作业需求
HAproxy配置文件操作
1. 根据用户输入,输出对应的backend下的server信息
2. 可添加backend 和sever信息
3. 可修改backend 和sever信息
4. 可删除backend 和sever信息
5. 操作配置文件前进行备份
6. 添加server信息时,如果ip已经存在则修改;如果backend不存在则创建;若信息与已有信息重复则不操作

  • [x] 博客
  • [x] 查询backend下的server信息
  • [x] 添加backend和server信息
  • [ ] 修改backend 和sever信息
  • [x] 删除backend和server信息

博客地址

ygqygq2的博客地址

基本流程图

基本流程图

程序代码

#!/usr/bin/env python
# _*_coding:utf-8_*_
'''
 * Created on 2016/11/7 21:24.
 * @author: Chinge_Yang.
'''

import shutil
import json


def list_function():
    print("Please choice the ID of a action.".center(50, "#"))
    print("【1】.Fetch haproxy.cfg backend infomation.")
    print("【2】.Add haproxy.cfg backend infomation.")
    print("【3】.Delete haproxy.cfg backend infomation.")
    print("End".center(50, "#"))


def fetch(backend):
    # 取出backend相关server信息
    result = []  # 定义结果列表
    with open("haproxy.cfg", "r", encoding="utf-8") as f:  # 循环读取文件
        flag = False  # 标记为假
        for line in f:
            # 以backend开头
            line = line.strip()
            if line.startswith("backend") and line == "backend " + backend:
                flag = True  # 读取到backend开头的信息,标记为真
                continue
            # 下一个backend开头
            if flag and line.strip().startswith("backend"):
                flag = False
                break
            # server信息添加到result列表
            if flag and line.strip():
                result.append(line.strip())
    return result


def writer(backend, record_list):
    with open("haproxy.cfg", "r") as old, open("new.cfg", "w") as new:
        flag = False
        for line in old:
            if line.strip().startswith('backend') and line.strip() == "backend " + backend:
                flag = True
                new.write(line)
                for new_line in record_list:
                    new.write(" " * 4 + new_line + "\n")
                continue  # 跳到下一次循环,避免下一个backend写二次

            if flag and line.strip().startswith("backend"):  # 下一个backend
                flag = False
                new.write(line)
                continue  # 退出此循环,避免server信息二次写入
            if line.strip() and not flag:
                new.write(line)


def add(backend, record):
    global change_flag
    record_list = fetch(backend)  # 查找是否存在记录
    if not record_list:  # backend不存在, record不存在
        with open('haproxy.cfg', 'r') as old, open('new.cfg', 'w') as new:
            for line in old:
                new.write(line)
            # 添加新记录
            new.write("\nbackend " + backend + "\n")
            new.write(" " * 4 + record + "\n")
        print("\033[32;1mAdd done\033[0m")
        change_flag = True
    else:  # backend存在,record存在
        if record in record_list:
            print("\033[31;1mRecord already in it,Nothing to do!\033[0m")
            change_flag = False
        else:  # backend存在,record不存在
            record_list.append(record)
            writer(backend, record_list)
            print("\033[32;1mAdd done\033[0m")
            change_flag = True


def delete(backend, record):
    global change_flag
    record_list = fetch(backend)  # 查找是否存在记录
    if not record_list:  # backend不存在, record不存在
        print("Not match the backend,no need delete!".center(50, "#"))
        change_flag = False
    else:  # backend存在,record存在
        if record in record_list:
            record_list.remove(record)  # 移除元素
            writer(backend, record_list)  # 写入
            print("\033[31;1mDelete done\033[0m")
            change_flag = True
        else:  # backend存在,record不存在
            print("Only match backend,no need delete!".center(50, "#"))
            change_flag = False
    return change_flag


def output(servers):
    # 输出指定backend的server信息
    print("Match the server info:".center(50, "#"))
    for server in servers:
        print("\033[32;1m%s\033[0m" % server)
    print("#".center(50, "#"))


def input_json():
    # 判断输入,要求为json格式
    continue_flag = False
    while continue_flag is not True:
        backend_record = input("Input backend info(json):").strip()
        try:
            backend_record_dict = json.loads(backend_record)
        except Exception as e:
            print("\033[31;1mInput not a json data type!\033[0m")
            continue
        continue_flag = True
    return backend_record_dict


def operate(action):
    global change_flag
    if action == "fetch":
        backend_info = input("Input backend info:").strip()
        result = fetch(backend_info)  # 取出backend信息
        if result:
            output(result)  # 输出获取到的server信息
        else:
            print("\033[31;1mNot a match is found!\033[0m")
    elif action is None:
        print("\033[31;1mNothing to do!\033[0m")
    else:
        backend_record_dict = input_json()  # 要求输入json格式
        for key in backend_record_dict:
            backend = key
            record = backend_record_dict[key]
            if action == "add":
                add(backend, record)
            elif action == "delete":
                delete(backend, record)
        if change_flag is True:  # 文件有修改,才进行文件更新
            # 将操作结果生效
            shutil.copy("haproxy.cfg", "old.cfg")
            shutil.copy("new.cfg", "haproxy.cfg")
            result = fetch(backend)
            output(result)  # 输出获取到的server信息


def judge_input():
    # 判断输入功能编号,执行相应步骤
    input_info = input("Your input number:").strip()
    if input_info == "1":  # 查询指定backend记录
        action = "fetch"
    elif input_info == "2":  # 添加backend记录
        action = "add"
    elif input_info == "3":  # 删除backend记录
        action = "delete"
    elif input_info == "q" or input_info == "quit":
        exit("Bye,thanks!".center(50, "#"))
    else:
        print("\033[31;1mInput error!\033[0m")
        action = None
    return action


def main():
    exit_flag = False
    while exit_flag is not True:
        global change_flag
        change_flag = False
        list_function()
        action = judge_input()
        operate(action)


if __name__ == '__main__':
    main()

HAproxy配置文件操作

1.程序说明

实现功能如下

  • [x] 查询backend下的server信息
  • [x] 添加backend和server信息
  • [ ] 修改backend 和sever信息
  • [x] 删除backend和server信息

2.程序测试配置文件

cat haproxy.cfg

global
    log 127.0.0.1 local2
    daemon
    maxconn 256
    log 127.0.0.1 local2 info
defaults
    log global
    mode http
    timeout connect 5000ms
    timeout client 50000ms
    timeout server 50000ms
    option  dontlognull
listen stats :8888
    stats enable
    stats uri   /admin
    stats auth  admin:1234
frontend 51cto.com
    bind 0.0.0.0:80
    option httplog
    option httpclose
    option  forwardfor
    log global
    acl www hdr_reg(host) -i test01.example.com
    use_backend test01.example.com if www
backend test01.example.com
    server 100.1.7.10 100.1.7.10 weight 20 maxconn 3000
backend test.com
    server 100.1.7.90 100.1.7.90 weight 20 maxconn 3000
    server 100.1.7.66 100.1.7.66 weight 20 maxconn 3000
    server 100.1.7.27 100.1.7.27 weight 20 maxconn 3000
    server 100.1.7.13 100.1.7.13 weight 20 maxconn 3000

backend www.test.com
    server 100.1.7.13 100.1.7.13 weight 20 maxconn 3000

3.程序测试

python config_haproxy.py
执行结果:

########Please choice the ID of a action.#########1】.Fetch haproxy.cfg backend infomation.
【2】.Add haproxy.cfg backend infomation.
【3】.Delete haproxy.cfg backend infomation.
#######################End########################
Your input number:1
Input backend info:test.com
##############Match the server info:##############
server 100.1.7.90 100.1.7.90 weight 20 maxconn 3000
server 100.1.7.66 100.1.7.66 weight 20 maxconn 3000
server 100.1.7.27 100.1.7.27 weight 20 maxconn 3000
##################################################
########Please choice the ID of a action.#########1】.Fetch haproxy.cfg backend infomation.
【2】.Add haproxy.cfg backend infomation.
【3】.Delete haproxy.cfg backend infomation.
#######################End########################
Your input number:2
Input backend info(json):{"test.com":"testtest.com"}
Add done
##############Match the server info:##############
server 100.1.7.90 100.1.7.90 weight 20 maxconn 3000
server 100.1.7.66 100.1.7.66 weight 20 maxconn 3000
server 100.1.7.27 100.1.7.27 weight 20 maxconn 3000
testtest.com
##################################################
########Please choice the ID of a action.#########1】.Fetch haproxy.cfg backend infomation.
【2】.Add haproxy.cfg backend infomation.
【3】.Delete haproxy.cfg backend infomation.
#######################End########################
Your input number:1
Input backend info:test.com
##############Match the server info:##############
server 100.1.7.90 100.1.7.90 weight 20 maxconn 3000
server 100.1.7.66 100.1.7.66 weight 20 maxconn 3000
server 100.1.7.27 100.1.7.27 weight 20 maxconn 3000
testtest.com
##################################################
########Please choice the ID of a action.#########1】.Fetch haproxy.cfg backend infomation.
【2】.Add haproxy.cfg backend infomation.
【3】.Delete haproxy.cfg backend infomation.
#######################End########################
Your input number:3
Input backend info(json):{"test.com":"testtest.com"}
Delete done
##############Match the server info:##############
server 100.1.7.90 100.1.7.90 weight 20 maxconn 3000
server 100.1.7.66 100.1.7.66 weight 20 maxconn 3000
server 100.1.7.27 100.1.7.27 weight 20 maxconn 3000
##################################################
########Please choice the ID of a action.#########1】.Fetch haproxy.cfg backend infomation.
【2】.Add haproxy.cfg backend infomation.
【3】.Delete haproxy.cfg backend infomation.
#######################End########################
Your input number:4
Input error!
Nothing to do!
########Please choice the ID of a action.#########1】.Fetch haproxy.cfg backend infomation.
【2】.Add haproxy.cfg backend infomation.
【3】.Delete haproxy.cfg backend infomation.
#######################End########################
Your input number:3
Input backend info(json):d
Input not a json data type!
Input backend info(json):{"test01.example.com":"server 100.1.7.27 100.1.7.27 weight 20 maxconn 3000"}
########Only match backend,no need delete!########
########Please choice the ID of a action.#########1】.Fetch haproxy.cfg backend infomation.
【2】.Add haproxy.cfg backend infomation.
【3】.Delete haproxy.cfg backend infomation.
#######################End########################
Your input number:q
###################Bye,thanks!####################

Process finished with exit code 1
0
0
查看评论

python案例1---修改haproxy的配置文件

python案例1---修改haproxy的配置文件
  • wyqlxy
  • wyqlxy
  • 2016-07-14 10:28
  • 1614

用python修改haproxy配置文件

需求:     当用户输入域名的时候,显示出来下面的记录     当用户需要输入添加纪录的时候,添加到你需要的那个域名下面 # !/usr/bin/env python # -*- coding:utf-8 -*- def select(...
  • wo_renfanzi
  • wo_renfanzi
  • 2016-06-01 09:45
  • 522

python操作haproxy.cfg文件

需求1、查 输入:www.oldboy.org 获取当前backend下的所有记录 2、新建 输入: arg = { 'bakend': 'www.oldboy.org', ...
  • reblue520
  • reblue520
  • 2017-02-28 17:25
  • 303

Python文件操作学习总结

Python读写文件 1.open 使用open打开文件后一定要记得调用文件对象的close()方法。比如可以用try/finally语句来确保最后能关闭文件。 file_object = open('thefile.txt') try:   &#...
  • bcbobo21cn
  • bcbobo21cn
  • 2016-12-13 09:49
  • 996

HAproxy配置实例

一、HAproxy介绍 HAProxy是高性能的代理服务器,其可以提供7层和4层代理,具有healthcheck,负载均衡等多种特性,性能卓越,包括Twitter,Reddit,StackOverflow,GitHub在内的多家知名互联网公司在使用。 HAProxy有以下优点,总结如下:...
  • Lakers_KobeBryant
  • Lakers_KobeBryant
  • 2014-09-20 20:34
  • 5198

HAProxy详细配置过程

一、HAProxy安装 http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.22.tar.gz # tar xvzf haproxy-1.4.22.tar.gz # cd haproxy-1.4.22 # make TARGET=linux2...
  • shuyun123456789
  • shuyun123456789
  • 2016-12-05 21:50
  • 746

HAProxy简介及配置文件详解(一)

一 HAProxy简介    HAProxy提供高可用、负载均衡以及基于TCP和HTTP的应用代理,适合处理高负载站点的七层数据请求。类似的代理服务可以屏蔽内部真实服务器,防止内部服务器遭受攻击。    HAProxy特点和优点:    1...
  • HzSunshine
  • HzSunshine
  • 2017-03-12 23:01
  • 2384

Haproxy 配置详解

http://www.07net01.com/linux/Haproxypeizhixiangjie_645322_1380518936.html HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAPro...
  • u014695188
  • u014695188
  • 2016-04-02 14:44
  • 2107

OpenFire源码学习之三十:haproxy负载均衡

安装 使用Haproxy做负载均衡。 下载地址:http://www.haproxy.com/downloads/trial-versions/ 下载后解压: tar zcvf haproxy-1.3.20.tar.gz cd haproxy-1.3.20 ...
  • huwenfeng_2011
  • huwenfeng_2011
  • 2015-02-04 14:02
  • 8648

基于域名负载均衡的Haproxy配置

global log 127.0.0.1 local0 info #[err warning info debug] //日志位置 maxconn 4096 daemon #设置成后台运行 nbproc 1 #进程数量 #...
  • youyudehexie
  • youyudehexie
  • 2012-05-27 14:04
  • 8153
    个人资料
    • 访问:53880次
    • 积分:1050
    • 等级:
    • 排名:千里之外
    • 原创:92篇
    • 转载:3篇
    • 译文:0篇
    • 评论:9条
    文章分类
    最新评论