Python 多環境配置管理


一、概述

實際工程開發中常常會對開發、測試和生產等不同環境配置不同的數據庫環境,傳統方式可以通過添加不同環境的配置文件達到部署時的動態切換的效果。這種方式還不錯,不過不同環境間往往會共享相同的配置而造成一些重復工作。

 

項目代碼

./
├── 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"
View Code

 

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)
View Code

 

需求

目前情況是,執行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]()  # 獲取指定的環境
View Code

 

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]()  # 實例化對應的環境
View Code

 

再次執行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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM