Kubernetes āĻ­āĻŋāϤāϰ⧇ āĻāĻŦāĻ‚ āĻŦāĻžāχāϰ⧇ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ

āφāĻŽāĻŋ āϏāĻŽā§āĻĒā§āϰāϤāĻŋ āϞāĻŋāϖ⧇āĻ›āĻŋ āĻĄāĻ•āĻžāϰ⧇ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ āĻœā§€āĻŦāύ āĻāĻŦāĻ‚ āĻāϰ āĻŦāĻžāχāϰ⧇ āĻĄāĻŋāĻŦāĻžāĻ—āĻŋāĻ‚ āϕ⧋āĻĄ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āωāĻ¤ā§āϤāϰ āĻĻāĻŋāύ, āϝ⧇āĻ–āĻžāύ⧇ āϤāĻŋāύāĻŋ āϏāĻ‚āĻ•ā§āώāĻŋāĻĒā§āϤāĻ­āĻžāĻŦ⧇ āωāĻ˛ā§āϞ⧇āĻ– āĻ•āϰ⧇āϛ⧇āύ āϝ⧇ āφāĻĒāύāĻŋ āύāĻŋāĻœā§‡āϰ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ āϝāĻžāϤ⧇ āϕ⧁āĻŦ⧇āϰ⧇ āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϟāĻŋ āĻ­āĻžāϞāĻ­āĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇, āĻ—ā§‹āĻĒāύ⧀āϝāĻŧāϤāĻž āϤ⧁āϞ⧇ āϧāϰ⧇ āĻāĻŦāĻ‚ āĻ¸ā§āĻĨāĻžāύ⧀āϝāĻŧāĻ­āĻžāĻŦ⧇ āϏ⧁āĻŦāĻŋāϧāĻžāϜāύāĻ•āĻ­āĻžāĻŦ⧇ āĻāĻŽāύāĻ•āĻŋ āĻĄāĻ•āĻžāϰ⧇āϰ āĻŦāĻžāχāϰ⧇āĻ“ āϚāϞ⧇āĨ¤ āĻ•āĻŋāϛ⧁ āϜāϟāĻŋāϞ āύāϝāĻŧ, āϤāĻŦ⧇ āĻŦāĻ°ā§āĻŖāĻŋāϤ "āϰ⧇āϏāĻŋāĻĒāĻŋ" āĻ•āĻžāϰ⧋ āϜāĻ¨ā§āϝ āωāĻĒāϝ⧋āĻ—ā§€ āĻšāϤ⧇ āĻĒāĻžāϰ⧇ :) āϕ⧋āĻĄāϟāĻŋ āĻĒāĻžāχāĻĨāύ⧇ āϰāϝāĻŧ⧇āϛ⧇, āĻ•āĻŋāĻ¨ā§āϤ⧁ āϝ⧁āĻ•ā§āϤāĻŋāϟāĻŋ āĻ­āĻžāώāĻžāϰ āϏāĻžāĻĨ⧇ āφāĻŦāĻĻā§āϧ āύāϝāĻŧāĨ¤

Kubernetes āĻ­āĻŋāϤāϰ⧇ āĻāĻŦāĻ‚ āĻŦāĻžāχāϰ⧇ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ

āĻĒā§āϰāĻļā§āύ⧇āϰ āĻĒāϟāĻ­ā§‚āĻŽāĻŋ āĻāχ: āĻāĻ• āϏāĻŽāϝāĻŧ āĻāĻ•āϟāĻŋ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ āĻ›āĻŋāϞ, āĻĒā§āϰāĻĨāĻŽā§‡ āĻāϟāĻŋ āχāωāϟāĻŋāϞāĻŋāϟāĻŋ āĻāĻŦāĻ‚ āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟ āϏāĻš āĻāĻ•āϟāĻŋ āϛ⧋āϟ āĻŽāύ⧋āϞāĻŋāĻĨ āĻ›āĻŋāϞ, āĻ•āĻŋāĻ¨ā§āϤ⧁ āϏāĻŽāϝāĻŧ⧇āϰ āϏāĻžāĻĨ⧇ āϏāĻžāĻĨ⧇ āĻāϟāĻŋ āĻŦ⧇āĻĄāĻŧ⧇āϛ⧇, āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϗ⧁āϞāĻŋāϤ⧇ āĻŦāĻŋāĻ­āĻ•ā§āϤ āĻšāϝāĻŧ⧇āϛ⧇, āϝāĻž āĻĢāϞāĻ¸ā§āĻŦāϰ⧂āĻĒ āĻŽāĻžāχāĻ•ā§āϰ⧋āϏāĻžāĻ°ā§āĻ­āĻŋāϏ⧇ āĻŦāĻŋāĻ­āĻ•ā§āϤ āĻšāϤ⧇ āĻļ⧁āϰ⧁ āĻ•āϰ⧇āϛ⧇ āĻāĻŦāĻ‚ āϤāĻžāϰāĻĒāϰ āĻ¸ā§āϕ⧇āϞ āφāĻĒ. āĻĒā§āϰāĻĨāĻŽā§‡, āĻāχ āϏāĻŽāĻ¸ā§āϤ āĻŦ⧇āϝāĻŧāĻžāϰ āĻ­āĻŋāĻĒāĻŋāĻāϏ-āĻ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āĻ›āĻŋāϞ, āϕ⧋āĻĄ āϏ⧇āϟ āφāĻĒ āĻāĻŦāĻ‚ āĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰāĻžāϰ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻžāϗ⧁āϞāĻŋ āϝāĻžāϰ āωāĻĒāϰ Ansible āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧāĻ­āĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āĻ›āĻŋāϞ, āĻāĻŦāĻ‚ āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻĒāϰāĻŋāώ⧇āĻŦāĻž āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧ āϏ⧇āϟāĻŋāĻ‚āϏ āĻāĻŦāĻ‚ āϕ⧀āϗ⧁āϞāĻŋāϰ āϏāĻžāĻĨ⧇ āĻāĻ•āϟāĻŋ YAML āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ⧇āϰ āϏāĻžāĻĨ⧇ āĻ•āĻŽā§āĻĒāĻžāχāϞ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āĻ›āĻŋāϞ, āĻāĻŦāĻ‚ āĻāĻ•āϟāĻŋ āĻ…āύ⧁āϰ⧂āĻĒ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻĢāĻžāχāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āĻ›āĻŋāϞ āĻ¸ā§āĻĨāĻžāύ⧀āϝāĻŧ āϞāĻžā§āϚāϗ⧁āϞāĻŋ, āϝāĻž āϖ⧁āĻŦ āϏ⧁āĻŦāĻŋāϧāĻžāϜāύāĻ• āĻ›āĻŋāϞ, āĻ•āĻžāϰāĻŖ .k āĻāχ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύāϟāĻŋ āĻāĻ•āϟāĻŋ āĻŦāĻŋāĻļā§āĻŦāĻŦā§āϝāĻžāĻĒā§€ āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸā§‡ āϞ⧋āĻĄ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇, āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ⧇āϰ āϝ⧇ āϕ⧋āύāĻ“ āϜāĻžāϝāĻŧāĻ—āĻž āĻĨ⧇āϕ⧇ āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏāϝ⧋āĻ—ā§āϝāĨ¤

āϝāĻžāχāĻšā§‹āĻ•, āĻŽāĻžāχāĻ•ā§āϰ⧋āϏāĻžāĻ°ā§āĻ­āĻŋāϏ⧇āϰ āϏāĻ‚āĻ–ā§āϝāĻž āĻŦ⧃āĻĻā§āϧāĻŋ, āϤāĻžāĻĻ⧇āϰ āϏāĻ‚āϝ⧋āĻ—, āĻāĻŦāĻ‚ āϕ⧇āĻ¨ā§āĻĻā§āϰ⧀āĻ­ā§‚āϤ āϞāĻ—āĻŋāĻ‚ āĻāĻŦāĻ‚ āĻĒāĻ°ā§āϝāĻŦ⧇āĻ•ā§āώāϪ⧇āϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ, āϕ⧁āĻŦ⧇āϰ⧇āϰ āĻāĻ•āϟāĻŋ āĻĒāĻĻāĻ•ā§āώ⧇āĻĒ⧇āϰ āĻĒā§‚āĻ°ā§āĻŦāĻžāĻ­āĻžāϏ āĻĻāĻŋāϝāĻŧ⧇āϛ⧇āύ, āϝāĻž āĻāĻ–āύāĻ“ āϚāϞāϛ⧇āĨ¤ āωāĻ˛ā§āϞāĻŋāĻ–āĻŋāϤ āϏāĻŽāĻ¸ā§āϝāĻžāϗ⧁āϞāĻŋ āϏāĻŽāĻžāϧāĻžāύ⧇ āϏāĻšāĻžāϝāĻŧāϤāĻžāϰ āϏāĻžāĻĨ⧇, āϕ⧁āĻŦāĻžāϰāύ⧇āϟāϏ āĻ…āĻŦāĻ•āĻžāĻ āĻžāĻŽā§‹ āĻŦā§āϝāĻŦāĻ¸ā§āĻĨāĻžāĻĒāύāĻžāϰ āϜāĻ¨ā§āϝ āϤāĻžāϰ āĻĒāĻ¨ā§āĻĨāĻžāϗ⧁āϞāĻŋ āĻ…āĻĢāĻžāϰ āĻ•āϰ⧇, āϝāĻžāϰ āĻŽāĻ§ā§āϝ⧇ āϰāϝāĻŧ⧇āϛ⧇ āϤāĻĨāĻžāĻ•āĻĨāĻŋāϤ āĻ—ā§‹āĻĒāύ⧀āϝāĻŧāϤāĻž и āϤāĻžāĻĻ⧇āϰ āϏāĻžāĻĨ⧇ āĻ•āĻžāϜ āĻ•āϰāĻžāϰ āωāĻĒāĻžāϝāĻŧ. āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻžāϟāĻŋ āĻŽāĻžāύāĻ• āĻāĻŦāĻ‚ āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ, āϤāĻžāχ āĻāϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āύāĻž āĻ•āϰāĻž āφāĻ•ā§āώāϰāĻŋāĻ• āĻ…āĻ°ā§āĻĨ⧇āχ āĻāĻ•āϟāĻŋ āĻĒāĻžāĻĒ! āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻāĻ•āχ āϏāĻŽāϝāĻŧ⧇, āφāĻŽāĻŋ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ⧇āϰ āϏāĻžāĻĨ⧇ āĻ•āĻžāϜ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āφāĻŽāĻžāϰ āĻŦāĻ°ā§āϤāĻŽāĻžāύ āĻŦāĻŋāĻ¨ā§āϝāĻžāϏ āĻŦāϜāĻžāϝāĻŧ āϰāĻžāĻ–āϤ⧇ āϚāĻžāχ: āĻĒā§āϰāĻĨāĻŽāϤ, āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ⧇āϰ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āĻŽāĻžāχāĻ•ā§āϰ⧋āϏāĻžāĻ°ā§āĻ­āĻŋāϏ⧇ āĻāĻ•āχāĻ­āĻžāĻŦ⧇ āĻāϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻāĻŦāĻ‚ āĻĻā§āĻŦāĻŋāϤ⧀āϝāĻŧāϤ, āĻāĻ•āϟāĻŋ āϏāĻžāϧāĻžāϰāĻŖ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻ¸ā§āĻĨāĻžāύ⧀āϝāĻŧ āĻŽā§‡āĻļāĻŋāύ⧇ āϕ⧋āĻĄ āϚāĻžāϞāĻžāϤ⧇ āϏāĻ•ā§āώāĻŽ āĻšāϤ⧇ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻĢāĻžāχāϞāĨ¤

āĻāχ āĻŦāĻŋāώāϝāĻŧ⧇, āφāĻŽāĻžāĻĻ⧇āϰ āĻ•ā§āϞāĻžāϏāĻŋāĻ• āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ āĻĢāĻžāχāϞ āĻāĻŦāĻ‚ āϕ⧁āĻŦ⧇āϰ⧇āϰ āĻ—ā§‹āĻĒāύ⧀āϝāĻŧāϤāĻž āωāĻ­āϝāĻŧ⧇āϰ āϏāĻžāĻĨ⧇ āĻ•āĻžāϜ āĻ•āϰāϤ⧇ āϏāĻ•ā§āώāĻŽ āĻšāĻ“āϝāĻŧāĻžāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āϤ⧈āϰāĻŋāϰ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻžāϟāĻŋ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āĻ›āĻŋāϞāĨ¤ āϤ⧃āϤ⧀āϝāĻŧ āĻĒāĻžāχāĻĨāύ⧇āϰ āĻ­āĻžāώāĻžāϝāĻŧ āφāϰāĻ“ āĻ•āĻ ā§‹āϰ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻ•āĻžāĻ āĻžāĻŽā§‹āĻ“ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āĻ›āĻŋāϞ, āύāĻŋāĻŽā§āύāϰ⧂āĻĒ:

Dict[str, Dict[str, Union[str, int, float]]]

āĻ…āĻ°ā§āĻĨāĻžā§Ž, āĻšā§‚āĻĄāĻŧāĻžāĻ¨ā§āϤ āĻ•āĻ—āĻĢāĻŋāĻ— āĻšāϞ āύāĻžāĻŽāϝ⧁āĻ•ā§āϤ āĻŦāĻŋāĻ­āĻžāĻ— āϏāĻš āĻāĻ•āϟāĻŋ āĻ…āĻ­āĻŋāϧāĻžāύ, āϝāĻžāϰ āĻĒā§āϰāϤāĻŋāϟāĻŋ āϏāĻžāϧāĻžāϰāĻŖ āĻĒā§āϰāĻ•āĻžāϰ⧇āϰ āĻŽāĻžāύ āϏāĻš āĻāĻ•āϟāĻŋ āĻ…āĻ­āĻŋāϧāĻžāύāĨ¤ āĻāĻŦāĻ‚ āĻŦāĻŋāĻ­āĻžāĻ—āϗ⧁āϞāĻŋ āĻāĻ•āϟāĻŋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āϧāϰāϪ⧇āϰ āϏāĻ‚āĻ¸ā§āĻĨāĻžāύāϗ⧁āϞāĻŋāϰ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ āĻāĻŦāĻ‚ āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ āĻŦāĻ°ā§āĻŖāύāĻž āĻ•āϰ⧇āĨ¤ āφāĻŽāĻžāĻĻ⧇āϰ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ⧇āϰ āĻāĻ•āϟāĻŋ āĻ…āĻ‚āĻļ⧇āϰ āĻāĻ•āϟāĻŋ āωāĻĻāĻžāĻšāϰāĻŖ:

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: info@test.com
  pw: "SuperHardPassword"

āĻāĻ•āχ āϏāĻ™ā§āϗ⧇ āĻŽāĻžāĻ  engine āĻĄāĻžāϟāĻžāĻŦ⧇āϏ SQLite āĻ āχāύāĻ¸ā§āϟāϞ āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇, āĻāĻŦāĻ‚ redis āϏ⧇āϟ mock, āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻĢāĻžāχāϞ⧇āϰ āύāĻžāĻŽāĻ“ āωāĻ˛ā§āϞ⧇āĻ– āĻ•āϰ⧇ - āĻāχ āĻĒāϰāĻžāĻŽāĻŋāϤāĻŋāϗ⧁āϞāĻŋ āϏāĻ āĻŋāĻ•āĻ­āĻžāĻŦ⧇ āĻ¸ā§āĻŦā§€āĻ•ā§ƒāϤ āĻāĻŦāĻ‚ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻžāϜāĻžāϤ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇, āϝāĻž āĻĄāĻŋāĻŦāĻžāĻ—āĻŋāĻ‚, āχāωāύāĻŋāϟ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻāĻŦāĻ‚ āĻ…āĻ¨ā§āϝ āϝ⧇āϕ⧋āύ⧋ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧇āϰ āϜāĻ¨ā§āϝ āĻ¸ā§āĻĨāĻžāύ⧀āϝāĻŧāĻ­āĻžāĻŦ⧇ āϕ⧋āĻĄ āϚāĻžāϞāĻžāύ⧋ āϏāĻšāϜ āĻ•āϰ⧇ āϤ⧋āϞ⧇āĨ¤ āĻāϟāĻŋ āφāĻŽāĻžāĻĻ⧇āϰ āϜāĻ¨ā§āϝ āĻŦāĻŋāĻļ⧇āώāĻ­āĻžāĻŦ⧇ āϗ⧁āϰ⧁āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ āĻ•āĻžāϰāĻŖ āφāϰāĻ“ āĻ…āύ⧇āĻ• āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧāϤāĻž āϰāϝāĻŧ⧇āϛ⧇ - āφāĻŽāĻžāĻĻ⧇āϰ āϕ⧋āĻĄā§‡āϰ āĻ…āĻ‚āĻļāϟāĻŋ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āĻŦāĻŋāĻļā§āϞ⧇āώāĻŖāĻžāĻ¤ā§āĻŽāĻ• āĻ—āĻŖāύāĻžāϰ āωāĻĻā§āĻĻ⧇āĻļā§āϝ⧇ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇, āĻāϟāĻŋ āϕ⧇āĻŦāϞ āĻ…āĻ°ā§āϕ⧇āĻ¸ā§āĻŸā§āϰ⧇āĻļāύ āϏāĻš āϏāĻžāĻ°ā§āĻ­āĻžāϰāϗ⧁āϞāĻŋāϤ⧇āχ āύāϝāĻŧ, āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟāϗ⧁āϞāĻŋāϰ āϏāĻžāĻĨ⧇ āĻāĻŦāĻ‚ āĻŦāĻŋāĻļā§āϞ⧇āώāĻ•āĻĻ⧇āϰ āĻ•āĻŽā§āĻĒāĻŋāωāϟāĻžāϰ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇ āϝāĻžāĻĻ⧇āϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻ•āĻžāϜ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇āĨ¤ āĻāĻŦāĻ‚ āĻŦā§āϝāĻžāĻ•āĻāĻ¨ā§āĻĄ āϏāĻŽāĻ¸ā§āϝāĻž āϚāĻŋāĻ¨ā§āϤāĻž āύāĻž āĻ•āϰ⧇ āϜāϟāĻŋāϞ āĻĄā§‡āϟāĻž āĻĒā§āϰāϏ⧇āϏāĻŋāĻ‚ āĻĒāĻžāχāĻĒāϞāĻžāχāύ āĻĄāĻŋāĻŦāĻžāĻ— āĻ•āϰ⧁āύāĨ¤ āϝāĻžāχāĻšā§‹āĻ•, āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āϞ⧇āφāωāϟ āϕ⧋āĻĄ āϏāĻš āφāĻŽāĻžāĻĻ⧇āϰ āĻĒā§āϰāϧāĻžāύ āϏāϰāĻžā§āϜāĻžāĻŽāϗ⧁āϞāĻŋ āĻāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āχāύāĻ¸ā§āϟāϞ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇ āϤāĻž āĻļ⧇āϝāĻŧāĻžāϰ āĻ•āϰāϤ⧇ āĻ•ā§āώāϤāĻŋ āĻšāĻŦ⧇ āύāĻž setup.py - āĻāĻ•āϏāĻžāĻĨ⧇ āĻāϟāĻŋ āφāĻŽāĻžāĻĻ⧇āϰ āϕ⧋āĻĄāϕ⧇ āĻāĻ•āϟāĻŋ āĻāĻ•āĻ• āχāϕ⧋āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡ āĻāĻ•āĻ¤ā§āϰāĻŋāϤ āĻ•āϰ⧇, āĻĒā§āĻ˛ā§āϝāĻžāϟāĻĢāĻ°ā§āĻŽ āĻāĻŦāĻ‚ āĻŦā§āϝāĻŦāĻšāĻžāϰ⧇āϰ āĻĒāĻĻā§āϧāϤāĻŋ āĻĨ⧇āϕ⧇ āĻ¸ā§āĻŦāĻžāϧ⧀āύāĨ¤

āĻāĻ•āϟāĻŋ Kubernetes āĻĒāĻĄā§‡āϰ āĻŦāĻ°ā§āĻŖāύāĻž āĻāχ āĻŽāϤ āĻĻ⧇āĻ–āĻžāϝāĻŧ:

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

āĻāĻŦāĻ‚ āĻ¸ā§āĻĨāĻžāύ⧀āϝāĻŧ āϞāĻžā§āĻšā§‡āϰ āϜāĻ¨ā§āϝ, āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšāϝāĻŧ, āϝāĻž āĻĒā§āϰāĻœā§‡āĻ•ā§āĻŸā§‡āϰ āϰ⧁āϟ āĻĄāĻŋāϰ⧇āĻ•ā§āϟāϰāĻŋāϤ⧇ āĻŦāĻž āĻĒāϰāĻŋāĻŦ⧇āĻļ āϭ⧇āϰāĻŋāϝāĻŧ⧇āĻŦāϞ⧇ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻĒāĻĨ āĻŦāϰāĻžāĻŦāϰ āĻ…āĻŦāĻ¸ā§āĻĨāĻŋāϤāĨ¤ āĻāχ āϏ⧁āĻŦāĻŋāϧāĻžāϰ āϜāĻ¨ā§āϝ āĻĻāĻžāϝāĻŧā§€ āϕ⧋āĻĄāϟāĻŋ āĻ¸ā§āĻĒāϝāĻŧāϞāĻžāϰ⧇ āĻĻ⧇āĻ–āĻž āϝāĻžāϝāĻŧāĨ¤

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()

āĻāĻ–āĻžāύ⧇ āϝ⧁āĻ•ā§āϤāĻŋāϟāĻŋ āĻŦ⧇āĻļ āϏāĻšāϜ: āφāĻŽāϰāĻž āĻĒā§āϰāĻœā§‡āĻ•ā§āϟ āĻĄāĻŋāϰ⧇āĻ•ā§āϟāϰāĻŋ āĻĨ⧇āϕ⧇ āĻŦāĻĄāĻŧ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻāĻŦāĻ‚ āĻāύāĻ­āĻžāϝāĻŧāϰāύāĻŽā§‡āĻ¨ā§āϟ āϭ⧇āϰāĻŋāϝāĻŧ⧇āĻŦāϞ āĻĻā§āĻŦāĻžāϰāĻž āĻĒāĻžāĻĨ āĻāĻŦāĻ‚ āϕ⧁āĻŦ⧇āϰ āϏāĻŋāĻ•ā§āϰ⧇āϟāϏ āĻĨ⧇āϕ⧇ āϛ⧋āϟ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻŦāĻŋāĻ­āĻžāĻ—āϗ⧁āϞāĻŋāϕ⧇ āĻāĻ•āĻ¤ā§āϰāĻŋāϤ āĻ•āϰāĻŋ, āĻāĻŦāĻ‚ āϤāĻžāϰāĻĒāϰ⧇ āϏ⧇āϗ⧁āϞāĻŋāϕ⧇ āĻāĻ•āϟ⧁ āĻĒā§āϰāĻŋāĻĒā§āϰāϏ⧇āϏ āĻ•āϰāĻŋāĨ¤ āĻĒā§āϞāĻžāϏ āĻ•āĻŋāϛ⧁ āϭ⧇āϰāĻŋāϝāĻŧ⧇āĻŦāϞ. āφāĻŽāĻŋ āϞāĻ•ā§āĻˇā§āϝ āĻ•āϰāĻŋ āϝ⧇ āĻ—ā§‹āĻĒāύ⧀āϝāĻŧāϤāĻž āĻĨ⧇āϕ⧇ āĻĢāĻžāχāϞāϗ⧁āϞāĻŋ āĻ…āύ⧁āϏāĻ¨ā§āϧāĻžāύ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ, āĻāĻ•āϟāĻŋ āĻ—āĻ­ā§€āϰāϤāĻž āϏ⧀āĻŽāĻžāĻŦāĻĻā§āϧāϤāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšāϝāĻŧ, āĻ•āĻžāϰāĻŖ K8s āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻ—ā§‹āĻĒāύ⧀āϝāĻŧāϤāĻžāϝāĻŧ āĻāĻ•āϟāĻŋ āϞ⧁āĻ•āĻžāύ⧋ āĻĢā§‹āĻ˛ā§āĻĄāĻžāϰ āϤ⧈āϰāĻŋ āĻ•āϰ⧇ āϝ⧇āĻ–āĻžāύ⧇ āĻ—ā§‹āĻĒāύ⧀āϝāĻŧāϤāĻžāϗ⧁āϞāĻŋ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰāĻž āĻšāϝāĻŧ āĻāĻŦāĻ‚ āϕ⧇āĻŦāϞāĻŽāĻžāĻ¤ā§āϰ āĻāĻ•āϟāĻŋ āϞāĻŋāĻ™ā§āĻ• āωāĻšā§āϚ āĻ¸ā§āϤāϰ⧇ āĻ…āĻŦāĻ¸ā§āĻĨāĻŋāϤāĨ¤

āφāĻŽāĻŋ āφāĻļāĻž āĻ•āϰāĻŋ āϝ⧇ āĻŦāĻ°ā§āĻŖāύāĻž āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇ āϤāĻž āĻ•āĻžāϰ⧋ āϜāĻ¨ā§āϝ āωāĻĒāϝ⧋āĻ—ā§€ āĻšāĻŦ⧇ :) āύāĻŋāϰāĻžāĻĒāĻ¤ā§āϤāĻž āĻŦāĻž āωāĻ¨ā§āύāϤāĻŋāϰ āϜāĻ¨ā§āϝ āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āĻ•ā§āώ⧇āĻ¤ā§āϰ āϏāĻŽā§āĻĒāĻ°ā§āĻ•āĻŋāϤ āϕ⧋āύ āĻŽāĻ¨ā§āϤāĻŦā§āϝ āĻāĻŦāĻ‚ āϏ⧁āĻĒāĻžāϰāĻŋāĻļ āĻ—ā§ƒāĻšā§€āϤ āĻšāϝāĻŧāĨ¤ āϏāĻŽā§āĻĒā§āϰāĻĻāĻžāϝāĻŧ⧇āϰ āĻŽāϤāĻžāĻŽāϤāĻ“ āφāĻ•āĻ°ā§āώāĻŖā§€āϝāĻŧ, āϏāĻŽā§āĻ­āĻŦāϤ āĻāϟāĻŋ āĻ•āύāĻĢāĻŋāĻ—āĻŽā§āϝāĻžāĻĒ (āφāĻŽāĻžāĻĻ⧇āϰ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ āĻāĻ–āύāĻ“ āϏ⧇āϗ⧁āϞāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āύāĻž) āĻāĻŦāĻ‚ GitHub/PyPI-āϤ⧇ āϕ⧋āĻĄ āĻĒā§āϰāĻ•āĻžāĻļ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āϏāĻŽāĻ°ā§āĻĨāύ āϝ⧋āĻ— āĻ•āϰāĻž āĻŽā§‚āĻ˛ā§āϝāĻŦāĻžāύ? āĻŦā§āϝāĻ•ā§āϤāĻŋāĻ—āϤāĻ­āĻžāĻŦ⧇, āφāĻŽāĻŋ āĻŽāύ⧇ āĻ•āϰāĻŋ āϝ⧇ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒāϗ⧁āϞāĻŋ āϏāĻžāĻ°ā§āĻŦāϜāύ⧀āύ āĻšāĻ“āϝāĻŧāĻžāϰ āϜāĻ¨ā§āϝ āĻāχ āϜāĻžāϤ⧀āϝāĻŧ āϜāĻŋāύāĻŋāϏāϗ⧁āϞāĻŋ āϖ⧁āĻŦ āĻ¸ā§āĻŦāϤāĻ¨ā§āĻ¤ā§āϰ, āĻāĻŦāĻ‚ āĻāĻ–āĻžāύ⧇ āĻĻ⧇āĻ“āϝāĻŧāĻž āĻāĻ•āϟāĻŋāϰ āĻŽāϤ⧋ āĻ…āĻ¨ā§āϝ āϞ⧋āϕ⧇āĻĻ⧇āϰ āĻŦāĻžāĻ¸ā§āϤāĻŦāĻžāϝāĻŧāύ⧇āϰ āĻĻāĻŋāϕ⧇ āĻāĻ•āϟ⧁ āωāρāĻ•āĻŋ āĻĻ⧇āĻ“āϝāĻŧāĻž, āĻāĻŦāĻ‚ āϏ⧂āĻ•ā§āĻˇā§āĻŽāϤāĻž, āϟāĻŋāĻĒāϏ āĻāĻŦāĻ‚ āϏāĻ°ā§āĻŦā§‹āĻ¤ā§āϤāĻŽ āĻ…āύ⧁āĻļā§€āϞāύ⧇āϰ āφāϞ⧋āϚāύāĻž, āϝāĻž āφāĻŽāĻŋ āĻŽāĻ¨ā§āϤāĻŦā§āϝ⧇ āĻĻ⧇āĻ–āϤ⧇ āφāĻļāĻž āĻ•āϰāĻŋ , āϝāĻĨ⧇āĻˇā§āϟ 😉

āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āύāĻŋāĻŦāĻ¨ā§āϧāĻŋāϤ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰāĻž āϜāϰāĻŋāĻĒ⧇ āĻ…āĻ‚āĻļāĻ—ā§āϰāĻšāĻŖ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŦ⧇āύāĨ¤ āϏāĻžāχāύ āχāύ āĻ•āϰ⧁āύāĻ•āϰ⧁āύāĨ¤

āφāĻŽāĻŋ āĻāĻ•āϟāĻŋ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ/āϞāĻžāχāĻŦā§āϰ⧇āϰāĻŋ āĻšāĻŋāϏāĻžāĻŦ⧇ āĻĒā§āϰāĻ•āĻžāĻļ āĻ•āϰāĻž āωāϚāĻŋāϤ?

  • ā§Žā§Ļ%āĻšā§āϝāĻžāρ, āφāĻŽāĻŋ /contribution0 āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŦ

  • ā§Žā§Ļ%āĻšā§āϝāĻžāρ, āĻāϟāĻž āĻŽāĻšāĻžāύ āĻļā§‹āύāĻžāĻšā§āϛ⧇4

  • ā§Žā§Ļ%āύāĻž, āϝāĻžāϰāĻž āĻāϟāĻŋ āϤāĻžāĻĻ⧇āϰ āύāĻŋāϜāĻ¸ā§āĻŦ āĻŦāĻŋāĻ¨ā§āϝāĻžāϏ⧇ āĻāĻŦāĻ‚ āϤāĻžāĻĻ⧇āϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āĻ…āύ⧁āϏāĻžāϰ⧇ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇

  • ā§Žā§Ļ%āφāĻŽāĻŋ āωāĻ¤ā§āϤāϰ āĻĻ⧇āĻ“āϝāĻŧāĻž āĻĨ⧇āϕ⧇ āĻŦāĻŋāϰāϤ āĻĨāĻžāĻ•āĻŦ 3

12 āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āĻ­ā§‹āϟ āĻĻāĻŋāϝāĻŧ⧇āϛ⧇āύāĨ¤ 3 āϜāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āĻŦāĻŋāϰāϤ āĻ›āĻŋāϞ⧇āύāĨ¤

āωāĻ¤ā§āϏ: www.habr.com