āύāĻŋāĻ°ā§āĻĻ⧇āĻļāĻžāĻŦāϞ⧀: āϕ⧀āĻ­āĻžāĻŦ⧇ āωāĻ¤ā§āϤāϰāϝ⧋āĻ—ā§āϝ āĻ­ā§‚āĻŽāĻŋāĻ•āĻž āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāĻž āϝāĻžāϝāĻŧ āĻāĻŦāĻ‚ āĻ‰ā§ŽāĻĒāĻžāĻĻāύ⧇āϰ āφāϗ⧇ āϏāĻŽāĻ¸ā§āϝāĻžāϗ⧁āϞāĻŋ āϖ⧁āρāĻœā§‡ āĻŦ⧇āϰ āĻ•āϰāĻž āϝāĻžāϝāĻŧ

āĻšā§āϝāĻžāϞ⧋ āϏāĻŦāĻžāχ!

āφāĻŽāĻŋ āĻāĻ•āϟāĻŋ āĻšā§‹āĻŸā§‡āϞ āĻŦ⧁āĻ•āĻŋāĻ‚ āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϝāĻŧ āĻāĻ•āϜāύ DevOps āĻĒā§āϰāĻ•ā§ŒāĻļāϞ⧀ āĻšāĻŋāϏāĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰāĻŋāĨ¤ Ostrovok.ru. āĻāχ āύāĻŋāĻŦāĻ¨ā§āϧ⧇, āφāĻŽāĻŋ āωāĻ¤ā§āϤāϰāϝ⧋āĻ—ā§āϝ āĻ­ā§‚āĻŽāĻŋāĻ•āĻž āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāĻžāϰ āφāĻŽāĻžāĻĻ⧇āϰ āĻ…āĻ­āĻŋāĻœā§āĻžāϤāĻž āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āĻ•āĻĨāĻž āĻŦāϞāϤ⧇ āϚāĻžāχāĨ¤

Ostrovok.ru-āĻ, āφāĻŽāϰāĻž āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ āĻŽā§āϝāĻžāύ⧇āϜāĻžāϰ āĻšāĻŋāϏ⧇āĻŦ⧇ āĻāύāϏāĻŋāĻŦāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŋāĨ¤ āϏāĻŽā§āĻĒā§āϰāϤāĻŋ, āφāĻŽāϰāĻž āĻ­ā§‚āĻŽāĻŋāĻ•āĻžāϗ⧁āϞāĻŋ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāĻžāϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧇ āĻāϏ⧇āĻ›āĻŋ, āϤāĻŦ⧇ āĻāϟāĻŋ āĻĻ⧇āĻ–āĻž āϗ⧇āϛ⧇, āĻāϰ āϜāĻ¨ā§āϝ āĻāϤāϗ⧁āϞāĻŋ āϏāϰāĻžā§āϜāĻžāĻŽ āύ⧇āχ - āϏāĻŦāĻšā§‡āϝāĻŧ⧇ āϜāύāĻĒā§āϰāĻŋāϝāĻŧ, āϏāĻŽā§āĻ­āĻŦāϤ, āĻ…āϪ⧁ āĻ•āĻžāĻ āĻžāĻŽā§‹, āϤāĻžāχ āφāĻŽāϰāĻž āĻāϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžāϰ āϏāĻŋāĻĻā§āϧāĻžāĻ¨ā§āϤ āύāĻŋāϝāĻŧ⧇āĻ›āĻŋāĨ¤ āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻĻ⧇āĻ–āĻž āϗ⧇āϞ āϝ⧇ āϤāĻžāϰ āĻĄāϕ⧁āĻŽā§‡āĻ¨ā§āĻŸā§‡āĻļāύ āĻ…āύ⧇āĻ• āĻ¤ā§āϰ⧁āϟāĻŋ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āύ⧀āϰāĻŦāĨ¤ āφāĻŽāϰāĻž āϰāĻžāĻļāĻŋāϝāĻŧāĻžāύ āĻ­āĻžāώāĻžāϝāĻŧ āĻāĻ•āϟāĻŋ āĻĒāĻ°ā§āϝāĻžāĻĒā§āϤ āĻŦāĻŋāĻļāĻĻ āĻŽā§āϝāĻžāύ⧁āϝāĻŧāĻžāϞ āϖ⧁āρāĻœā§‡ āĻĒāĻžāχāύāĻŋ, āϤāĻžāχ āφāĻŽāϰāĻž āĻāχ āύāĻŋāĻŦāĻ¨ā§āϧāϟāĻŋ āϞ⧇āĻ–āĻžāϰ āϏāĻŋāĻĻā§āϧāĻžāĻ¨ā§āϤ āύāĻŋāϝāĻŧ⧇āĻ›āĻŋāĨ¤

āύāĻŋāĻ°ā§āĻĻ⧇āĻļāĻžāĻŦāϞ⧀: āϕ⧀āĻ­āĻžāĻŦ⧇ āωāĻ¤ā§āϤāϰāϝ⧋āĻ—ā§āϝ āĻ­ā§‚āĻŽāĻŋāĻ•āĻž āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāĻž āϝāĻžāϝāĻŧ āĻāĻŦāĻ‚ āĻ‰ā§ŽāĻĒāĻžāĻĻāύ⧇āϰ āφāϗ⧇ āϏāĻŽāĻ¸ā§āϝāĻžāϗ⧁āϞāĻŋ āϖ⧁āρāĻœā§‡ āĻŦ⧇āϰ āĻ•āϰāĻž āϝāĻžāϝāĻŧ

āĻ…āϪ⧁

āĻ…āϪ⧁ - āωāĻ¤ā§āϤāϰāϝ⧋āĻ—ā§āϝ āĻ­ā§‚āĻŽāĻŋāĻ•āĻž āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāϤ⧇ āϏāĻžāĻšāĻžāĻ¯ā§āϝ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻ•āĻžāĻ āĻžāĻŽā§‹āĨ¤

āϏāϰāϞ⧀āĻ•ā§ƒāϤ āĻŦāĻ°ā§āĻŖāύāĻž: āĻ…āϪ⧁ āφāĻĒāύāĻžāϰ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ•āϰāĻž āĻĒā§āĻ˛ā§āϝāĻžāϟāĻĢāĻ°ā§āĻŽā§‡ āĻāĻ•āϟāĻŋ āωāĻĻāĻžāĻšāϰāĻŖ āϤ⧈āϰāĻŋ āĻ•āϰ⧇ (āĻ•ā§āϞāĻžāωāĻĄ, āĻ­āĻžāĻ°ā§āϚ⧁āϝāĻŧāĻžāϞ āĻŽā§‡āĻļāĻŋāύ, āϧāĻžāϰāĻ•; āφāϰāĻ“ āĻŦāĻŋāĻļāĻĻ āĻŦāĻŋāĻŦāϰāϪ⧇āϰ āϜāĻ¨ā§āϝ, āĻŦāĻŋāĻ­āĻžāĻ—āϟāĻŋ āĻĻ⧇āϖ⧁āύ āϚāĻžāϞāĻ•), āĻāϟāĻŋāϤ⧇ āφāĻĒāύāĻžāϰ āĻ­ā§‚āĻŽāĻŋāĻ•āĻž āϚāĻžāϞāĻžāϝāĻŧ, āϤāĻžāϰāĻĒāϰ āĻĒāϰ⧀āĻ•ā§āώāĻž āϚāĻžāϞāĻžāϝāĻŧ āĻāĻŦāĻ‚ āωāĻĻāĻžāĻšāϰāĻŖāϟāĻŋ āĻŽā§āϛ⧇ āĻĻ⧇āϝāĻŧāĨ¤ āĻāĻ•āϟāĻŋ āϧāĻžāĻĒ⧇ āĻŦā§āϝāĻ°ā§āĻĨāϤāĻžāϰ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇, āĻ…āϪ⧁ āφāĻĒāύāĻžāϕ⧇ āĻāϟāĻŋ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āĻ…āĻŦāĻšāĻŋāϤ āĻ•āϰāĻŦ⧇āĨ¤

āĻāĻ–āύ āφāϰ⧋.

āϤāĻ¤ā§āĻ¤ā§āĻŦ āĻāĻ•āϟāĻŋ āĻŦāĻŋāϟ

āĻ…āϪ⧁āϰ āĻĻ⧁āϟāĻŋ āĻŽā§‚āϞ āϏāĻ¤ā§āϤāĻž āĻŦāĻŋāĻŦ⧇āϚāύāĻž āĻ•āϰ⧁āύ: āĻĻ⧃āĻļā§āϝāĻ•āĻ˛ā§āĻĒ āĻāĻŦāĻ‚ āĻĄā§āϰāĻžāχāĻ­āĻžāϰāĨ¤

āĻĻ⧃āĻļā§āϝāĻĒāϟ

āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āĻŸā§‡ āϕ⧀, āϕ⧋āĻĨāĻžāϝāĻŧ, āϕ⧀āĻ­āĻžāĻŦ⧇ āĻāĻŦāĻ‚ āϕ⧀ āĻ•ā§āϰāĻŽāĻžāύ⧁āϏāĻžāϰ⧇ āϏāĻžā§āϚāĻžāϞāĻŋāϤ āĻšāĻŦ⧇ āϤāĻžāϰ āĻŦāĻ°ā§āĻŖāύāĻž āϰāϝāĻŧ⧇āϛ⧇āĨ¤ āĻāĻ•āϟāĻŋ āĻ­ā§‚āĻŽāĻŋāĻ•āĻžāϰ āĻŦ⧇āĻļ āĻ•āϝāĻŧ⧇āĻ•āϟāĻŋ āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟ āĻĨāĻžāĻ•āϤ⧇ āĻĒāĻžāϰ⧇ āĻāĻŦāĻ‚ āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻĒāĻĨ āĻŦāϰāĻžāĻŦāϰ āĻāĻ•āϟāĻŋ āĻĄāĻŋāϰ⧇āĻ•ā§āϟāϰāĻŋ <role>/molecule/<scenario>, āϝāĻž āĻĒāϰ⧀āĻ•ā§āώāĻžāϰ āϜāĻ¨ā§āϝ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧ āĻ•ā§āϰāĻŋāϝāĻŧāĻžāϗ⧁āϞāĻŋāϰ āĻŦāĻ°ā§āĻŖāύāĻž āϰāϝāĻŧ⧇āϛ⧇⧎ āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟ āĻ…āĻ¨ā§āϤāĻ°ā§āϭ⧁āĻ•ā§āϤ āĻ•āϰāĻž āφāĻŦāĻļā§āϝāĻ• default, āϝāĻž āφāĻĒāύāĻŋ āĻāĻ•āϟāĻŋ āĻ…āϪ⧁ āĻĻāĻŋāϝāĻŧ⧇ āĻ­ā§‚āĻŽāĻŋāĻ•āĻž āĻļ⧁āϰ⧁ āĻ•āϰāϞ⧇ āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧāĻ­āĻžāĻŦ⧇ āϤ⧈āϰāĻŋ āĻšāĻŦ⧇āĨ¤ āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤ āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟāϗ⧁āϞāĻŋāϰ āύāĻžāĻŽ āφāĻĒāύāĻžāϰ āωāĻĒāϰ āύāĻŋāĻ°ā§āĻ­āϰ āĻ•āϰ⧇āĨ¤

āĻāĻ•āϟāĻŋ āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āĻŸā§‡ āĻĒāϰ⧀āĻ•ā§āώāĻžāϰ āĻ•ā§āϰāĻŋāϝāĻŧāĻžāϗ⧁āϞāĻŋāϰ āĻ•ā§āϰāĻŽ āĻŦāϞāĻž āĻšāϝāĻŧ āϜāϰāĻžāϝāĻŧ⧁, āĻāĻŦāĻ‚ āĻĄāĻŋāĻĢāĻ˛ā§āϟāϰ⧂āĻĒ⧇ āĻāϟāĻŋ āĻšāϞ:

(āĻĒāĻĻāĻ•ā§āώ⧇āĻĒ āϞ⧇āĻŦ⧇āϞ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇ ?, āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āĻĻā§āĻŦāĻžāϰāĻž āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āύāĻž āĻšāϞ⧇ āĻĄāĻŋāĻĢāĻ˛ā§āϟāϰ⧂āĻĒ⧇ āĻŦāĻžāĻĻ āĻĻ⧇āĻ“āϝāĻŧāĻž āĻšāϝāĻŧ)

  • lint - āϚāϞāĻŽāĻžāύ āϞāĻŋāĻ¨ā§āϟāĻžāϰāĨ¤ āĻĄāĻŋāĻĢāĻ˛ā§āϟāϰ⧂āĻĒ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšāϝāĻŧ yamllint и flake8,
  • destroy - āĻ…āϪ⧁āϰ āĻļ⧇āώ āϞāĻžā§āϚ āĻĨ⧇āϕ⧇ āĻĻ⧃āĻˇā§āϟāĻžāĻ¨ā§āϤ āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻž (āϝāĻĻāĻŋ āĻĨāĻžāϕ⧇),
  • dependency? - āĻĒāϰ⧀āĻ•ā§āώāĻŋāϤ āĻ­ā§‚āĻŽāĻŋāĻ•āĻžāϰ āωāĻ¤ā§āϤāϰāϝ⧋āĻ—ā§āϝ āύāĻŋāĻ°ā§āĻ­āϰāϤāĻžāϰ āχāύāĻ¸ā§āϟāϞ⧇āĻļāύ,
  • syntax - āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻ­ā§‚āĻŽāĻŋāĻ•āĻžāϰ āϏāĻŋāύāĻŸā§āϝāĻžāĻ•ā§āϏ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāĻž āĻšāĻšā§āϛ⧇ ansible-playbook --syntax-check,
  • create - āĻāĻ•āϟāĻŋ āωāĻĻāĻžāĻšāϰāĻŖ āϤ⧈āϰāĻŋ āĻ•āϰāĻž,
  • prepare? - āωāĻĻāĻžāĻšāϰāϪ⧇āϰ āĻĒā§āϰāĻ¸ā§āϤ⧁āϤāĻŋ; āϝ⧇āĻŽāύ python2 āĻšā§‡āĻ•/āχāύāĻ¸ā§āϟāϞ āĻ•āϰ⧁āύ
  • converge - āĻĒā§āϞ⧇āĻŦ⧁āĻ• āϞāĻžā§āϚ āĻ•āϰāĻž āĻšāĻšā§āϛ⧇ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāĻž āĻšāĻšā§āϛ⧇,
  • idempotence - āĻ…āĻĻāĻŽā§āϝāϤāĻž āĻĒāϰ⧀āĻ•ā§āώāĻžāϰ āϜāĻ¨ā§āϝ āĻĒā§āϞ⧇āĻŦ⧁āĻ• āĻĒ⧁āύāϰāĻžāϝāĻŧ āϚāĻžāϞ⧁ āĻ•āϰāĻž,
  • side_effect? - āĻ•ā§āϰāĻŋāϝāĻŧāĻžāϗ⧁āϞāĻŋ āϏāϰāĻžāϏāϰāĻŋ āĻ­ā§‚āĻŽāĻŋāĻ•āĻžāϰ āϏāĻžāĻĨ⧇ āϏāĻŽā§āĻĒāĻ°ā§āĻ•āĻŋāϤ āύāϝāĻŧ, āϤāĻŦ⧇ āĻĒāϰ⧀āĻ•ā§āώāĻžāϰ āϜāĻ¨ā§āϝ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧ,
  • verify - āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻĢāϞāĻžāĻĢāϞ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ⧇āϰ āĻĒāϰ⧀āĻ•ā§āώāĻž āϚāϞāϛ⧇ testinfra(āĻĄāĻŋāĻĢāĻ˛ā§āϟ) /goss/inspec,
  • cleanup? - (āύāϤ⧁āύ āϏāĻ‚āĻ¸ā§āĻ•āϰāϪ⧇) - āĻŽā§‹āϟāĻžāĻŽā§āϟāĻŋāĻ­āĻžāĻŦ⧇ āĻŦāϞāϤ⧇ āϗ⧇āϞ⧇, āĻ…āϪ⧁ āĻĻā§āĻŦāĻžāϰāĻž āĻĒā§āϰāĻ­āĻžāĻŦāĻŋāϤ āĻŦāĻžāĻšā§āϝāĻŋāĻ• āĻ…āĻŦāĻ•āĻžāĻ āĻžāĻŽā§‹ "āĻĒāϰāĻŋāĻˇā§āĻ•āĻžāϰ āĻ•āϰāĻž",
  • destroy - āĻāĻ•āϟāĻŋ āωāĻĻāĻžāĻšāϰāĻŖ āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻž āĻšāĻšā§āϛ⧇

āĻāχ āĻ•ā§āϰāĻŽāϟāĻŋ āĻŦ⧇āĻļāĻŋāϰāĻ­āĻžāĻ— āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇āχ āĻ•āĻ­āĻžāϰ āĻ•āϰ⧇, āϤāĻŦ⧇ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧇ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤

āωāĻĒāϰ⧇āϰ āĻĒā§āϰāϤāĻŋāϟāĻŋ āϧāĻžāĻĒ⧇āϰ āϏāĻžāĻĨ⧇ āφāϞāĻžāĻĻāĻžāĻ­āĻžāĻŦ⧇ āϚāĻžāϞāĻžāύ⧋ āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇ molecule <command>. āϤāĻŦ⧇ āĻāϟāĻŋ āĻŦā§‹āĻāĻž āωāϚāĻŋāϤ āϝ⧇ āĻāχ āϜāĻžāϤ⧀āϝāĻŧ āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻ•ā§āϞāĻŋ-āĻ•āĻŽāĻžāĻ¨ā§āĻĄā§‡āϰ āϜāĻ¨ā§āϝ āύāĻŋāϜāĻ¸ā§āĻŦ āĻ•ā§āϰāĻŋāϝāĻŧāĻžāϗ⧁āϞāĻŋāϰ āĻ•ā§āϰāĻŽ āĻĨāĻžāĻ•āϤ⧇ āĻĒāĻžāϰ⧇, āϝāĻž āφāĻĒāύāĻŋ āĻ•āĻžāĻ°ā§āϝāĻ•āϰ āĻ•āϰāĻžāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āϖ⧁āρāĻœā§‡ āĻĒ⧇āϤ⧇ āĻĒāĻžāϰ⧇āύ molecule matrix <command>. āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āϚāĻžāϞāĻžāύ⧋āϰ āϏāĻŽāϝāĻŧ converge (āĻĒāϰ⧀āĻ•ā§āώāĻžāϰ āĻ…āϧ⧀āύ⧇ āĻĒā§āϞ⧇āĻŦ⧁āĻ• āϚāĻžāϞāĻžāύ⧋), āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤ āĻ•ā§āϰāĻŋāϝāĻŧāĻžāϗ⧁āϞāĻŋ āϏāĻžā§āϚāĻžāϞāĻŋāϤ āĻšāĻŦ⧇:

$ molecule matrix converge
...
└── default         # ĐŊаСваĐŊиĐĩ ҁ҆ĐĩĐŊĐ°Ņ€Đ¸Ņ
    ├── dependency  # ŅƒŅŅ‚Đ°ĐŊОвĐēа ĐˇĐ°Đ˛Đ¸ŅĐ¸ĐŧĐžŅŅ‚ĐĩĐš
    ├── create      # ŅĐžĐˇĐ´Đ°ĐŊиĐĩ иĐŊŅŅ‚Đ°ĐŊŅĐ°
    ├── prepare     # ĐŋŅ€ĐĩĐ´ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēа иĐŊŅŅ‚Đ°ĐŊŅĐ°
    └── converge    # ĐŋŅ€ĐžĐŗĐžĐŊ ĐŋĐģĐĩĐšĐąŅƒĐēа

āĻāχ āĻ•āĻ°ā§āĻŽā§‡āϰ āĻ•ā§āϰāĻŽ āϏāĻŽā§āĻĒāĻžāĻĻāύāĻž āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇. āϤāĻžāϞāĻŋāĻ•āĻž āĻĨ⧇āϕ⧇ āĻ•āĻŋāϛ⧁ āϝāĻĻāĻŋ āχāϤāĻŋāĻŽāĻ§ā§āϝ⧇āχ āĻ•āϰāĻž āĻšāϝāĻŧ⧇ āĻĨāĻžāϕ⧇, āϤāĻžāĻšāϞ⧇ āϤāĻž āĻŦāĻžāĻĻ āĻĻ⧇āĻ“āϝāĻŧāĻž āĻšāĻŦ⧇āĨ¤ āĻŦāĻ°ā§āϤāĻŽāĻžāύ āĻ…āĻŦāĻ¸ā§āĻĨāĻž, āϏ⧇āχāϏāĻžāĻĨ⧇ āĻĻ⧃āĻˇā§āϟāĻžāĻ¨ā§āϤ⧇āϰ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ, āĻ…āϪ⧁ āĻĄāĻŋāϰ⧇āĻ•ā§āϟāϰāĻŋāϤ⧇ āϏāĻžā§āϚāϝāĻŧ āĻ•āϰ⧇ $TMPDIR/molecule/<role>/<scenario>.

āϏāĻ™ā§āϗ⧇ āϧāĻžāĻĒ āϝ⧋āĻ— āĻ•āϰ⧁āύ ? āφāĻĒāύāĻŋ āωāĻ¤ā§āϤāϰāϝ⧋āĻ—ā§āϝ-āĻĒā§āϞ⧇āĻŦ⧁āĻ• āĻŦāĻŋāĻ¨ā§āϝāĻžāϏ⧇ āĻĒāĻ›āĻ¨ā§āĻĻāϏāχ āĻ•ā§āϰāĻŋāϝāĻŧāĻžāϗ⧁āϞāĻŋ āĻŦāĻ°ā§āĻŖāύāĻž āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ āĻāĻŦāĻ‚ āϧāĻžāĻĒ āĻ…āύ⧁āϏāĻžāϰ⧇ āĻĢāĻžāχāϞ⧇āϰ āύāĻžāĻŽ āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ: prepare.yml/side_effect.yml. āĻāχ āĻĢāĻžāχāϞāϗ⧁āϞāĻŋ āφāĻļāĻž āĻ•āϰ⧁āύ āĻ…āϪ⧁āϟāĻŋ āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟ āĻĢā§‹āĻ˛ā§āĻĄāĻžāϰ⧇ āĻĨāĻžāĻ•āĻŦ⧇āĨ¤

āϚāĻžāϞāĻ•

āĻĄā§āϰāĻžāχāĻ­āĻžāϰ āĻšāϞ āĻāĻ•āϟāĻŋ āϏāĻ¤ā§āϤāĻž āϝ⧇āĻ–āĻžāύ⧇ āĻĒāϰ⧀āĻ•ā§āώāĻžāϰ āωāĻĻāĻžāĻšāϰāĻŖ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤
āĻ¸ā§āĻŸā§āϝāĻžāĻ¨ā§āĻĄāĻžāĻ°ā§āĻĄ āĻĄā§āϰāĻžāχāĻ­āĻžāϰ⧇āϰ āϤāĻžāϞāĻŋāĻ•āĻž āϝāĻžāϰ āϜāĻ¨ā§āϝ āĻŽāϞāĻŋāĻ•āĻŋāωāϞ⧇āϰ āĻŸā§‡āĻŽāĻĒā§āϞ⧇āϟ āĻĒā§āϰāĻ¸ā§āϤ⧁āϤ āϰāϝāĻŧ⧇āϛ⧇: Azure, Docker, EC2, GCE, LXC, LXD, OpenStack, Vagrant, DelegatedāĨ¤

āĻŦ⧇āĻļāĻŋāϰāĻ­āĻžāĻ— āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇, āĻŸā§‡āĻŽāĻĒā§āϞ⧇āϟāϗ⧁āϞāĻŋ āĻĢāĻžāχāϞ create.yml и destroy.yml āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟ āĻĢā§‹āĻ˛ā§āĻĄāĻžāϰ⧇ āϝāĻž āϝāĻĨāĻžāĻ•ā§āϰāĻŽā§‡ āĻāĻ•āϟāĻŋ āωāĻĻāĻžāĻšāϰāĻŖ āϤ⧈āϰāĻŋ āĻāĻŦāĻ‚ āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻžāϰ āĻŦāĻ°ā§āĻŖāύāĻž āĻĻ⧇āϝāĻŧāĨ¤
āĻŦā§āϝāϤāĻŋāĻ•ā§āϰāĻŽāϗ⧁āϞāĻŋ āĻšāϞ āĻĄāĻ•āĻžāϰ āĻāĻŦāĻ‚ āĻ­ā§āϝāĻžāĻ—ā§āϰāĻžāĻ¨ā§āϟ, āĻ•āĻžāϰāĻŖ āϤāĻžāĻĻ⧇āϰ āĻŽāĻĄāĻŋāωāϞāϗ⧁āϞāĻŋāϰ āϏāĻžāĻĨ⧇ āĻŽāĻŋāĻĨāĻ¸ā§āĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻĒā§‚āĻ°ā§āĻŦā§‹āĻ•ā§āϤ āĻĢāĻžāχāϞāϗ⧁āϞāĻŋ āĻ›āĻžāĻĄāĻŧāĻžāχ āϘāϟāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤

āĻāϟāĻŋ āĻĄā§‡āϞāĻŋāϗ⧇āĻŸā§‡āĻĄ āĻĄā§āϰāĻžāχāĻ­āĻžāϰ āĻšāĻžāχāϞāĻžāχāϟ āĻ•āϰāĻž āĻŽā§‚āĻ˛ā§āϝāĻŦāĻžāύ, āϝ⧇āĻšā§‡āϤ⧁ āĻāϟāĻŋ āĻāĻ•āϟāĻŋ āĻĻ⧃āĻˇā§āϟāĻžāĻ¨ā§āϤ āϤ⧈āϰāĻŋ āĻāĻŦāĻ‚ āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻžāϰ āϜāĻ¨ā§āϝ āĻĢāĻžāχāϞāϗ⧁āϞāĻŋāϤ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšāϝāĻŧ, āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻĻ⧃āĻˇā§āϟāĻžāĻ¨ā§āϤāϗ⧁āϞāĻŋāϰ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ⧇āϰ āϏāĻžāĻĨ⧇ āĻ•āĻžāϜāϟāĻŋ āĻŦāĻ°ā§āĻŖāύāĻž āĻ•āϰāĻž āĻšāϝāĻŧ, āĻŦāĻžāĻ•āĻŋāϟāĻŋ āχāĻžā§āϜāĻŋāύāĻŋāϝāĻŧāĻžāϰ āĻĻā§āĻŦāĻžāϰāĻž āĻŦāĻ°ā§āĻŖāύāĻž āĻ•āϰāĻž āωāϚāĻŋāϤāĨ¤

āĻĄāĻŋāĻĢāĻ˛ā§āϟ āĻĄā§āϰāĻžāχāĻ­āĻžāϰ āĻšāϞ āĻĄāĻ•āĻžāϰāĨ¤

āĻāĻ–āύ āĻ…āύ⧁āĻļā§€āϞāύ⧇ āĻāĻ—āĻŋāϝāĻŧ⧇ āϝāĻžāĻ“āϝāĻŧāĻž āϝāĻžāĻ• āĻāĻŦāĻ‚ āϏ⧇āĻ–āĻžāύ⧇ āφāϰāĻ“ āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝ āĻŦāĻŋāĻŦ⧇āϚāύāĻž āĻ•āϰāĻž āϝāĻžāĻ•āĨ¤

āϗ⧇āϟāĻŋāĻ‚ āĻ¸ā§āϟāĻžāĻ°ā§āĻŸā§‡āĻĄ

āĻāĻ•āϟāĻŋ "āĻšā§āϝāĻžāϞ⧋ āĻ“āϝāĻŧāĻžāĻ°ā§āĻ˛ā§āĻĄ" āĻšāĻŋāϏāĻžāĻŦ⧇, āφāϏ⧁āύ āĻāĻ•āϟāĻŋ āϏāĻžāϧāĻžāϰāĻŖ nginx āχāύāĻ¸ā§āϟāϞ⧇āĻļāύ āĻ­ā§‚āĻŽāĻŋāĻ•āĻž āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāĻŋāĨ¤ āφāĻŽāϰāĻž āĻĄā§āϰāĻžāχāĻ­āĻžāϰ āĻšāĻŋāϏāĻžāĻŦ⧇ āĻĄāĻ•āĻžāϰāϕ⧇ āĻŦ⧇āϛ⧇ āύ⧇āĻŦ - āφāĻŽāĻŋ āĻŽāύ⧇ āĻ•āϰāĻŋ āφāĻĒāύāĻžāϰ āĻŦ⧇āĻļāĻŋāϰāĻ­āĻžāĻ—āχ āĻāϟāĻŋ āχāύāĻ¸ā§āϟāϞ āĻ•āϰ⧇āϛ⧇āύ (āĻāĻŦāĻ‚ āĻŽāύ⧇ āϰāĻžāĻ–āĻŦ⧇āύ āϝ⧇ āĻĄāĻ•āĻžāϰ āĻšāϞ āĻĄāĻŋāĻĢāĻ˛ā§āϟ āĻĄā§āϰāĻžāχāĻ­āĻžāϰ)āĨ¤

āĻĒā§āϰāĻ¸ā§āϤ⧁āϤ āĻ•āϰāĻž virtualenv āĻāĻŦāĻ‚ āĻāϟāĻŋāϤ⧇ āχāύāĻ¸ā§āϟāϞ āĻ•āϰ⧁āύ molecule:

> pip install virtualenv
> virtualenv -p `which python2` venv
> source venv/bin/activate
> pip install molecule docker  # molecule ŅƒŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ ansible ĐēаĐē ĐˇĐ°Đ˛Đ¸ŅĐ¸ĐŧĐžŅŅ‚ŅŒ; docker Đ´ĐģŅ Đ´Ņ€Đ°ĐšĐ˛ĐĩŅ€Đ°

āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āĻĒāĻĻāĻ•ā§āώ⧇āĻĒāϟāĻŋ āύāϤ⧁āύ āĻ­ā§‚āĻŽāĻŋāĻ•āĻž āĻļ⧁āϰ⧁ āĻ•āϰāĻžāĨ¤
āĻāĻ•āϟāĻŋ āύāϤ⧁āύ āĻ­ā§‚āĻŽāĻŋāĻ•āĻžāϰ āϏ⧂āϚāύāĻž, āϏ⧇āχāϏāĻžāĻĨ⧇ āĻāĻ•āϟāĻŋ āύāϤ⧁āύ āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟ, āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āϏāĻžā§āϚāĻžāϞāĻŋāϤ āĻšāϝāĻŧ molecule init <params>:

> molecule init role -r nginx
--> Initializing new role nginx...
Initialized role in <path>/nginx successfully.
> cd nginx
> tree -L 1
.
├── README.md
├── defaults
├── handlers
├── meta
├── molecule
├── tasks
└── vars

6 directories, 1 file

āĻāϟāĻŋ āĻāĻ•āϟāĻŋ āϏāĻžāϧāĻžāϰāĻŖ āϜāĻŦāĻžāĻŦāĻĻāĻŋāĻšāĻŋāĻŽā§‚āϞāĻ• āĻ­ā§‚āĻŽāĻŋāĻ•āĻžāϝāĻŧ āĻĒāϰāĻŋāĻŖāϤ āĻšāϝāĻŧ⧇āϛ⧇āĨ¤ āφāϰāĻ“, CLI āĻ…āϪ⧁āϰ āϏāĻžāĻĨ⧇ āϏāĻŽāĻ¸ā§āϤ āĻŽāĻŋāĻĨāĻ¸ā§āĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻ­ā§‚āĻŽāĻŋāĻ•āĻžāϰ āĻŽā§‚āϞ āĻĨ⧇āϕ⧇ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤

āϚāϞ⧁āύ āĻĻ⧇āĻ–āĻŋ āĻ­ā§‚āĻŽāĻŋāĻ•āĻž āĻĄāĻŋāϰ⧇āĻ•ā§āϟāϰāĻŋāϤ⧇ āĻ•āĻŋ āφāϛ⧇:

> tree molecule/default/
molecule/default/
├── Dockerfile.j2  # Jinja-ŅˆĐ°ĐąĐģĐžĐŊ Đ´ĐģŅ Dockerfile
├── INSTALL.rst.   # НĐĩĐŧĐŊĐžĐŗĐž иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Đ¸ Ой ŅƒŅŅ‚Đ°ĐŊОвĐēĐĩ ĐˇĐ°Đ˛Đ¸ŅĐ¸ĐŧĐžŅŅ‚ĐĩĐš ҁ҆ĐĩĐŊĐ°Ņ€Đ¸Ņ
├── molecule.yml   # ФаКĐģ ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸
├── playbook.yml   # ПĐģĐĩĐšĐąŅƒĐē СаĐŋ҃ҁĐēа Ņ€ĐžĐģи
└── tests          # Đ”Đ¸Ņ€ĐĩĐēŅ‚ĐžŅ€Đ¸Ņ ҁ Ņ‚ĐĩŅŅ‚Đ°Đŧи ŅŅ‚Đ°Đ´Đ¸Đ¸ verify
    └── test_default.py

1 directory, 6 files

āĻāϰ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ āĻŦāĻŋāĻļā§āϞ⧇āώāĻŖ āĻ•āϰāĻž āϝāĻžāĻ• molecule/default/molecule.yml (āĻļ⧁āϧ⧁ āĻĄāĻ•āĻžāϰ āχāĻŽā§‡āϜ āĻĒā§āϰāϤāĻŋāĻ¸ā§āĻĨāĻžāĻĒāύ):

---
dependency:
  name: galaxy
driver:
  name: docker
lint:
  name: yamllint
platforms:
  - name: instance
    image: centos:7
provisioner:
  name: ansible
  lint:
    name: ansible-lint
scenario:
  name: default
verifier:
  name: testinfra
  lint:
    name: flake8

āĻŦāĻļā§āϝāϤāĻž

āĻāχ āĻŦāĻŋāĻ­āĻžāĻ—āϟāĻŋ āύāĻŋāĻ°ā§āĻ­āϰāĻļā§€āϞāϤāĻžāϰ āωāĻ¤ā§āϏ āĻŦāĻ°ā§āĻŖāύāĻž āĻ•āϰ⧇āĨ¤

āϏāĻŽā§āĻ­āĻžāĻŦā§āϝ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒāϏāĻŽā§‚āĻš: āĻ›āĻžāϝāĻŧāĻžāĻĒāĻĨ, āĻ—āĻŋāĻ˛ā§āϟ, āĻļ⧇āϞāĨ¤

āĻļ⧇āϞ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻāĻ•āϟāĻŋ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻļ⧇āϞ āϝāĻž āĻ—ā§āϝāĻžāϞāĻžāĻ•ā§āϏāĻŋ āĻāĻŦāĻ‚ āĻ—āĻŋāĻ˛ā§āϟ āφāĻĒāύāĻžāϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύāϗ⧁āϞāĻŋāϕ⧇ āĻ•āĻ­āĻžāϰ āύāĻž āĻ•āϰāĻžāϰ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤

āφāĻŽāĻŋ āĻāĻ–āĻžāύ⧇ āĻĻā§€āĻ°ā§āϘāĻ•āĻžāϞ āĻĨāĻžāĻ•āĻŦ āύāĻž, āĻāϟāĻŋ āϝāĻĨ⧇āĻˇā§āϟ āĻŦāĻ°ā§āĻŖāύāĻž āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇ āĻĄāϕ⧁āĻŽā§‡āĻ¨ā§āĻŸā§‡āĻļāύ.

āϚāĻžāϞāĻ•

āĻĄā§āϰāĻžāχāĻ­āĻžāϰ⧇āϰ āύāĻžāĻŽāĨ¤ āφāĻŽāĻžāĻĻ⧇āϰ āĻĄāĻ•āĻžāϰ āĻšāϝāĻŧ.

āϤāĻŋāϏāĻŋ

āϞāĻŋāĻ¨ā§āϟāĻžāϰ āĻšāϞ āχāϝāĻŧāĻžāĻŽāϞāĻŋāĻ¨ā§āϟāĨ¤

āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ⧇āϰ āĻāχ āĻ…āĻ‚āĻļ⧇ āĻĻāϰāĻ•āĻžāϰ⧀ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒāϗ⧁āϞāĻŋ āĻšāϞ yamllint, āĻĢāϰ⧋āϝāĻŧāĻžāĻ°ā§āĻĄ āĻāύāĻ­āĻžāϝāĻŧāϰāύāĻŽā§‡āĻ¨ā§āϟ āϭ⧇āϰāĻŋāϝāĻŧ⧇āĻŦāϞ āĻŦāĻž āϞāĻŋāĻ¨ā§āϟāĻžāϰ āύāĻŋāĻˇā§āĻ•ā§āϰāĻŋāϝāĻŧ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ āĻĢāĻžāχāϞ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ•āϰāĻžāϰ āĻ•ā§āώāĻŽāϤāĻž:

lint:
  name: yamllint
  options:
    config-file: foo/bar
  env:
    FOO: bar
  enabled: False

āĻĒā§āĻ˛ā§āϝāĻžāϟāĻĢāĻ°ā§āĻŽā§‡āϰ

āĻĻ⧃āĻˇā§āϟāĻžāĻ¨ā§āϤāϗ⧁āϞāĻŋāϰ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ āĻŦāĻ°ā§āĻŖāύāĻž āĻ•āϰ⧇āĨ¤
āĻĄā§āϰāĻžāχāĻ­āĻžāϰ āĻšāĻŋāϏāĻžāĻŦ⧇ āĻĄāĻ•āĻžāϰ⧇āϰ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇, āĻ…āϪ⧁āϟāĻŋ āĻāχ āĻŦāĻŋāĻ­āĻžāϗ⧇ āĻĒ⧁āύāϰāĻžāĻŦ⧃āĻ¤ā§āϤāĻŋ āĻ•āϰāĻž āĻšāϝāĻŧ āĻāĻŦāĻ‚ āϤāĻžāϞāĻŋāĻ•āĻžāϰ āĻĒā§āϰāϤāĻŋāϟāĻŋ āωāĻĒāĻžāĻĻāĻžāύ āĻĒāĻžāĻ“āϝāĻŧāĻž āϝāĻžāϝāĻŧ Dockerfile.j2 āĻāĻ•āϟāĻŋ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύāĻļā§€āϞ āĻšāĻŋāϏāĻžāĻŦ⧇ item.

āϚāĻžāϞāϕ⧇āϰ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇ āϝ⧇āϟāĻž āĻĒā§āϰāϝāĻŧā§‹āϜāύ create.yml и destroy.yml, āĻŦāĻŋāĻ­āĻžāĻ— āϤāĻžāĻĻ⧇āϰ āĻšāĻŋāϏāĻžāĻŦ⧇ āωāĻĒāϞāĻŦā§āϧ molecule_yml.platforms, āĻāĻŦāĻ‚ āĻāϟāĻŋāϰ āĻĒ⧁āύāϰāĻžāĻŦ⧃āĻ¤ā§āϤāĻŋāϗ⧁āϞāĻŋ āχāϤāĻŋāĻŽāĻ§ā§āϝ⧇āχ āĻāχ āĻĢāĻžāχāϞāϗ⧁āϞāĻŋāϤ⧇ āĻŦāĻ°ā§āĻŖāύāĻž āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇āĨ¤

āϝ⧇āĻšā§‡āϤ⧁ āĻ…āϪ⧁ āωāĻ¤ā§āϤāϰāϝ⧋āĻ—ā§āϝ āĻŽāĻĄāĻŋāωāϞāϗ⧁āϞāĻŋāϤ⧇ āĻĻ⧃āĻˇā§āϟāĻžāĻ¨ā§āϤāϗ⧁āϞāĻŋāϰ āύāĻŋāϝāĻŧāĻ¨ā§āĻ¤ā§āϰāĻŖ āϏāϰāĻŦāϰāĻžāĻš āĻ•āϰ⧇, āϤāĻžāχ āϏāĻŽā§āĻ­āĻžāĻŦā§āϝ āϏ⧇āϟāĻŋāĻ‚āϏ⧇āϰ āϤāĻžāϞāĻŋāĻ•āĻžāϟāĻŋāĻ“ āϏ⧇āĻ–āĻžāύ⧇ āϏāĻ¨ā§āϧāĻžāύ āĻ•āϰāĻž āωāϚāĻŋāϤāĨ¤ āĻĄāĻ•āĻžāϰ⧇āϰ āϜāĻ¨ā§āϝ, āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, āĻŽāĻĄāĻŋāωāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšāϝāĻŧ docker_container_module. āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āĻĄā§āϰāĻžāχāĻ­āĻžāϰ⧇ āϕ⧋āύ āĻŽāĻĄāĻŋāωāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšāϝāĻŧ āϤāĻž āĻĒāĻžāĻ“āϝāĻŧāĻž āϝāĻžāĻŦ⧇ āĻĄāϕ⧁āĻŽā§‡āĻ¨ā§āĻŸā§‡āĻļāύ.

āĻĒāĻžāĻļāĻžāĻĒāĻžāĻļāĻŋ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āϚāĻžāϞāĻ• āĻŦā§āϝāĻŦāĻšāĻžāϰ⧇āϰ āωāĻĻāĻžāĻšāϰāĻŖāĻ“ āĻĒāĻžāĻ“āϝāĻŧāĻž āϝāĻžāĻŦ⧇ āĻ…āϪ⧁ āύāĻŋāĻœā§‡āχ āĻĒāϰ⧀āĻ•ā§āώāĻž.

āĻāĻ–āĻžāύ⧇ āĻĒā§āϰāϤāĻŋāĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰ⧁āύ centos:7 āωāĻĒāϰ ubuntu.

āĻŦāĻŋāϧāĻžāύāĻ•āĻžāϰ⧀

"āϏāϰāĻŦāϰāĻžāĻšāĻ•āĻžāϰ⧀" - āĻāĻ•āϟāĻŋ āϏāĻ¤ā§āϤāĻž āϝāĻž āĻĻ⧃āĻˇā§āϟāĻžāĻ¨ā§āϤ āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰ⧇āĨ¤ āĻ…āϪ⧁āϰ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇, āĻāϟāĻŋ āωāĻ¤ā§āϤāϰāϝ⧋āĻ—ā§āϝ, āĻ…āĻ¨ā§āϝāĻĻ⧇āϰ āϜāĻ¨ā§āϝ āϏāĻŽāĻ°ā§āĻĨāύ āĻĒāϰāĻŋāĻ•āĻ˛ā§āĻĒāĻŋāϤ āύāϝāĻŧ, āϤāĻžāχ āĻāχ āĻŦāĻŋāĻ­āĻžāĻ—āϟāĻŋāϕ⧇ āϏāϤāĻ°ā§āĻ•āϤāĻžāϰ āϏāĻžāĻĨ⧇ āωāĻ¤ā§āϤāϰāϝ⧋āĻ—ā§āϝ āĻŦāĻ°ā§āϧāĻŋāϤ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ āĻŦāϞāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤
āĻāĻ–āĻžāύ⧇ āφāĻĒāύāĻŋ āĻ…āύ⧇āĻ• āĻ•āĻŋāϛ⧁ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ, āφāĻŽāĻŋ āφāĻŽāĻžāϰ āĻŽāϤ⧇ āĻĒā§āϰāϧāĻžāύ āĻĒāϝāĻŧ⧇āĻ¨ā§āϟāϗ⧁āϞāĻŋ āĻšāĻžāχāϞāĻžāχāϟ āĻ•āϰāĻŦ:

  • āĻĒā§āϞ⧇āĻŦ⧁āĻ•: āφāĻĒāύāĻŋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻĒāĻ°ā§āϝāĻžāϝāĻŧ⧇ āϕ⧋āύ āĻĒā§āϞ⧇āĻŦ⧁āĻ• āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āωāϚāĻŋāϤ āϤāĻž āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤

provisioner:
  name: ansible
  playbooks:
    create: create.yml
    destroy: ../default/destroy.yml
    converge: playbook.yml
    side_effect: side_effect.yml
    cleanup: cleanup.yml

provisioner:
  name: ansible
  config_options:
    defaults:
      fact_caching: jsonfile
    ssh_connection:
      scp_if_ssh: True

provisioner:
  name: ansible  
  connection_options:
    ansible_ssh_common_args: "-o 'UserKnownHostsFile=/dev/null' -o 'ForwardAgent=yes'"

  • āĻ…āĻĒāĻļāύ: āωāĻ¤ā§āϤāϰāϝ⧋āĻ—ā§āϝ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ āĻāĻŦāĻ‚ āĻĒāϰāĻŋāĻŦ⧇āĻļ āϭ⧇āϰāĻŋāϝāĻŧ⧇āĻŦāϞ

provisioner:
  name: ansible  
  options:
    vvv: true
    diff: true
  env:
    FOO: BAR

āĻĻ⧃āĻļā§āϝāĻ•āĻ˛ā§āĻĒ

āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟ āϏāĻŋāϕ⧋āϝāĻŧ⧇āĻ¨ā§āϏ⧇āϰ āύāĻžāĻŽ āĻāĻŦāĻ‚ āĻŦāĻ°ā§āĻŖāύāĻžāĨ¤
āφāĻĒāύāĻŋ āϕ⧀ āϝ⧋āĻ— āĻ•āϰ⧇ āϝ⧇āϕ⧋āύ⧋ āĻ•āĻŽāĻžāĻ¨ā§āĻĄā§‡āϰ āĻĄāĻŋāĻĢāĻ˛ā§āϟ āĻ…ā§āϝāĻžāĻ•āĻļāύ āĻŽā§āϝāĻžāĻŸā§āϰāĻŋāĻ•ā§āϏ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ <command>_sequence āĻāĻŦāĻ‚ āĻāϟāĻŋāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻŽāĻžāύ āĻšāĻŋāϏāĻžāĻŦ⧇ āφāĻŽāĻžāĻĻ⧇āϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧ āĻĒāĻĻāĻ•ā§āώ⧇āĻĒāϗ⧁āϞāĻŋāϰ āϤāĻžāϞāĻŋāĻ•āĻž āύāĻŋāĻ°ā§āϧāĻžāϰāĻŖ āĻ•āϰ⧇āĨ¤
āϧāϰāĻž āϝāĻžāĻ• āĻĒā§āϞ⧇āĻŦ⧁āĻ• āϰāĻžāύ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āϚāĻžāϞāĻžāύ⧋āϰ āϏāĻŽāϝāĻŧ āφāĻŽāϰāĻž āĻ•āĻ°ā§āĻŽā§‡āϰ āĻ•ā§āϰāĻŽ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰāϤ⧇ āϚāĻžāχ: molecule converge

# иСĐŊĐ°Ņ‡Đ°ĐģҌĐŊĐž:
# - dependency
# - create
# - prepare
# - converge
scenario:
  name: default
  converge_sequence:
    - create
    - converge

āĻšā§‡āĻ•

āĻĒāϰ⧀āĻ•ā§āώāĻžāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻ•āĻžāĻ āĻžāĻŽā§‹ āĻāĻŦāĻ‚ āĻāϟāĻŋāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āϞāĻŋāĻ¨ā§āϟāĻžāϰ āϏ⧇āϟ āφāĻĒ āĻ•āϰāĻžāĨ¤ āĻĄāĻŋāĻĢāĻ˛ā§āϟ āϞāĻŋāĻ¨ā§āϟāĻžāϰ āĻšāϝāĻŧ testinfra и flake8. āϏāĻŽā§āĻ­āĻžāĻŦā§āϝ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ āωāĻĒāϰ⧇āϰ āĻŽāϤ āĻāĻ•āχ:

verifier:
  name: testinfra
  additional_files_or_dirs:
    - ../path/to/test_1.py
    - ../path/to/test_2.py
    - ../path/to/directory/*
  options:
    n: 1
  enabled: False
  env:
    FOO: bar
  lint:
    name: flake8
    options:
      benchmark: True
    enabled: False
    env:
      FOO: bar

āφāĻŽāĻžāĻĻ⧇āϰ āĻ­ā§‚āĻŽāĻŋāĻ•āĻžāϝāĻŧ āĻĢāĻŋāϰ⧇ āφāϏāĻž āϝāĻžāĻ•āĨ¤ āĻĢāĻžāχāϞ āϏāĻŽā§āĻĒāĻžāĻĻāύāĻž āĻ•āϰāĻž āϝāĻžāĻ• tasks/main.yml āĻāχ āϧāϰāύ⧇āϰ:

---
- name: Install nginx
  apt:
    name: nginx
    state: present

- name: Start nginx
  service:
    name: nginx
    state: started

āĻāĻŦāĻ‚ āĻĒāϰ⧀āĻ•ā§āώāĻž āϝ⧋āĻ— āĻ•āϰ⧁āύ molecule/default/tests/test_default.py

def test_nginx_is_installed(host):
    nginx = host.package("nginx")
    assert nginx.is_installed

def test_nginx_running_and_enabled(host):
    nginx = host.service("nginx")
    assert nginx.is_running
    assert nginx.is_enabled

def test_nginx_config(host):
    host.run("nginx -t")

āϏāĻŽā§āĻĒāĻ¨ā§āύ āĻšāϝāĻŧ⧇āϛ⧇, āĻāϟāĻŋ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āϚāĻžāϞāĻžāύ⧋āϰ āϜāĻ¨ā§āϝ āĻ…āĻŦāĻļāĻŋāĻˇā§āϟ āϰāϝāĻŧ⧇āϛ⧇ (āĻ­ā§‚āĻŽāĻŋāĻ•āĻžāϟāĻŋāϰ āĻŽā§‚āϞ āĻĨ⧇āϕ⧇, āφāĻŽāĻŋ āφāĻĒāύāĻžāϕ⧇ āĻŽāύ⧇ āĻ•āϰāĻŋāϝāĻŧ⧇ āĻĻāĻŋāχ):

> molecule test

āĻ¸ā§āĻĒāϝāĻŧāϞāĻžāϰ⧇āϰ āύāĻŋāĻšā§‡ āĻĻā§€āĻ°ā§āϘ āύāĻŋāĻˇā§āĻ•āĻžāĻļāύ:

--> Validating schema <path>/nginx/molecule/default/molecule.yml.
Validation completed successfully.
--> Test matrix

└── default
    ├── lint
    ├── destroy
    ├── dependency
    ├── syntax
    ├── create
    ├── prepare
    ├── converge
    ├── idempotence
    ├── side_effect
    ├── verify
    └── destroy

--> Scenario: 'default'
--> Action: 'lint'
--> Executing Yamllint on files found in <path>/nginx/...
Lint completed successfully.
--> Executing Flake8 on files found in <path>/nginx/molecule/default/tests/...
Lint completed successfully.
--> Executing Ansible Lint on <path>/nginx/molecule/default/playbook.yml...
Lint completed successfully.
--> Scenario: 'default'
--> Action: 'destroy'

    PLAY [Destroy] *****************************************************************

    TASK [Destroy molecule instance(s)] ********************************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Wait for instance(s) deletion to complete] *******************************
    ok: [localhost] => (item=None)
    ok: [localhost]

    TASK [Delete docker network(s)] ************************************************

    PLAY RECAP *********************************************************************
    localhost                  : ok=2    changed=1    unreachable=0    failed=0

--> Scenario: 'default'
--> Action: 'dependency'
Skipping, missing the requirements file.
--> Scenario: 'default'
--> Action: 'syntax'

    playbook: <path>/nginx/molecule/default/playbook.yml

--> Scenario: 'default'
--> Action: 'create'

    PLAY [Create] ******************************************************************

    TASK [Log into a Docker registry] **********************************************
    skipping: [localhost] => (item=None)

    TASK [Create Dockerfiles from image names] *************************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Discover local Docker images] ********************************************
    ok: [localhost] => (item=None)
    ok: [localhost]

    TASK [Build an Ansible compatible image] ***************************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Create docker network(s)] ************************************************

    TASK [Create molecule instance(s)] *********************************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Wait for instance(s) creation to complete] *******************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    PLAY RECAP *********************************************************************
    localhost                  : ok=5    changed=4    unreachable=0    failed=0

--> Scenario: 'default'
--> Action: 'prepare'
Skipping, prepare playbook not configured.
--> Scenario: 'default'
--> Action: 'converge'

    PLAY [Converge] ****************************************************************

    TASK [Gathering Facts] *********************************************************
    ok: [instance]

    TASK [nginx : Install nginx] ***************************************************
    changed: [instance]

    TASK [nginx : Start nginx] *****************************************************
    changed: [instance]

    PLAY RECAP *********************************************************************
    instance                   : ok=3    changed=2    unreachable=0    failed=0

--> Scenario: 'default'
--> Action: 'idempotence'
Idempotence completed successfully.
--> Scenario: 'default'
--> Action: 'side_effect'
Skipping, side effect playbook not configured.
--> Scenario: 'default'
--> Action: 'verify'
--> Executing Testinfra tests found in <path>/nginx/molecule/default/tests/...
    ============================= test session starts ==============================
    platform darwin -- Python 2.7.15, pytest-4.3.0, py-1.8.0, pluggy-0.9.0
    rootdir: <path>/nginx/molecule/default, inifile:
    plugins: testinfra-1.16.0
collected 4 items

    tests/test_default.py ....                                               [100%]

    ========================== 4 passed in 27.23 seconds ===========================
Verifier completed successfully.
--> Scenario: 'default'
--> Action: 'destroy'

    PLAY [Destroy] *****************************************************************

    TASK [Destroy molecule instance(s)] ********************************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Wait for instance(s) deletion to complete] *******************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Delete docker network(s)] ************************************************

    PLAY RECAP *********************************************************************
    localhost                  : ok=2    changed=2    unreachable=0    failed=0

āφāĻŽāĻžāĻĻ⧇āϰ āϏāĻžāϧāĻžāϰāĻŖ āĻ­ā§‚āĻŽāĻŋāĻ•āĻž āϏāĻŽāĻ¸ā§āϝāĻž āĻ›āĻžāĻĄāĻŧāĻžāχ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāĻž āĻšāϝāĻŧ⧇āĻ›āĻŋāϞāĨ¤
āĻāϟāĻž āĻŽāύ⧇ āϰāĻžāĻ–āĻž āĻŽā§‚āĻ˛ā§āϝāĻŦāĻžāύ āϝ⧇ āϝāĻĻāĻŋ āĻ•āĻžāĻœā§‡āϰ āϏāĻŽāϝāĻŧ āϏāĻŽāĻ¸ā§āϝāĻž āĻšāϝāĻŧ molecule test, āϤāĻžāϰāĻĒāϰ āφāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻĄāĻŋāĻĢāĻ˛ā§āϟ āĻ•ā§āϰāĻŽ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āύāĻž āĻ•āϰ⧇āύ, āϤāĻžāĻšāϞ⧇ āĻ…āϪ⧁ āωāĻĻāĻžāĻšāϰāĻŖāϟāĻŋ āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻŦ⧇āĨ¤

āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤ āĻ•āĻŽāĻžāĻ¨ā§āĻĄāϗ⧁āϞāĻŋ āĻĄāĻŋāĻŦāĻžāĻ— āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻĻāϰāĻ•āĻžāϰ⧀:

> molecule --debug <command> # debug info. ĐŸŅ€Đ¸ ĐžĐąŅ‹Ņ‡ĐŊĐžĐŧ СаĐŋ҃ҁĐēĐĩ МоĐģĐĩĐē҃Đģа ҁĐēŅ€Ņ‹Đ˛Đ°ĐĩŅ‚ ĐģĐžĐŗĐ¸.
> molecule converge          # ĐžŅŅ‚Đ°Đ˛ĐģŅĐĩŅ‚ иĐŊŅŅ‚Đ°ĐŊҁ ĐŋĐžŅĐģĐĩ ĐŋŅ€ĐžĐŗĐžĐŊа Ņ‚ĐĩŅŅ‚Đ¸Ņ€ŅƒĐĩĐŧОК Ņ€ĐžĐģи.
> molecule login             # Đ—Đ°ĐšŅ‚Đ¸ в ŅĐžĐˇĐ´Đ°ĐŊĐŊŅ‹Đš иĐŊŅŅ‚Đ°ĐŊҁ.
> molecule --help            # ПоĐģĐŊŅ‹Đš ҁĐŋĐ¸ŅĐžĐē ĐēĐžĐŧаĐŊĐ´.

āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āĻ­ā§‚āĻŽāĻŋāĻ•āĻž

āĻāĻ•āϟāĻŋ āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āĻ­ā§‚āĻŽāĻŋāĻ•āĻž āĻāĻ•āϟāĻŋ āύāϤ⧁āύ āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟ āϝ⧋āĻ— āĻ•āϰāĻž āĻšāϝāĻŧ āĻ­ā§‚āĻŽāĻŋāĻ•āĻž āĻĄāĻŋāϰ⧇āĻ•ā§āϟāϰāĻŋ āĻĨ⧇āϕ⧇ āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āϏāĻš:

# ĐŋĐžĐģĐŊŅ‹Đš ҁĐŋĐ¸ŅĐžĐē Đ´ĐžŅŅ‚ŅƒĐŋĐŊҋ҅ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€ĐžĐ˛
> molecule init scenarion --help
# ŅĐžĐˇĐ´Đ°ĐŊиĐĩ ĐŊĐžĐ˛ĐžĐŗĐž ҁ҆ĐĩĐŊĐ°Ņ€Đ¸Ņ
> molecule init scenario -r <role_name> -s <scenario_name>

āϝāĻĻāĻŋ āĻāϟāĻŋ āĻ­ā§‚āĻŽāĻŋāĻ•āĻžāϰ āĻĒā§āϰāĻĨāĻŽ āĻĻ⧃āĻļā§āϝ, āϤāĻžāϰāĻĒāϰ āĻĒāϰāĻžāĻŽāĻŋāϤāĻŋ -s āĻŦāĻžāĻĻ āĻĻ⧇āĻ“āϝāĻŧāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇ āĻ•āĻžāϰāĻŖ āĻāϟāĻŋ āĻāĻ•āϟāĻŋ āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟ āϤ⧈āϰāĻŋ āĻ•āϰāĻŦ⧇ default.

āωāĻĒāϏāĻ‚āĻšāĻžāϰ

āφāĻĒāύāĻŋ āĻĻ⧇āĻ–āϤ⧇ āĻĒāĻžāĻšā§āϛ⧇āύ, āĻ…āϪ⧁āϟāĻŋ āϖ⧁āĻŦ āϜāϟāĻŋāϞ āύāϝāĻŧ, āĻāĻŦāĻ‚ āφāĻĒāύāĻžāϰ āύāĻŋāϜāĻ¸ā§āĻŦ āĻŸā§‡āĻŽāĻĒā§āϞ⧇āϟ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇, āĻāĻ•āϟāĻŋ āύāϤ⧁āύ āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟ āĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰ⧇ āωāĻĻāĻžāĻšāϰāĻŖ āϤ⧈āϰāĻŋ āĻāĻŦāĻ‚ āĻĒā§āϞ⧇āĻŦ⧁āĻ•āϗ⧁āϞāĻŋ āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻžāϰ āϭ⧇āϰāĻŋāϝāĻŧ⧇āĻŦāϞāϗ⧁āϞāĻŋ āϏāĻŽā§āĻĒāĻžāĻĻāύāĻž āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻšā§āϰāĻžāϏ āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āĻ…āϪ⧁āϟāĻŋ āϏāĻŋāφāχ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡āϰ āϏāĻžāĻĨ⧇ āύāĻŋāĻ°ā§āĻŦāĻŋāĻ˜ā§āύ⧇ āϏāĻ‚āĻšāϤ āĻ•āϰ⧇, āϝāĻž āφāĻĒāύāĻžāϕ⧇ āĻĒā§āϞ⧇āĻŦ⧁āĻ•āϗ⧁āϞāĻŋāϰ āĻŽā§āϝāĻžāύ⧁āϝāĻŧāĻžāϞ āĻĒāϰ⧀āĻ•ā§āώāĻžāϰ āϜāĻ¨ā§āϝ āϏāĻŽāϝāĻŧ āĻ•āĻŽāĻŋāϝāĻŧ⧇ āĻŦāĻŋāĻ•āĻžāĻļ⧇āϰ āĻ—āϤāĻŋ āĻŦāĻžāĻĄāĻŧāĻžāϤ⧇ āĻĻ⧇āϝāĻŧāĨ¤

āφāĻĒāύāĻžāϰ āĻŽāύ⧋āϝ⧋āϗ⧇āϰ āϜāĻ¨ā§āϝ āφāĻĒāύāĻžāϕ⧇ āϧāĻ¨ā§āϝāĻŦāĻžāĻĻāĨ¤ āφāĻĒāύāĻžāϰ āϝāĻĻāĻŋ āωāĻ¤ā§āϤāϰāϝ⧋āĻ—ā§āϝ āĻ­ā§‚āĻŽāĻŋāĻ•āĻžāϗ⧁āϞāĻŋ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāĻžāϰ āĻ…āĻ­āĻŋāĻœā§āĻžāϤāĻž āĻĨāĻžāϕ⧇ āĻāĻŦāĻ‚ āĻāϟāĻŋ āĻ…āϪ⧁āϰ āϏāĻžāĻĨ⧇ āϏāĻŽā§āĻĒāĻ°ā§āĻ•āĻŋāϤ āύāĻž āĻšāϝāĻŧ āϤāĻŦ⧇ āĻŽāĻ¨ā§āϤāĻŦā§āϝ⧇ āĻāϟāĻŋ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āφāĻŽāĻžāĻĻ⧇āϰ āĻŦāϞ⧁āύ!

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

DDoS āϏ⧁āϰāĻ•ā§āώāĻž, VPS VDS āϏāĻžāĻ°ā§āĻ­āĻžāϰ āϏāĻš āϏāĻžāχāϟāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āĻšā§‹āĻ¸ā§āϟāĻŋāĻ‚ āĻ•āĻŋāύ⧁āύ đŸ”Ĩ DDoS āϏ⧁āϰāĻ•ā§āώāĻž āϏāĻš āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āĻ“āϝāĻŧ⧇āĻŦāϏāĻžāχāϟ āĻšā§‹āĻ¸ā§āϟāĻŋāĻ‚ āĻ•āĻŋāύ⧁āύ, VPS VDS āϏāĻžāĻ°ā§āĻ­āĻžāϰ | ProHoster