рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░!
рдореИрдВ рдПрдХ рд╣реЛрдЯрд▓ рдмреБрдХрд┐рдВрдЧ рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП DevOps рдЗрдВрдЬреАрдирд┐рдпрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдБред
Ostrovok.ru рдкрд░ рд╣рдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреНрд░рдмрдВрдзрдХ рдХреЗ рд░реВрдк рдореЗрдВ ansible рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╣рд╛рд▓ рд╣реА рдореЗрдВ рд╣рдореЗрдВ рднреВрдорд┐рдХрд╛рдУрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдорд╣рд╕реВрд╕ рд╣реБрдИ, рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрдИ рдЙрдкрдХрд░рдг рдирд╣реАрдВ рд╣реИрдВ - рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп, рд╢рд╛рдпрдж, рдЕрдгреБ рдврд╛рдВрдЪрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЙрдирдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрдИ рдиреБрдХрд╕рд╛рдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪреБрдк рд╣реИред рд╣рдореЗрдВ рд░реВрд╕реА рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рд╡рд┐рд╕реНрддреГрдд рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдХрд╛ рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХреА, рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдпрд╣ рд▓реЗрдЦ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред
рдЕрдгреБ
рд╕рд░рд▓реАрдХреГрдд рд╡рд┐рд╡рд░рдг: рдЕрдгреБ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо (рдХреНрд▓рд╛рдЙрдб, рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди, рдХрдВрдЯреЗрдирд░) рдкрд░ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддрд╛ рд╣реИ; рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рдЕрдиреБрднрд╛рдЧ рджреЗрдЦреЗрдВ
рдЕрдм рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗред
рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛
рдЕрдгреБ рдХреА рджреЛ рдкреНрд░рдореБрдЦ рд╕рдВрд╕реНрдерд╛рдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ: рдкрд░рд┐рджреГрд╢реНрдп рдФрд░ рдЪрд╛рд▓рдХред
рдкрд░рд┐рджреГрд╢реНрдп
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдпрд╣ рд╡рд░реНрдгрди рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛, рдХрд╣рд╛рдБ, рдХреИрд╕реЗ рдФрд░ рдХрд┐рд╕ рдХреНрд░рдо рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдПрдХ рднреВрдорд┐рдХрд╛ рдореЗрдВ рдХрдИ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдкрде рдХреЗ рд╕рд╛рде рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╣реИ <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>
. рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдРрд╕реЗ рдкреНрд░рддреНрдпреЗрдХ cli рдХрдорд╛рдВрдб рдХреЗ рд▓рд┐рдП рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдЕрдкрдирд╛ рдХреНрд░рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЖрдк рдЪрд▓рд╛рдХрд░ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ molecule matrix <command>
. рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрдорд╛рдВрдб рдЪрд▓рд╛рддреЗ рд╕рдордп converge
(рдкрд░реАрдХреНрд╖рдг рдХреЗ рддрд╣рдд рдкреНрд▓реЗрдмреБрдХ рдЪрд▓рд╛рдиреЗ рдкрд░), рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреНрд░рд┐рдпрд╛рдПрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХреА рдЬрд╛рдПрдВрдЧреА:
$ molecule matrix converge
...
тФФтФАтФА default # ╨╜╨░╨╖╨▓╨░╨╜╨╕╨╡ ╤Б╤Ж╨╡╨╜╨░╤А╨╕╤П
тФЬтФАтФА dependency # ╤Г╤Б╤В╨░╨╜╨╛╨▓╨║╨░ ╨╖╨░╨▓╨╕╤Б╨╕╨╝╨╛╤Б╤В╨╡╨╣
тФЬтФАтФА create # ╤Б╨╛╨╖╨┤╨░╨╜╨╕╨╡ ╨╕╨╜╤Б╤В╨░╨╜╤Б╨░
тФЬтФАтФА prepare # ╨┐╤А╨╡╨┤╨╜╨░╤Б╤В╤А╨╛╨╣╨║╨░ ╨╕╨╜╤Б╤В╨░╨╜╤Б╨░
тФФтФАтФА converge # ╨┐╤А╨╛╨│╨╛╨╜ ╨┐╨╗╨╡╨╣╨▒╤Г╨║╨░
рдЗрди рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдХреНрд░рдо рд╕рдВрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рд╕реВрдЪреА рдореЗрдВ рд╕реЗ рдХреБрдЫ рдкрд╣рд▓реЗ рд╣реА рдХрд┐рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИ, рддреЛ рдЙрд╕реЗ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐, рд╕рд╛рде рд╣реА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рд╡рд┐рдиреНрдпрд╛рд╕, рдЕрдгреБ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддрд╛ рд╣реИ $TMPDIR/molecule/<role>/<scenario>
.
рдХреЗ рд╕рд╛рде рдЪрд░рдг рдЬреЛрдбрд╝реЗрдВ ?
рдЖрдк Ansible рдкреНрд▓реЗрдмреБрдХ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЪрд░рдг рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ: 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
рдпрд╣ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрддреНрддрд░рджрд╛рдпреА-рднреВрдорд┐рдХрд╛ рдирд┐рдХрд▓реАред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реАрдПрд▓рдЖрдИ рдЕрдгреБрдУрдВ рдХреЗ рд╕рд╛рде рд╕рднреА рдЗрдВрдЯрд░реИрдХреНрд╢рди рднреВрдорд┐рдХрд╛ рдХреА рдЬрдбрд╝ рд╕реЗ рдмрдиреЗ рд╣реЛрддреЗ рд╣реИрдВред
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рднреВрдорд┐рдХрд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ:
> 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 рдкрд░ ubuntu.
рдкреНрд░рд╛рд╡рдзрд╛рдирдХрд░реНрддрд╛
"рдкреНрд░рджрд╛рддрд╛" рд╡рд╣ рдЗрдХрд╛рдИ рд╣реИ рдЬреЛ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддреА рд╣реИред рдЕрдгреБ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдЙрддреНрддрд░рджрд╛рдпреА рд╣реИ; рджреВрд╕рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреА рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рдмрдирд╛рдИ рдЧрдИ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрд░рдХреНрд╖рдг рдХреЗ рд╕рд╛рде рдЗрд╕ рдЕрдиреБрднрд╛рдЧ рдХреЛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдЙрддреНрддрд░рджрд╛рдпреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЖрдк рдпрд╣рд╛рдВ рдмрд╣реБрдд рдХреБрдЫ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдореИрдВ рдореБрдЦреНрдп рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓реВрдВрдЧрд╛:
- playbooks: рдЖрдк рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреБрдЫ рдЪрд░рдгреЛрдВ рдореЗрдВ рдХреМрди рд╕реА рдкреНрд▓реЗрдмреБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
provisioner:
name: ansible
playbooks:
create: create.yml
destroy: ../default/destroy.yml
converge: playbook.yml
side_effect: side_effect.yml
cleanup: cleanup.yml
- config_options:
ansible config
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