áá«áááŒá¬áá±ážáá®ááá±ážáá²á·áááºá
áá±ážááœááºážááá±á¬ááºáá¶ááŸá¬ á€ááá¯á·ááŒá áºáááº- áá áºáá»áááºá ááá±á¬áá»ááºáá áºáá¯ááŸááá²á·áááºá á¡á ááá¯ááºážááœáẠáááºážááẠá¡áá¯á¶ážáááºááŸá¯áá»á¬ážááŸáá·áº script áá»á¬ážáá«ááŸááá±á¬ áá±ážáááºáá±á¬ monolith ááŒá áºáá²á·áá±á¬áºáááºáž á¡áá»áááºááŒá¬áá¬áááºááŸáá·áºá¡áá»áŸ áááºážááẠáááºáá±á¬ááºááŸá¯áá»á¬ážá¡ááŒá áºááá¯á· ááá¯ááºážááŒá¬ážáᬠááŒá®ážááœá¬ážáá¬áᬠmicroservices áá»á¬ážá¡ááŒá áºááá¯á· ááá¯ááºážááŒá¬ážáá¬áá²á·áááºá ááá¯á·áá±á¬áẠá¡ááá¯ááºážá¡áá¬ááᯠááŒáŸáá·áºáááºáá²á·áááºá á¡á ááá¯ááºážááœááºá á€á¡áá¬á¡á¬ážáá¯á¶ážááᯠááᬠVPS ááœááºáá¯ááºáá±á¬ááºáá²á·ááŒá®ážá Ansible ááá¯á¡áá¯á¶ážááŒá¯á á¡ááá¯á¡áá»á±á¬ááºáá¯ááºáá±á¬ááºááá·áº áá¯ááºááá¯áááºááŸááºááŒááºážááŸáá·áº á¡áá¯á¶ážáá»ááŒááºážáá¯ááºáááºážá ááºáá»á¬ážá áááºáá±á¬ááºááŸá¯áá áºáá¯á á®á¡á¬áž ááá¯á¡ááºáá±á¬áááºáááºáá»á¬ážááŸáá·áºáá±á¬á·áá»á¬ážááŒáá·áº YAML config ááŒáá·áºá á¯á ááºážáá¬ážááŒá®ážá á¡áá¬ážáá° config ááá¯ááºááá¯á¡áá¯á¶ážááŒá¯áá¬ážáááºá .k ဠconfig ááᯠááá¹áá¬áá¯á¶ážááá¯ááºáá¬á¡áá¬ááá¹áá¯áá áºáá¯ááá¯á· áááºáá¬ážáá±á¬ááŒá±á¬áá·áºá ááá±á¬áá»ááºááŸá áááºááá·áºáá±áá¬ááŸáááᯠáááºáá±á¬ááºááá¯ááºáá±á¬ááŒá±á¬áá·áº local launches áá»á¬ážááẠá¡ááœááºá¡áááºááŒá±áá«áááºá
ááá¯á·áá±á¬áºá microservices á¡áá±á¡ááœááºá áááºážááá¯á·ááá»áááºáááºááŸá¯áá»á¬ážááŸáá·áº ááá¯ážáááºááŸá¯
á€ááá á¹á ááŸáá·áºá ááºáá»ááºážá áá»áœááºá¯ááºááá¯á·á classic config file ááŸáá·áº Kuber ááŸáá»áŸáá¯á·ááŸááºáá»ááºáá»á¬ážááŒáá·áº ááŸá áºáá»áá¯ážáá¯á¶ážáá¯ááºáá±á¬ááºááá¯ááºá á±ááẠááœá²á·á ááºážááŸá¯áá¯á¶á á¶á¡áá¬ááá¹áá¯áá áºáá¯áááºáá±á¬ááºááŒááºážá¡ááœáẠááá¹ááá¬ážá¡á¬áž ááŒá¯ááŒááºááœááºážáá¶áá¬ážáá«áááºá áááá Python ááá¬áá¬á áá¬ážááŒáá·áº á¡á±á¬ááºáá«á¡ááá¯ááºáž ááá¯ááá¯áááºážáá»ááºáá±á¬ config ááœá²á·á ááºážáá¯á¶ááá¯áááºáž áá±á¬áºááŒáá¬ážáá«áááºá
Dict[str, Dict[str, Union[str, int, float]]]
ááá¯ááá¯áááºááŸá¬á áá±á¬ááºáá¯á¶áž cogfig ááẠá¡áááºáá±ážáá¬ážáá±á¬ ááá¹ááá»á¬ážáá«ááŸááá±á¬ á¡áááá¬ááºááŒá áºááŒá®áž áá áºáá¯á á®ááẠááá¯ážááá¯ážá¡áá»áá¯ážá¡á á¬ážáá»á¬ážá០áááºááá¯ážáá»á¬ážááŸááá±á¬ á¡áááá¬ááºáá áºáá¯ááŒá áºáááºá ááŸáá·áº á¡ááá¯ááºážáá»á¬ážááẠá¡áá»áá¯á·áá±á¬á¡áá»áá¯ážá¡á á¬ážá á¡áááºážá¡ááŒá áºáá»á¬ážááœá²á·á ááºážáá¯á¶ááŸáá·áº áá¯á¶ážá áœá²ááœáá·áºááá¯á·ááᯠáá±á¬áºááŒáááºá áá»áœááºá¯ááºááá¯á·á config áá áºáá¯á á¥ááá¬áá áºáá¯á
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
ááááºážáááºážááẠááá¯ááºá¡áááºááá¯áááºáž áááºááŸááºááŒááºáž - á€áá±á¬ááºáá»á¬ážááᯠááŸááºáááºá
áœá¬ á¡ááá¡ááŸááºááŒá¯ááŒá®áž á
á®áá¶áá±á¬ááºááœááºáá¬ážáááºá áááºážááẠá¡ááŸá¬ážááŸá¬ááŒááºááŒááºážá áá°áá
áºá
ááºážáááºááŒááºážááŸáá·áº á¡ááŒá¬ážááá¯á¡ááºáá»ááºáá»á¬ážá¡ááœáẠá
ááºááœááºážáá¯ááºááᯠáá¯ááºáá±á¬ááºááẠááœááºáá°á
á±áááºá á¡ááŒá¬ážááá¯á¡ááºáá»ááºáá»á¬ážá
áœá¬ááŸááá±á¬ááŒá±á¬áá·áº áá»áœááºá¯ááºááá¯á·á¡ááœáẠá¡áá°ážá¡áá±ážááŒá®ážááẠ- áá»áœááºá¯ááºááá¯á·ááá¯ááºááá
áºá
áááºáá
áºááá¯ááºážááẠá¡áá»áá¯ážáá»áá¯ážáá±á¬ááœá²ááŒááºážá
áááºááŒá¬ááœááºáá»ááºááŸá¯áá»á¬ážá¡ááœáẠáááºááœááºáááºá áááºážááẠorchestration ááŒáá·áºáá¬áá¬áá»á¬ážáá±á«áºááœááºáá¬áá á¡áá»áá¯ážáá»áá¯ážáá±á¬ scripts áá»á¬ážááŸáá·áºáá« áá¯ááºáá±á¬ááºáááºááá¯á¡ááºáá±á¬ ááœá²ááŒááºážá
áááºááŒá¬áá°áááœááºáá»á°áá¬áá»á¬ážááœááºáááºáž áá¯ááºáá±á¬ááºáá«áááºá ááŸáá·áº backend ááŒá¿áá¬áá»á¬ážááᯠá
áá¯ážááááºá
áá¬áááá¯áá² ááŸá¯ááºááœá±ážáá±á¬ áá±áá¬áá¯ááºáá±á¬ááºááŒááºáž ááá¯ááºááá¯ááºážáá»á¬ážááᯠá¡ááŸá¬ážááŸá¬áá«á á
áá¬ážáá
ááºá config layout code á¡áá«á¡ááẠáá»áœááºá¯ááºááá¯á·á á¡ááá tools áá»á¬ážááŸáááá·áº install áá¯ááºáá¬ážáááºááᯠáá»áŸáá±ááẠáááááá¯ááºá
á±áá«á 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
ááŸáá·áº local launch áá»á¬ážá¡ááœáẠconfig ááᯠproject á root directory ááœáẠááá¯á·ááá¯áẠenvironment variable ááœáẠáááºááŸááºáá¬ážááá·áºáááºážááŒá±á¬ááºážáá áºáá»áŸá±á¬ááºááœááºááŸááá±á¬ config ááá¯á¡áá¯á¶ážááŒá¯áááºá á€á¡áááºááŒá±ááŸá¯áá»á¬ážá¡ááœáẠáá¬áááºááŸááá±á¬áá¯ááºááᯠspoiler ááœáẠááŒáá·áºááŸá¯ááá¯ááºáá«áááºá
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()
á€áá±áá¬ááœáẠáá¯áá¹áááá±áááẠá¡ááœááºááá¯ážááŸááºážáá«áááº- áá»áœááºá¯ááºááá¯á·ááẠááá±á¬áá»ááºáááºážááœáŸááºá០ááŒá®ážáá¬ážáá±á¬ configs áá»á¬ážááŸáá·áº áááºáááºážáá»áẠááŒá±á¬ááºážáá²ááá¯ááºáá±á¬ áááºážááŒá±á¬ááºážáá»á¬ážá¡ááá¯ááºá ááŸáá·áº Kuber áá»áŸáá¯á·ááŸááºáá»ááºáá»á¬ážá០áá±ážáááºáá±á¬ config á¡ááá¯ááºážáá»á¬ážááᯠáá±á«ááºážá ááºááŒá®áž áááºážááá¯á·ááᯠá¡áááºážááẠááŒáá¯áááºáá¯ááºáá±á¬ááºáá«áááºá ááá¯á·á¡ááŒáẠá¡áá»áá¯á·áá±á¬ ááááºážááŸááºáá»á¬ážá áá»áŸáá¯á·ááŸááºáá»ááºáá»á¬ážá០ááá¯ááºáá»á¬ážááᯠááŸá¬ááœá±ááá·áºá¡áá«ááœáẠK8s ááẠáá»áŸáá¯á·ááŸááºáá»ááºáá»á¬áž ááááºážáááºážáá¬ážááá·áº áá»áŸáá¯á·ááŸááºááá¯ááºáá áºáá¯á á®ááœáẠááŸááºáá¬ážáá±á¬ ááá¯ááºááœá²áá áºáá¯ááᯠáááºáá®ážáá±ážáᬠááá·áºááºáá áºáá¯ááẠááá¯ááá¯ááŒáá·áºáá¬ážáá±á¬á¡ááá·áºááœáẠááŸááá±áá±á¬ááŒá±á¬áá·áº ááŒá áºáááºá
áá±á¬áºááŒáá¬ážááá·áºá¡áá¬ááẠáá áºá á¯á¶áá áºáŠážá¡ááœáẠá¡áá¯á¶ážáááºáááá·áºáááºáᯠáá»áŸá±á¬áºááá·áºáááá«áááºá á¡ááá¯ááºážá¡ááá¯ááºážááááºááŒááºáá°ááá»ááºáááºáááºáž á áááºáááºá á¬ážá áá¬áá±á¬ááºážáááºá ConfigMaps (áá»áœááºá¯ááºááá¯á·áááá±á¬áá»ááºááẠáááºážááá¯á·ááᯠá¡áá¯á¶ážáááŒá¯ááá±ážáá«) ááŸáá·áº GitHub / PyPI ááœáẠáá¯ááºááá¯áá¯ááºáá±ááŒááºážá¡ááœáẠáá¶á·ááá¯ážááŸá¯áá±á«ááºážááá·áºááá·áºáá«ááá¬ážá áá¯áá¹ááá¯ááºáá±ážá¡áá á€á¡áá¬áá»á¬ážááẠuniversal ááŒá áºááẠááá±á¬áá»ááºáá»á¬ážá¡ááœáẠáá®ážááá·áºáááºááœááºážáááºáᯠáá»áœááºá¯ááºáááºáááºá á€áá±áá¬ááœááºáá±ážáá¬ážááá·áºá¡ááá¯ááºáž á¡ááŒá¬ážáá°áá»á¬ážá á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯áá»á¬ážááᯠá¡áááºážáááºáá»á±á¬ááºážááŒáá·áºáᬠááœá²ááŒá¬ážááŸá¯áá»á¬ážá á¡ááŒá¶ááŒá¯áá»ááºáá»á¬ážááŸáá·áº á¡áá±á¬ááºážáá¯á¶ážá¡áá±á·á¡áá»áá·áºáá»á¬ážá¡ááŒá±á¬ááºáž ááœá±ážááœá±ážááŒááºážááá¯á·ááᯠááŸááºáá»ááºáá»á¬ážááœáẠááŒááºááá¯ááºáááºáᯠáá»áŸá±á¬áºááá·áºáá«áááºá áá¯á¶áá±á¬ááºááŒá® ð
á
á¬áááºážááœááºážá¡áá¯á¶ážááŒá¯áá°áá»á¬ážáᬠá
á
áºáááºážááœáẠáá«áááºááá¯ááºáá«áááºá
ááá±á¬áá»ááº/á á¬ááŒáá·áºááá¯ááºá¡ááŒá Ạáá¯ááºáá±ááá·áºáá«ááá¬ážá
-
0,0%áá¯ááºáááºá áá« /contribution0 ááá¯áá¯á¶ážáááºá
-
33,3%áá¯ááºáááºá á¡á²áá«áá±á¬ááºážááẠá
-
41,7%ááá¯ááºáá°ážá áááºáá°á ááá¯áá·áºáá¯á¶á á¶áá²á· ááá¯áá·áºááá¯á¡ááºáá»ááºáá²á·ááá¯ááºáá®á¡á±á¬áẠáá¯ááºááá¯á·ááá¯ááá²á
-
25,0%ááŒá±ááá¯ááŒááºážá០ááŸá±á¬ááºááŒááºáá«ááẠá
á¡áá¯á¶ážááŒá¯áá° ááá áŠáž áá²áá±ážáá²á·áááºá á¡áá¯á¶ážááŒá¯áá° 12 áŠáž ááŒá¬ážáá±áá²á·áá«áááºá
source: www.habr.com