python 调用 lvs 脚本 [备忘]

软件环境

操作系统 CentOS
运行环境:python 2.7
工具:/sbin/ipvsadm

参数说明

[root@gd02-zabbix-db-research python_api]# ./lvs.py
usage: ./lvs.py --help or --example

[root@gd02-zabbix-db-research python_api]# ./lvs.py --help
usage: lvs.py [-h] [-A] [-D] [-F] [-L] [-t] [-u] [-s SCHEDULER]
              [-p PERSISTENT] [-r REALSERVER] [-f FLOAPINGIP] [-g] [-m]
              [-P SRCPORT] [-R DESTPORT] [--example]
optional arguments:
  -h, --help            show this help message and exit
  -A, --add             add LVS rules
  -D, --delete          delete LVS rules
  -F, --fresh           clean all LVS rules
  -L, --show            show LVS status
  -t, --tcp             tcp service
  -u, --udp             udp service
  -s SCHEDULER, --scheduler SCHEDULER
                        one of rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,the
                        default scheduler is wlc
  -p PERSISTENT, --persistent PERSISTENT
                        persistent service, default:1500
  -r REALSERVER, --realserver REALSERVER
                        server-address is host (and port) Example: -r '1.1.1.1
                        2.2.2.2 3.3.3.3'
  -f FLOAPINGIP, --floapingip FLOAPINGIP
                        vip address of lvs
  -g, --gatewaying      gatewaying (direct routing)
  -m, --masquerading    masquerading (NAT)
  -P SRCPORT, --srcport SRCPORT
                        listen on floapip port
  -R DESTPORT, --destport DESTPORT
                        listen on realserver port
  --example             show create LVS rule example

python 脚本

#!/apps/svr/python/python
#coding:utf-8
# Terry zeng <terry.zeng@vipshop.com>
#
#  2014 04 10
#
#  lvs 调用接口
#
# 脚本主要功能:
#   1. 参数输入判定
# 2. 查询, 添加, 删除, 清空 lvs 规则
# 3. 帮助语法: ./lvs.py --help
# 4. 添加规则语法:
#
#       添加 udp 53 端口调度例子
#        ./lvs.py --add --udp --scheduler wlc --persistent 1500 --floapingip 61.1.1.1 --srcport 53 --realserver "192.168.1.1 172.16.14.1 10.1.1.1" --destport 53 --gatewaying
#        ./lvs.py -A -u -s wlc -p 1500 -f 61.1.1.1 -P 53 -r "192.168.1.1 172.16.14.1 10.1.1.1" -R 53 -g
#
#
#       添加 tcp 80 端口调度例子
#       ./lvs.py --add --tcp --scheduler rr --persistent 1500 --floapingip 202.1.1.1 --srcport 80 --realserver "192.168.1.1 172.16.14.1 10.1.1.1 10.3.4.1" --destport 8080 --masquerading
#        ./lvs.py -A -t -s rr -p 1500 -f 202.1.1.1 -P 80 -r "192.168.1.1 172.16.14.1 10.1.1.1 10.3.4.1" -R 8080 -m
#
#
#       删除某个规则方法
#       ./lvs.py --delete --tcp --scheduler rr --persistent 1500 --floapingip 202.1.1.1 --srcport 80 --realserver "192.168.1.1 172.16.14.1 10.1.1.1 10.3.4.1" --destport 8080 --masquerading
#
#       清空所有规则
#       ./lvs.py --fresh
#       显示规则方法
#       ./lvs.py --show
#

import argparse
import sys
import socket
import os
import re

### 判断 ipvsadm 是否可用
if os.path.exists('/sbin/ipvsadm') == False:
    print "install ipvsadm pckage first"
    print "contact administrator or rum command: yum install -y ipvsadm"
    exit()

## ip 地址可用性判断
def valid_ip(address):
    try:
        socket.inet_aton(address)
        return True
    except:
        return False

def usage():
    print 'usage: ' + __file__ + ' --help or --example'
    sys.exit(2)

#### 参数调用说明
parser = argparse.ArgumentParser()
parser.add_argument('-A','--add', help='add LVS rules', action='store_true')
parser.add_argument('-D','--delete', help='delete LVS rules', action='store_true')
parser.add_argument('-F','--fresh', help='clean all LVS rules', action='store_true')
parser.add_argument('-L','--show', help='show LVS status', action='store_true')
parser.add_argument('-t','--tcp', help='tcp service',action='store_true')
parser.add_argument('-u', '--udp', help='udp service', action='store_true')
parser.add_argument('-s', '--scheduler', help='one of rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,the default scheduler is wlc')
parser.add_argument('-p', '--persistent', help='persistent service, default:1500', type = int)
parser.add_argument('-r', '--realserver', help="server-address is host (and port) Example: -r '1.1.1.1 2.2.2.2 3.3.3.3'", type = str )
parser.add_argument('-f', '--floapingip', help='vip address of lvs' )
parser.add_argument('-g', '--gatewaying', help='gatewaying (direct routing)',action='store_true')
parser.add_argument('-m','--masquerading', help='masquerading (NAT)', action='store_true')
parser.add_argument('-P','--srcport', help='listen on floapip port', type = int )
parser.add_argument('-R','--destport', help='listen on realserver port', type = int )
parser.add_argument('--example', help='show create LVS rule example', action='store_true' )
args = parser.parse_args()

## 对参数进行空值判断,  add delete fresh show example 重复,可用性判断

if args.example == True:
    print __file__ + ' --add --tcp --scheduler wlc --persistent 1500 --floapingip 61.1.1.1 --srcport 80 --realserver "192.168.1.1 172.16.14.1 10.1.1.1" --destport 8080 --gatewaying'
    print __file__ + ' --delete --tcp --scheduler wlc --persistent 1500 --floapingip 61.1.1.1 --srcport 80 --realserver "192.168.1.1 172.16.14.1 10.1.1.1" --destport 8080 --gatewaying'
    print __file__ + ' --fresh'
    print __file__ + ' --show'
    sys.exit()

rule = False

if args.add == True:
    if True in [ args.delete,  args.fresh,  args.show ]:
        usage()
    else:
        rule = "add"

if args.delete == True:
    if True in [ args.add, args.fresh,  args.show ]:
        usage()
    else:
        rule = "delete"

if args.fresh ==  True:
    if True in [ args.add, args.delete,  args.show ]:
        usage()
    else:
        os.system('/sbin/ipvsadm -C')
        os.system('/etc/init.d/ipvsadm save')
        exit()

if args.show ==  True:
    if True in [ args.add, args.delete,  args.add ]:
        usage()
    else:
        os.system('/sbin/ipvsadm -L -n')
        exit()

if rule == False:
    usage()

## 对参数进行空值判断,  tcp, udp || DR, NAT 重复判断

if args.tcp == args.udp:
    usage()

if args.gatewaying == args.masquerading:
    usage()

### 判断 persistent 值是否正确 start
if args.persistent == None:
    persistent = "1500"
else:
    persistent = str(args.persistent)

### 判断 persistent 值是否正确 end

### 判断 scheduler start
if args.scheduler == None:
    scheduler = 'wlc'
else:
    scheduler = args.scheduler

if scheduler not in ('rr', 'wrr', 'lc', 'wlc', 'lblc', 'lblcr', 'dh', 'sh', 'sed', 'nq'):
    print 'scheduler must one of rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,the default scheduler is wlc'
    usage()

### 判断 scheduler end

### 判断 realserver 及 ip 地址 start
### 解决参数中包含多个空格问题
### 解决 IP 地址验证问题
if args.realserver == None:
    print "--realserver is needed, example: -r '1.1.1.1 2.2.2.2 3.3.3.3'"
    usage()
else:
    realip =    re.sub(r'\s+', ' ',args.realserver)
    realserver = realip.split(' ')

    for address in realserver:
        if valid_ip(address) == False:
            print "--realserver ip error, example: -r '1.1.1.1 2.2.2.2 3.3.3.3'"
            usage()
### 判断 realserver 及 ip 地址 end

### 判断 floading ip  start
if args.floapingip == None:
    print "--floapingip is needed,  example: -f '1.1.1.1'"
    usage()
else:
    floapingip = args.floapingip

    if valid_ip(floapingip) == False:
        print "--realserver ip error, example: -f '1.1.1.1'"
        usage()

### 判断 floading ip end

### 判断 vip port start
if args.srcport == None:
    print "--srcport is needed,  example: -S '80'"
    usage()
else:
    srcport = str(args.srcport)

### 判断 vip port start

### 判断 realserver port start, 切记类型转换
if args.destport == None:
    print "--destport is needed,  example: -R '80'"
    usage()
else:
  destport = str(args.destport)

### 判断 realserver port end

###lvs  语法
if args.tcp == False:
    protocal = "-u"
else:
    protocal = "-t"

if args.gatewaying == None:
    gateway = "-m"
else:
    gateway = "-g"

if rule == "add":
    main_rule = "/sbin/ipvsadm -A " + protocal + " " + floapingip + ":" + srcport + " -s " + scheduler + " -p " + persistent
    os.system(main_rule)

    for ip in realserver:
        sub_rule = "/sbin/ipvsadm -a " + protocal + " " + floapingip + ":" + srcport + " -r " + ip + ":" + srcport + " " + gateway
        os.system(sub_rule)

elif rule == "delete":
        main_rule = "/sbin/ipvsadm -D " + protocal + " " + floapingip + ":" + srcport
        os.system(main_rule)

os.system('/etc/init.d/ipvsadm save')
时间: 2024-08-30 23:36:44

python 调用 lvs 脚本 [备忘]的相关文章

Oracle常用脚本备忘

oracle|脚本 1.创建一个表T2,使之具有T1表的结构        CREATE TABLE T2 AS SELECT * FROM T1 WHERE 1<>2;2.创建一个表T2,使之具有T1表的结构和数据        CREATE TABLE T2 AS SELECT * FROM T1;3.修改michael用户的确省表空间为users,临时表空间为temp,并给他在users表空间中创建15M的空间配额ALTER USER michael DEFAULT TABLESPACE

Python中利用函数装饰器实现备忘功能_python

"备忘"的定义 "memoization"(备忘)这个词是由Donald Michie在1968年提出的,它基于拉丁语单词"memorandum"(备忘录),意思是"被记住".虽然它和单词"memorization"在某种程度上有些相似,但它并不是该单词的错误拼写.实际上,Memoisation是一种用于通过计算来加速程序的技术,它通过记住输入量的计算结果,例如函数调用结果,来实现其加速目的.如果遇到相同的

Python中的字典遍历备忘_python

备忘一下python中的字典如何遍历,没有什么太多技术含量.仅供作为初学者的我参考. 复制代码 代码如下: #!/usr/bin/env python # coding=utf-8 demoDict = {'1':'Chrome', '2':'Android'} for key in demoDict.keys():     print key for value in demoDict.values():     print value for key in demoDict:     pri

技术备忘3

   shell单引号与变量 [root@test] a=55 [root@test] echo $a 55 [root@test] echo '$a' $a [root@test] echo ''$a'' #注意此处是两个单引不是一个双引 55 总结: 在单引号中引用变量,需要这样来写(单引号括起来双引号内的变量.) :   '"${a}"' 原文地址 date星期求取 <span style="font-family:Microsoft YaHei">

Cheat—— 给Linux初学者和管理员一个终极命令行&quot;备忘单&quot;

Cheat-- 给Linux初学者和管理员一个终极命令行"备忘单" 当你不确定你所运行的命令,尤其是那些使用了许多选项的复杂命令时,你会怎么做?在这种情况下,我们使用man pages来获取帮助.还有一些其它的选择可能包括像'help','whereis'和'whatis'这样的命令.但是所有的这些既有优点,也有缺点. 当我们浏览man pages来查看选项和帮助的时候,里面的描述实在太冗长了,我们无法在短的时间里理解它的意思. Linux Man Pages Linux Man Pa

zabbix 配置管理[备忘]

参见 zabbix-2.2.1 打造 server 端 自定义 rpm 方法 [备忘] 文档, 编译 zabbix 服务器端   另外可选择使用直接编译方法进行 zabbix 软件安装 编译提示: zabbix-2.2.1 下载位置http://downloads.sourceforge.net/project/zabbix/ZABBIX%20Latest%20Stable/2.2.1/zabbix-2.2.1.tar.gz   解压后可选的编译参数 ./configure \ --enable

Oracle数据库如何手动恢复备忘日志

最近因为升级了Mac os x 10.10 Yosemite,突然前几天的一个晚上,开机发现就停留在开机界面了,看来BETA果然是不靠谱,然后想到自己这不前几天刚备份完吗,没事,TimeMachine是何等神器,二话不说直接恢复.但是恢复完,我后悔了,一来是忘了昨天晚上还加班呢,加班的成功保留成果所剩无几,关键我这才发现TimeMachine既然不备份虚拟机文件(虚拟机文件30G,估计直接给略过了吧),难怪每次都觉得备份那么快. 不过后悔也没用,重新搭开发环境吧.操作系统WIN7->开发工具VS

服务器迁移之debian重新配置Web服务的一些细节备忘

这次服务系统采用的是最新的Debian 7.0,但是有几个细节的忽略导致我折腾了一番,我再这里再做个记录吧   之前配置Linux服务器时采用的是Debian系统一直很稳定,这次准备迁移到新的服务器环境上,好在以前的配置我在博客都做了备忘,所以很容易就搞定了,这次服务系统采用的是最新的Debian 7.0,但是有几个细节的忽略导致我折腾了一番,我再这里再做个记录吧: 首先要安装编译环境,虽然我们通过apt-get可以方便的绕过手动编译的环节,但是一些程序包可能内置编译命令,可以编译一些扩展程序,

mysql 数据库导入\导出(总结备忘)

 数据库的基本导入\导出的命令 是 mysqldump 和 source  在linux下直接用命令行操作就可以 在windows下 一般情况下有两种方法一个也是用命令行 另一个是用phpmyadmin   先来说说phpmyadmin 这个工具导出和导入很简单 而且导入时无需建库 直接还原成原来的数据库   用source  也可以还原 但他导入文件时有大小限制不能超过2M 再来说说  mysqldump 和 source  用命令操作很快 但是想把导出的文件再导入时必须先建立一个数据库(这个