写个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()
搞定!觉得写的不错的,可以赞赏一下