五、使用Python部署MongoDB
一、引子
在我们运维工作中,往往会部署各种各样的软件,不过我们都是人工一步一步去部署的,这次不同,我们可以用Python程序安装,提高了效率,以及降低了部署中的误操作;
二、案例描述
在我们当前目录下存在一个MongoDB安装包,我们的Python程序需要将安装包解压到当前目录的mongo目录下,并在当前目录下创建一个mongodata目录用来保存MongoDB的数据文件。
MongoDB是当下最流行的文档数据库,具有很好易用性。启动一个MongoDB数据库实例,只需要执行以下几条shell命令即可:
# tar zxf mongodb-linux-x86_64-3.0.6.gz
# mv mongodb-linux-x86_64-3.0.6 mongodb
# mdkir mangodata
# mongo/bin/mongod --fork --logpath mongodata/mongod.log --dbpath mongodata
三、使用Python部署MongoDB
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import print_function
import os
import shutil
import tarfile
import subprocess
def execute_cmd(cmd):
p = subprocess.Popen(cmd,
shell=True,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
)
stdout,stderr = p.communicate()
if p.returncode != 0:
return p.returncode,stderr
return p.returncode,stdout
def unpackage_mongo(package,package_dir):
unpackage_dir = os.path.splitext(package)[0]
if os.path.exists(unpackage_dir):
shutil.rmtree(unpackage_dir)
if os.path.exists(package_dir):
shutil.rmtree(package_dir)
t = tarfile.open(package,'r:gz')
t.extractall('.')
shutil.move(unpackage_dir,package_dir)
def create_datadir(data_dir):
if os.path.exists(data_dir):
shutil.rmtree(data_dir)
os.mkdir(data_dir)
def format_mongod_command(package_dir,data_dir,logFile):
mongod = os.path.join(package_dir,'bin','mongod')
mongod_format = """{0} --fork --dbpath {1} --logpath {2}"""
return mongod_format.format(mongod,data_dir,logFile)
def start_mongod(cmd):
returncode,out = execute_cmd(cmd)
if returncode != 0:
raise SystemExit('execute {0} error: {1}'.format(cmd,out))
else:
print("execute command ({0}) successful".format(cmd))
def main():
package = 'mongodb-linux-x86_64-3.0.6.gz'
cur_dir = os.path.abspath('.')
package_dir = os.path.join(cur_dir,'mongo')
data_dir = os.path.join(cur_dir,'mongodata')
logfile= os.path.join(data_dir,'mongo.log')
if not os.path.exists(package):
raise SystemExit("{0} not found".format(package))
unpackage_mongo(package,package_dir)
create_datadir(data_dir)
start_mongod(format_mongod_command(package_dir,data_dir,logfile))
if __name__ == '__main__':
main()