案例:使用Python部署MongoDB
案例中将会用到各种与系统管理相关的标准库,包括os、os.path、shutil、tarfile和subprocess模块。
MongoDB下载地址如下:
wget https://fastdl.mongodb.org/linux/mongodb-linux-s390x-rhel72-4.3.3.tgz
创建目录,传入MongoDB软件包,扁你邪恶python脚本,并且创建一个mongodata目录用来保存MongoDB的数据库文件。
1)创建目录,导入软件包
[root@localhost ~]# mkdir MongoDB
[root@localhost ~]# cd MongoDB/
[root@localhost MongoDB]# ls
2)编写脚本
[root@localhost MongoDB]# vim deploy_mongo.py
#!/usr/bin/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('执行{0} 错误:{1}'format.(cmd, out.decode()))
else:
print('执行命令 ({0})成功。'.format(cmd))
def main():
package = 'mongodb-linux-x86_64-rhel70-4.2.3.tgz'
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, 'mongod.log')
if not os.path.exists(package):
raise SystemExit('{0} 没找到'.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()
执行脚本
[root@localhost MongoDB]# python deploy_mongo.py
执行命令 (/root/MongoDB/mongo/bin/mongod --fork --dbpath /root/MongoDB/mongodata --logpath /root/MongoDB/mongodata/mongod.log)成功。
[root@localhost MongoDB]# ls
代码说明:
- 在这段程序中,首先在main函数中定义了几个变量,包括当前目录的路径、MongoDB二进制文件所在的路径、MongoDB数据目录所在的路径,以及MongoDB的日志文件。
- 随后,判断MongoDB的安装包是否存在,如果不存在,则通过抛出SystemExit异常的方式结束程序。
- 在unpackage_mongo函数中,通过Python程序得到MongoDB安装包解压以后的目录。如果目录已经存在,则删除该目录。随后,使用tarfile解压MongoDB数据库,解压完成后,将命令重命名为mongo目录。
- 在create_datafir目录中,首先判断MongoDB数据库目录是否存在,如果存在,则删除该目录,随后再创建MongoDB数据库目录。
- 在start_mongod函数中,执行MongoDB数据库的启动命令启动MongoDB数据库。为了在Python代码中执行shell命令,使用了subprocess库。将subprocess库执行shell命令的逻辑封装成execute_cmd函数,在执行shell命令时,直接调用该函数即可。
访问测试:
[root@localhost MongoDB]# cd mongo/bin/
[root@localhost bin]# ./mongo
MongoDB shell version v4.2.3
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("f4240c88-11c6-4144-be74-8f72b10caec6") }
MongoDB server version: 4.2.3
Welcome to the MongoDB shell.
.....
To enable free monitoring, run the following command: db.enableFreeMonitoring()
To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
---
> show databases;
admin 0.000GB
config 0.000GB
local 0.000GB