Python 多环境配置管理
2020-02-24
一、概述
实际工程开发中常常会对开发、测试和生产等不同环境配置不同的数据库环境,传统方式可以通过添加不同环境的配置文件达到部署时的动态切换的效果。这种方式还不错,不过不同环境间往往会共享相同的配置而造成一些重复工作。
项目代码
./├── conf.py└── test.py
别看只有2个文件,实际情况是有十几个文件,这里只是举例而已!
conf.py 这个是配置文件,其他py文件都依赖于它
#!/usr/bin/env python3# coding: utf-8# 配置文件# k8s信息########################################## 开发环境####################K8S_MASTER = "192.168.0.162"K8S_USERNAME = "root"K8S_PASSWD = "root"# # 生产环境##################### K8S_MASTER = "10.0.0.167"# K8S_USERNAME = "root"# K8S_PASSWD = "abcd@1234"
test.py 测试文件,下面的代码时伪代码,仅供演示!
#!/usr/bin/env python3# coding: utf-8import confdef ssh2(ip,username,password,cmd): # 远程执行命令print(ip,username,password,cmd)return Trueres = ssh2(conf.K8S_MASTER,conf.K8S_USERNAME,conf.K8S_PASSWD,"uptime")print(res)
需求
目前情况是,执行test.py,是这样的
python3 test.py
如果需要切换环境,要修改conf.py,将对应的变量注释掉即可!
但是如果变量过多,注释就太麻烦了!需要有一个变量,能够一键切换环境
二、改造配置文件
一键切换
conf.py
#!/usr/bin/env python3# coding: utf-8# 配置文件import osclass Config(object): # 默认配置DEBUG = False# get attributedef __getitem__(self, key):return self.__getattribute__(key)class ProductionConfig(Config): # 生产环境K8S_MASTER = "10.0.0.167"K8S_USERNAME = "root"K8S_PASSWD = "abcd@1234"class DevelopmentConfig(Config): # 开发环境K8S_MASTER = "192.168.0.162"K8S_USERNAME = "root"K8S_PASSWD = "root"# 环境映射关系mapping = {'development': DevelopmentConfig,'production': ProductionConfig,'default': DevelopmentConfig}# 一键切换环境APP_ENV = os.environ.get('APP_ENV', 'default').lower() # 设置环境变量为defaultconfig = mapping[APP_ENV]() # 获取指定的环境
test.py 需要修改导入的模块
#!/usr/bin/env python3# coding: utf-8# import conffrom conf import config as confdef ssh2(ip,username,password,cmd): # 远程执行命令print(ip,username,password,cmd)return Trueres = ssh2(conf.K8S_MASTER,conf.K8S_USERNAME,conf.K8S_PASSWD,"uptime")print(res)
执行test.py,输出:
192.168.0.162 root root uptimeTrue
现在需要切换环境,直接修改 conf.py 的倒数第二行
APP_ENV = os.environ.get('APP_ENV', 'production').lower() # 设置环境变量为defaultconfig = mapping[APP_ENV]() # 获取指定的环境
再次执行test.py,输出:
10.0.0.167 root abcd@1234 uptimeTrue
脚本执行切换
改conf.py切换环境,不够灵活,需要执行脚本时,带一个参数,由这个参数来决定环境,比如:
python test.py dev
这样,就可以切换到开发环境!怎么做呢?
很简单,只需要修改conf.py即可!因为其他文件,都依赖于它
conf.py
#!/usr/bin/env python3# coding: utf-8# 配置文件import osclass Config(object): # 默认配置DEBUG = False# get attributedef __getitem__(self, key):return self.__getattribute__(key)class ProductionConfig(Config): # 生产环境K8S_MASTER = "10.0.0.167"K8S_USERNAME = "root"K8S_PASSWD = "abcd@1234"class DevelopmentConfig(Config): # 开发环境K8S_MASTER = "192.168.0.162"K8S_USERNAME = "root"K8S_PASSWD = "root"# 环境映射关系mapping = {'dev': DevelopmentConfig,'pro': ProductionConfig,'default': DevelopmentConfig}# # 一键切换环境# APP_ENV = os.environ.get('APP_ENV', 'production').lower() # 设置环境变量为default# config = mapping[APP_ENV]() # 获取指定的环境# 根据脚本参数,来决定用那个环境配置import sys# print(sys.argv)num = len(sys.argv) - 1 #参数个数if num < 1 or num > 1:exit("参数错误,必须传环境变量!比如: python xx.py dev|pro|default")env = sys.argv[1] # 环境# print(env)APP_ENV = os.environ.get('APP_ENV', env).lower()config = mapping[APP_ENV]() # 实例化对应的环境
再次执行test.py
python test.py
输出:
参数错误,必须传环境变量!比如: python xx.py dev|pro|default
切换到开发环境
python test.py dev
输出:
192.168.0.162 root root uptimeTrue
切换到生产环境
输出:
10.0.0.167 root abcd@1234 uptimeTrue
本文参考链接:
