Python如何实现多环境配置管理

发表于:2022-11-04 09:45

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:程序员曾曾    来源:稀土掘金

  一、概述
  实际工程开发中常常会对开发、测试和生产等不同环境配置不同的数据库环境,传统方式可以通过添加不同环境的配置文件达到部署时的动态切换的效果。这种方式还不错,不过不同环境间往往会共享相同的配置而造成一些重复工作。
  项目代码
  ./
  ├── 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-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,是这样的:
  python3 test.py
  如果需要切换环境,要修改conf.py,将对应的变量注释掉即可!
  但是如果变量过多,注释就太麻烦了!需要有一个变量,能够一键切换环境
  二、改造配置文件
  一键切换
  conf.py
  #!/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 需要修改导入的模块
  #!/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,输出:
  192.168.0.162 root root uptime
  True
  现在需要切换环境,直接修改 conf.py 的倒数第二行。
  APP_ENV = os.environ.get('APP_ENV', 'production').lower()  # 设置环境变量为default
  config = mapping[APP_ENV]()  # 获取指定的环境
  再次执行test.py,输出:
  10.0.0.167 root abcd@1234 uptime
  True
  脚本执行切换
  改conf.py切换环境,不够灵活,需要执行脚本时,带一个参数,由这个参数来决定环境,比如:
  python test.py dev
  这样,就可以切换到开发环境!怎么做呢?
  很简单,只需要修改conf.py即可!因为其他文件,都依赖于它
  conf.py
  #!/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
  python test.py
  输出:
  参数错误,必须传环境变量!比如: python xx.py dev|pro|default
  · 切换到开发环境
  python test.py dev
  输出:
  192.168.0.162 root root uptime
  True
  ·切换到生产环境
  输出:
  10.0.0.167 root abcd@1234 uptime
  True
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号