āĻšā§āϝāĻžāϞ⧠āϏāĻŦāĻžāĻ!
āĻāĻŽāĻŋ āĻāĻāĻāĻŋ āĻšā§āĻā§āϞ āĻŦā§āĻāĻŋāĻ āĻĒāϰāĻŋāώā§āĻŦāĻžāϝāĻŧ āĻāĻāĻāύ DevOps āĻĒā§āϰāĻā§āĻļāϞ⧠āĻšāĻŋāϏāĻžāĻŦā§ āĻāĻžāĻ āĻāϰāĻŋāĨ¤ . āĻāĻ āύāĻŋāĻŦāύā§āϧā§, āĻāĻŽāĻŋ āĻāϤā§āϤāϰāϝā§āĻā§āϝ āĻā§āĻŽāĻŋāĻāĻž āĻĒāϰā§āĻā§āώāĻž āĻāϰāĻžāϰ āĻāĻŽāĻžāĻĻā§āϰ āĻ āĻāĻŋāĻā§āĻāϤāĻž āϏāĻŽā§āĻĒāϰā§āĻā§ āĻāĻĨāĻž āĻŦāϞāϤ⧠āĻāĻžāĻāĨ¤
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, āĻāĻŦāĻ āĻāĻāĻŋāϰ āĻĒā§āύāϰāĻžāĻŦā§āϤā§āϤāĻŋāĻā§āϞāĻŋ āĻāϤāĻŋāĻŽāϧā§āϝā§āĻ āĻāĻ āĻĢāĻžāĻāϞāĻā§āϞāĻŋāϤ⧠āĻŦāϰā§āĻŖāύāĻž āĻāϰāĻž āĻšāϝāĻŧā§āĻā§āĨ¤
āϝā§āĻšā§āϤ⧠āĻ āĻŖā§ āĻāϤā§āϤāϰāϝā§āĻā§āϝ āĻŽāĻĄāĻŋāĻāϞāĻā§āϞāĻŋāϤ⧠āĻĻā§āώā§āĻāĻžāύā§āϤāĻā§āϞāĻŋāϰ āύāĻŋāϝāĻŧāύā§āϤā§āϰāĻŖ āϏāϰāĻŦāϰāĻžāĻš āĻāϰā§, āϤāĻžāĻ āϏāĻŽā§āĻāĻžāĻŦā§āϝ āϏā§āĻāĻŋāĻāϏā§āϰ āϤāĻžāϞāĻŋāĻāĻžāĻāĻŋāĻ āϏā§āĻāĻžāύ⧠āϏāύā§āϧāĻžāύ āĻāϰāĻž āĻāĻāĻŋāϤāĨ¤ āĻĄāĻāĻžāϰā§āϰ āĻāύā§āϝ, āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āĻŽāĻĄāĻŋāĻāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻšāϝāĻŧ . āĻ āύā§āϝāĻžāύā§āϝ āĻĄā§āϰāĻžāĻāĻāĻžāϰ⧠āĻā§āύ āĻŽāĻĄāĻŋāĻāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻšāϝāĻŧ āϤāĻž āĻĒāĻžāĻāϝāĻŧāĻž āϝāĻžāĻŦā§ .
āĻĒāĻžāĻļāĻžāĻĒāĻžāĻļāĻŋ āĻŦāĻŋāĻāĻŋāύā§āύ āĻāĻžāϞāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰā§āϰ āĻāĻĻāĻžāĻšāϰāĻŖāĻ āĻĒāĻžāĻāϝāĻŧāĻž āϝāĻžāĻŦā§ .
āĻāĻāĻžāύ⧠āĻĒā§āϰāϤāĻŋāϏā§āĻĨāĻžāĻĒāύ āĻāϰā§āύ 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- config_options:
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
