ααααΈαααααααα»αααΆαααααα
ααΆαααΆαααααα½αααΊαααα ααΌααααααααΆααααααααα½α αααααααΌαα‘αΎαααΆααΆ monolith ααΌα αα½ααααααΆαα§αααααααααΎααααΆαα αα·αααααααΈα ααα»ααααααΌαααα ααΆααΆαααΈαααα‘αΎα αααα ααααΆααααΆαααα ααααα αααα»ααααα αΆααααααΎααααα αααα ααΆ microservices αα·α αααααΆαααααααααΈαα ααααΌα α’αααΈαααΆααα’αααααααααΌαααΆαααααΎαα ααΎ VPS ααα ααααΎαααΆαααααΆαααα‘αΎα αα·αααΆαααΆαααααααΆαααΌααααααααΎαααΆααααααααααααααααα·αααααααΎ Ansible α αΎαααααΆααααααΈαα½ααααααΌαααΆαα αααααααΆαα½αααΆαααααααα ααΆαααααααα YAML ααΆαα½αααΉαααΆαααααα αα·αααα αΆαααΆα α α αΎαα―αααΆαααααααα ααΆααααααααααααααααααΆαααααααΌαααΆαααααΎαααααΆαα ααΆαααΎαααααΎαααΆααααα»ααααα»α αααααΆααααα½αααΆαα ααΈααααα .k ααΆαααααααα ααΆαααααααααααααααΌαααΆααααα»ααα αααα»αααααα»ααα αααα’αΆα α αΌαααααΎααΆαααΈαααααααΈαααααααααα»αααααααα
αααααΆαααΆαααΆααααα ααΆαααΎαα‘αΎαααα
ααα½αααααΆααΈααααΌ ααΆααααααΆαααααααα½ααα αα·α
αααα»ααααααα ααααααΆααααααΆααααΆαααΆααααααααα»ααααααα ααΆααααααααααααΌαααΆααααααα ααΎααααΈα’αΆα ααααΎαααΆαααΆααααΆαα½αα―αααΆαααααααα ααΆαααααααααα»ααΆαααααααΎα αα·ααααα’αΆααααααΆααααΈ Kuber α αα ααΆααααααααααααααα ααΆααααααααααΉαααΆααααααααααΌαααΆααααααΆααααααα ααΆααΆααΆαααα Python ααΈααΈααΌα ααΆααααααα
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
ααααααααΆαααααααααΌααααααα―αααΆααααααααΌααααααΆαα»α - αααΆαααΆααααααααΆαααααααααΌαααΆαααα½αααααΆαα αα·αααααΎαααΆααααΆαααααΉαααααΌα αααααααΎα±ααααΆααΆααααα½ααααα»αααΆαααααΎαααΆαααΌααααα»αααΌαααααΆααααααΆααααΆαααααα α»α ααΆαααααΎαααααα―αααΆ αα·ααααααΌαααΆααααααααααα αααααΆαααΆααααααΆααααΆαα·ααααααααΆααααΎα ααΈαααααααΆααααααΌαααΆαααΆα
αααΎαααα - αααααααααΌαααααααΎαααααΌαααΆαααααα»ααα»ααααααΆααααΆαααααΆαα·ααΆααααααα ααΆααααΎαααΆααα·αααααΉαααααΎαααΆαααΈααααααααΆαααΆα orchestration ααα»ααααααα ααα»ααααααααΆαααααααΈααααααα αα·ααα
ααΎαα»αααααΌαααααααα’ααααα·ααΆααααααααΌαααΆαααααΎααΆαααΆαααα αα·αααααΆααααα α»ααααααααααΎαααΆααα·αααααααααα»αααααααΆαααααα·αααΆααααααΈαααα αΆαααααααΆααααααα αα·ααΆαα’ααα
αΉα ααΆααΉααα·αααΊα
αΆαααααααα»αααΆαα
αααααααααΆα§αααααααααΆαααααααααΎα αα½αααΆααααΌαααααααααααααααΌαααΆαααα‘αΎαααΆαααα 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
α αΎααααααΆααααΆαααΎαααααΎαααΆααααα»αααααα ααΆααααααααααΌαααΆαααααΎ αααααΆαααΈααΆαααα αααα»αααα«ααααααααα α¬ααΆαααααΌααααααΆααααααΆαααα αααα»αα’αααααα·ααααΆαα αααααΌααααααα½ααα»αααααΌαα ααααααΆαααΆααααα½αααΆαααααα’αΆα ααΎαααΎααα αααα»α 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()
αααααα·ααααΆαα ααΈαααααΊααΆααααααΆααα ααΎααα½ααααα αΌαααααΆααΌαααΆαααααααααααΈαααααααα αα·αααααΌααααα’αααααα·ααααΆα αα·ααααααααααααα ααΆααααααααααΌα αααΈ Kuber secrets α αΎααααααΆααααααααΎαααΆααα½αααΆααΆαα»αααααα·α α ααΌαα’ααααα½αα ααα½αα αααα»αααααααααΆααααΆαα ααααααααααα―αααΆαααΈα’αΆααααααΆαα ααΆααααααααααα ααααΌαααΆαααααΎ ααΈααααα K8s αααααΎααααααααΆαααα αααα»αα’αΆααααααΆααααΈαα½αα αααα’αΆααααααΆαααααα½αα―αααααΌαααΆααααααΆαα»α α αΎαααααΆααααααααα½ααααα·ααα ααααα·ααααααααΆαα
αααα»ααααααΉαααΆα’αααΈαααααΆααα·αααααΆααΉαααΆααααααααααααααΆααααααΆααααΆαα :) ααΆααααα·ααααα αα·αα’αα»ααΆαααααΆααααααΉααα»ααααα·ααΆα α¬ααααααααααααααααααΆααααΆααααααα’ααααΌαααΆαααα½αααα ααα·αααααα αααααααα½αα±ααα αΆααα’αΆααααααααααα αααα ααααΆααΆααΆααααααααααααααΆαααΆαααααααααΆαα ConfigMaps (ααααααααααααΎααα·αααΆααααααΎαα½αααΆαα) αα·αααΆαααααα»αααααΌααα ααΎ GitHub / PyPI? αααααααΆαα αααα»ααα·αααΆααΏαααααααααΆααααααααα»ααααααααααααΆααααααααααΆααα α αΎαααΆααααααΉαααΎαααΆαα’αα»ααααααααα’αααααααααααα·α ααΌα ααΆα’αααΈαααααΆααααααα±αααα ααΈααα αα·αααΆααα·ααΆααααΆα’αααΈααΆααα»αααααΆ αααααΉα αα·αααΆαα’αα»ααααααα’αααα»α ααααααα»ααααααΉαααΆααΉαααΎααα αααα»αααα·ααααα αααααααααΆααα αΎα π
ααΆαααα’αααααααΎααααΆαααααααΆαα
α»ααααααααα»ααααααααα’αΆα
α
αΌααα½ααααα»αααΆααααααααα·αααα
ααΎαααα»ααα½αααααα»αααααΆαααααα/αααααΆααααα?
-
0,0%ααΆα/α αΆα αααα»αααΉαααααΎ /contribution0
-
33,3%ααΆα ααααΆαααα ααα’ααΆαα α€
-
41,7%αα α’αααααΆααααΌαααΆαααααΎααΆααααααα½αα―αααΆααααααααααααα½ααα αα·αααααααααΆααααααΌαααΆααααααα½ααα α₯
-
25,0%αααα»αααΉαααα·ααααα·αααααΎα α£
α’αααααααΎααααΆαα 12 ααΆααααΆαααααααααα α’αααααααΎααααΆαα α¦α£ ααΆααααααΌαααΆαα αΆαααΆααα
ααααα: www.habr.com