Python爱好者Python 运维

用 Python 程序自动部署 MongoDB 服务器

2017-11-15  本文已影响14人  远飞的大雁2010

MongoDB 是一款非常棒的 NOSQL 数据库,其部署本身并不复杂。但是,这款软件的升级还是比较频繁的,每次升级都要重新部署也比较麻烦。作为一个经常写代码的,还是希望能通过程序自动去干这项工作。

主要步骤

  1. 安装新版数据库服务软件;
  2. 停止数据库服务;
  3. 定位最新版的安装目录,并将相关可执行文件连接 %windir% 目录下;
  4. 写入配置文件;
  5. 删除数据库服务;
  6. 安装数据库服务;
  7. 重启数据库服务;

相关代码

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')

其他代码

由于本程序使用了我自己编写的一些简化代码,其中的一些代码如下:

  1. 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]
  1. exec_shell
def exec_shell(cmd):
    '''
    执行系统命令。
    '''
    return os.system(cmd)

注意事项

上一篇 下一篇

猜你喜欢

热点阅读