用 Python 程序自动部署 MongoDB 服务器
2017-11-15 本文已影响14人
远飞的大雁2010
MongoDB 是一款非常棒的 NOSQL 数据库,其部署本身并不复杂。但是,这款软件的升级还是比较频繁的,每次升级都要重新部署也比较麻烦。作为一个经常写代码的,还是希望能通过程序自动去干这项工作。
主要步骤
- 安装新版数据库服务软件;
- 停止数据库服务;
- 定位最新版的安装目录,并将相关可执行文件连接
%windir%
目录下; - 写入配置文件;
- 删除数据库服务;
- 安装数据库服务;
- 重启数据库服务;
相关代码
import sys
import platform
from orange.deploy import *
from orange import exec_shell, read_shell
from orange.pyver import Ver, get_cur_ver
MONGOCONFIG = '''
systemLog:
destination: file
path: "{logpath}/mongodb.log"
logAppend: true
storage:
dbPath: "{dbpath}"
directoryPerDB: true
engine: "{engine}"
net:
bindIp: 127.0.0.1
port: 27017
'''
MONGOFILES = ('mongo.exe', 'mongod.exe', 'mongodump.exe',
'mongoexport.exe', 'mongoimport.exe')
SERVERNAME = 'MongoDb'
def win_deploy():
print('停止 MongoDb 服务')
exec_shell('sc stop %s' % (SERVERNAME))
cur_prg_path = get_cur_ver(Path('%PROGRAMFILES%/MongoDB').rglob('bin'))
print('最新版程序安装路径:%s' % (cur_prg_path))
dest = Path('%windir%')
for exefile in MONGOFILES:
dexefile = dest/exefile
if dexefile.exists():
dexefile.unlink()
dexefile.symlink_to(cur_prg_path/exefile)
print('连接 %s 到 %s 成功' % (dexefile, cur_prg_path/exefile))
root = get_path(SERVERNAME, False)[0]
data_path = root / 'data'
if not data_path.exists():
data_path.ensure()
print('创建数据目录:%s' % (data_path))
config_file = root/'mongo.conf'
print('写入配置文件 %s ' % (config_file))
config = {
'dbpath': data_path.as_posix(),
'logpath': root.as_posix(),
'engine': 'wiredTiger'}
if platform.architecture()[0] != '64bit':
config['engine'] = 'mmapv1'
print('本机使用32位处理器,使用 mmapv1 引擎')
config_file.text = MONGOCONFIG.format(**config)
print('删除服务配置')
exec_shell('sc delete %s' % (SERVERNAME))
print('重新配置服务')
cmd = '%s --install --serviceName "%s" --config "%s"' % (
'mongod.exe', SERVERNAME, config_file)
print(cmd)
exec_shell(cmd)
print('启动 MongoDB 服务')
exec_shell('sc start %s' % (SERVERNAME))
input('Press any key to continue')
其他代码
由于本程序使用了我自己编写的一些简化代码,其中的一些代码如下:
get_cur_ver
Pattern=R/r'\d+(\.\d+)*([ab]\d+)?' def find_ver(path): v=Pattern.search(str(path)) if v: return Version(v.group()) def get_cur_ver(paths): if paths: return list(sorted(paths,key=lambda x:find_ver(x)))[-1]
exec_shell
def exec_shell(cmd): ''' 执行系统命令。 ''' return os.system(cmd)
注意事项
- 如果仅仅是小版本升级,即 3.2.1 升级到 3.2.5 时,安装时会覆盖到原来的安装程序。故,不使用本程序来进行配置,可以先停止服务后安装,安装完成后重启服务即可。
- 32位的系统只能使用
mmapv1
数据引擎,64位系统推荐使用默认的数据 引擎wiredTiger
。 - 最重要的一点,运行本程序需要管理员权限。