āĻšā§āĻ¯āĻžāĻ˛ā§ āĻ¸āĻŦāĻžāĻ!
āĻāĻŽāĻŋ āĻāĻāĻāĻŋ āĻšā§āĻā§āĻ˛ āĻŦā§āĻāĻŋāĻ āĻĒāĻ°āĻŋāĻˇā§āĻŦāĻžāĻ¯āĻŧ āĻāĻāĻāĻ¨ 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
, āĻāĻŦāĻ āĻāĻāĻŋāĻ° āĻĒā§āĻ¨āĻ°āĻžāĻŦā§āĻ¤ā§āĻ¤āĻŋāĻā§āĻ˛āĻŋ āĻāĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§āĻ āĻāĻ āĻĢāĻžāĻāĻ˛āĻā§āĻ˛āĻŋāĻ¤ā§ āĻŦāĻ°ā§āĻŖāĻ¨āĻž āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻā§āĨ¤
āĻ¯ā§āĻšā§āĻ¤ā§ āĻ
āĻŖā§ āĻāĻ¤ā§āĻ¤āĻ°āĻ¯ā§āĻā§āĻ¯ āĻŽāĻĄāĻŋāĻāĻ˛āĻā§āĻ˛āĻŋāĻ¤ā§ āĻĻā§āĻˇā§āĻāĻžāĻ¨ā§āĻ¤āĻā§āĻ˛āĻŋāĻ° āĻ¨āĻŋāĻ¯āĻŧāĻ¨ā§āĻ¤ā§āĻ°āĻŖ āĻ¸āĻ°āĻŦāĻ°āĻžāĻš āĻāĻ°ā§, āĻ¤āĻžāĻ āĻ¸āĻŽā§āĻāĻžāĻŦā§āĻ¯ āĻ¸ā§āĻāĻŋāĻāĻ¸ā§āĻ° āĻ¤āĻžāĻ˛āĻŋāĻāĻžāĻāĻŋāĻ āĻ¸ā§āĻāĻžāĻ¨ā§ āĻ¸āĻ¨ā§āĻ§āĻžāĻ¨ āĻāĻ°āĻž āĻāĻāĻŋāĻ¤āĨ¤ āĻĄāĻāĻžāĻ°ā§āĻ° āĻāĻ¨ā§āĻ¯, āĻāĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§āĻĒ, āĻŽāĻĄāĻŋāĻāĻ˛ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻž āĻšāĻ¯āĻŧ
āĻĒāĻžāĻļāĻžāĻĒāĻžāĻļāĻŋ āĻŦāĻŋāĻāĻŋāĻ¨ā§āĻ¨ āĻāĻžāĻ˛āĻ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°ā§āĻ° āĻāĻĻāĻžāĻšāĻ°āĻŖāĻ āĻĒāĻžāĻāĻ¯āĻŧāĻž āĻ¯āĻžāĻŦā§
āĻāĻāĻžāĻ¨ā§ āĻĒā§āĻ°āĻ¤āĻŋāĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻāĻ°ā§āĻ¨ āĻ¸ā§āĻ¨ā§āĻā§āĻ¸:7 āĻāĻĒāĻ° āĻāĻŦā§āĻ¨ā§āĻā§.
āĻŦāĻŋāĻ§āĻžāĻ¨āĻāĻžāĻ°ā§
"āĻ¸āĻ°āĻŦāĻ°āĻžāĻšāĻāĻžāĻ°ā§" - āĻāĻāĻāĻŋ āĻ¸āĻ¤ā§āĻ¤āĻž āĻ¯āĻž āĻĻā§āĻˇā§āĻāĻžāĻ¨ā§āĻ¤ āĻĒāĻ°āĻŋāĻāĻžāĻ˛āĻ¨āĻž āĻāĻ°ā§āĨ¤ āĻ
āĻŖā§āĻ° āĻā§āĻˇā§āĻ¤ā§āĻ°ā§, āĻāĻāĻŋ āĻāĻ¤ā§āĻ¤āĻ°āĻ¯ā§āĻā§āĻ¯, āĻ
āĻ¨ā§āĻ¯āĻĻā§āĻ° āĻāĻ¨ā§āĻ¯ āĻ¸āĻŽāĻ°ā§āĻĨāĻ¨ āĻĒāĻ°āĻŋāĻāĻ˛ā§āĻĒāĻŋāĻ¤ āĻ¨āĻ¯āĻŧ, āĻ¤āĻžāĻ āĻāĻ āĻŦāĻŋāĻāĻžāĻāĻāĻŋāĻā§ āĻ¸āĻ¤āĻ°ā§āĻāĻ¤āĻžāĻ° āĻ¸āĻžāĻĨā§ āĻāĻ¤ā§āĻ¤āĻ°āĻ¯ā§āĻā§āĻ¯ āĻŦāĻ°ā§āĻ§āĻŋāĻ¤ āĻāĻ¨āĻĢāĻŋāĻāĻžāĻ°ā§āĻļāĻ¨ āĻŦāĻ˛āĻž āĻ¯ā§āĻ¤ā§ āĻĒāĻžāĻ°ā§āĨ¤
āĻāĻāĻžāĻ¨ā§ āĻāĻĒāĻ¨āĻŋ āĻ
āĻ¨ā§āĻ āĻāĻŋāĻā§ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨, āĻāĻŽāĻŋ āĻāĻŽāĻžāĻ° āĻŽāĻ¤ā§ āĻĒā§āĻ°āĻ§āĻžāĻ¨ āĻĒāĻ¯āĻŧā§āĻ¨ā§āĻāĻā§āĻ˛āĻŋ āĻšāĻžāĻāĻ˛āĻžāĻāĻ āĻāĻ°āĻŦ:
- āĻĒā§āĻ˛ā§āĻŦā§āĻ: āĻāĻĒāĻ¨āĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻ āĻĒāĻ°ā§āĻ¯āĻžāĻ¯āĻŧā§ āĻā§āĻ¨ āĻĒā§āĻ˛ā§āĻŦā§āĻ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻž āĻāĻāĻŋāĻ¤ āĻ¤āĻž āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨āĨ¤
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