Python 多環境配置管理

  • 2020 年 2 月 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-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

本文參考鏈接:

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