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

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

рдореИрдВ рдПрдХ рд╣реЛрдЯрд▓ рдмреБрдХрд┐рдВрдЧ рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП 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, рдФрд░ рдЗрд╕рдХреЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдЗрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

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

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

рдЖрдЗрдП рдпрд╣рд╛рдВ рдмрджрд▓реЗрдВ рд╕реЗрдВрдЯреЛрд╕: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

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ