#!/usr/bin/env 
python
#site: www.jb200.com
# -*- coding: utf-8 -*-  
#script u
sed in Slave Server for change server ip  
import os,sys,time,socket,
paramiko,
MySQLdb  
 
def mysql_connect(ip,sql):#数据库连接  
    try:  
        conn = MySQLdb.connect(host = ip,user = 'repl',passwd = 'VQrtetr8',connect_timeout=5)  
        cursor = conn.cursor(cursorclass = MySQLdb.cursors.DictCursor)  
        cursor.execute(sql)  
        alldata = cursor.fetchall()  
        return alldata  
    except MySQLdb.Error,e:  
        return e.args[0]  
 
def ssh_conm(conm):#连接主库
服务器并执行命令  
    host = mysql_connect('127.0.0.1',"show slave status")[0]["Master_Host"]  
    #stat = mysql_chcek(host)  
    username='root' 
    password = '3141315' 
    port = 63008 
    s=paramiko.SSHClient()  
    s.set_missing_host_key_policy(paramiko.AutoAddPolicy())  
    s.connect(host,port,username,password)  
    stdin,stdout,stderr=s.exec_command(conm)  
    result = stdout.read()  
    s.close()  
    return result  
 
def log_pos():#获取当前主从的同步位置  
    result = mysql_connect('127.0.0.1',"show slave status")  
    host = result[0]["Master_Host"]  
    s_log = result[0]["Relay_Master_Log_File"].split('.')[1]  
    s_pos = result[0]["Exec_master_log_pos"]  
    result = mysql_connect(host,"show master status")  
    if result == 2003:#这里是应对my
sql数据库无法连接,可以选择据继续和终止脚本  
        choose = raw_input('Can not connect Master,Do you go on ?  (y or n) :')  
        if choose == 'y':  
            return 0,0,0,0 
        else:  
            sys.exit(1)  
    m_log = result[0]["File"].split('.')[1]  
    m_pos = result[0]["Position"]  
    return s_log,m_log,s_pos,m_pos  
 
def show():#循环5次判断主从同步是否一致  
    print "Check Master-Slave now..." 
    for i in range(5):  
        s_log,m_log,s_pos,m_pos = log_pos()  
        if s_log == m_log and s_pos == m_pos:  
            print "Slave and Master is OK." 
            
break 
        else:  
            print "Slave and Master not OK,please wait moment." 
            if i == 4:  
                #print "Must be show Replcation Error,Quit this script now !"  
                choose = raw_input('Master-slave not synchronous,Do you go on ?  (y or n) :')  
                if choose == 'y':  
                    break 
                else:  
                    sys.exit(1)  
            i = i + 1 
            time.sleep(5)  
 
def replace():  
    #显示当前主从的IP,并检测主从3306是否存在  
    print "Before switching IP:" 
    s_ip = os.popen("cat /etc/sysconfig/network-scripts/ifcfg-
eth0|grep IPADDR|
linuxjishu/13830.html target=_blank class=infotextkey>awk -F '=' '{print $2}'").read().split()[:1][0]  
    print "s_ip: " + s_ip  
    conm = "cat /etc/sysconfig/network-scripts/ifcfg-eth0|grep IPADDR|awk -F '=' '{print $2}'" 
    m_ip = ssh_conm(conm).split()[:1][0]  
    print "m_ip: " + m_ip  
    print 
    #1:停用主的网卡  
    conm = "ifdown eth0" 
    ssh_conm(conm)  
    #2: 判断主从同步是否一致,如果一致则切换,不一致则手动查看问题所在(不一致的情况重复检测5次,间隔5s,检测五次依然不同步可以选择停止脚本的执行或继续执行)  
    show()  
    #3:修改从IP为主的IP  
    os.popen("sed -i 's/%s/%s/' /etc/sysconfig/network-scripts/ifcfg-eth0" % (s_ip,m_ip))  
    print "Slave change IP is OK" 
    #4:修改主IP为从的IP  
    conm = "sed -i 's/%s/%s/' /etc/sysconfig/network-scripts/ifcfg-eth0" % (m_ip,s_ip)  
    ssh_conm(conm)  
    print "Master change IP is OK" 
    #5: 显示替换之后主从的IP  
    print 
    print "After switching IP:" 
    s_ip = os.popen("cat /etc/sysconfig/network-scripts/ifcfg-eth0|grep IPADDR|awk -F '=' '{print $2}'").read().split()[:1][0]  
    print "s_ip: " + s_ip  
    conm = "cat /etc/sysconfig/network-scripts/ifcfg-eth0|grep IPADDR|awk -F '=' '{print $2}'" 
    m_ip = ssh_conm(conm).split()[:1][0]  
    print "m_ip: " + m_ip  
    #6: 停止主从同步  
    mysql_connect("127.0.0.1","slave stop")  
    print "Slave stop OK" 
    #7: 重启用主从的网卡  
    print 
    print "Network service restart now,please wait ......" 
    conm = "ifup eth0" 
    ssh_conm(conm)  
    os.system("ifdown eth0")  
    os.system("ifup eth0")  
    print "Network reatrt OK !" 
 
if __name__ == "__main__":  
    replace()