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)
發佈了27 篇原創文章 · 獲贊 3 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章