2020-03-26

写个python脚本部署mysql主从服务器,其实用ansible的playbook来实现该功能是更可行的,但是今天来挑战一下自己。

思路:我们根据主从服务器搭建的过程,把python脚本分成几个部分,每个函数代表一个部分,要做到全自动无人工干预,其中一个关键点就是如何获取主服务器master的二进制日志的POS位置(通过show master status获取的位置),然后获取该参数传入slave从服务器脚本里。

主服务器-master数据库脚本

1 设置增加yum源

先调用os模块创建空文件,然后再调用configparser模块的相关方法配置以下repo文件写进内容

【mariadb】

name=MariaDB

baseurl=http://mirrors.ustc.edu.cn/mariadb/yum/10.3/centos7-amd64/

gpkey=http://mirrors.ustc.edu.cn/mariadb/yum/RPM-GPG-KEY-MariaDB

gpcheck=1

最后再把内存里的数据写进配置文件里

2安装数据库

这里比较简单,yum安装数据库后,我们会进行数据库的安全模式下的安装,这里必须进入交互模式,设置数据库密码,是否禁止root远程登录,是否删除测试数据库等等各项设置

3数据库配置以及启动和授权

主服务器的server-id一般默认都必须是1,还有二进制日志的设置,这里通过调用python的configparser模块的方法,先写进内存,最后再把内存里的数据写进配置文件,接着调用os.systen()方法启动数据库,判断执行成功后,我们再调用python的pexcept模块进入交互模式,通过sql语句授权slave





slave数据库的python脚本和master数据库大致一样,显著不同的就是多了pos这个步骤。

接着就是关键而言的pos,我之前自己单独写了个获取主数据库的pos的python脚本


全部如下:

#!/usr/bin/env python3

#-*- coding:utf-8 -*-

import MYSQLdb

import os

obtainlist = []

def database():

      HOST = 'localhost'

      USER = 'zabbix'

      PASSWORD = 'SDFSDGS1223'  #这里的密码我乱写的,不会告诉你我的密码的~~_~~

      DATABASE = 'test'

      db = MYSQLdb.connect(HOST,USER,PASSWORD,DATABASE)

      list = []

      cursor = db.cursor() 

      # obtain the cursor of database

      if cursor:

        command = "show master status"

        ret = cursor.execute(command)

        #execute the sql

        ret = cursor.fetchall()

        #obtian all the data that return

        print(ret)

        for i in ret:

            ret2 = i.split()

            new_rss = ret2[2]

            list.append(new_rss)

            return list

if __name == '__main__':

      obtainlist = database()

      print("the log-pos of the masterdb is %s" % obtainlist[1])

现在的关键就是把这个脚本融合进slave的python脚本里,如下所示


所以最终的slave-db的python脚本如下


部分截图

[root@localhost pythonshell]# cat slave-db.py

#!/usr/bin/env python3

#-*- coding:utf-8 -*-

#author:trippal

#time:2020/03/26

import os

import pexpect

import configparser

import MYSQLdb

DB1 = '192.168.31.133'

DBPASSWORD = 'fsdfsdfsdfkk1'  #我随便写的密码

def setrepo():

    os.system('touch /etc/yum.repos.d/mariadb.repo')

    with open('/etc/yum.repos.d/mariadb.repo','w',encoding='utf8') as f:

        f.write('[mariadb]')

    config = configparser.ConfigParser()

    config.read("/etc/yum.repos.d/mariadb.repo", encoding="utf-8")

    config.set('mariadb', 'name', 'MariaDB')

    config.set('mariadb', 'baseurl', 'http://mirrors.ustc.edu.cn/mariadb/yum/10.3/centos7-amd64/')

    config.set('mariadb', 'gpgkey', 'http://mirrors.ustc.edu.cn/mariadb/yum/RPM-GPG-KEY-MariaDB')

    config.set('mariadb', 'gpgcheck', '1')

    config.write(open('/etc/yum.repos.d/mariadb.repo','w'))

def mariadb():

    a = os.system('yum install MariaDB -y')

    if a == 0:

        b = os.system('systemctl start mariadb &> /dev/null')

        if b == 0:

            print('mariadb启动成功')

        child = pexpect.spawn('mysql_secure_installation')

        child.expect('enter for none')

        child.sendline('')

        child.expect('Y/n')

        child.sendline('y')

        child.expect('New')

        child.sendline(DBPASSWORD)

        child.expect('Re-enter')

        child.sendline(DBPASSWORD)

        child.expect('successfully')

        child.sendline('')

        child.sendline('')

        child.sendline('')

        child.sendline('')

def slavedb():

    config = configparser.ConfigParser()

    config.read("/etc/my.cnf.d/server.cnf", encoding="utf-8")

    config.set('mysqld', 'server-id', '2')

    config.write(open('/etc/my.cnf.d/server.cnf','w'))

    b = os.system('systemctl restart mariadb')

    if b ==  0:

        bin = 'mysql-bin.000001'


        HOST = '192.168.31.134'

        #the ip address of master-database

        USER = 'zabbix'

        PASSWORD = 'SDFSDGS1223'

        DATABASE = 'test'

        db = MYSQLdb.connect(HOST,USER,PASSWORD,DATABASE)

        list = []

        cursor = db.cursor()

        # obtain the cursor of database

        if cursor:

          command = "show master status"

          ret = cursor.execute(command)

          #execute the sql

          ret = cursor.fetchall()

          #obtian all the data that return

          print(ret)

          for i in ret:

              ret2 = i.split()

              new_rss = ret2[2]

              list.append(new_rss)

          pos = list [1]

        child = pexpect.spawn('mysql -uroot -p%s' % DBPASSWORD)

        child.expect('none')

        child.sendline("CHANGE MASTER TO MASTER_HOST='%s', MASTER_USER='slave', MASTER_PASSWORD='slave', MASTER_LOG_FILE='%s', MASTER_LOG_POS=%s;" % (DB1,bin,pos))

        child.expect('none')

        child.sendline( 'start slave;' )

        child.interact()

        child.close()

def main():

    setrepo()

    mariadb()

    slavedb()

if __name__ == '__main__':

    main()

搞定!觉得写的不错的,可以赞赏一下

你可能感兴趣的:(2020-03-26)