DRBD自动化使用脚本

1. 启动脚本(startDRBD.py):

#! /usr/bin/env python
#_*_coding:utf-8_*_

import os,sys
import threading
from time import ctime,sleep
import commands

def GetIsPrimary():     #判断输入参数是 primary 还是 secondary
    if len(sys.argv) != 2:
        print '参数个数错误!参数个数:3个'
        exit()
    if sys.argv[1] == 'primary':
        return 1
    elif sys.argv[1] == 'secondary':
        return 2
    else:
        print '参数错误!请输入参数:primary或secondary'
        exit()

def StartAndSendYes():  #启动DRBD并自动输入yes(保证单节点启动)
    import pexpect
    pwd="yes\r"
    #发送命令执行交互
    child=pexpect.spawn('service drbd start')
    sleep(15)
    if IsStarted() != 1:
        child.expect (']:')
        child.sendline(pwd)
        #child.interact() 
    #关闭pexpect 
    child.close()

def SetPrimOrSenc(bIsPrimary):  #设置启动时的主备状态
    if bIsPrimary == 1:
        output = commands.getstatusoutput('drbdadm primary --forc
e r0')
        if output[0] == 2816:
            print 'there is another primary node already!'
        output = commands.getstatusoutput('mount /dev/drbd1 /db')
        if output[0] != 0:
            print 'mount /dev/drbd1 failed!'

def IsStarted():
    output = commands.getstatusoutput('drbdadm cstate r0')
    if len(output[1])>90:
        if output[1][90:] == 'Connected':
            return 1
    return 0

def IsSplitBrain():     #是否发生脑裂
    output = commands.getstatusoutput('drbdadm cstate r0')
    if len(output[1])>90:
        if output[1][90:] == 'StandAlone':
            print 'Split-Brain!Repairing...'
            RepairSplitBrain()
    exit()

def RepairSplitBrain():     #脑裂自动修复
    if(GetIsPrimary()==1):
        commands.getstatusoutput('drbdadm connect r0')
    elif(GetIsPrimary()==2):
        commands.getstatusoutput('drbdadm secondary r0')
        commands.getstatusoutput('drbdadm connect --discard-my-da
ta r0')

class MyThread(threading.Thread):   #多线程
    def __init__(self, name=None):
        threading.Thread.__init__(self)

    def run(self):
        IsSplitBrain()

def BeginThread():
    t = MyThread()
    sleep(1)
    t.start()

if __name__ == "__main__":
    num = GetIsPrimary()
    commands.getstatusoutput('service drbd stop')
    StartAndSendYes()
    SetPrimOrSenc(num)
    BeginThread()

2. 主备节点切换脚本 (setDRBD.py):

#! /usr/bin/env python
#_*_coding:utf8_*_

import sys,os
import commands

def IsPrimary():    #判断输入参数是 primary 还是 secondary
    if(len(sys.argv) != 2):
        print '参数个数错误!'
        exit()
    if sys.argv[1] == 'primary':
        return 1
    elif sys.argv[1] == 'secondary':
        return 2
    else:
        print '参数错误!请输入参数:primary或secondary'
        exit()

def SetPrimOrSenc(bIsPrimary):  #设置主/备节点
    output = '0'
    if bIsPrimary == 1:
        output = commands.getstatusoutput('drbdadm primary r0')
        if output[0] == 2816:
            print 'there is another primary node already!'
        output = commands.getstatusoutput('mount /dev/drbd1 /db')
        if output[0] != 0:
            print 'mount /dev/drbd1 failed!'
    elif bIsPrimary == 2:
        output = commands.getstatusoutput('umount /db')
        if output[0] != 0:
            print 'umount /db failed!'
        commands.getstatusoutput('drbdadm secondary r0')

if __name__ == '__main__':
    index = IsPrimary()
    SetPrimOrSenc(index)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值