python安装modify_python自动安装mysql5.7【转】

#!/usr/bin/env python#-*- coding:utf-8 -*-#@Author : huazai#@Time : 2017/5/4 22:04#@File : installmysql.py#@Description : mysql数据目录路径:/data/mysql/ ,mysql安装目录路径:/usr/local/mysql

importosimportsysfrom optparse importOptionParserfrom subprocess importPopen, PIPEimportshleximporttimeimportMySQLdbimportreimportshutilimporttarfileimportstatimportloggingimportpwd

logger=None

MYSQL_DATA_DIR= '/data/mysql/'MYSQL_INSTALL_DIR= '/usr/local/mysql/'MYSQL_CONF_DIR= '/etc/'MYSQL_BACK_DIR= '/data/backup/mysql/'MYSQL_STARTUP_SCRIPT= '/etc/init.d/mysql'

definit_log():globallogger

fmt_date= '%Y-%m-%d %H:%M:%S.%s'fmt_file= '%(lineno)s %(asctime)s [%(process)d]: %(levelname)s %(filename)s %(message)s'log_file= 'installmysql.log'logger= logging.getLogger('mysqlinstallloging')

logger.setLevel(logging.INFO)

file_handler= logging.FileHandler(log_file, mode='a')

file_handler.setFormatter(logging.Formatter(fmt_file, fmt_date))

logger.addHandler(file_handler)defopt():

parser= OptionParser("Usage: %prog -P -f -b -p")

parser.add_option("-P", "--port",

dest="port",

action="store",

default="3306",

help='port 3306')

parser.add_option("-f", "--tarfile",

dest="tarfile",

action="store",

default="/tmp/mysql-5.6.28-linux-glibc2.5-x86_64.tar.gz",

help='file /tmp/mysql-5.6.28-linux-glibc2.5-x86_64.tar.gz')

parser.add_option("-b", "--bashfile",

dest="myfile",

action="store",

default="/tmp/createmycnf.sh",

help='file /tmp/createmycnf.sh')

parser.add_option("-p", "--mysqlpwd",

dest="mysqlpwd",

action="store",

default="123456",

help='password 123456')

options, args=parser.parse_args()returnoptions, args#设置安装目录和数据目录的权限

defsetOwner(mysqlport):

list=[]

with open('/etc/passwd', 'r') as fd:for line infd:

matchmysql= re.search(r'mysql', line, re.I)ifmatchmysql:

os.system('chown -R mysql:mysql %s' %MYSQL_DATA_DIR)

os.system('chown -R mysql:mysql %s' %MYSQL_INSTALL_DIR)else:

os.system('useradd -M -s /sbin/nologin mysql')

os.system('chown -R mysql:mysql %s' %MYSQL_DATA_DIR)

os.system('chown -R mysql:mysql %s' %MYSQL_INSTALL_DIR)#检查安装目录和数据目录权限

for i in pwd.getpwnam('mysql'):

list.append(i)

mysqluid= list[2]

mysqlgid= list[3]

stdatadirmode=os.stat(MYSQL_DATA_DIR).st_mode

stinstalldirmode=os.stat(MYSQL_INSTALL_DIR).st_modeif not (os.stat(MYSQL_DATA_DIR).st_uid == mysqluid and os.stat(MYSQL_DATA_DIR).st_gid ==mysqlgid):

logger.error('chown mysql datadir or installdir not ok')

sys.exit(1)if not (os.stat(MYSQL_DATA_DIR+'mysql%s/data' %(mysqlport)).st_uid == mysqluid and os.stat(MYSQL_DATA_DIR+'mysql%s/data' %(mysqlport)).st_gid ==mysqlgid):

logger.error('chown mysql datadir or installdir not ok')

sys.exit(1)if not (os.stat(MYSQL_DATA_DIR+'mysql%s/logs' %(mysqlport)).st_uid == mysqluid and os.stat(MYSQL_DATA_DIR+'mysql%s/data' %(mysqlport)).st_gid ==mysqlgid):

logger.error('chown mysql datadir or installdir not ok')

sys.exit(1)if not (os.stat(MYSQL_DATA_DIR + 'mysql%s/tmp' % (mysqlport)).st_uid == mysqluid and os.stat(MYSQL_DATA_DIR + 'mysql%s/tmp' % (mysqlport)).st_gid ==mysqlgid):

logger.error('chown mysql datadir or installdir not ok')

sys.exit(1)#创建必要的目录

defmakeDIR(port):if os.path.exists('/data/mysql/mysql%s/data' %port):

logger.error('mysql %s already install' %port)

sys.exit(1)try:#os.makedirs('/usr/local/mysql')

os.makedirs('/data/mysql/mysql%s/data' %port)

os.makedirs('/data/mysql/mysql%s/tmp' %port)

os.makedirs('/data/mysql/mysql%s/logs' %port)exceptException, e:

logger.error(e)#解压二进制安装包

defextract(mysqlfile):if notos.path.exists(mysqlfile):

logger.error('%s is not exists' %mysqlfile)

sys.exit(1)

os.chdir(os.path.dirname(mysqlfile))

t= tarfile.open(mysqlfile, 'r:gz')

t.extractall()#解压到当前目录

t.close()#拷贝安装包文件到程序目录

defcopyFile(mysqlfile):

shutil.copytree(mysqlfile.split('.tar.gz')[0], MYSQL_INSTALL_DIR)

shutil.copy2(MYSQL_INSTALL_DIR+ 'support-files/mysql.server', MYSQL_STARTUP_SCRIPT)

shutil.rmtree(mysqlfile.split('.tar.gz')[0])#设置环境变量

defsetEnv():

with open('/etc/profile', 'a') as fd:

fd.write('export PATH=$PATH:/usr/local/mysql/bin' + '\n')

os.system('source /etc/profile')#初始化mysql

defmysqlInstall():

cnf= '/etc/my.cnf'

ifos.path.exists(cnf):

cmd= MYSQL_INSTALL_DIR + "bin/mysqld --defaults-file=%s --initialize-insecure" %cnf

p= Popen(shlex.split(cmd), stdout=PIPE, stderr=PIPE)

stdout, stderr=p.communicate()ifstdout:

logger.info('install output: %s' %(stdout))ifstderr:

logger.error('install error output: %s' %(stderr))if p.returncode ==0:

logger.info('initialize completed')

logger.info('install returncode: %s' %(p.returncode))else:

logger.info('initialize failed , please check the mysql errror log')

logger.info('install returncode: %s' %(p.returncode))

sys.exit(1)else:

logger.error(cnf+ 'do not esixts')

sys.exit(1)#设置my.cnf

defmycnfCreate(mybashfile, mysqlport):

cnf= '/etc/my.cnf'cmd= "/bin/bash %s" %mybashfile

p= Popen(shlex.split(cmd), stdout=PIPE, stderr=PIPE)

p.communicate()

p.returncode

f1= open(cnf, "r", )

f2= open("%s.bak" % cnf, "w", )for line inf1:

f2.write(re.sub(r'3306', mysqlport, line, count=1))

f1.close()

f2.close()

os.remove(cnf)

os.rename("%s.bak" %cnf, cnf)#设置启动脚本

defmodifyStartupscript(port):

isdatadirfind=0

isbasedirfind=0

f1= open(MYSQL_STARTUP_SCRIPT, "r", )

f2= open("%s.bak" % MYSQL_STARTUP_SCRIPT, "w", )for line inf1:if line.startswith('datadir=') and notisdatadirfind:

f2.write(line.replace('datadir=', 'datadir=/data/mysql/mysql%s/data' % port, 1))

isdatadirfind= 1

elif line.startswith('basedir=') and notisbasedirfind:

f2.write(line.replace('basedir=', 'basedir=/usr/local/mysql', 1))

isbasedirfind= 1

else:

f2.write(line)

f1.close()

f2.close()

os.remove(MYSQL_STARTUP_SCRIPT)

os.rename("%s.bak" %MYSQL_STARTUP_SCRIPT, MYSQL_STARTUP_SCRIPT)#设置启动脚本执行权限

stmode =os.stat(MYSQL_STARTUP_SCRIPT).st_mode

os.chmod(MYSQL_STARTUP_SCRIPT, stmode| stat.S_IXOTH | stat.S_IXGRP |stat.S_IXUSR)#检查安装

defcheckInstall(port):if not os.path.exists('/data/mysql/mysql%s/data/ibdata1' %port):

logger.error('mysql not install')

sys.exit(1)

with open('/data/mysql/mysql%s/logs/error.log' % port, 'r') as fd:

fdlist= [i for i in fd ifi]

fdstr= ''.join(fdlist)

re_error= re.compile(r'\s\[error\]\s', re.I | re.M) #匹配errorlog日志格式

errorlist =re_error.findall(fdstr)iferrorlist:

logger.error('error.log error count:' +str(len(errorlist)))

logger.error('mysql not install')

sys.exit(1)else:

logger.info('install mysql ok')defmysqlserviceStart():

cnf= '/etc/my.cnf'cmd= MYSQL_INSTALL_DIR+"bin/mysqld --defaults-file=%s &" %(cnf)

p= Popen(cmd, stdout=PIPE, stderr=PIPE, shell=True)

stdout, stderr=p.communicate()ifstdout:

logger.info('mysql startup output: %s' %(stdout))ifstderr:

logger.error('mysql startup error output: %s' %(stderr))if p.returncode ==0:

logger.info('mysql startup completed')

logger.info('mysql startup returncode: %s' %(p.returncode))else:

logger.info('mysql startup failed , please check the mysql errror log')

logger.info('mysql startup returncode: %s' %(p.returncode))

sys.exit(1)

time.sleep(4) #休眠4秒 让mysql完全启动完毕

#连接mysql

defconnMysql(mysqlport):

cnf= '/etc/my.cnf'

ifos.path.exists(cnf):

host= 'localhost'user= 'root'dbname= 'mysql'usocket= MYSQL_DATA_DIR+'mysql%s/tmp/mysql.sock' %(mysqlport)try:

conn= MySQLdb.connect(host=host, user=user, db=dbname, unix_socket=usocket)exceptException, e:

logger.error(e)

sys.exit(1)

cur=conn.cursor()returncur#设置mysql的root的密码

defrunSQL(mysqlport, mysqlpwd):

sql= "alter user root@localhost identified by '%s'" %(mysqlpwd)

cur=connMysql(mysqlport)

cur.execute(sql)if __name__ == '__main__':

init_log()

options, args=opt()try:

cmd=args[0]exceptIndexError:print "%s follow a command" % __file__

print "%s -h" % __file__sys.exit(1)if (options.port and str.isdigit(options.port)) and (options.tarfile and os.path.isfile(options.tarfile)) and(

options.myfileand os.path.isfile(options.myfile)) and(

options.mysqlpwd):

mysqlport=options.port

mysqlfile=options.tarfile

mybashfile=options.myfile

mysqlpwd=options.mysqlpwdelse:print "%s -h" % __file__sys.exit(1)if cmd == 'create':

mycnfCreate(mybashfile, mysqlport)

logger.info('step1:mycnfCreate completed')

makeDIR(mysqlport)

logger.info('step2:makeDIR completed')

extract(mysqlfile)

logger.info('step3:extract completed')

copyFile(mysqlfile)

logger.info('step4:copyFile completed')

setOwner(mysqlport)

logger.info('step5:setOwner completed')

mysqlInstall()

logger.info('step6:mysql_install completed')

setEnv()

logger.info('step7:setEnv completed')

modifyStartupscript(mysqlport)

logger.info('step8:modify_startupscript completed')

checkInstall(mysqlport)

logger.info('step9:checkInstall completed')

mysqlserviceStart()

logger.info('step10:mysqlserviceStart completed')

runSQL(mysqlport, mysqlpwd)

logger.info('step11:runSQL completed')print 'mysql install finish'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值