前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python 多环境配置管理

Python 多环境配置管理

作者头像
py3study
发布2020-02-24 15:23:01
3.2K0
发布2020-02-24 15:23:01
举报
文章被收录于专栏:python3python3

一、概述

实际工程开发中常常会对开发、测试和生产等不同环境配置不同的数据库环境,传统方式可以通过添加不同环境的配置文件达到部署时的动态切换的效果。这种方式还不错,不过不同环境间往往会共享相同的配置而造成一些重复工作。

项目代码

代码语言:javascript
复制
./
├── conf.py
└── test.py

别看只有2个文件,实际情况是有十几个文件,这里只是举例而已!

conf.py 这个是配置文件,其他py文件都依赖于它

代码语言:javascript
复制
#!/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 测试文件,下面的代码时伪代码,仅供演示!

代码语言:javascript
复制
#!/usr/bin/env python3
# coding: utf-8

import conf

def ssh2(ip,username,password,cmd):  # 远程执行命令
    print(ip,username,password,cmd)
    return True

res = ssh2(conf.K8S_MASTER,conf.K8S_USERNAME,conf.K8S_PASSWD,"uptime")
print(res)

需求

目前情况是,执行test.py,是这样的

代码语言:javascript
复制
python3 test.py

如果需要切换环境,要修改conf.py,将对应的变量注释掉即可!

但是如果变量过多,注释就太麻烦了!需要有一个变量,能够一键切换环境

二、改造配置文件

一键切换

conf.py

代码语言:javascript
复制
#!/usr/bin/env python3
# coding: utf-8
# 配置文件
import os

class Config(object):  # 默认配置
    DEBUG = False
    # get attribute
    def __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()  # 设置环境变量为default
config = mapping[APP_ENV]()  # 获取指定的环境

test.py 需要修改导入的模块

代码语言:javascript
复制
#!/usr/bin/env python3
# coding: utf-8

# import conf
from conf import config as conf


def ssh2(ip,username,password,cmd):  # 远程执行命令
    print(ip,username,password,cmd)
    return True

res = ssh2(conf.K8S_MASTER,conf.K8S_USERNAME,conf.K8S_PASSWD,"uptime")
print(res)

执行test.py,输出:

代码语言:javascript
复制
192.168.0.162 root root uptime
True

 现在需要切换环境,直接修改 conf.py 的倒数第二行

代码语言:javascript
复制
APP_ENV = os.environ.get('APP_ENV', 'production').lower()  # 设置环境变量为default
config = mapping[APP_ENV]()  # 获取指定的环境

 再次执行test.py,输出:

代码语言:javascript
复制
10.0.0.167 root abcd@1234 uptime
True

脚本执行切换

改conf.py切换环境,不够灵活,需要执行脚本时,带一个参数,由这个参数来决定环境,比如:

代码语言:javascript
复制
python test.py dev

这样,就可以切换到开发环境!怎么做呢?

很简单,只需要修改conf.py即可!因为其他文件,都依赖于它

conf.py

代码语言:javascript
复制
#!/usr/bin/env python3
# coding: utf-8
# 配置文件
import os

class Config(object):  # 默认配置
    DEBUG = False
    # get attribute
    def __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

代码语言:javascript
复制
python test.py

 输出:

代码语言:javascript
复制
参数错误,必须传环境变量!比如: python xx.py dev|pro|default

切换到开发环境

代码语言:javascript
复制
python test.py dev

输出:

代码语言:javascript
复制
192.168.0.162 root root uptime
True

切换到生产环境

输出:

代码语言:javascript
复制
10.0.0.167 root abcd@1234 uptime
True

本文参考链接:

https://blog.yuanbin.me/posts/2018-02/2018-02-24_16-30-16/

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-02-20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、概述
    • 项目代码
      • 需求
      • 二、改造配置文件
        • 一键切换
          • 脚本执行切换
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档