рдирд┐рд░реНрджреЗрд╢: рдЙрддреНрдкрд╛рджрди рдпреЛрдЧреНрдп рднреВрдорд┐рдХрд╛рдУрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХреИрд╕реЗ рдХрд░реЗрдВ рдФрд░ рдЙрддреНрдкрд╛рджрди рд╕реЗ рдкрд╣рд▓реЗ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдХрд░реЗрдВ

рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░!


рдореИрдВ рд╣реЛрдЯрд▓ рдЖрд░рдХреНрд╖рдг рд╕реЗрд╡рд╛ Ostrovok.ru рдореЗрдВ рдПрдХ DevOps рдЗрдВрдЬреАрдирд┐рдпрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рддрд╛рдХрд┐ рд╣рдо рдЕрдирдЬрд╛рдиреА рднреВрдорд┐рдХрд╛рдУрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХреЗрдВред


Ostrovok.ru рдкрд░, рд╣рдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреНрд░рдмрдВрдзрдХ рдХреЗ рд░реВрдк рдореЗрдВ ansible рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рд╣рд╛рд▓ рд╣реА рдореЗрдВ рднреВрдорд┐рдХрд╛рдУрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рд╕рд╛рде рдЖрдП рдереЗ, рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрдИ рдЙрдкрдХрд░рдг рдирд╣реАрдВ рд╣реИрдВ - рдЕрдгреБ рд░реВрдкрд░реЗрдЦрд╛ рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЙрдирдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХрдИ рдиреБрдХрд╕рд╛рдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪреБрдк рдереЗред рд╣рдореЗрдВ рд░реВрд╕реА рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рд╡рд┐рд╕реНрддреГрдд рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдХрд╛ рдирд╣реАрдВ рдорд┐рд▓реА, рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдЗрд╕ рд▓реЗрдЦ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред



рдЕрдгреБ


рдЕрдгреБ - ansible рднреВрдорд┐рдХрд╛рдУрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд░реВрдкрд░реЗрдЦрд╛ред


рд╕рд░рд▓реАрдХреГрдд рд╡рд┐рд╡рд░рдг: рдЕрдгреБ рдЙрд╕ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ (рдХреНрд▓рд╛рдЙрдб, рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди, рдХрдВрдЯреЗрдирд░; рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рдбреНрд░рд╛рдЗрд╡рд░ рдЕрдиреБрднрд╛рдЧ рджреЗрдЦреЗрдВ), рдЙрд╕ рдкрд░ рдЕрдкрдиреА рднреВрдорд┐рдХрд╛ рдЪрд▓рд╛рддрд╛ рд╣реИ, рдлрд┐рд░ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддрд╛ рд╣реИ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╣рдЯрд╛рддрд╛ рд╣реИред рдПрдХ рдХрджрдо рдкрд░ рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрдгреБ рдЖрдкрдХреЛ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд░реЗрдЧрд╛ред


рдЕрдм рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗред


рд╕рд┐рджреНрдзрд╛рдВрдд рдХреА рдмрд┐рдЯ


рдЕрдгреБ рдФрд░ рдЪрд╛рд▓рдХ: рдореЛрд▓реЗрдХреНрдпреВрд▓ рдХреА рджреЛ рдкреНрд░рдореБрдЦ рдЗрдХрд╛рдЗрдпреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред


рдкрд░рд┐рджреГрд╢реНрдп


рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдХреНрдпрд╛, рдХрд╣рд╛рдБ, рдХреИрд╕реЗ рдФрд░ рдХрд┐рд╕ рдХреНрд░рдо рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдХрд╛ рд╡рд┐рд╡рд░рдг рд╣реИред рдПрдХ рднреВрдорд┐рдХрд╛ рдореЗрдВ рдХрдИ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдкрде рдХреЗ рд╕рд╛рде рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╣реИ <role>/molecule/<scenario> , рдЬрд┐рд╕рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг рд╢рд╛рдорд┐рд▓ рд╣реИред default рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореМрдЬреВрдж рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдмрдирд╛рдИ рдЬрд╛рдПрдЧреА рдпрджрд┐ рдЖрдк рдЕрдгреБ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рднреВрдорд┐рдХрд╛ рдХреЛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЗ рдирд╛рдо рдЖрдкрдХреЗ рд╡рд┐рд╡реЗрдХ рдкрд░ рдЪреБрдиреЗ рдЧрдП рд╣реИрдВред


рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЛ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ , рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдпрд╣ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:


(рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЫреЛрдбрд╝реЗ рдЧрдП рдХрджрдо)


  • lint - рд░рди рд▓рд┐рдВрдЯрд░ред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, yamllint рдФрд░ flake8 ,
  • destroy - рдкрд┐рдЫрд▓реЗ рдЕрдгреБ рдкреНрд░рдХреНрд╖реЗрдкрдг рд╕реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрдВ (рдпрджрд┐ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ),
  • dependency ? - рдкрд░реАрдХреНрд╖рдг рдХреА рднреВрдорд┐рдХрд╛ рдХреА рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп-рдирд┐рд░реНрднрд░рддрд╛ рдХреА рд╕реНрдерд╛рдкрдирд╛,
  • syntax - syntax - ansible-playbook --syntax-check , рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рднреВрдорд┐рдХрд╛ рдХреЗ рд╡рд╛рдХреНрдп ansible-playbook --syntax-check
  • create - рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдПрдБ,
  • prepare ? - рдЙрджрд╛рд╣рд░рдг рдХреА рддреИрдпрд╛рд░реА; рдЬреИрд╕реЗ python2 рдХреА рдЬрд╛рдБрдЪ / рд╕реНрдерд╛рдкрдирд╛
  • converge - рдкрд░реАрдХреНрд╖рдг рдХреА рдЧрдИ рдкреНрд▓реЗрдмреБрдХ рдХрд╛ рд╢реБрднрд╛рд░рдВрдн,
  • idempotence - рдЖрд▓рд╕реНрдп рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдкреНрд▓реЗрдмреБрдХ рдХреЛ рдкреБрдирдГ рдЖрд░рдВрдн рдХрд░реЗрдВ,
  • side_effect ? - рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╕реАрдзреЗ рднреВрдорд┐рдХрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ,
  • verify - testinfra (рдбрд┐рдлрд╝реЙрд▓реНрдЯ) / goss / goss рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рдгрд╛рдореА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдПрдВ,
  • cleanup ? - (рдирдП рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ) - рдореЛрдЯреЗ рддреМрд░ рдкрд░, рдмреЛрд▓рдЪрд╛рд▓ рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдмрд╛рд╣рд░реА рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХреА "рд╕рдлрд╛рдИ"
  • destroy - рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣рдЯрд╛рдирд╛ред

рдпрд╣ рдЕрдиреБрдХреНрд░рдо рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдорд▓реЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдЖрдк рдЗрд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред


рдЙрдкрд░реНрдпреБрдХреНрдд рдЪрд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ molecule <command> рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрд▓рдЧ рд╕реЗ рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдордЭрдирд╛ рдЙрдЪрд┐рдд рд╣реИ рдХрд┐ рдРрд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреНрд▓реА-рдХрдорд╛рдВрдб рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдореМрдЬреВрдж рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ molecule matrix <command> рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдХреЗ рдкрд╣рдЪрд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдЖрдк converge рдХрдорд╛рдВрдб рдЪрд▓рд╛рддреЗ рд╣реИрдВ (рдкрд░реАрдХреНрд╖рдг рдкреНрд▓реЗрдмреБрдХ рдЪрд▓рд╛рддреЗ рд╣реИрдВ), рддреЛ рдирд┐рдореНрди рдХрд╛рд░реНрдп рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ:


 $ molecule matrix converge ... тФФтФАтФА default #   тФЬтФАтФА dependency #   тФЬтФАтФА create #   тФЬтФАтФА prepare #   тФФтФАтФА converge #   

рдЗрди рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рд╕реВрдЪреА рдореЗрдВ рд╕реЗ рдХреБрдЫ рдкрд╣рд▓реЗ рд╣реА рдкреВрд░рд╛ рд╣реЛ рдЪреБрдХрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐, рд╕рд╛рде рд╣реА рдЖрд╡реГрддреНрддрд┐ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди, $TMPDIR/molecule/<role>/<scenario> рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред


рдХреЗ рд╕рд╛рде рдХрджрдо рдЬреЛрдбрд╝реЗрдВ ? рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ ansible-playbook рдХреЗ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЪрд░рдг рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдмрдирд╛рддреЗ рд╣реИрдВ: side_effect.yml / side_effect.yml ред рдЕрдгреБ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЗрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдЧрд╛ред


рдбреНрд░рд╛рдЗрд╡рд░


рдПрдХ рдЪрд╛рд▓рдХ рдПрдХ рдЗрдХрд╛рдИ рд╣реИ рдЬрд╣рд╛рдВ рдкрд░реАрдХреНрд╖рдг рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдорд╛рдирдХ рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреА рд╕реВрдЪреА рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдореЛрд▓реЗрдХреНрдпреВрд▓ рддреИрдпрд╛рд░ рд╣реИ, рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИрдВ: рдПрдЬрд╝реНрдпреЛрд░, рдбреЙрдХрд░, рдИрд╕реА 2, рдЬреАрд╕реАрдИ, рдПрд▓рдПрдХреНрд╕рд╕реА, рдПрд▓рдПрдХреНрд╕рдбреА, рдУрдкрдирд╕реНрдЯреИрдХ, рд╡реИрдЧреНрд░реЗрдВрдЯ, рдбреЗрд▓рд┐рдЧреЗрдЯред


рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ create.yml рдФрд░ create.yml destroy.yml рд╣реЛрддреА рд╣реИрдВ рдЬреЛ рдХреНрд░рдорд╢рдГ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдирд┐рд░реНрдорд╛рдг рдФрд░ рд╡рд┐рд▓реЛрдкрди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреА рд╣реИрдВред
рдЕрдкрд╡рд╛рдж рдбреЛрдХрд░ рдФрд░ рд╡реИрдЧреНрд░рд╛рдВрдд рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдкрд░реЛрдХреНрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдмрд┐рдирд╛ рдЙрдирдХреЗ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рд╣реЛ рд╕рдХрддреА рд╣реИред


рдпрд╣ рдбреЗрд▓реАрдЧреЗрдЯреЗрдб рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЛ рдмрдирд╛рдиреЗ рдФрд░ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХреЗрд╡рд▓ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдмрд╛рдХреА рдХрд╛ рд╡рд░реНрдгрди рдЗрдВрдЬреАрдирд┐рдпрд░ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред


рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдбреНрд░рд╛рдЗрд╡рд░ Docker рд╣реИред


рдЕрдм рд╣рдо рдЕрднреНрдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╡рд╣рд╛рдВ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред


рд╢реБрд░реБрдЖрдд рд╣реЛ рд░рд╣реА рд╣реИ


"рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб" рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдирд╛рдЬрд╝рд┐рдирдХреНрд╕ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рд╕рд░рд▓ рднреВрдорд┐рдХрд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рд░реВрдк рдореЗрдВ docker рдХреЛ рдЪреБрдиреЗрдВрдЧреЗ - рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдк рдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рд╣реИ (рдФрд░ рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ docker рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдбреНрд░рд╛рдЗрд╡рд░ рд╣реИ)ред


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 

рдирд┐рд░реНрднрд░рддрд╛


рдпрд╣ рдЦрдВрдб рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд╕реНрд░реЛрдд рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред


рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд┐рдХрд▓реНрдк: рдЖрдХрд╛рд╢рдЧрдВрдЧрд╛ , рдЧрд┐рд▓реНрдЯ , рд╢реЗрд▓ред


рд╢реЗрд▓ рдХреЗрд╡рд▓ рдПрдХ рдХрдорд╛рдВрдб рд╢реЗрд▓ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рдЖрдХрд╛рд╢рдЧрдВрдЧрд╛ рдФрд░ рдЧрд┐рд▓реНрдЯ рдЖрдкрдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдХрд╡рд░ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред


рдореИрдВ рдпрд╣рд╛рдВ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдирд╣реАрдВ рд░реБрдХреВрдВрдЧрд╛, рдпрд╣ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рд╡рд░реНрдгрд┐рдд рд╣реИред


рдбреНрд░рд╛рдЗрд╡рд░


рдбреНрд░рд╛рдЗрд╡рд░ рдХрд╛ рдирд╛рдоред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рдбреЙрдХрдЯрд░ рд╣реИред


рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡реГрдХреНрд╖


рд▓рд┐рдВрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдпрдорд▓рд┐рдиреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдЗрд╕ рднрд╛рдЧ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╡рд┐рдХрд▓реНрдк рдпрдорд▓рд┐рдиреНрдЯ, рдЖрдЧреЗ рдХреЗ рд╡рд╛рддрд╛рд╡рд░рдг рдЪрд░ рдпрд╛ рд▓рд┐рдВрдЯрд░ рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдиреНрдпрд╛рд╕ рдлрд╛рдЗрд▓ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИ:


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

рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ


рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред
рдПрдХ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рд░реВрдк рдореЗрдВ Dockerfile.j2 рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, Molecule рдЗрд╕ рдЦрдВрдб рдкрд░ Dockerfile.j2 рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╕реВрдЪреА рдЖрдЗрдЯрдо Dockerfile.j2 рдореЗрдВ item рдЪрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реЛрддрд╛ рд╣реИред


рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬрд┐рд╕рдореЗрдВ create.yml рдФрд░ create.yml destroy.yml , рдЕрдиреБрднрд╛рдЧ рдЙрдиреНрд╣реЗрдВ create.yml рд░реВрдк рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ, рдФрд░ рдЙрд╕ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИрдВред


рдЪреВрдБрдХрд┐ рдЕрдгреБ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдЕрдгреБ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡рд╣рд╛рдБ рд╕рдВрднрд╛рд╡рд┐рдд рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреА рд╕реВрдЪреА рдорд╛рдВрдЧреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред Docker рдХреЗ рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, docker_container_module рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред рдЕрдиреНрдп рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдореЗрдВ рдХреМрди рд╕реЗ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд╕реНрд╡рдпрдВ рдЕрдгреБ рдХреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред


рдмрджрд▓реЗрдВ рд╕реЗрдВрдЯреЛрд╕: 7 рдпрд╣рд╛рдБ ubuntu рдкрд░ред


рдкреНрд░рд╛рд╡рдзрд╛рдирдХрд░реНрддрд╛


"рдкреНрд░рджрд╛рддрд╛" рд╡рд╣ рд╕рдВрд╕реНрдерд╛ рд╣реИ рдЬреЛ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреА рд╣реИред рдЕрдгреБ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ ansible рд╣реИ, рджреВрд╕рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреА рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдЦрдВрдб рдХреЛ ansible рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдЖрд░рдХреНрд╖рдг рдХреЗ рд╕рд╛рде рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдпрд╣рд╛рдБ рдЖрдк рдмрд╣реБрдд рд╕реА рдмрд╛рддреЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдореИрдВ рдЕрдкрдиреА рд░рд╛рдп, рдХреНрд╖рдгреЛрдВ рдореЗрдВ рдореБрдЦреНрдп рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓реВрдВрдЧрд╛:


  • рдкреНрд▓реЗрдмреБрдХ : рдЖрдк рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреБрдЫ рдЪрд░рдгреЛрдВ рдореЗрдВ рдХреМрди рд╕реА рдкреНрд▓реЗрдмреБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

 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 

  • connection_options : рдХрдиреЗрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░

 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 рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдПрдХреНрд╢рди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ <command>_sequence рдФрд░ рдЪрд░рдгреЛрдВ рдХреА рд╕реВрдЪреА рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рддреЗ рд╣реБрдП рд╣рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдореВрд▓реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдо рдкреНрд▓реЗрдмреБрдХ рд░рди рдХрдорд╛рдВрдб рдЪрд▓рд╛рддреЗ рд╕рдордп рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЛ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ: molecule converge


 # : # - dependency # - create # - prepare # - converge scenario: name: default converge_sequence: - create - converge 

рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛


рдкрд░реАрдХреНрд╖рдгреЛрдВ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрдирд░ рдХреЗ рд▓рд┐рдП рд░реВрдкрд░реЗрдЦрд╛ рддреИрдпрд╛рд░ рдХрд░рдирд╛ред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, testinfra рдФрд░ flake8 рдХрд╛ рдЙрдкрдпреЛрдЧ flake8 testinfra рдореЗрдВ рдХрд┐рдпрд╛ testinfra ред рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд┐рдХрд▓реНрдк рдЙрдкрд░реЛрдХреНрдд рдХреЗ рд╕рдорд╛рди рд╣реИрдВ:


 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 рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛рдИ рдЬрд╛рдПрдЧреАред


рдирд┐рд╖реНрдХрд░реНрд╖


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдгреБ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЬрдм рдЖрдк рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрдВрд╕реНрдЯреЗрдВрд╕реЗрд╕ рдмрдирд╛рдиреЗ рдФрд░ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд▓реЗрдмреБрдХ рдореЗрдВ рдПрдбрд┐рдЯрд┐рдВрдЧ рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдореЗрдВ рдПрдХ рдирдИ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рддреИрдирд╛рддреА рдХреЛ рдХрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдгреБ рд╕реАрдЖрдИ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдореВрд▓ рдПрдХреАрдХреГрдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдкреБрд╕реНрддрд┐рдХрд╛рдУрдВ рдХреЛ рд▓реЗрдиреЗ рдХреЗ рд╕рдордп рдХреЛ рдХрдо рдХрд░рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреА рдЧрддрд┐ рдмрдврд╝рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред


рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрдиреБрднрд╡рдЬрдиреНрдп рднреВрдорд┐рдХрд╛рдУрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХрд╛ рдЕрдиреБрднрд╡ рд╣реИ, рдФрд░ рдпрд╣ рдЕрдгреБ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИ - рддреЛ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдПрдВ!

Source: https://habr.com/ru/post/hi448136/


All Articles