Ansible рд╡рд╛рдкрд░реВрди Rails рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЙрдкрдпреЛрдЬрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕рд░реНрд╡реНрд╣рд░ рд╕реЗрдЯ рдХрд░рдгреЗ

рдХрд╛рд╣реА рдХрд╛рд│рд╛рдкреВрд░реНрд╡реА рдорд▓рд╛ рд░реЗрд▓ рдНрдкреНрд▓рд┐рдХреЗрд╢рди рддреИрдирд╛рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕рд░реНрд╡реНрд╣рд░ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЕрдиреЗрдХ рдЙрддреНрддрд░рджрд╛рдпреА рдкреНрд▓реЗрдмреБрдХ рд▓рд┐рд╣рд┐рдгреНрдпрд╛рдЪреА рдЧрд░рдЬ рд╣реЛрддреА. рдЖрдгрд┐, рдЖрд╢реНрдЪрд░реНрдпрд╛рдЪреА рдЧреЛрд╖реНрдЯ рдореНрд╣рдгрдЬреЗ, рдорд▓рд╛ рдПрдХ рд╕рд╛рдзреЗ рдЪрд░рдг-рджрд░-рдЪрд░рдг рдореЕрдиреНрдпреБрдЕрд▓ рд╕рд╛рдкрдбрд▓реЗ рдирд╛рд╣реА. рдХрд╛рдп рдШрдбрдд рдЖрд╣реЗ рд╣реЗ рд╕рдордЬреВрди рдШреЗрддрд▓реНрдпрд╛рд╢рд┐рд╡рд╛рдп рдорд▓рд╛ рдХреЛрдгрд╛рдЪреНрдпрд╛рддрд░реА рдкреНрд▓реЗрдмреБрдХрдЪреА рдХреЙрдкреА рдХрд░рд╛рдпрдЪреА рдирд╡реНрд╣рддреА рдЖрдгрд┐ рд╢реЗрд╡рдЯреА рдорд▓рд╛ рд╕рд░реНрд╡ рдХрд╛рд╣реА рд╕реНрд╡рддрдГ рдЧреЛрд│рд╛ рдХрд░реВрди рджрд╕реНрддрдРрд╡рдЬреАрдХрд░рдг рд╡рд╛рдЪрд╛рд╡реЗ рд▓рд╛рдЧрд▓реЗ. рдХрджрд╛рдЪрд┐рдд рдореА рдпрд╛ рд▓реЗрдЦрд╛рдЪреНрдпрд╛ рдорджрддреАрдиреЗ рдПрдЦрд╛рджреНрдпрд╛рд▓рд╛ рд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╡реЗрдЧрд╡рд╛рди рдХрд░рдгреНрдпрд╛рдд рдорджрдд рдХрд░реВ рд╢рдХреЗрди.

рд╕рдордЬреВрди рдШреЗрдгреНрдпрд╛рдЪреА рдкрд╣рд┐рд▓реА рдЧреЛрд╖реНрдЯ рдореНрд╣рдгрдЬреЗ рдПрдВрд╕рд┐рдмрд▓ рддреБрдореНрд╣рд╛рд▓рд╛ SSH рджреНрд╡рд╛рд░реЗ рд░рд┐рдореЛрдЯ рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рдХреНрд░рд┐рдпрд╛рдВрдЪреА рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╕реВрдЪреА рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕реЛрдпреАрд╕реНрдХрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рддреЗ. рдпреЗрдереЗ рдХреЛрдгрддреАрд╣реА рдЬрд╛рджреВ рдирд╛рд╣реА, рддреБрдореНрд╣реА рдкреНрд▓рдЧрдЗрди рд╕реНрдерд╛рдкрд┐рдд рдХрд░реВ рд╢рдХрдд рдирд╛рд╣реА рдЖрдгрд┐ рдмреЙрдХреНрд╕рдЪреНрдпрд╛ рдмрд╛рд╣реЗрд░ рдбреЙрдХрд░, рдореЙрдирд┐рдЯрд░рд┐рдВрдЧ рдЖрдгрд┐ рдЗрддрд░ рд╡рд╕реНрддреВрдВрд╕рд╣ рддреБрдордЪреНрдпрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рдЪрд╛ рд╢реВрдиреНрдп рдбрд╛рдЙрдирдЯрд╛рдЗрдо рдЙрдкрдпреЛрдЬрди рдорд┐рд│рд╡реВ рд╢рдХрдд рдирд╛рд╣реА. рдкреНрд▓реЗрдмреБрдХ рд▓рд┐рд╣рд┐рдгреНрдпрд╛рд╕рд╛рдареА, рддреБрдореНрд╣рд╛рд▓рд╛ рдирдХреНрдХреА рдХрд╛рдп рдХрд░рд╛рдпрдЪреЗ рдЖрд╣реЗ рдЖрдгрд┐ рддреЗ рдХрд╕реЗ рдХрд░рд╛рдпрдЪреЗ рдЖрд╣реЗ рд╣реЗ рдорд╛рд╣рд┐рдд рдЕрд╕рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдореНрд╣рдгреВрдирдЪ рдореА GitHub рд╡рд░реАрд▓ рд░реЗрдбреАрдореЗрдб рдкреНрд▓реЗрдмреБрдХ рдХрд┐рдВрд╡рд╛ "рдХреЙрдкреА рдХрд░рд╛ рдЖрдгрд┐ рдЪрд╛рд▓рд╡рд╛, рддреЗ рдХрд╛рд░реНрдп рдХрд░реЗрд▓" рдпрд╛рд╕рд╛рд░рдЦреНрдпрд╛ рд▓реЗрдЦрд╛рдВрд╡рд░ рд╕рдорд╛рдзрд╛рдиреА рдирд╛рд╣реА.

рдЖрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рд╣рд╡реЗ рдЖрд╣реЗ?

рдореА рдЖрдзреАрдЪ рдореНрд╣рдЯрд▓реНрдпрд╛рдкреНрд░рдорд╛рдгреЗ, рдкреНрд▓реЗрдмреБрдХ рд▓рд┐рд╣рд┐рдгреНрдпрд╛рд╕рд╛рдареА рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рдХрд░рд╛рдпрдЪреЗ рдЖрд╣реЗ рдЖрдгрд┐ рддреЗ рдХрд╕реЗ рдХрд░рд╛рдпрдЪреЗ рдЖрд╣реЗ рд╣реЗ рдорд╛рд╣рд┐рдд рдЕрд╕рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдЖрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рд╣рд╡реЗ рдЖрд╣реЗ рддреЗ рдард░рд╡реВрдпрд╛. рд░реЗрд▓ рдНрдкреНрд▓рд┐рдХреЗрд╢рдирд╕рд╛рдареА рдЖрдореНрд╣рд╛рд▓рд╛ рдЕрдиреЗрдХ рд╕рд┐рд╕реНрдЯрдо рдкреЕрдХреЗрдЬреЗрд╕рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕реЗрд▓: nginx, postgresql (redis, рдЗ). рдпрд╛рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд, рдЖрдореНрд╣рд╛рд▓рд╛ рд░реБрдмреАрдЪреНрдпрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрд╡реГрддреНрддреАрдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ. рд╣реЗ rbenv (rvm, asdf...) рджреНрд╡рд╛рд░реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреЗ рд╕рд░реНрд╡реЛрддреНрддрдо рдЖрд╣реЗ. рд░реВрдЯ рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдореНрд╣рдгреВрди рд╣реЗ рд╕рд░реНрд╡ рдЪрд╛рд▓рд╡рдгреЗ рдиреЗрд╣рдореАрдЪ рдПрдХ рд╡рд╛рдИрдЯ рдХрд▓реНрдкрдирд╛ рдЕрд╕рддреЗ, рдореНрд╣рдгреВрди рддреБрдореНрд╣рд╛рд▓рд╛ рд╕реНрд╡рддрдВрддреНрд░ рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рддрдпрд╛рд░ рдХрд░рдгреЗ рдЖрдгрд┐ рддреНрдпрд╛рдЪреЗ рдЕрдзрд┐рдХрд╛рд░ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдпрд╛рдирдВрддрд░, рддреБрдореНрд╣рд╛рд▓рд╛ рдЖрдордЪрд╛ рдХреЛрдб рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рдЕрдкрд▓реЛрдб рдХрд░рд╛рд╡рд╛ рд▓рд╛рдЧреЗрд▓, nginx, postgres рдЗрддреНрдпрд╛рджреАрд╕рд╛рдареА рдХреЙрдиреНрдлрд┐рдЧ рдХреЙрдкреА рдХрд░рд╛рд╡реА рд▓рд╛рдЧреЗрд▓ рдЖрдгрд┐ рдпрд╛ рд╕рд░реНрд╡ рд╕реЗрд╡рд╛ рд╕реБрд░реВ рдХрд░рд╛рд╡реНрдпрд╛ рд▓рд╛рдЧрддреАрд▓.

рдкрд░рд┐рдгрд╛рдореА, рдХреНрд░рд┐рдпрд╛рдВрдЪрд╛ рдХреНрд░рдо рдЦрд╛рд▓реАрд▓рдкреНрд░рдорд╛рдгреЗ рдЖрд╣реЗ:

  1. рд░реВрдЯ рдореНрд╣рдгреВрди рд▓реЙрдЧ рдЗрди рдХрд░рд╛
  2. рд╕рд┐рд╕реНрдЯрдо рдкреЕрдХреЗрдЬреЗрд╕ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рд╛
  3. рдирд╡реАрди рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рддрдпрд╛рд░ рдХрд░рд╛, рдЕрдзрд┐рдХрд╛рд░ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░рд╛, ssh рдХреА
  4. рд╕рд┐рд╕реНрдЯрдо рдкреЕрдХреЗрдЬреЗрд╕ (nginx рдЗ.) рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░рд╛ рдЖрдгрд┐ рддреНрдпрд╛рдВрдирд╛ рдЪрд╛рд▓рд╡рд╛
  5. рдЖрдореНрд╣реА рдбреЗрдЯрд╛рдмреЗрд╕рдордзреНрдпреЗ рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рддрдпрд╛рд░ рдХрд░рддреЛ (рддреБрдореНрд╣реА рд▓рдЧреЗрдЪ рдбреЗрдЯрд╛рдмреЗрд╕ рддрдпрд╛рд░ рдХрд░реВ рд╢рдХрддрд╛)
  6. рдирд╡реАрди рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдореНрд╣рдгреВрди рд▓реЙрдЧ рдЗрди рдХрд░рд╛
  7. rbenv рдЖрдгрд┐ ruby тАЛтАЛрд╕реНрдерд╛рдкрд┐рдд рдХрд░рд╛
  8. рдмрдВрдбрд▓рд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдд рдЖрд╣реЗ
  9. рдЕрд░реНрдЬ рдХреЛрдб рдЕрдкрд▓реЛрдб рдХрд░рдд рдЖрд╣реЗ
  10. Puma рд╕рд░реНрд╡реНрд╣рд░ рд▓рд╛рдБрдЪ рдХрд░рдд рдЖрд╣реЗ

рд╢рд┐рд╡рд╛рдп, рд╢реЗрд╡рдЯрдЪреЗ рдЯрдкреНрдкреЗ рдХреЕрдкрд┐рд╕реНрдЯреНрд░рд╛рдиреЛ рд╡рд╛рдкрд░реВрди рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддрд╛рдд, рдХрдореАрддрдХрдореА рдмреЙрдХреНрд╕рдЪреНрдпрд╛ рдмрд╛рд╣реЗрд░ рддреЛ рдХреЛрдб рд░рд┐рд▓реАрдЭ рдбрд┐рд░реЗрдХреНрдЯрд░реАрдордзреНрдпреЗ рдХреЙрдкреА рдХрд░реВ рд╢рдХрддреЛ, рдпрд╢рд╕реНрд╡реА рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯрд╡рд░ рд╕рд┐рдорд▓рд┐рдВрдХрд╕рд╣ рд░рд┐рд▓реАрдЭ рд╕реНрд╡рд┐рдЪ рдХрд░реВ рд╢рдХрддреЛ, рд╢реЗрдЕрд░ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдбрд┐рд░реЗрдХреНрдЯрд░реАрдордзреВрди рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдХреЙрдкреА рдХрд░реВ рд╢рдХрддреЛ, рдкреНрдпреВрдорд╛ рд░реАрд╕реНрдЯрд╛рд░реНрдЯ рдХрд░реВ рд╢рдХрддреЛ рдЗ. рд╣реЗ рд╕рд░реНрд╡ Ansible рд╡рд╛рдкрд░реВрди рдХрд░рддрд╛ рдпреЗрддреЗ, рдкрдг рдХрд╛?

рдлрд╛рдЗрд▓ рд╕рдВрд░рдЪрдирд╛

Ansible рдХрдбрдХ рдЖрд╣реЗ рдлрд╛рдЗрд▓ рд╕рдВрд░рдЪрдирд╛ рддреБрдордЪреНрдпрд╛ рд╕рд░реНрд╡ рдлрд╛рдпрд▓реАрдВрд╕рд╛рдареА, рддреНрдпрд╛рдореБрд│реЗ рддреЗ рд╕рд░реНрд╡ рд╡реЗрдЧрд│реНрдпрд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХреЗрдд рдареЗрд╡рдгреЗ рдЪрд╛рдВрдЧрд▓реЗ. рд╢рд┐рд╡рд╛рдп, рддреЗ рд╕реНрд╡рддрдГ рд░реЗрд▓ рдНрдкреНрд▓рд┐рдХреЗрд╢рдирдордзреНрдпреЗ рдЕрд╕реЗрд▓ рдХрд┐рдВрд╡рд╛ рд╕реНрд╡рддрдВрддреНрд░рдкрдгреЗ рдЕрд╕реЗрд▓ рд╣реЗ рдЗрддрдХреЗ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ рдирд╛рд╣реА. рддреБрдореНрд╣реА рдлрд╛рдЗрд▓реНрд╕ рд╡реЗрдЧрд│реНрдпрд╛ рдЧрд┐рдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реАрдордзреНрдпреЗ рд╕рд╛рдард╡реВ рд╢рдХрддрд╛. рд╡реИрдпрдХреНрддрд┐рдХрд░рд┐рддреНрдпрд╛, рдорд▓рд╛ рд░реЗрд▓ рдНрдкреНрд▓рд┐рдХреЗрд╢рдирдЪреНрдпрд╛ /рдХреЙрдиреНрдлрд┐рдЧ рдбрд┐рд░реЗрдХреНрдЯрд░реАрдордзреНрдпреЗ рдЙрддреНрддрд░рджрд╛рдпреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рддрдпрд╛рд░ рдХрд░рдгреЗ рдЖрдгрд┐ рд╕рд░реНрд╡ рдХрд╛рд╣реА рдПрдХрд╛ рд░реЗрдкреЙрдЬрд┐рдЯрд░реАрдордзреНрдпреЗ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░рдгреЗ рд╕рд░реНрд╡рд╛рдд рд╕реЛрдпреАрдЪреЗ рд╡рд╛рдЯрд▓реЗ.

рд╕рд╛рдзреЗ рдкреНрд▓реЗрдмреБрдХ

рдкреНрд▓реЗрдмреБрдХ рд╣реА рдПрдХ yml рдлрд╛рдЗрд▓ рдЖрд╣реЗ рдЬреА, рд╡рд┐рд╢реЗрд╖ рд╡рд╛рдХреНрдпрд░рдЪрдирд╛ рд╡рд╛рдкрд░реВрди, Ansible рдХрд╛рдп рдЖрдгрд┐ рдХрд╕реЗ рдХрд░рд╛рд╡реЗ рдпрд╛рдЪреЗ рд╡рд░реНрдгрди рдХрд░рддреЗ. рдЪрд▓рд╛ рдЕрд╕реЗ рдкрд╣рд┐рд▓реЗ рдкреНрд▓реЗрдмреБрдХ рддрдпрд╛рд░ рдХрд░реВ рдЬреЗ рдХрд╛рд╣реАрд╣реА рдХрд░рдд рдирд╛рд╣реА:

---
- name: Simple playbook
  hosts: all

рдЗрдереЗ рдЖрдореНрд╣реА рд╕рд╣рдЬ рдореНрд╣рдгрддреЛ рдХреА рдЖрдордЪреЗ рдкреНрд▓реЗрдмреБрдХ рдореНрд╣рдгрддрд╛рдд Simple Playbook рдЖрдгрд┐ рддреНрдпрд╛рддреАрд▓ рд╕рд╛рдордЧреНрд░реА рд╕рд░реНрд╡ рдпрдЬрдорд╛рдирд╛рдВрд╕рд╛рдареА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреЗрд▓реА рдЬрд╛рд╡реА. рдЖрдкрдг рддреЗ рдирд╛рд╡рд╛рд╕рд╣ /ansible рдбрд┐рд░реЗрдХреНрдЯрд░реАрдордзреНрдпреЗ рд╕реЗрд╡реНрд╣ рдХрд░реВ рд╢рдХрддреЛ playbook.yml рдЖрдгрд┐ рдЪрд╛рд▓рд╡рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░рд╛:

ansible-playbook ./playbook.yml

PLAY [Simple Playbook] ************************************************************************************************************************************
skipping: no hosts matched

рдЙрддреНрддрд░рджрд╛рдпреА рдореНрд╣рдгрддреЗ рдХреА рддреНрдпрд╛рд▓рд╛ рд╕рд░реНрд╡ рд╕реВрдЪреАрд╢реА рдЬреБрд│рдгрд╛рд░реЗ рдХреЛрдгрддреЗрд╣реА рд╣реЛрд╕реНрдЯ рдорд╛рд╣рд┐рдд рдирд╛рд╣реАрдд. рддреЗ рд╡рд┐рд╢реЗрд╖ рдордзреНрдпреЗ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рдЗрдиреНрд╡реНрд╣реЗрдВрдЯрд░реА рдлрд╛рдЗрд▓.

рдЪрд▓рд╛ рддреНрдпрд╛рдЪ рдЙрддреНрддрд░рджрд╛рдпреА рдирд┐рд░реНрджреЗрд╢рд┐рдХреЗрдд рддрдпрд╛рд░ рдХрд░реВ:

123.123.123.123

рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ рдЖрдореНрд╣реА рд╣реЛрд╕реНрдЯ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЛ (рдЖрджрд░реНрд╢ рдЪрд╛рдЪрдгреАрд╕рд╛рдареА рдЖрдордЪреНрдпрд╛ VPS рдЪреЗ рд╣реЛрд╕реНрдЯ, рдХрд┐рдВрд╡рд╛ рддреБрдореНрд╣реА рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯрдЪреА рдиреЛрдВрджрдгреА рдХрд░реВ рд╢рдХрддрд╛) рдЖрдгрд┐ рддреЗ рдирд╛рд╡рд╛рдЦрд╛рд▓реА рд╕реЗрд╡реНрд╣ рдХрд░реВ рд╢рдХрддрд╛. inventory.
рддреБрдореНрд╣реА рдЗрдиреНрд╡реНрд╣реЗрдЯреНрд░реА рдлрд╛рдЗрд▓рд╕рд╣ рдЙрддреНрддрд░рджрд╛рдпреА рдЪрд╛рд▓рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░реВ рд╢рдХрддрд╛:

ansible-playbook ./playbook.yml -i inventory
PLAY [Simple Playbook] ************************************************************************************************************************************

TASK [Gathering Facts] ************************************************************************************************************************************

PLAY RECAP ************************************************************************************************************************************

рдЬрд░ рддреБрдордЪреНрдпрд╛рдХрдбреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реЛрд╕реНрдЯрдордзреНрдпреЗ ssh рдкреНрд░рд╡реЗрд╢ рдЕрд╕реЗрд▓, рддрд░ ansible рдХрдиреЗрдХреНрдЯ рдХрд░реЗрд▓ рдЖрдгрд┐ рд░рд┐рдореЛрдЯ рд╕рд┐рд╕реНрдЯрдордмрджреНрджрд▓ рдорд╛рд╣рд┐рддреА рдЧреЛрд│рд╛ рдХрд░реЗрд▓. (рдбрд┐рдлреЙрд▓реНрдЯ рдЯрд╛рд╕реНрдХ [рдЧреЕрджрд░рд┐рдВрдЧ рдлреЕрдХреНрдЯреНрд╕]) рддреНрдпрд╛рдирдВрддрд░ рддреЗ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрд╡рд░ рдПрдХ рдЫреЛрдЯрд╛ рдЕрд╣рд╡рд╛рд▓ рджреЗрдИрд▓ (рдкреНрд▓реЗ рд░реАрдХреЕрдк).

рдбреАрдлреЙрд▓реНрдЯрдиреБрд╕рд╛рд░, рдХрдиреЗрдХреНрд╢рди рд╡рд╛рдкрд░рдХрд░реНрддрд╛рдирд╛рд╡ рд╡рд╛рдкрд░рддреЗ рдЬреНрдпрд╛ рдЕрдВрддрд░реНрдЧрдд рддреБрдореНрд╣реА рд╕рд┐рд╕реНрдЯрдордордзреНрдпреЗ рд▓реЙрдЧ рдЗрди рдХреЗрд▓реЗ рдЖрд╣реЗ. рд╣реЗ рдмрд╣реБрдзрд╛ рд╣реЛрд╕реНрдЯрд╡рд░ рдирд╕реЗрд▓. рдкреНрд▓реЗрдмреБрдХ рдлрд╛рдЗрд▓рдордзреНрдпреЗ, рддреБрдореНрд╣реА remote_user рдирд┐рд░реНрджреЗрд╢ рд╡рд╛рдкрд░реВрди рдХрдиреЗрдХреНрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХреЛрдгрддрд╛ рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рд╡рд╛рдкрд░рд╛рдпрдЪрд╛ рддреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реВ рд╢рдХрддрд╛. рддрд╕реЗрдЪ, рд░рд┐рдореЛрдЯ рд╕рд┐рд╕реНрдЯрдордмрджреНрджрд▓рдЪреА рдорд╛рд╣рд┐рддреА рддреБрдордЪреНрдпрд╛рд╕рд╛рдареА рдЕрдиреЗрдХрджрд╛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЕрд╕реВ рд╢рдХрддреЗ рдЖрдгрд┐ рддреБрдореНрд╣реА рддреА рдЧреЛрд│рд╛ рдХрд░рдгреНрдпрд╛рдд рд╡реЗрд│ рд╡рд╛рдпрд╛ рдШрд╛рд▓рд╡реВ рдирдпреЗ. рд╣реЗ рдХрд╛рд░реНрдп рджреЗрдЦреАрд▓ рдЕрдХреНрд╖рдо рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ:

---
- name: Simple playbook
  hosts: all
  remote_user: root
  become: true
  gather_facts: no

рдкреНрд▓реЗрдмреБрдХ рдкреБрдиреНрд╣рд╛ рдЪрд╛рд▓рд╡рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░рд╛ рдЖрдгрд┐ рдХрдиреЗрдХреНрд╢рди рдХрд╛рд░реНрдп рдХрд░рдд рдЕрд╕рд▓реНрдпрд╛рдЪреА рдЦрд╛рддреНрд░реА рдХрд░рд╛. (рдЬрд░ рддреБрдореНрд╣реА рд░реВрдЯ рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреЗрд▓рд╛ рдЕрд╕реЗрд▓, рддрд░ рддреБрдореНрд╣рд╛рд▓рд╛ рднрд╛рд░рджрд╕реНрдд рдЕрдзрд┐рдХрд╛рд░ рдорд┐рд│рд╡рд┐рдгреНрдпрд╛рд╕рд╛рдареА рдмрди: рдЦрд░реЗ рдирд┐рд░реНрджреЗрд╢ рджреЗрдЦреАрд▓ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рджрд╕реНрддрдРрд╡рдЬреАрдХрд░рдгрд╛рдд рд▓рд┐рд╣рд┐рд▓реНрдпрд╛рдкреНрд░рдорд╛рдгреЗ: become set to тАШtrueтАЩ/тАЩyesтАЩ to activate privilege escalation. рдЬрд░реА рддреЗ рдХрд╛ рдкреВрд░реНрдгрдкрдгреЗ рд╕реНрдкрд╖реНрдЯ рдирд╛рд╣реА).

рдХрджрд╛рдЪрд┐рдд рддреБрдореНрд╣рд╛рд▓рд╛ рдПрдХ рддреНрд░реБрдЯреА рдкреНрд░рд╛рдкреНрдд рд╣реЛрдИрд▓ рдпрд╛ рд╡рд╕реНрддреБрд╕реНрдерд┐рддреАрдореБрд│реЗ рдХреА рдЙрддреНрддрд░рджрд╛рдпреА рдкрд╛рдпрдерди рдЗрдВрдЯрд░рдкреНрд░рд┐рдЯрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реВ рд╢рдХрдд рдирд╛рд╣реА, рдирдВрддрд░ рддреБрдореНрд╣реА рддреЗ рд╡реНрдпрдХреНрддрд┐рдЪрд▓рд┐рддрдкрдгреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реВ рд╢рдХрддрд╛:

ansible_python_interpreter: /usr/bin/python3 

рддреБрдордЪреНрдпрд╛рдХрдбреЗ рдкрд╛рдпрдерди рдХреБрдареЗ рдЖрд╣реЗ рд╣реЗ рддреБрдореНрд╣реА рдХрдорд╛рдВрдбрджреНрд╡рд╛рд░реЗ рд╢реЛрдзреВ рд╢рдХрддрд╛ whereis python.

рд╕рд┐рд╕реНрдЯрдо рдкреЕрдХреЗрдЬреЗрд╕ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдд рдЖрд╣реЗ

Ansible рдЪреНрдпрд╛ рдорд╛рдирдХ рд╡рд┐рддрд░рдгрд╛рдордзреНрдпреЗ рд╡рд┐рд╡рд┐рдз рд╕рд┐рд╕реНрдЯрдо рдкреЕрдХреЗрдЬреЗрд╕рд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЕрдиреЗрдХ рдореЙрдбреНрдпреВрд▓ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдЖрд╣реЗрдд, рддреНрдпрд╛рдореБрд│реЗ рдЖрдореНрд╣рд╛рд▓рд╛ рдХреЛрдгрддреНрдпрд╛рд╣реА рдХрд╛рд░рдгрд╛рд╕реНрддрд╡ рдмреЕрд╢ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рд╣рд┐рдгреНрдпрд╛рдЪреА рдЧрд░рдЬ рдирд╛рд╣реА. рдЖрддрд╛ рдЖрдореНрд╣рд╛рд▓рд╛ рд╕рд┐рд╕реНрдЯрдо рдЕрдкрдбреЗрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рд╕рд┐рд╕реНрдЯрдо рдкреЕрдХреЗрдЬреЗрд╕ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдпрд╛рдкреИрдХреА рдПрдХ рдореЙрдбреНрдпреВрд▓ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдорд╛рдЭреНрдпрд╛ VPS рд╡рд░ рдорд╛рдЭреНрдпрд╛рдХрдбреЗ рдЙрдмрдВрдЯреВ рд▓рд┐рдирдХреНрд╕ рдЖрд╣реЗ, рдореНрд╣рдгреВрди рдореА рд╡рд╛рдкрд░рдд рдЕрд╕рд▓реЗрд▓реЗ рдкреЕрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА apt-get ╨╕ рддреНрдпрд╛рд╕рд╛рдареА рдореЙрдбреНрдпреВрд▓. рдЬрд░ рддреБрдореНрд╣реА рд╡реЗрдЧрд│реА рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯреАрдо рд╡рд╛рдкрд░рдд рдЕрд╕рд╛рд▓ рддрд░ рддреБрдореНрд╣рд╛рд▓рд╛ рд╡реЗрдЧрд│реНрдпрд╛ рдореЙрдбреНрдпреВрд▓рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕реВ рд╢рдХрддреЗ (рд▓рдХреНрд╖рд╛рдд рдареЗрд╡рд╛, рдореА рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛ рд╕рд╛рдВрдЧрд┐рддрд▓реЗ рд╣реЛрддреЗ рдХреА рдЖрдореНрд╣реА рдХрд╛рдп рдЖрдгрд┐ рдХрд╕реЗ рдХрд░рдгрд╛рд░ рдЖрд╣реЛрдд рд╣реЗ рдЖрдзреАрдЪ рдорд╛рд╣рд┐рдд рдЕрд╕рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ). рддрдерд╛рдкрд┐, рд╡рд╛рдХреНрдпрд░рдЪрдирд╛ рдмрд╣реБрдзрд╛ рд╕рдорд╛рди рдЕрд╕реЗрд▓.

рдЪрд▓рд╛ рдЖрдордЪреНрдпрд╛ рдкреНрд▓реЗрдмреБрдХрд▓рд╛ рдкрд╣рд┐рд▓реНрдпрд╛ рдХрд╛рд░реНрдпрд╛рдВрд╕рд╣ рдкреВрд░рдХ рдХрд░реВрдпрд╛:

---
- name: Simple playbook
  hosts: all
  remote_user: root
  become: true
  gather_facts: no

  tasks:
    - name: Update system
      apt: update_cache=yes
    - name: Install system dependencies
      apt:
        name: git,nginx,redis,postgresql,postgresql-contrib
        state: present

рдЯрд╛рд╕реНрдХ рд╣реЗ рдиреЗрдордХреЗ рдХрд╛рд░реНрдп рдЖрд╣реЗ рдЬреЗ Ansible рд░рд┐рдореЛрдЯ рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рдХрд░реЗрд▓. рдЖрдореНрд╣реА рдЯрд╛рд╕реНрдХрд▓рд╛ рдирд╛рд╡ рджреЗрддреЛ рдЬреЗрдгреЗрдХрд░реВрди рдЖрдореНрд╣реА рд▓реЙрдЧрдордзреНрдпреЗ рддреНрдпрд╛рдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдЯреНрд░реЕрдХ рдХрд░реВ рд╢рдХреВ. рдЖрдгрд┐ рдЖрдореНрд╣реА рд╡рд░реНрдгрди рдХрд░рддреЛ, рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореЙрдбреНрдпреВрд▓рдЪреЗ рд╡рд╛рдХреНрдпрд░рдЪрдирд╛ рд╡рд╛рдкрд░реВрди, рддреНрдпрд╛рд▓рд╛ рдХрд╛рдп рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧреЗрд▓. рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд apt: update_cache=yes - apt рдореЙрдбреНрдпреВрд▓ рд╡рд╛рдкрд░реВрди рд╕рд┐рд╕реНрдЯрдо рдкреЕрдХреЗрдЬреЗрд╕ рдЕрджреНрдпрддрдирд┐рдд рдХрд░рдгреНрдпрд╛рд╕ рд╕рд╛рдВрдЧрддреЗ. рджреБрд╕рд░реА рдЖрдЬреНрдЮрд╛ рдереЛрдбреА рдЕрдзрд┐рдХ рдХреНрд▓рд┐рд╖реНрдЯ рдЖрд╣реЗ. рдЖрдореНрд╣реА рдкреЕрдХреЗрдЬреЗрд╕рдЪреА рдпрд╛рджреА apt рдореЙрдбреНрдпреВрд▓рд▓рд╛ рджреЗрддреЛ рдЖрдгрд┐ рдореНрд╣рдгрддреЛ рдХреА рддреЗ рдЖрд╣реЗрдд state рдмрдирд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ present, рдореНрд╣рдгрдЬреЗ, рдЖрдореНрд╣реА рдореНрд╣рдгрддреЛ рдХреА рд╣реА рдкреЕрдХреЗрдЬреЗрд╕ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рд╛. рдЕрд╢рд╛рдЪ рдкреНрд░рдХрд╛рд░реЗ, рдЖрдореНрд╣реА рддреНрдпрд╛рдВрдирд╛ рддреЗ рд╣рдЯрд╡рдгреНрдпрд╛рд╕ рд╕рд╛рдВрдЧреВ рд╢рдХрддреЛ рдХрд┐рдВрд╡рд╛ рдлрдХреНрдд рдмрджрд▓реВрди рддреНрдпрд╛рдВрдирд╛ рдЕрдкрдбреЗрдЯ рдХрд░реВ рд╢рдХрддреЛ state. рдХреГрдкрдпрд╛ рд▓рдХреНрд╖рд╛рдд рдШреНрдпрд╛ рдХреА postgresql рд╕рд╣ рдХрд╛рдо рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд░реЗрд▓рд╕рд╛рдареА рдЖрдореНрд╣рд╛рд▓рд╛ postgresql-contrib рдкреЕрдХреЗрдЬ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ, рдЬреЗ рдЖрдореНрд╣реА рдЖрддрд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдд рдЖрд╣реЛрдд. рдкреБрдиреНрд╣рд╛, рддреБрдореНрд╣рд╛рд▓рд╛ рд╣реЗ рдорд╛рд╣рд┐рдд рдЕрд╕рдгреЗ рдЖрдгрд┐ рддреЗ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ; рд╕реНрд╡рддрдГрд╣реВрди рдЙрддреНрддрд░рджрд╛рдпреА рд╣реЗ рдХрд░рдгрд╛рд░ рдирд╛рд╣реА.

рдкреНрд▓реЗрдмреБрдХ рдкреБрдиреНрд╣рд╛ рдЪрд╛рд▓рд╡рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░рд╛ рдЖрдгрд┐ рдкреЕрдХреЗрдЬреЗрд╕ рд╕реНрдерд╛рдкрд┐рдд рдХреЗрд▓реЗ рдЖрд╣реЗрдд рдХрд╛ рддреЗ рддрдкрд╛рд╕рд╛.

рдирд╡реАрди рд╡рд╛рдкрд░рдХрд░реНрддреЗ рддрдпрд╛рд░ рдХрд░рдгреЗ.

рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдВрд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, Ansible рдордзреНрдпреЗ рдПрдХ рдореЙрдбреНрдпреВрд▓ рджреЗрдЦреАрд▓ рдЖрд╣реЗ - рд╡рд╛рдкрд░рдХрд░реНрддрд╛. рдЪрд▓рд╛ рдЖрдгрдЦреА рдПрдХ рдХрд╛рд░реНрдп рдЬреЛрдбреВрдпрд╛ (рдкреНрд░рддреНрдпреЗрдХ рд╡реЗрд│реА рдкреВрд░реНрдгрдкрдгреЗ рдХреЙрдкреА рдХрд░реВ рдирдпреЗ рдореНрд╣рдгреВрди рдореА рдкреНрд▓реЗрдмреБрдХрдЪреЗ рдЖрдзреАрдЪ рдЬреНрдЮрд╛рдд рднрд╛рдЧ рдЯрд┐рдкреНрдкрдгреНрдпрд╛рдВрдорд╛рдЧреЗ рд▓рдкрд╡рд▓реЗ рдЖрд╣реЗрдд):

---
- name: Simple playbook
  # ...
  tasks:
    # ...
    - name: Add a new user
      user:
        name: my_user
        shell: /bin/bash
        password: "{{ 123qweasd | password_hash('sha512') }}"

рдЖрдореНрд╣реА рдПрдХ рдирд╡реАрди рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рддрдпрд╛рд░ рдХрд░рддреЛ, рддреНрдпрд╛рд╕рд╛рдареА рдПрдХ рд╢реЗрд▓ рдЖрдгрд┐ рдкрд╛рд╕рд╡рд░реНрдб рд╕реЗрдЯ рдХрд░рддреЛ. рдЖрдгрд┐ рдордЧ рдЖрдкрдг рдЕрдиреЗрдХ рд╕рдорд╕реНрдпрд╛рдВрдирд╛ рд╕рд╛рдореЛрд░реЗ рдЬрд╛рддреЛ. рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рд╣реЛрд╕реНрдЯрд╕рд╛рдареА рд╡рд╛рдкрд░рдХрд░реНрддрд╛рдирд╛рд╡реЗ рд╡реЗрдЧрд│реА рдЕрд╕рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реНрдпрд╛рд╕ рдХрд╛рдп? рдЖрдгрд┐ рдкреНрд▓реЗрдмреБрдХрдордзреНрдпреЗ рд╕реНрдкрд╖реНрдЯ рдордЬрдХреВрд░рд╛рдд рдкрд╛рд╕рд╡рд░реНрдб рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░рдгреЗ рд╣реА рдЦреВрдк рд╡рд╛рдИрдЯ рдХрд▓реНрдкрдирд╛ рдЖрд╣реЗ. рд╕реБрд░реВрд╡рд╛рддреАрд╕, рдЪрд▓рд╛ рд╡рд╛рдкрд░рдХрд░реНрддрд╛рдирд╛рд╡ рдЖрдгрд┐ рд╕рдВрдХреЗрддрд╢рдмреНрдж рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕рдордзреНрдпреЗ рдареЗрд╡реВрдпрд╛ рдЖрдгрд┐ рд▓реЗрдЦрд╛рдЪреНрдпрд╛ рд╢реЗрд╡рдЯреА рдореА рд╕рдВрдХреЗрддрд╢рдмреНрдж рдПрдирдХреНрд░рд┐рдкреНрдЯ рдХрд╕рд╛ рдХрд░рд╛рдпрдЪрд╛ рддреЗ рджрд░реНрд╢рд╡реЗрд▓.

---
- name: Simple playbook
  # ...
  tasks:
    # ...
    - name: Add a new user
      user:
        name: "{{ user }}"
        shell: /bin/bash
        password: "{{ user_password | password_hash('sha512') }}"

рджреБрд╣реЗрд░реА рдХрд░реНрд▓реА рдмреНрд░реЗрд╕реЗрд╕ рд╡рд╛рдкрд░реВрди рдкреНрд▓реЗрдмреБрдХрдордзреНрдпреЗ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕ рд╕реЗрдЯ рдХреЗрд▓реЗ рдЬрд╛рддрд╛рдд.

рдЖрдореНрд╣реА рдЗрдиреНрд╡реНрд╣реЗрдВрдЯрд░реА рдлрд╛рдИрд▓рдордзреАрд▓ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕рдЪреА рдореВрд▓реНрдпреЗ рджрд░реНрд╢рд╡реВ:

123.123.123.123

[all:vars]
user=my_user
user_password=123qweasd

рдХреГрдкрдпрд╛ рдирд┐рд░реНрджреЗрд╢ рд▓рдХреНрд╖рд╛рдд рдШреНрдпрд╛ [all:vars] - рддреНрдпрд╛рдд рдЕрд╕реЗ рдореНрд╣рдЯрд▓реЗ рдЖрд╣реЗ рдХреА рдордЬрдХреВрд░рд╛рдЪрд╛ рдкреБрдвреАрд▓ рдмреНрд▓реЙрдХ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕ (vars) рдЖрд╣реЗ рдЖрдгрд┐ рддреЗ рд╕рд░реНрд╡ рд╣реЛрд╕реНрдЯрд▓рд╛ (рд╕рд░реНрд╡) рд▓рд╛рдЧреВ рдЖрд╣реЗрдд.

рдбрд┐рдЭрд╛рдЗрди рджреЗрдЦреАрд▓ рдордиреЛрд░рдВрдЬрдХ рдЖрд╣реЗ "{{ user_password | password_hash('sha512') }}". рдЧреЛрд╖реНрдЯ рдЕрд╢реА рдЖрд╣реЗ рдХреА рдЙрддреНрддрд░рджрд╛рдпреА рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рджреНрд╡рд╛рд░реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдд рдирд╛рд╣реА user_add рдЬрд╕реЗ рддреБрдореНрд╣реА рддреЗ рд╕реНрд╡рд╣рд╕реНрддреЗ рдХрд░рд╛рд▓. рдЖрдгрд┐ рд╣реЗ рд╕рд░реНрд╡ рдбреЗрдЯрд╛ рдереЗрдЯ рд╕реЗрд╡реНрд╣ рдХрд░рддреЗ, рдореНрд╣рдгреВрдирдЪ рдЖрдкрдг рдкрд╛рд╕рд╡рд░реНрдбрд▓рд╛ рдЖрдзреАрдЪ рд╣реЕрд╢рдордзреНрдпреЗ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХреЗрд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ, рдЬреЗ рд╣реА рдХрдорд╛рдВрдб рдХрд░рддреЗ.

рдЪрд▓рд╛ рдЖрдордЪрд╛ рд╡рд╛рдкрд░рдХрд░реНрддрд╛ sudo рдЧрдЯрд╛рдд рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдХрд░реВ. рддрдерд╛рдкрд┐, рдпрд╛рдЖрдзреА рдЖрдореНрд╣рд╛рд▓рд╛ рдЦрд╛рддреНрд░реА рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рдХреА рдЕрд╕рд╛ рдЧрдЯ рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдЖрд╣реЗ рдХрд╛рд░рдг рдЖрдордЪреНрдпрд╛рд╕рд╛рдареА рдХреЛрдгреАрд╣реА рд╣реЗ рдХрд░рдгрд╛рд░ рдирд╛рд╣реА:

---
- name: Simple playbook
  # ...
  tasks:
    # ...
    - name: Ensure a 'sudo' group
      group:
        name: sudo
        state: present
    - name: Add a new user
      user:
        name: "{{ user }}"
        shell: /bin/bash
        password: "{{ user_password | password_hash('sha512') }}"
        groups: "sudo"

рд╕рд░реНрд╡ рдХрд╛рд╣реА рдЕрдЧрджреА рд╕реЛрдкреЗ рдЖрд╣реЗ, рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдЧрдЯ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдПрдХ рдЧрдЯ рдореЙрдбреНрдпреВрд▓ рджреЗрдЦреАрд▓ рдЖрд╣реЗ, рдЬреНрдпрд╛рдЪрд╛ рд╕рд┐рдВрдЯреЕрдХреНрд╕ apt рд╕рд╛рд░рдЦрд╛рдЪ рдЖрд╣реЗ. рдордЧ рд╣рд╛ рдЧрдЯ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдХрдбреЗ рдиреЛрдВрджрдгреА рдХрд░рдгреЗ рдкреБрд░реЗрд╕реЗ рдЖрд╣реЗ (groups: "sudo").
рдпрд╛ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рд╕рд╛рдареА ssh рдХреА рдЬреЛрдбрдгреЗ рджреЗрдЦреАрд▓ рдЙрдкрдпреБрдХреНрдд рдЖрд╣реЗ рдЬреЗрдгреЗрдХрд░реВрди рдЖрдореНрд╣реА рдкрд╛рд╕рд╡рд░реНрдбрд╢рд┐рд╡рд╛рдп рд▓реЙрдЧ рдЗрди рдХрд░реВ рд╢рдХреВ:

---
- name: Simple playbook
  # ...
  tasks:
    # ...
    - name: Ensure a 'sudo' group
      group:
      name: sudo
        state: present
    - name: Add a new user
      user:
        name: "{{ user }}"
        shell: /bin/bash
        password: "{{ user_password | password_hash('sha512') }}"
        groups: "sudo"
    - name: Deploy SSH Key
      authorized_key:
        user: "{{ user }}"
        key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
        state: present

рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд, рдбрд┐рдЭрд╛рдЗрди рдордиреЛрд░рдВрдЬрдХ рдЖрд╣реЗ "{{ lookup('file', '~/.ssh/id_rsa.pub') }}" тАФ рддреЗ id_rsa.pub рдлрд╛рдИрд▓рдЪреА рд╕рд╛рдордЧреНрд░реА рдХреЙрдкреА рдХрд░рддреЗ (рддреБрдордЪреЗ рдирд╛рд╡ рд╡реЗрдЧрд│реЗ рдЕрд╕реВ рд╢рдХрддреЗ), рдореНрд╣рдгрдЬреЗрдЪ ssh рдХреАрдЪрд╛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рднрд╛рдЧ рдЖрдгрд┐ рд╕рд░реНрд╡реНрд╣рд░рд╡рд░реАрд▓ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рд╕рд╛рдареА рдЕрдзрд┐рдХреГрдд рдХреАрдЪреНрдпрд╛ рд╕реВрдЪреАрдордзреНрдпреЗ рдЕрдкрд▓реЛрдб рдХрд░рддреЛ.

рднреВрдорд┐рдХрд╛

рд╡рд╛рдкрд░ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕рд░реНрд╡ рддреАрди рдХрд╛рд░реНрдпреЗ рд╕рд╣рдЬрдкрдгреЗ рдХрд╛рд░реНрдпрд╛рдВрдЪреНрдпрд╛ рдПрдХрд╛ рдЧрдЯрд╛рдордзреНрдпреЗ рд╡рд░реНрдЧреАрдХреГрдд рдХреЗрд▓реА рдЬрд╛рдК рд╢рдХрддрд╛рдд рдЖрдгрд┐ рд╣рд╛ рдЧрдЯ рдореБрдЦреНрдп рдкреНрд▓реЗрдмреБрдХрдкрд╛рд╕реВрди рд╡реЗрдЧрд│рд╛ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░рдгреЗ рдЪрд╛рдВрдЧрд▓реА рдХрд▓реНрдкрдирд╛ рдЕрд╕реЗрд▓ рдЬреЗрдгреЗрдХрд░реВрди рддреЗ рдЦреВрдк рдореЛрдареЗ рд╣реЛрдгрд╛рд░ рдирд╛рд╣реА. рдпрд╛ рдЙрджреНрджреЗрд╢рд╛рд╕рд╛рдареА, Ansible рдЖрд╣реЗ рднреВрдорд┐рдХрд╛.
рдЕрдЧрджреА рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛ рд╕реВрдЪрд┐рдд рдХреЗрд▓реЗрд▓реНрдпрд╛ рдлрд╛рдЗрд▓ рд╕реНрдЯреНрд░рдХреНрдЪрд░рдиреБрд╕рд╛рд░, рднреВрдорд┐рдХрд╛ рд╡реЗрдЧрд│реНрдпрд╛ рднреВрдорд┐рдХрд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХреЗрдд рдареЗрд╡рд▓реНрдпрд╛ рдкрд╛рд╣рд┐рдЬреЗрдд, рдкреНрд░рддреНрдпреЗрдХ рднреВрдорд┐рдХреЗрд╕рд╛рдареА рдХрд╛рд░реНрдпреЗ, рдлрд╛рдЗрд▓реНрд╕, рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдЗрддреНрдпрд╛рджреА рдирд┐рд░реНрджреЗрд╢рд┐рдХреЗрдд рд╕рдорд╛рди рдирд╛рд╡рд╛рдЪреА рд╡реЗрдЧрд│реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдЕрд╕рддреЗ.
рдЪрд▓рд╛ рдлрд╛рдИрд▓ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рддрдпрд╛рд░ рдХрд░реВрдпрд╛: ./ansible/roles/user/tasks/main.yml (рдореБрдЦреНрдп рд╣реА рдореБрдЦреНрдп рдлрд╛рдИрд▓ рдЖрд╣реЗ рдЬреА рдкреНрд▓реЗрдмреБрдХрд╢реА рд░реЛрд▓ рдХрдиреЗрдХреНрдЯ рдХреЗрд▓реНрдпрд╛рд╡рд░ рд▓реЛрдб рдХреЗрд▓реА рдЬрд╛рдИрд▓ рдЖрдгрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреЗрд▓реА рдЬрд╛рдИрд▓; рдЗрддрд░ рд░реЛрд▓ рдлрд╛рдЗрд▓реНрд╕ рддреНрдпрд╛рдЪреНрдпрд╛рд╢реА рдХрдиреЗрдХреНрдЯ рдХреЗрд▓реНрдпрд╛ рдЬрд╛рдК рд╢рдХрддрд╛рдд). рдЖрддрд╛ рддреБрдореНрд╣реА рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рд╢реА рд╕рдВрдмрдВрдзрд┐рдд рд╕рд░реНрд╡ рдХрд╛рд░реНрдпреЗ рдпрд╛ рдлрд╛рдИрд▓рдордзреНрдпреЗ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд░реВ рд╢рдХрддрд╛:

# Create user and add him to groups
- name: Ensure a 'sudo' group
  group:
    name: sudo
    state: present

- name: Add a new user
  user:
    name: "{{ user }}"
    shell: /bin/bash
    password: "{{ user_password | password_hash('sha512') }}"
    groups: "sudo"

- name: Deploy SSH Key
  authorized_key:
    user: "{{ user }}"
    key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
    state: present

рдореБрдЦреНрдп рдкреНрд▓реЗрдмреБрдХрдордзреНрдпреЗ, рдЖрдкрдг рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рднреВрдорд┐рдХрд╛ рд╡рд╛рдкрд░рдгреНрдпрд╛рд╕рд╛рдареА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ:

---
- name: Simple playbook
  hosts: all
  remote_user: root
  gather_facts: no

  tasks:
    - name: Update system
      apt: update_cache=yes
    - name: Install system dependencies
      apt:
        name: git,nginx,redis,postgresql,postgresql-contrib
        state: present

  roles:
    - user

рддрд╕реЗрдЪ, рдЗрддрд░ рд╕рд░реНрд╡ рдХрд╛рд░реНрдпрд╛рдВрдкреВрд░реНрд╡реА рд╕рд┐рд╕реНрдЯрдо рдЕрдкрдбреЗрдЯ рдХрд░рдгреЗ рдЕрд░реНрдердкреВрд░реНрдг рдЕрд╕реВ рд╢рдХрддреЗ; рд╣реЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдкрдг рдмреНрд▓реЙрдХрдЪреЗ рдирд╛рд╡ рдмрджрд▓реВ рд╢рдХрддрд╛ tasks рдЬреНрдпрд╛рдордзреНрдпреЗ рддреНрдпрд╛рдВрдЪреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗрд▓реА рдЖрд╣реЗ pre_tasks.

nginx рд╕реЗрдЯ рдХрд░рдд рдЖрд╣реЗ

рдЖрдореНрд╣реА рдЖрдзреАрдЪ Nginx рд╕реНрдерд╛рдкрд┐рдд рдХреЗрд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ; рдЖрдореНрд╣рд╛рд▓рд╛ рддреЗ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░реВрди рдЪрд╛рд▓рд╡рд╛рд╡реЗ рд▓рд╛рдЧреЗрд▓. рднреВрдорд┐рдХреЗрдд рд▓рдЧреЗрдЪ рдХрд░реВ. рдЪрд▓рд╛ рдлрд╛рдИрд▓ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рддрдпрд╛рд░ рдХрд░реВрдпрд╛:

- ansible
  - roles
    - nginx
      - files
      - tasks
        - main.yml
      - templates

рдЖрддрд╛ рдЖрдореНрд╣рд╛рд▓рд╛ рдлрд╛рдЗрд▓реНрд╕ рдЖрдгрд┐ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ. рддреНрдпрд╛рдВрдЪреНрдпрд╛рддреАрд▓ рдлрд░рдХ рдЕрд╕рд╛ рдЖрд╣реЗ рдХреА рдЙрддреНрддрд░рджрд╛рдпреА рдлрд╛рдпрд▓реА рдереЗрдЯ рдХреЙрдкреА рдХрд░рддрд╛рдд. рдЖрдгрд┐ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕рдордзреНрдпреЗ j2 рд╡рд┐рд╕реНрддрд╛рд░ рдЕрд╕рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рдЖрдгрд┐ рддреЗ рд╕рдорд╛рди рджреБрд╣реЗрд░реА рдХрд░реНрд▓реА рдмреНрд░реЗрд╕реЗрд╕ рд╡рд╛рдкрд░реВрди рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓ рдореВрд▓реНрдпреЗ рд╡рд╛рдкрд░реВ рд╢рдХрддрд╛рдд.

рдЪрд▓рд╛ nginx in рд╕рдХреНрд╖рдо рдХрд░реВрдпрд╛ main.yml рдлрд╛рдЗрд▓ рдпрд╛рд╕рд╛рдареА рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдПрдХ systemd рдореЙрдбреНрдпреВрд▓ рдЖрд╣реЗ:

# Copy nginx configs and start it
- name: enable service nginx and start
  systemd:
    name: nginx
    state: started
    enabled: yes

рдпреЗрдереЗ рдЖрдореНрд╣реА рдХреЗрд╡рд│ рдЕрд╕реЗ рдореНрд╣рдгрдд рдирд╛рд╣реА рдХреА nginx рд╕реБрд░реВ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ (рдореНрд╣рдгрдЬреЗ рдЖрдореНрд╣реА рддреЗ рд▓рд╛рдБрдЪ рдХрд░рддреЛ), рдкрд░рдВрддреБ рдЖрдореНрд╣реА рд▓рдЧреЗрдЪ рдореНрд╣рдгрддреЛ рдХреА рддреЗ рд╕рдХреНрд╖рдо рдХреЗрд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ.
рдЖрддрд╛ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдлрд╛рдЗрд▓реНрд╕ рдХреЙрдкреА рдХрд░реВрдпрд╛:

# Copy nginx configs and start it
- name: enable service nginx and start
  systemd:
    name: nginx
    state: started
    enabled: yes

- name: Copy the nginx.conf
  copy:
    src: nginx.conf
    dest: /etc/nginx/nginx.conf
    owner: root
    group: root
    mode: '0644'
    backup: yes

- name: Copy template my_app.conf
  template:
    src: my_app_conf.j2
    dest: /etc/nginx/sites-available/my_app.conf
    owner: root
    group: root
    mode: '0644'

рдЖрдореНрд╣реА рдореБрдЦреНрдп nginx рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдлрд╛рдЗрд▓ рддрдпрд╛рд░ рдХрд░рддреЛ (рддреБрдореНрд╣реА рддреА рдереЗрдЯ рд╕рд░реНрд╡реНрд╣рд░рд╡рд░реВрди рдШреЗрдК рд╢рдХрддрд╛ рдХрд┐рдВрд╡рд╛ рд╕реНрд╡рддрдГ рд▓рд┐рд╣реВ рд╢рдХрддрд╛). рдЖрдгрд┐ рд╕рд╛рдЗрдЯреНрд╕_рдЙрдкрд▓рдмреНрдз рдирд┐рд░реНрджреЗрд╢рд┐рдХреЗрдд рдЖрдордЪреНрдпрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рд╕рд╛рдареА рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдлрд╛рдЗрд▓ рджреЗрдЦреАрд▓ (рд╣реЗ рдЖрд╡рд╢реНрдпрдХ рдирд╛рд╣реА рдкрд░рдВрддреБ рдЙрдкрдпреБрдХреНрдд рдЖрд╣реЗ). рдкрд╣рд┐рд▓реНрдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд, рдЖрдореНрд╣реА рдлрд╛рдпрд▓реА рдХреЙрдкреА рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХреЙрдкреА рдореЙрдбреНрдпреВрд▓ рд╡рд╛рдкрд░рддреЛ (рдлрд╛рдЗрд▓рдордзреНрдпреЗ рдЕрд╕рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ /ansible/roles/nginx/files/nginx.conf). рджреБрд╕рд▒реНрдпрд╛рдордзреНрдпреЗ, рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕рдЪреА рд╡реНрд╣реЕрд▓реНрдпреВрдЬ рдмрджрд▓реВрди рдЖрдореНрд╣реА рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЙрдкреА рдХрд░рддреЛ. рдЯреЗрдореНрдкрд▓реЗрдЯ рдордзреНрдпреЗ рдЕрд╕рд╛рд╡реЗ /ansible/roles/nginx/templates/my_app.j2). рдЖрдгрд┐ рддреЗ рдпрд╛рд╕рд╛рд░рдЦреЗ рдХрд╛рд╣реАрддрд░реА рджрд┐рд╕реВ рд╢рдХрддреЗ:

upstream {{ app_name }} {
  server unix:{{ app_path }}/shared/tmp/sockets/puma.sock;
}

server {
  listen 80;
  server_name {{ server_name }} {{ inventory_hostname }};
  root {{ app_path }}/current/public;

  try_files $uri/index.html $uri.html $uri @{{ app_name }};
  ....
}

рдЗрдиреНрд╕рд░реНрдЯрд╡рд░ рд▓рдХреНрд╖ рджреНрдпрд╛ {{ app_name }}, {{ app_path }}, {{ server_name }}, {{ inventory_hostname }} тАФ рд╣реА рд╕рд░реНрд╡ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕ рдЖрд╣реЗрдд рдЬреНрдпрд╛рдВрдЪреА рд╡реНрд╣реЕрд▓реНрдпреВ Ansible рдХреЙрдкреА рдХрд░рдгреНрдпрд╛рдкреВрд░реНрд╡реА рдЯреЗрдореНрдкреНрд▓реЗрдЯрдордзреНрдпреЗ рдмрджрд▓рддреАрд▓. рддреБрдореНрд╣реА рдпрдЬрдорд╛рдирд╛рдВрдЪреНрдпрд╛ рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рдЧрдЯрд╛рдВрд╕рд╛рдареА рдкреНрд▓реЗрдмреБрдХ рд╡рд╛рдкрд░рдд рдЕрд╕рд▓реНрдпрд╛рд╕ рд╣реЗ рдЙрдкрдпреБрдХреНрдд рдЖрд╣реЗ. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдЖрдореНрд╣реА рдЖрдордЪреА рдЗрдиреНрд╡реНрд╣реЗрдВрдЯрд░реА рдлрд╛рдЗрд▓ рдЬреЛрдбреВ рд╢рдХрддреЛ:

[production]
123.123.123.123

[staging]
231.231.231.231

[all:vars]
user=my_user
user_password=123qweasd

[production:vars]
server_name=production
app_path=/home/www/my_app
app_name=my_app

[staging:vars]
server_name=staging
app_path=/home/www/my_stage
app_name=my_stage_app

рдЖрдореНрд╣реА рдЖрддрд╛ рдЖрдордЪреЗ рдкреНрд▓реЗрдмреБрдХ рд▓рд╛рдБрдЪ рдХреЗрд▓реНрдпрд╛рд╕, рддреЗ рджреЛрдиреНрд╣реА рд╣реЛрд╕реНрдЯрд╕рд╛рдареА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд╛рд░реНрдпреЗ рдХрд░реЗрд▓. рдкрд░рдВрддреБ рддреНрдпрд╛рдЪ рд╡реЗрд│реА, рд╕реНрдЯреЗрдЬрд┐рдВрдЧ рд╣реЛрд╕реНрдЯрд╕рд╛рдареА, рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕ рдЙрддреНрдкрд╛рджрдирд╛рдкреЗрдХреНрд╖рд╛ рднрд┐рдиреНрди рдЕрд╕рддреАрд▓ рдЖрдгрд┐ рдХреЗрд╡рд│ рднреВрдорд┐рдХрд╛ рдЖрдгрд┐ рдкреНрд▓реЗрдмреБрдХрдордзреНрдпреЗрдЪ рдирд╛рд╣реА рддрд░ рдПрдирдЬреАрдиреЗрдХреНрд╕ рдХреЙрдиреНрдлрд┐рдЧрдордзреНрдпреЗ рджреЗрдЦреАрд▓ рдЕрд╕рддреАрд▓. {{ inventory_hostname }} рдЗрдиреНрд╡реНрд╣реЗрдВрдЯрд░реА рдлрд╛рдЗрд▓рдордзреНрдпреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╛рд╣реА - рд╣реЗ рд╡рд┐рд╢реЗрд╖ рдЙрддреНрддрд░рджрд╛рдпреА рдЪрд▓ рдЖрдгрд┐ рдЬреНрдпрд╛ рд╣реЛрд╕реНрдЯрд╕рд╛рдареА рдкреНрд▓реЗрдмреБрдХ рд╕рдзреНрдпрд╛ рдЪрд╛рд▓реВ рдЖрд╣реЗ рддреЗ рддреЗрдереЗ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХреЗрд▓реЗ рдЖрд╣реЗ.
рддреБрдореНрд╣рд╛рд▓рд╛ рдЕрдиреЗрдХ рд╣реЛрд╕реНрдЯрд╕рд╛рдареА рдЗрдиреНрд╡реНрд╣реЗрдВрдЯрд░реА рдлрд╛рдЗрд▓ рд╣рд╡реА рдЕрд╕рд▓реНрдпрд╛рд╕, рдкрд░рдВрддреБ рдлрдХреНрдд рдПрдХрд╛ рдЧрдЯрд╛рд╕рд╛рдареА рдЪрд╛рд▓рд╡рд╛рдпрдЪреА рдЕрд╕рд▓реНрдпрд╛рд╕, рд╣реЗ рдЦрд╛рд▓реАрд▓ рдЖрджреЗрд╢рд╛рдиреЗ рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ:

ansible-playbook -i inventory ./playbook.yml -l "staging"

рджреБрд╕рд░рд╛ рдкрд░реНрдпрд╛рдп рдореНрд╣рдгрдЬреЗ рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рдЧрдЯрд╛рдВрд╕рд╛рдареА рд╕реНрд╡рддрдВрддреНрд░ рдЗрдиреНрд╡реНрд╣реЗрдВрдЯрд░реА рдлрд╛рдЗрд▓реНрд╕ рдЕрд╕рдгреЗ. рдХрд┐рдВрд╡рд╛ рддреБрдордЪреНрдпрд╛рдХрдбреЗ рдЕрдиреЗрдХ рднрд┐рдиреНрди рд╣реЛрд╕реНрдЯ рдЕрд╕рд▓реНрдпрд╛рд╕ рддреБрдореНрд╣реА рджреЛрди рджреГрд╖реНрдЯрд┐рдХреЛрди рдПрдХрддреНрд░ рдХрд░реВ рд╢рдХрддрд╛.

рдЪрд▓рд╛ nginx рд╕реЗрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдкрд░рдд рдЬрд╛рдКрдпрд╛. рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдлрд╛рдЗрд▓реНрд╕ рдХреЙрдкреА рдХреЗрд▓реНрдпрд╛рдирдВрддрд░, рдЖрдореНрд╣рд╛рд▓рд╛ sites_available рд╡рд░реВрди my_app.conf рд╡рд░ sitest_enabled рдордзреНрдпреЗ рдПрдХ рд╕рд┐рдорд▓рд┐рдВрдХ рддрдпрд╛рд░ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдЖрдгрд┐ nginx рд░реАрд╕реНрдЯрд╛рд░реНрдЯ рдХрд░рд╛.

... # old code in mail.yml

- name: Create symlink to sites-enabled
  file:
    src: /etc/nginx/sites-available/my_app.conf
    dest: /etc/nginx/sites-enabled/my_app.conf
    state: link

- name: restart nginx
  service:
    name: nginx
    state: restarted

рдпреЗрдереЗ рд╕рд░реНрд╡ рдХрд╛рд╣реА рд╕реЛрдкреЗ рдЖрд╣реЗ - рдЕрдЧрджреА рдорд╛рдирдХ рд╡рд╛рдХреНрдпрд░рдЪрдирд╛рд╕рд╣ рдкреБрдиреНрд╣рд╛ рдЙрддреНрддрд░рджрд╛рдпреА рдореЙрдбреНрдпреВрд▓реНрд╕. рдкрдг рдПрдХ рдореБрджреНрджрд╛ рдЖрд╣реЗ. рдкреНрд░рддреНрдпреЗрдХ рд╡реЗрд│реА nginx рд░реАрд╕реНрдЯрд╛рд░реНрдЯ рдХрд░рдгреНрдпрд╛рдд рдХрд╛рд╣реА рдЕрд░реНрде рдирд╛рд╣реА. рддреБрдордЪреНрдпрд╛ рд▓рдХреНрд╖рд╛рдд рдЖрд▓реЗ рдЖрд╣реЗ рдХреА рдЖрдореНрд╣реА рдЖрдЬреНрдЮрд╛ рд▓рд┐рд╣рд┐рдд рдирд╛рд╣реА рдЬрд╕реЗ: тАЬрд╣реЗ рдЕрд╕реЗ рдХрд░рд╛тАЭ, рд╡рд╛рдХреНрдпрд░рдЪрдирд╛ рдЕрдзрд┐рдХ рджрд┐рд╕рддреЗ тАЬрдпрд╛рдЪреА рд╣реА рд╕реНрдерд┐рддреА рдЕрд╕рд╛рд╡реАтАЭ. рдЖрдгрд┐ рдмрд░реНтАНрдпрд╛рдЪрджрд╛ рдЙрддреНрддрд░рджрд╛рдпреА рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ. рдЬрд░ рдЧрдЯ рдЖрдзреАрдЪ рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдЕрд╕реЗрд▓, рдХрд┐рдВрд╡рд╛ рд╕рд┐рд╕реНрдЯрдо рдкреЕрдХреЗрдЬ рдЖрдзреАрдкрд╛рд╕реВрдирдЪ рд╕реНрдерд╛рдкрд┐рдд рдХреЗрд▓реЗ рдЕрд╕реЗрд▓, рддрд░ рдЙрддреНрддрд░рджрд╛рдпреА рд╣реЗ рддрдкрд╛рд╕реЗрд▓ рдЖрдгрд┐ рдХрд╛рд░реНрдп рд╡рдЧрд│реЗрд▓. рддрд╕реЗрдЪ, рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рдЖрдзреАрдкрд╛рд╕реВрди рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдлрд╛рдЗрд▓реНрд╕рд╢реА рдкреВрд░реНрдгрдкрдгреЗ рдЬреБрд│рдд рдЕрд╕рд▓реНрдпрд╛рд╕ рдлрд╛рдпрд▓реА рдХреЙрдкреА рдХреЗрд▓реНрдпрд╛ рдЬрд╛рдгрд╛рд░ рдирд╛рд╣реАрдд. рдЖрдореНрд╣реА рдпрд╛рдЪрд╛ рдлрд╛рдпрджрд╛ рдШреЗрдК рд╢рдХрддреЛ рдЖрдгрд┐ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдлрд╛рдЗрд▓реНрд╕ рдмрджрд▓рд▓реНрдпрд╛ рдЕрд╕рддреАрд▓ рддрд░рдЪ nginx рд░реАрд╕реНрдЯрд╛рд░реНрдЯ рдХрд░реВ рд╢рдХрддреЛ. рдпрд╛рд╕рд╛рдареА рдПрдХ рд░рдЬрд┐рд╕реНрдЯрд░ рдирд┐рд░реНрджреЗрд╢ рдЖрд╣реЗ:

# Copy nginx configs and start it
- name: enable service nginx and start
  systemd:
    name: nginx
    state: started
    enabled: yes

- name: Copy the nginx.conf
  copy:
    src: nginx.conf
    dest: /etc/nginx/nginx.conf
    owner: root
    group: root
    mode: '0644'
    backup: yes
  register: restart_nginx

- name: Copy template my_app.conf
  template:
    src: my_app_conf.j2
    dest: /etc/nginx/sites-available/my_app.conf
    owner: root
    group: root
    mode: '0644'
  register: restart_nginx

- name: Create symlink to sites-enabled
  file:
    src: /etc/nginx/sites-available/my_app.conf
    dest: /etc/nginx/sites-enabled/my_app.conf
    state: link

- name: restart nginx
  service:
    name: nginx
    state: restarted
  when: restart_nginx.changed

рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдлрд╛рдЗрд▓реНрд╕рдкреИрдХреА рдПрдХ рдмрджрд▓рд▓реНрдпрд╛рд╕, рдПрдХ рдкреНрд░рдд рддрдпрд╛рд░ рдХреЗрд▓реА рдЬрд╛рдИрд▓ рдЖрдгрд┐ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓рдЪреА рдиреЛрдВрджрдгреА рдХреЗрд▓реА рдЬрд╛рдИрд▓ restart_nginx. рдЖрдгрд┐ рдЬрд░ рд╣реЗ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓ рдиреЛрдВрджрдгреАрдХреГрдд рдЕрд╕реЗрд▓ рддрд░рдЪ рд╕реЗрд╡рд╛ рдкреБрдиреНрд╣рд╛ рд╕реБрд░реВ рд╣реЛрдИрд▓.

рдЖрдгрд┐, рдЕрд░реНрдерд╛рддрдЪ, рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдореБрдЦреНрдп рдкреНрд▓реЗрдмреБрдХрдордзреНрдпреЗ nginx рднреВрдорд┐рдХрд╛ рдЬреЛрдбрдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ.

postgresql рд╕реЗрдЯ рдХрд░рдд рдЖрд╣реЗ

рдЖрдореНрд╣реА nginx рдкреНрд░рдорд╛рдгреЗрдЪ systemd рд╡рд╛рдкрд░реВрди postgresql рд╕рдХреНрд╖рдо рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ, рдЖрдгрд┐ рдПрдХ рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рджреЗрдЦреАрд▓ рддрдпрд╛рд░ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рдЬреНрдпрд╛рдЪрд╛ рд╡рд╛рдкрд░ рдЖрдореНрд╣реА рдбреЗрдЯрд╛рдмреЗрд╕ рдЖрдгрд┐ рдбреЗрдЯрд╛рдмреЗрд╕рдордзреНрдпреЗ рдкреНрд░рд╡реЗрд╢ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХрд░реВ.
рдЪрд▓рд╛ рдПрдХ рднреВрдорд┐рдХрд╛ рддрдпрд╛рд░ рдХрд░реВрдпрд╛ /ansible/roles/postgresql/tasks/main.yml:

# Create user in postgresql
- name: enable postgresql and start
  systemd:
    name: postgresql
    state: started
    enabled: yes

- name: Create database user
  become_user: postgres
  postgresql_user:
    name: "{{ db_user }}"
    password: "{{ db_password }}"
    role_attr_flags: SUPERUSER

- name: Create database
  become_user: postgres
  postgresql_db:
    name: "{{ db_name }}"
    encoding: UTF-8
    owner: "{{ db_user }}"

рдЗрдиреНрд╡реНрд╣реЗрдВрдЯрд░реАрдордзреНрдпреЗ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХрд╕реЗ рдЬреЛрдбрд╛рдпрдЪреЗ рдпрд╛рдЪреЗ рдореА рд╡рд░реНрдгрди рдХрд░рдгрд╛рд░ рдирд╛рд╣реА, рд╣реЗ рдЖрдзреАрдЪ рдЕрдиреЗрдХ рд╡реЗрд│рд╛ рдХреЗрд▓реЗ рдЧреЗрд▓реЗ рдЖрд╣реЗ, рддрд╕реЗрдЪ postgresql_db рдЖрдгрд┐ postgresql_user рдореЙрдбреНрдпреВрд▓реНрд╕рдЪреЗ рд╡рд╛рдХреНрдпрд░рдЪрдирд╛. рдЕрдзрд┐рдХ рдорд╛рд╣рд┐рддреА рдХрд╛рдЧрджрдкрддреНрд░рд╛рдВрдордзреНрдпреЗ рдЖрдврд│реВ рд╢рдХрддреЗ. рдпреЗрдереЗ рд╕рд░реНрд╡рд╛рдд рдордиреЛрд░рдВрдЬрдХ рдирд┐рд░реНрджреЗрд╢ рдЖрд╣реЗ become_user: postgres. рд╡рд╕реНрддреБрд╕реНрдерд┐рддреА рдЕрд╢реА рдЖрд╣реЗ рдХреА рдбреАрдлреЙрд▓реНрдЯрдиреБрд╕рд╛рд░, рдХреЗрд╡рд│ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрд╕ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рд╕ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрд╕рдХреНрдпреВрдПрд▓ рдбреЗрдЯрд╛рдмреЗрд╕рдордзреНрдпреЗ рдкреНрд░рд╡реЗрд╢ рдЕрд╕рддреЛ рдЖрдгрд┐ рдХреЗрд╡рд│ рд╕реНрдерд╛рдирд┐рдХ рдкрд╛рддрд│реАрд╡рд░. рд╣рд╛ рдирд┐рд░реНрджреЗрд╢ рдЖрдореНрд╣рд╛рд▓рд╛ рдпрд╛ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдЪреНрдпрд╛ рд╡рддреАрдиреЗ рдЖрджреЗрд╢ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЛ (рдЬрд░ рдЖрдореНрд╣рд╛рд▓рд╛ рдкреНрд░рд╡реЗрд╢ рдЕрд╕реЗрд▓ рддрд░ рдирдХреНрдХреАрдЪ).
рддрд╕реЗрдЪ, рдбреЗрдЯрд╛рдмреЗрд╕рдордзреНрдпреЗ рдирд╡реАрди рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рд▓рд╛ рдкреНрд░рд╡реЗрд╢ рджреЗрдгреНрдпрд╛рд╕рд╛рдареА рддреБрдореНрд╣рд╛рд▓рд╛ pg_hba.conf рд╡рд░ рдПрдХ рдУрд│ рдЬреЛрдбрд╛рд╡реА рд▓рд╛рдЧреЗрд▓. рдЖрдореНрд╣реА nginx рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдмрджрд▓рд▓реЗ рддреНрдпрд╛рдЪ рдкреНрд░рдХрд╛рд░реЗ рд╣реЗ рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ.

рдЖрдгрд┐ рдЕрд░реНрдерд╛рддрдЪ, рддреБрдореНрд╣рд╛рд▓рд╛ рдореБрдЦреНрдп рдкреНрд▓реЗрдмреБрдХрдордзреНрдпреЗ postgresql рднреВрдорд┐рдХрд╛ рдЬреЛрдбрдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.

rbenv рджреНрд╡рд╛рд░реЗ рд░реБрдмреА рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдд рдЖрд╣реЗ

Ansible рдордзреНрдпреЗ rbenv рд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдореЙрдбреНрдпреВрд▓ рдирд╛рд╣реАрдд, рдкрд░рдВрддреБ рддреЗ git рд░реЗрдкреЙрдЬрд┐рдЯрд░реА рдХреНрд▓реЛрдирд┐рдВрдЧ рдХрд░реВрди рд╕реНрдерд╛рдкрд┐рдд рдХреЗрд▓реЗ рдЖрд╣реЗ. рдореНрд╣рдгреВрди, рд╣реА рд╕рдорд╕реНрдпрд╛ рд╕рд░реНрд╡рд╛рдд рдЕ-рдорд╛рдирдХ рдмрдирддреЗ. рдЪрд▓рд╛ рддрд┐рдЪреНрдпрд╛рд╕рд╛рдареА рдПрдХ рднреВрдорд┐рдХрд╛ рддрдпрд╛рд░ рдХрд░реВрдпрд╛ /ansible/roles/ruby_rbenv/main.yml рдЖрдгрд┐ рддреЗ рднрд░рдгреЗ рд╕реБрд░реВ рдХрд░реВрдпрд╛:

# Install rbenv and ruby
- name: Install rbenv
  become_user: "{{ user }}"
  git: repo=https://github.com/rbenv/rbenv.git dest=~/.rbenv

рдЖрдореНрд╣реА рдпрд╛ рдЙрджреНрджреЗрд╢рд╛рдВрд╕рд╛рдареА рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдЪреНрдпрд╛ рдЕрдВрддрд░реНрдЧрдд рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдкреБрдиреНрд╣рд╛ рдмрди_рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд┐рд░реНрджреЗрд╢ рд╡рд╛рдкрд░рддреЛ. rbenv рддреНрдпрд╛рдЪреНрдпрд╛ рд╣реЛрдо рдбрд┐рд░реЗрдХреНрдЯреНрд░реАрдордзреНрдпреЗ рд╕реНрдерд╛рдкрд┐рдд рдХреЗрд▓реЗ рдЖрд╣реЗ, рдЖрдгрд┐ рдЬрд╛рдЧрддрд┐рдХ рд╕реНрддрд░рд╛рд╡рд░ рдирд╛рд╣реА. рдЖрдгрд┐ рдЖрдореНрд╣реА рд░реЗрдкреЛ рдЖрдгрд┐ рдбреЗрд╕реНрдЯ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реВрди рд░реЗрдкреЙрдЬрд┐рдЯрд░реА рдХреНрд▓реЛрди рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА git рдореЙрдбреНрдпреВрд▓ рджреЗрдЦреАрд▓ рд╡рд╛рдкрд░рддреЛ.

рдкреБрдвреЗ, рдЖрдкрд▓реНрдпрд╛рд▓рд╛ bashrc рдордзреНрдпреЗ rbenv init рдЪреА рдиреЛрдВрджрдгреА рдХрд░рд╛рд╡реА рд▓рд╛рдЧреЗрд▓ рдЖрдгрд┐ рддреЗрдереЗ PATH рдордзреНрдпреЗ rbenv рдЬреЛрдбрд╛рд╡реЗ рд▓рд╛рдЧреЗрд▓. рдпрд╛рд╕рд╛рдареА рдЖрдордЪреНрдпрд╛рдХрдбреЗ lineinfile рдореЙрдбреНрдпреВрд▓ рдЖрд╣реЗ:

- name: Add rbenv to PATH
  become_user: "{{ user }}"
  lineinfile:
    path: ~/.bashrc
    state: present
    line: 'export PATH="${HOME}/.rbenv/bin:${PATH}"'

- name: Add rbenv init to bashrc
  become_user: "{{ user }}"
  lineinfile:
    path: ~/.bashrc
    state: present
    line: 'eval "$(rbenv init -)"'

рдордЧ рддреБрдореНрд╣рд╛рд▓рд╛ ruby_build рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ:

- name: Install ruby-build
  become_user: "{{ user }}"
  git: repo=https://github.com/rbenv/ruby-build.git dest=~/.rbenv/plugins/ruby-build

рдЖрдгрд┐ рд╢реЗрд╡рдЯреА рд░реБрдмреА рд╕реНрдерд╛рдкрд┐рдд рдХрд░рд╛. рд╣реЗ rbenv рджреНрд╡рд╛рд░реЗ рдХреЗрд▓реЗ рдЬрд╛рддреЗ, рдореНрд╣рдгрдЬреЗ, рдлрдХреНрдд bash рдХрдорд╛рдВрдбрд╕рд╣:

- name: Install ruby
  become_user: "{{ user }}"
  shell: |
    export PATH="${HOME}/.rbenv/bin:${PATH}"
    eval "$(rbenv init -)"
    rbenv install {{ ruby_version }}
  args:
    executable: /bin/bash

рдЖрдореНрд╣реА рдореНрд╣рдгрддреЛ рдХреА рдХреЛрдгрддреА рдЖрдЬреНрдЮрд╛ рдЕрдВрдорд▓рд╛рдд рдЖрдгрд╛рдпрдЪреА рдЖрдгрд┐ рдХрд╢рд╛рд╕рд╣. рддрдерд╛рдкрд┐, рдпреЗрдереЗ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рд╣реЗ рддрдереНрдп рдЖрдврд│реВрди рдЖрд▓реЗ рдЖрд╣реЗ рдХреА рдХрдорд╛рдВрдб рд░рди рдХрд░рдгреНрдпрд╛рдкреВрд░реНрд╡реА ansible bashrc рдордзреНрдпреЗ рдЕрд╕рд▓реЗрд▓рд╛ рдХреЛрдб рд░рди рдХрд░рдд рдирд╛рд╣реА. рдпрд╛рдЪрд╛ рдЕрд░реНрде рдЕрд╕рд╛ рдХреА rbenv рдЪреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдереЗрдЯ рддреНрдпрд╛рдЪ рд╕реНрдХреНрд░рд┐рдкреНрдЯрдордзреНрдпреЗ рдХрд░рд╛рд╡реА рд▓рд╛рдЧреЗрд▓.

рдкреБрдвреАрд▓ рд╕рдорд╕реНрдпрд╛ рд╢реЗрд▓ рдХрдорд╛рдВрдбрд▓рд╛ рдЙрддреНрддрд░рджрд╛рдпреА рджреГрд╖реНрдЯрд┐рдХреЛрдирд╛рддреВрди рдХреЛрдгрддреАрд╣реА рд╕реНрдерд┐рддреА рдирд╕рд▓реНрдпрд╛рдореБрд│реЗ рдЖрд╣реЗ. рдореНрд╣рдгрдЬреЗрдЪ, рд░реБрдмреАрдЪреА рд╣реА рдЖрд╡реГрддреНрддреА рд╕реНрдерд╛рдкрд┐рдд рдЖрд╣реЗ рдХреА рдирд╛рд╣реА рдпрд╛рдЪреА рдХреЛрдгрддреАрд╣реА рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рддрдкрд╛рд╕рдгреА рд╣реЛрдгрд╛рд░ рдирд╛рд╣реА. рдЖрдореНрд╣реА рд╣реЗ рд╕реНрд╡рддрдГ рдХрд░реВ рд╢рдХрддреЛ:

- name: Install ruby
  become_user: "{{ user }}"
  shell: |
    export PATH="${HOME}/.rbenv/bin:${PATH}"
    eval "$(rbenv init -)"
    if ! rbenv versions | grep -q {{ ruby_version }}
      then rbenv install {{ ruby_version }} && rbenv global {{ ruby_version }}
    fi
  args:
    executable: /bin/bash

рдмрдВрдбрд▓рд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреЗ рдмрд╛рдХреА рдЖрд╣реЗ:

- name: Install bundler
  become_user: "{{ user }}"
  shell: |
    export PATH="${HOME}/.rbenv/bin:${PATH}"
    eval "$(rbenv init -)"
    gem install bundler

рдЖрдгрд┐ рдкреБрдиреНрд╣рд╛, рдореБрдЦреНрдп рдкреНрд▓реЗрдмреБрдХрдордзреНрдпреЗ рдЖрдордЪреА рднреВрдорд┐рдХрд╛ ruby_rbenv рдЬреЛрдбрд╛.

рд╢реЗрдЕрд░ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдлрд╛рдпрд▓реА.

рд╕рд░реНрд╡рд╕рд╛рдзрд╛рд░рдгрдкрдгреЗ, рд╕реЗрдЯрдЕрдк рдпреЗрдереЗ рдкреВрд░реНрдг рдХреЗрд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ. рдкреБрдвреЗ, рдХреЕрдкрд┐рд╕реНрдЯреНрд░рд╛рдиреЛ рдЪрд╛рд▓рд╡рдгреЗ рдмрд╛рдХреА рдЖрд╣реЗ рдЖрдгрд┐ рддреЗ рд╕реНрд╡рддрдГ рдХреЛрдб рдХреЙрдкреА рдХрд░реЗрд▓, рдЖрд╡рд╢реНрдпрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рддрдпрд╛рд░ рдХрд░реЗрд▓ рдЖрдгрд┐ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд▓рд╛рдБрдЪ рдХрд░реЗрд▓ (рдЬрд░ рд╕рд░реНрд╡рдХрд╛рд╣реА рдпреЛрдЧреНрдпрд░рд┐рддреНрдпрд╛ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХреЗрд▓реЗ рдЕрд╕реЗрд▓). рддрдерд╛рдкрд┐, capistrano рд▓рд╛ рдЕрдиреЗрдХрджрд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдлрд╛рдЗрд▓реНрд╕рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕рддреЗ, рдЬрд╕реЗ рдХреА database.yml рдХрд┐рдВрд╡рд╛ .env рддреЗ nginx рд╕рд╛рдареА рдлрд╛рдЗрд▓реНрд╕ рдЖрдгрд┐ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕рдкреНрд░рдорд╛рдгреЗ рдХреЙрдкреА рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддрд╛рдд. рдлрдХреНрдд рдПрдХ рд╕реВрдХреНрд╖реНрдорддрд╛ рдЖрд╣реЗ. рдлрд╛рдЗрд▓реНрд╕ рдХреЙрдкреА рдХрд░рдгреНрдпрд╛рдкреВрд░реНрд╡реА, рддреБрдореНрд╣рд╛рд▓рд╛ рддреНрдпрд╛рдВрдЪреНрдпрд╛рд╕рд╛рдареА рдбрд┐рд░реЗрдХреНрдЯрд░реА рд╕реНрдЯреНрд░рдХреНрдЪрд░ рддрдпрд╛рд░ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ, рдЕрд╕реЗ рдХрд╛рд╣реАрддрд░реА:

# Copy shared files for deploy
- name: Ensure shared dir
  become_user: "{{ user }}"
  file:
    path: "{{ app_path }}/shared/config"
    state: directory

рдЖрдореНрд╣реА рдлрдХреНрдд рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЛ рдЖрдгрд┐ рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реНрдпрд╛рд╕ рдЙрддреНрддрд░рджрд╛рдпреА рдЖрдкреЛрдЖрдк рдкрд╛рд▓рдХ рддрдпрд╛рд░ рдХрд░реЗрд▓.

рдЙрддреНрддрд░рджрд╛рдпреА рддрд┐рдЬреЛрд░реА

рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕рдордзреНрдпреЗ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдЪрд╛ рдкрд╛рд╕рд╡рд░реНрдб рд╕рд╛рд░рдЦрд╛ рдЧреБрдкреНрдд рдбреЗрдЯрд╛ рдЕрд╕реВ рд╢рдХрддреЛ рд╣реЗ рдЖрдореНрд╣рд╛рд▓рд╛ рдЖрдзреАрдЪ рдХрд│рд▓реЗ рдЖрд╣реЗ. рдЖрдкрдг рддрдпрд╛рд░ рдХреЗрд▓реЗ рдЕрд╕рд▓реНрдпрд╛рд╕ .env рдЕрд░реНрдЬрд╛рд╕рд╛рдареА рдлрд╛рдЗрд▓, рдЖрдгрд┐ database.yml рдордЧ рдЕрд╕рд╛ рдЖрдгрдЦреА рдЧрдВрднреАрд░ рдбреЗрдЯрд╛ рдЕрд╕рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рддреНрдпрд╛рдВрдирд╛ рднреБрд░рд│ рдШрд╛рд▓рдгрд╛рд▒реНрдпрд╛ рдбреЛрд│реНрдпрд╛рдВрдкрд╛рд╕реВрди рд▓рдкрд╡рд┐рдгреЗ рдЪрд╛рдВрдЧрд▓реЗ рд╣реЛрдИрд▓. рдпрд╛ рдЙрджреНрджреЗрд╢рд╛рд╕рд╛рдареА рддреЗ рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рддреЗ рдЙрддреНрддрд░рджрд╛рдпреА рддрд┐рдЬреЛрд░реА.

рдЪрд▓рд╛ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕рд╕рд╛рдареА рдлрд╛рдИрд▓ рдмрдирд╡реВ /ansible/vars/all.yml (рдпреЗрдереЗ рддреБрдореНрд╣реА рдпрдЬрдорд╛рдирд╛рдВрдЪреНрдпрд╛ рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рдЧрдЯрд╛рдВрд╕рд╛рдареА рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рдлрд╛рдЗрд▓реНрд╕ рддрдпрд╛рд░ рдХрд░реВ рд╢рдХрддрд╛, рдЬрд╕реЗ рдЗрдиреНрд╡реНрд╣реЗрдВрдЯрд░реА рдлрд╛рдЗрд▓рдордзреНрдпреЗ: production.yml, staging.yml рдЗ.).
рд╕рд░реНрд╡ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕ рдЬреЗ рдПрдирдХреНрд░рд┐рдкреНрдЯ рдХреЗрд▓реЗрд▓реЗ рдЕрд╕рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рддреЗ рдорд╛рдирдХ yml рд╡рд╛рдХреНрдпрд░рдЪрдирд╛ рд╡рд╛рдкрд░реВрди рдпрд╛ рдлрд╛рдИрд▓рдордзреНрдпреЗ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ:

# System vars
user_password: 123qweasd
db_password: 123qweasd

# ENV vars
aws_access_key_id: xxxxx
aws_secret_access_key: xxxxxx
aws_bucket: bucket_name
rails_secret_key_base: very_secret_key_base

рддреНрдпрд╛рдирдВрддрд░ рд╣реА рдлрд╛рдИрд▓ рдХрдорд╛рдВрдбрд╕рд╣ рдПрдирдХреНрд░рд┐рдкреНрдЯ рдХреЗрд▓реА рдЬрд╛рдК рд╢рдХрддреЗ:

ansible-vault encrypt ./vars/all.yml

рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХрдЪ, рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рддрд╛рдирд╛, рддреБрдореНрд╣рд╛рд▓рд╛ рдбрд┐рдХреНрд░рд┐рдкреНрд╢рдирд╕рд╛рдареА рдкрд╛рд╕рд╡рд░реНрдб рд╕реЗрдЯ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдпрд╛ рдХрдорд╛рдВрдбрд▓рд╛ рдХреЙрд▓ рдХреЗрд▓реНрдпрд╛рдирдВрддрд░ рдлрд╛рдЗрд▓рдордзреНрдпреЗ рдХрд╛рдп рдЕрд╕реЗрд▓ рддреЗ рддреБрдореНрд╣реА рдкрд╛рд╣реВ рд╢рдХрддрд╛.

рдЪреНрдпрд╛ рдорджрддреАрдиреЗ ansible-vault decrypt рдлрд╛рдЗрд▓ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ, рд╕реБрдзрд╛рд░рд┐рдд рдЖрдгрд┐ рдирдВрддрд░ рдкреБрдиреНрд╣рд╛ рдПрдирдХреНрд░рд┐рдкреНрдЯ рдХреЗрд▓реА рдЬрд╛рдК рд╢рдХрддреЗ.

рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдо рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдлрд╛рдЗрд▓ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд░рдгреНрдпрд╛рдЪреА рдЧрд░рдЬ рдирд╛рд╣реА. рддреБрдореНрд╣реА рддреЗ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рд╕реНрдЯреЛрдЕрд░ рдХрд░рд╛ рдЖрдгрд┐ рд╡рд╛рджрд╛рд╕рд╣ рдкреНрд▓реЗрдмреБрдХ рдЪрд╛рд▓рд╡рд╛ --ask-vault-pass. Ansible рдкрд╛рд╕рд╡рд░реНрдб рд╡рд┐рдЪрд╛рд░реЗрд▓, рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░реЗрд▓ рдЖрдгрд┐ рдХрд╛рд░реНрдпреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░реЗрд▓. рд╕рд░реНрд╡ рдбреЗрдЯрд╛ рдПрдирдХреНрд░рд┐рдкреНрдЯреЗрдб рд░рд╛рд╣реАрд▓.

рдпрдЬрдорд╛рдирд╛рдВрдЪреНрдпрд╛ рдЕрдиреЗрдХ рдЧрдЯрд╛рдВрд╕рд╛рдареА рд╕рдВрдкреВрд░реНрдг рдХрдорд╛рдВрдб рдЖрдгрд┐ рдЙрддреНрддрд░рджрд╛рдпреА рд╡реНрд╣реЙрд▓реНрдЯ рдЕрд╕реЗ рдХрд╛рд╣реАрддрд░реА рджрд┐рд╕реЗрд▓:

ansible-playbook -i inventory ./playbook.yml -l "staging" --ask-vault-pass

рдкрдг рдореА рддреБрдореНрд╣рд╛рд▓рд╛ рдкреНрд▓реЗрдмреБрдХ рдЖрдгрд┐ рднреВрдорд┐рдХрд╛рдВрдЪрд╛ рдкреВрд░реНрдг рдордЬрдХреВрд░ рджреЗрдгрд╛рд░ рдирд╛рд╣реА, рддреЗ рд╕реНрд╡рддрдГ рд▓рд┐рд╣рд╛. рдХрд╛рд░рдг рдЙрддреНрддрд░рджрд╛рдпреА рдЕрд╕реЗ рдЖрд╣реЗ - рдХрд╛рдп рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рд╣реЗ рдЬрд░ рддреБрдореНрд╣рд╛рд▓рд╛ рд╕рдордЬрдд рдирд╕реЗрд▓, рддрд░ рддреЗ рддреБрдордЪреНрдпрд╛рд╕рд╛рдареА рддреЗ рдХрд░рдгрд╛рд░ рдирд╛рд╣реА.

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛