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

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)

注意事项

  • 如果仅仅是小版本升级,即 3.2.1 升级到 3.2.5 时,安装时会覆盖到原来的安装程序。故,不使用本程序来进行配置,可以先停止服务后安装,安装完成后重启服务即可。
  • 32位的系统只能使用 mmapv1 数据引擎,64位系统推荐使用默认的数据 引擎 wiredTiger
  • 最重要的一点,运行本程序需要管理员权限。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,084评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,623评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,450评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,322评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,370评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,274评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,126评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,980评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,414评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,599评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,773评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,470评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,080评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,713评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,852评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,865评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,689评论 2 354

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,654评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,095评论 25 707
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,625评论 18 399
  • 文|elinor 前言: 对艺术品的观看并非只是走马观花的看而已,细微到绘画上色调的交叠变化、雕塑上衣褶的细小纹路...
    书啦圈阅读 475评论 0 4
  • 从 3 月底 4 月初一直拖到今天 5.15 ,早想把这一个月前前后后发生的事做个总结,把心里所想的表述出来,无奈...
    Codios阅读 195评论 0 0