แชแแขแ แฎแแแก แฌแแ แแแแฌแแ แ
แแแแฎแแแก แกแแคแฃแซแแแแ แแกแแแแ: แแแแกแฆแแช แแงแ แแ แแ แแ แแแฅแขแ, แแแแแแแ แแก แแงแ แแแขแแ แ แแแแแแแแ แแแแฃแแแแฃแ แ แแ แกแแ แแแขแแแแ, แแแแ แแ แแ แแแ แแแแแแแแแแแจแ แแก แแแแแแ แแ, แแแงแแคแแแ แแงแ แกแแ แแแกแแแแ, แ แแแแแแช แแแแแก แแฎแ แแ แแแแฌแงแ แแแแ แแกแแ แแแกแแแแ แแแงแแคแ แแ แจแแแแแ แแแกแจแขแแแฃแ แ. แแแแแแแแ แแแแแ, แแก แงแแแแแคแแ แ แแแแแแแ แจแแจแแแ VPS-แแ, แแแแแก แแแงแแแแแแกแ แแ แแแแแแแแแแก แแ แแชแแกแแแ, แ แแแแแแแแแแช แแแขแแแแขแแแแ แแแฃแแ แแงแ Ansible-แแก แแแแแงแแแแแแ แแ แแแแแแฃแแ แกแแ แแแกแ แจแแแแแแแแ แแงแ YAML แแแแคแแแฃแ แแชแแแ, แกแแญแแ แ แแแ แแแแขแ แแแแ แแ แแแกแแฆแแแแแแ, แแ แแแแแงแแแแแฃแแ แแงแ แแกแแแแกแ แแแแคแแแฃแ แแชแแแก แคแแแแ. แแแแแแฃแ แ แแแจแแแแ, แ แแช แซแแแแแ แแแกแแฎแแ แฎแแแแแ แแงแ, แ แแแแแ .k แแก แแแแคแแแฃแ แแชแแ แแขแแแ แแแแ แแแแแแแฃแ แแแแแฅแขแจแ, แ แแแแแแช แฎแแแแแกแแฌแแแแแแ แแ แแแฅแขแแก แแแแแกแแแแ แ แแแแแแแแแ.
แแฃแแชแ, แแแแ แแกแแ แแแกแแแแก แ แแแแแแแแแก แแ แแ, แแแแ แแแแจแแ แแแ แแ
แแแแกแแแ แแแแแแจแแ แแแแ, แจแแแชแแแแ แแแแคแแแฃแ แแชแแแก แแแแแฅแขแแก แแแแแแก แแแฅแแแแแแ, แ แแแ แจแแกแแซแแแแแแ แงแแคแแแแงแ แแฃแจแแแแ แ แแแแ แช แฉแแแแก แแแแกแแแฃแ แแแแคแแแฃแ แแชแแแก แคแแแแแแ, แแกแแแ Kuber-แแก แกแแแแฃแแแแแแแแแแ. แฃแคแ แ แฎแแกแขแ แแแแคแแแฃแ แแชแแแก แกแขแ แฃแฅแขแฃแ แ แแกแแแ แแแแแแแแฃแแ แแงแ แแแกแแแ แแแแแแแก แแแแแ, แจแแแแแแแแแ แแ:
Dict[str, Dict[str, Union[str, int, float]]]
แแแฃ, แกแแแแแแ cogfig แแ แแก แแแฅแกแแแแแ แแแกแแฎแแแแแฃแแ แกแแฅแชแแแแแ, แ แแแแแแแแแ แแแแแแฃแแ แแ แแก แแแฅแกแแแแแ แแแ แขแแแ แขแแแแแแแแ แแแแจแแแแแแแแแแ. แแ แกแแฅแชแแแแ แแฆแฌแแ แก แแแแคแแแฃแ แแชแแแก แแ แฌแแแแแแก แแแ แแแแฃแแ แขแแแแก แ แแกแฃแ แกแแแแ. แฉแแแแ แแแแคแแแฃแ แแชแแแก แแแฌแแแแก แแแแแแแแ:
adminka:
django_secret: "ExtraLongAndHardCode"
db_main:
engine: mysql
host: 256.128.64.32
user: cool_user
password: "SuperHardPassword"
redis:
host: 256.128.64.32
pw: "SuperHardPassword"
port: 26379
smtp:
server: smtp.gmail.com
port: 465
email: [email protected]
pw: "SuperHardPassword"
แแแแแ แแ แแก, แแแแ engine
แแแแแชแแแแ แแแแแแแก แแแงแแแแแ แจแแกแแซแแแแแแแ SQLite-แแ แแ redis
แแแแงแแแแ mock
, แแกแแแ แแแแแแแแฃแแแ แจแแกแแแแฎแ แคแแแแแก แกแแฎแแแ - แแก แแแ แแแแขแ แแแ แกแฌแแ แแ แแ แแก แแฆแแแ แแแฃแแ แแ แแแแฃแจแแแแแฃแแ, แ แแช แแแแแแแแแก แแแแแก แแแแแแแแ แแแแ แแแจแแแแแก แแแแแ แแแแกแแแแก, แแ แแแฃแแแก แขแแกแขแแ แแแแกแแแแก แแ แแแแแกแแแแ แ แกแฎแแ แกแแญแแ แแแแแกแแแแก. แแก แแแแกแแแฃแแ แแแแ แแแแจแแแแแแแแแแ แฉแแแแแแแก, แ แแแแแ แแ แกแแแแแก แแ แแแแแ แกแฎแแ แกแแญแแ แแแแ - แฉแแแแ แแแแแก แแแฌแแแ แแแแแฃแแแแแแแ แกแฎแแแแแกแฎแแ แแแแแแขแแแฃแ แ แแแแแแแแแแแกแแแแก, แแก แแฃแจแแแแก แแ แ แแฎแแแแ แแ แแแกแขแ แแ แแแฃแ แกแแ แแแ แแแแ, แแ แแแแ แกแฎแแแแแกแฎแแ แกแแ แแแขแแแแ แแ แแแแแแขแแแแกแแแแก แแแแแแฃแขแแ แแแแ, แ แแแแแแกแแช แกแญแแ แแแแแ แแฃแจแแแแ. แแ แแแแแ แแแ แแแแแชแแแแ แแแแฃแจแแแแแแก แแแแแแแฅแกแฃแ แ แแแแกแแแแแแแ แจแแแแจแคแแแแแแแ แแ แแแแแแแแแก แแแ แแจแ. แกแฎแแแแ แจแแ แแก, แชแฃแแ แแ แแฅแแแแ แแแแก แแแแแแ แแแ, แ แแ แฉแแแแ แซแแ แแแแแ แฎแแแกแแฌแงแแแแ, แแแแคแแแฃแ แแชแแแก แแแแแแแแแแก แแแแแก แฉแแแแแแ, แแแแแกแขแแแแ แแแฃแแแ setup.py
- แแ แแแ แแก แแแ แแแแแแแก แฉแแแแก แแแแก แแ แ แแแแกแแกแขแแแแจแ, แแแแขแคแแ แแแกแ แแ แแแแแงแแแแแแก แแแแแแแกแแแ แแแแแฃแแแแแแแแ.
Kubernetes pod-แแก แแฆแฌแแ แ แแกแ แแแแแแงแฃแ แแแ:
containers:
- name : enter-api
image: enter-api:latest
ports:
- containerPort: 80
volumeMounts:
- name: db-main-secret-volume
mountPath: /etc/secrets/db-main
volumes:
- name: db-main-secret-volume
secret:
secretName: db-main-secret
แแแฃ แแแแแแฃแแ แกแแแแฃแแแ แแฆแฌแแ แก แแ แ แแแแแแแแแก. แแแแแ แกแแแแฃแแแแแแแแ แแฅแแแแแ แแกแ:
apiVersion: v1
kind: Secret
metadata:
name: db-main-secret
type: Opaque
stringData:
db_main.yaml: |
engine: sqlite
filename: main.sqlite3
แแก แแ แแแ แแฌแแแแก YAML แคแแแแแแแก แจแแฅแแแแก แแแแแ /etc/secrets/db-main/section_name.yaml
แแ แแแแแแแแ แแแ แแแจแแแแแกแแแแก, แแแแคแแแฃแ แแชแแ แแแแแแงแแแแแ, แ แแแแแแช แแแแแแ แแแแก แแ แแแฅแขแแก root แแแ แแฅแขแแ แแแจแ แแ แแแ แแแแก แชแแแแแจแ แแแแแแแแฃแแ แแแแแแแก แแแกแฌแแ แแ. แแ แแแฎแแ แฎแแแฃแแแแแแ แแแกแฃแฎแแกแแแแแแแ แแแแ แจแแแแซแแแแ แแฎแแแแ แกแแแแแแ แจแ.
config.py
__author__ = 'AivanF'
__copyright__ = 'Copyright 2020, AivanF'
import os
import yaml
__all__ = ['config']
PROJECT_DIR = os.path.abspath(__file__ + 3 * '/..')
SECRETS_DIR = '/etc/secrets'
KEY_LOG = '_config_log'
KEY_DBG = 'debug'
def is_yes(value):
if isinstance(value, str):
value = value.lower()
if value in ('1', 'on', 'yes', 'true'):
return True
else:
if value in (1, True):
return True
return False
def update_config_part(config, key, data):
if key not in config:
config[key] = data
else:
config[key].update(data)
def parse_big_config(config, filename):
'''
Parse YAML config with multiple section
'''
if not os.path.isfile(filename):
return False
with open(filename) as f:
config_new = yaml.safe_load(f.read())
for key, data in config_new.items():
update_config_part(config, key, data)
config[KEY_LOG].append(filename)
return True
def parse_tiny_config(config, key, filename):
'''
Parse YAML config with a single section
'''
with open(filename) as f:
config_tiny = yaml.safe_load(f.read())
update_config_part(config, key, config_tiny)
config[KEY_LOG].append(filename)
def combine_config():
config = {
# To debug config load code
KEY_LOG: [],
# To debug other code
KEY_DBG: is_yes(os.environ.get('DEBUG')),
}
# For simple local runs
CONFIG_SIMPLE = os.path.join(PROJECT_DIR, 'config.yaml')
parse_big_config(config, CONFIG_SIMPLE)
# For container's tests
CONFIG_ENVVAR = os.environ.get('CONFIG')
if CONFIG_ENVVAR is not None:
if not parse_big_config(config, CONFIG_ENVVAR):
raise ValueError(
f'No config file from EnvVar:n'
f'{CONFIG_ENVVAR}'
)
# For K8s secrets
for path, dirs, files in os.walk(SECRETS_DIR):
depth = path[len(SECRETS_DIR):].count(os.sep)
if depth > 1:
continue
for file in files:
if file.endswith('.yaml'):
filename = os.path.join(path, file)
key = file.rsplit('.', 1)[0]
parse_tiny_config(config, key, filename)
return config
def build_config():
config = combine_config()
# Preprocess
for key, data in config.items():
if key.startswith('db_'):
if data['engine'] == 'sqlite':
data['filename'] = os.path.join(PROJECT_DIR, data['filename'])
# To verify correctness
if config[KEY_DBG]:
print(f'** Loaded config:n{yaml.dump(config)}')
else:
print(f'** Loaded config from: {config[KEY_LOG]}')
return config
config = build_config()
แแแแแแ แแฅ แกแแแแแแ แแแ แขแแแแ: แฉแแแ แแแแแแกแแแ แแแ แแแแคแแแฃแ แแชแแแแก แแ แแแฅแขแแก แแแ แแฅแขแแ แแแแแ แแ แแแแแแแแก แแแ แแแแก แชแแแแแแก แแแฎแแแแแ, แแ แแแแคแแแฃแ แแชแแแก แแชแแ แ แกแแฅแชแแแแก Kuber-แแก แกแแแแฃแแแแแแแแแ, แจแแแแแ แแ แฌแแแแกแฌแแ แแแแฃแจแแแแแ แแแ. แแแฃแก แ แแแแแแแแ แชแแแแแ. แแ แแฆแแแแจแแแ, แ แแ แกแแแแฃแแแแแแแแแ แคแแแแแแแก แซแแแแแกแแก แแแแแแงแแแแแ แกแแฆแ แแแก แจแแแฆแฃแแแ, แ แแแแแ K8s แฅแแแแก แแแแแแฃแ แกแแฅแแฆแแแแแก แแแแแแฃแ แกแแแแฃแแแแจแ, แกแแแแช แแแแแ แกแแแแฃแแแแแแแแ แแแแฎแแแ แแ แฃแแ แแแแ แแแฃแแ แแแแแแ แแแแก แฃแคแ แ แแแฆแแ แแแแแแ.
แแแแแแแแแแ, แ แแช แแฆแฌแแ แแแแ แแแแแแกแแแแก แกแแกแแ แแแแแ แแฅแแแแ :) แแแแแกแแแแ แ แแแแแแขแแ แ แแ แ แแแแแแแแแชแแ แฃแกแแคแ แแฎแแแแแก แแ แแแฃแแฏแแแแกแแแแก แกแฎแแ แกแคแแ แแแแแแ แแแแแแจแแ แแแแ แแแแฆแแแ. แกแแแแแแแแแแแก แแแ แแช แกแแแแขแแ แแกแแ, แแฅแแแ แฆแแ แก ConfigMaps-แแก แแฎแแ แแแญแแ แแก แแแแแขแแแ (แฉแแแแ แแ แแแฅแขแ แแแ แฏแแ แแ แแงแแแแแก) แแ แแแแแก แแแแแฅแแแงแแแแ GitHub / PyPI-แแ? แแแ แแแแ แแ แแคแแฅแ แแ, แ แแ แแกแแแแกแ แ แแ แซแแแแแ แแแแแแแแฃแแแฃแ แแ แแแแกแแแแก, แ แแ แแ แแแฅแขแแแ แแงแแก แฃแแแแแ แกแแแฃแ แ, แแ แชแแขแ แแแแแ แแแแฃแกแฌแแ แ แกแฎแแ แแแแแแแแแแแก แแแแฎแแ แชแแแแแแแแก, แ แแแแ แแชแแ แแฅ แแแชแแแฃแแ, แแ แแแฃแแแกแแแแก, แ แฉแแแแแแกแ แแ แกแแฃแแแแแกแ แแ แแฅแขแแแแก แแแแฎแแแแ, แ แแกแแช แแแแแแแแแแ, แแแฎแแแแ แแแแแแขแแ แแแจแ. , แกแแแแแ แแกแแ ๐
แแแแแแแแฎแแแจแ แแแแแฌแแแแแแ แจแแฃแซแแแแ แแฎแแแแ แแแ แแแแกแขแ แแ แแแฃแ แแแแฎแแแ แแแแแแก.
แฃแแแ แแแแแแแฅแแแงแแ แ แแแแ แช แแ แแแฅแขแ/แแแแแแแแแแ?
-
0,0%แแแแฎ, แแ แแแแแแแงแแแแแแ /contribution0
-
33,3%แแแแฎ, แแจแแแแแแ แแ แแฆแแ แก4
-
41,7%แแ แ, แแแ แฃแแแ แแแแแแแแก แแก แกแแแฃแแแ แคแแ แแแขแจแ แแ แแแแแกแ แกแแญแแ แแแแแแแก แจแแกแแแแแแกแแ5
-
25,0%แแแกแฃแฎแแกแแแ แแแแก แจแแแแแแแแ3
แแแกแชแ แฎแแ 12 แแแแฎแแแ แแแแแแ. 3 แแแแฎแแแ แแแแแแ แแแแ แจแแแแแแ.
แฌแงแแ แ: www.habr.com