Ansible рдХреЛ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд░реЗрд▓ рдПрдк рдбрд┐рдкреНрд▓реЛрдп рдЧрд░реНрди рд╕рд░реНрднрд░ рд╕реЗрдЯрдЕрдк рдЧрд░реНрджреИ

рдХреЗрд╣реА рд╕рдордп рдЕрдШрд┐ рдореИрд▓реЗ рд░реЗрд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рддреИрдирд╛рддреА рдЧрд░реНрди рд╕рд░реНрднрд░ рддрдпрд╛рд░ рдЧрд░реНрди рдзреЗрд░реИ рдЙрддреНрддрд░рджрд╛рдпреА рдкреНрд▓реЗрдмреБрдХрд╣рд░реВ рд▓реЗрдЦреНрди рдЖрд╡рд╢реНрдпрдХ рдерд┐рдпреЛред рд░, рдЕрдЪрдореНрдордХреЛ рдХреБрд░рд╛, рдореИрд▓реЗ рд╕рд╛рдзрд╛рд░рдг рдЪрд░рдг-рджрд░-рдЪрд░рдг рдкреБрд╕реНрддрд┐рдХрд╛ рдлреЗрд▓рд╛ рдкрд╛рд░реЗрдиред рдо рдХреЗ рд╣реБрдБрджреИрдЫ рднрдиреЗрд░ рдмреБрдЭреЗрд░ рдЕрд░реВ рдХрд╕реИрдХреЛ рдкреНрд▓реЗрдмреБрдХ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдЧрд░реНрди рдЪрд╛рд╣рдиреНрди, рд░ рдЕрдиреНрддрдорд╛ рдореИрд▓реЗ рдХрд╛рдЧрдЬрд╛рддрд╣рд░реВ рдкрдвреНрдиреБрдкрд░реНтАНрдпреЛ, рд╕рдмреИ рдХреБрд░рд╛ рдЖрдлреИрдВ рд╕рдЩреНрдХрд▓рди рдЧрд░реЗрд░ред рд╕рд╛рдпрдж рдо рдХрд╕реИрд▓рд╛рдИ рдпрд╕ рд▓реЗрдЦрдХреЛ рдорджреНрджрддрд▓реЗ рдпрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛рд▓рд╛рдИ рдЧрддрд┐ рджрд┐рди рдорджреНрджрдд рдЧрд░реНрди рд╕рдХреНрдЫреБред

рдмреБрдЭреНрдирдХреЛ рд▓рд╛рдЧрд┐ рдкрд╣рд┐рд▓реЛ рдХреБрд░рд╛ рдпреЛ рд╣реЛ рдХрд┐ ansible рд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ SSH рдорд╛рд░реНрдлрдд рд░рд┐рдореЛрдЯ рд╕рд░реНрднрд░ (рд╣рд░реВ) рдорд╛ рдХрд╛рд░реНрдпрд╣рд░реВрдХреЛ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрди рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЗрдиреНрдЯрд░рдлреЗрд╕ рдкреНрд░рджрд╛рди рдЧрд░реНрджрдЫред рдпрд╣рд╛рдБ рдХреБрдиреИ рдЬрд╛рджреВ рдЫреИрди, рддрдкрд╛рдИрдВрд▓реЗ рдкреНрд▓рдЧрдЗрди рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрди рд░ рдбрдХрд░, рдЕрдиреБрдЧрдорди рд░ рдмрдХреНрд╕ рдмрд╛рд╣рд┐рд░ рдЕрдиреНрдп рдЧреБрдбреАрд╣рд░реВрдХреЛ рд╕рд╛рде рддрдкрд╛рдИрдВрдХреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрдХреЛ рд╢реВрдиреНрдп рдбрд╛рдЙрдирдЯрд╛рдЗрдо рдбрд┐рдкреНрд▓реЛрдЗрдореЗрдиреНрдЯ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдиред рдкреНрд▓реЗрдмреБрдХ рд▓реЗрдЦреНрдирдХреЛ рд▓рд╛рдЧрд┐, рддрдкрд╛рдИрдВрд▓реЗ рд╡рд╛рд╕реНрддрд╡рдорд╛ рдХреЗ рдЧрд░реНрди рдЪрд╛рд╣рдиреБрд╣реБрдиреНрдЫ рд░ рдХрд╕рд░реА рдЧрд░реНрдиреЗ рднрдиреЗрд░ рдЬрд╛рдиреНрдиреИ рдкрд░реНрдЫред рдпрд╕реИрд▓реЗ рдо GitHub рдмрд╛рдЯ рддрдпрд╛рд░-рдирд┐рд░реНрдорд┐рдд рдкреНрд▓реЗрдмреБрдХрд╣рд░реВ, рд╡рд╛ рд▓реЗрдЦрд╣рд░реВ рдЬрд╕реНрддреИ: "рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рд░ рдЪрд▓рд╛рдЙрдиреБрд╣реЛрд╕реН, рдпрд╕рд▓реЗ рдХрд╛рдо рдЧрд░реНрдиреЗрдЫ" рд╕рдБрдЧ рд╕рдиреНрддреБрд╖реНрдЯ рдЫреИрдиред

рд╣рд╛рдореАрд▓рд╛рдИ рдХреЗ рдЪрд╛рд╣рд┐рдиреНрдЫ?

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

рдирддрд┐рдЬрд╛рдХреЛ рд░реВрдкрдорд╛, рдХрд╛рд░реНрдпрд╣рд░реВрдХреЛ рдХреНрд░рдо рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЫ:

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

рдпрд╕рдмрд╛рд╣реЗрдХ, рдЕрдиреНрддрд┐рдо рдЪрд░рдгрд╣рд░реВ рдХреНрдпрд╛рдкрд┐рд╕реНрдЯреНрд░рд╛рдиреЛ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ, рдХрдореНрддрд┐рдорд╛ рдмрд╛рдХрд╕рдХреЛ рдмрд╛рд╣рд┐рд░ рдпрд╕рд▓реЗ рд░рд┐рд▓реАрдЬ рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реАрд╣рд░реВрдорд╛ рдХреЛрдб рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдЧрд░реНрди рд╕рдХреНрдЫ, рд╕рдлрд▓ рдбрд┐рдкреНрд▓реЛрдЗрдореЗрдиреНрдЯрдорд╛ рд╕рд┐рдорд▓рд┐рдЩреНрдХрдХреЛ рд╕рд╛рде рд░рд┐рд▓реАрдЬ рд╕реНрд╡рд┐рдЪ рдЧрд░реНрди, рд╕рд╛рдЭрд╛ рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реАрдмрд╛рдЯ рдХрдиреНрдлрд┐рдЧрд╣рд░реВ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдЧрд░реНрди, рдкреНрдпреВрдорд╛ рдкреБрди: рд╕реБрд░реБ рдЧрд░реНрди, рдЖрджрд┐ред рдпреЛ рд╕рдмреИ 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.
рддрдкрд╛рдИрдВ рдПрдХ invetory рдлрд╛рдЗрд▓ рд╕рдВрдЧ рдЙрддреНрддрд░рджрд╛рдпреА рдЪрд▓рд╛рдЙрди рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ:

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

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

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

рдпрджрд┐ рддрдкрд╛рдЗрдБрд╕рдБрдЧ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реЛрд╕реНрдЯрдорд╛ ssh рдкрд╣реБрдБрдЪ рдЫ рднрдиреЗ, рддреНрдпрд╕рдкрдЫрд┐ ansible рдЬреЛрдбрд┐рдиреЗрдЫ рд░ рд░рд┐рдореЛрдЯ рдкреНрд░рдгрд╛рд▓реАрдХреЛ рдмрд╛рд░реЗрдорд╛ рдЬрд╛рдирдХрд╛рд░реА рд╕рдЩреНрдХрд▓рди рдЧрд░реНрдиреЗрдЫред (рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд TASK [рддрдереНрдпрд╣рд░реВ рдЬрдореНрдорд╛ рдЧрд░реНрдиреЗ]) рддреНрдпрд╕рдкрдЫрд┐ рдпрд╕рд▓реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдорд╛ рдЫреЛрдЯреЛ рд░рд┐рдкреЛрд░реНрдЯ рджрд┐рдиреЗрдЫ (PLAY RECAP)ред

рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд░реВрдкрдорд╛, рдЬрдбрд╛рдирд▓реЗ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫ рдЬрд╕ рдЕрдиреНрддрд░реНрдЧрдд рддрдкрд╛рдЗрдБ рдкреНрд░рдгрд╛рд▓реАрдорд╛ рд▓рдЧ рдЗрди рд╣реБрдиреБрд╣реБрдиреНрдЫред рдпреЛ рдкреНрд░рд╛рдпрдГ рд╣реЛрд╕реНрдЯрдорд╛ рд╣реБрдиреЗрдЫреИрдиред рдкреНрд▓реЗрдмреБрдХ рдлрд╛рдЗрд▓рдорд╛, рддрдкрд╛рдИрдБрд▓реЗ 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 рд▓реЗ рдкрд╛рдЗрдерди рдЕрдиреБрд╡рд╛рджрдХ рдирд┐рд░реНрдзрд╛рд░рдг рдЧрд░реНрди рд╕рдХреНрджреИрди, рддреНрдпрд╕рдкрдЫрд┐ рддрдкрд╛рдИрд▓реЗ рдпрд╕рд▓рд╛рдИ рдореНрдпрд╛рдиреБрдЕрд▓ рд░реВрдкрдорд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ:

ansible_python_interpreter: /usr/bin/python3 

рддрдкрд╛рдИрд▓реЗ рдЖрджреЗрд╢рдХреЛ рд╕рд╛рде рддрдкрд╛рдИрд╕рдБрдЧ рдкрд╛рдЗрдерди рдХрд╣рд╛рдБ рдЫ рднрдиреЗрд░ рдкрддреНрддрд╛ рд▓рдЧрд╛рдЙрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ whereis python.

рдкреНрд░рдгрд╛рд▓реА рдкреНрдпрд╛рдХреЗрдЬрд╣рд░реВ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрджреИ

Ansible рдХреЛ рдорд╛рдирдХ рд╡рд┐рддрд░рдгрд▓реЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдгрд╛рд▓реА рдкреНрдпрд╛рдХреЗрдЬрд╣рд░реВрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдирдХрд╛ рд▓рд╛рдЧрд┐ рдзреЗрд░реИ рдореЛрдбреНрдпреБрд▓рд╣рд░реВ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫ, рддреНрдпрд╕реИрд▓реЗ рд╣рд╛рдореАрд▓реЗ рдХреБрдиреИ рдкрдирд┐ рдХрд╛рд░рдгрдХреЛ рд▓рд╛рдЧрд┐ bash рд╕реНрдХреНрд░рд┐рдкреНрдЯрд╣рд░реВ рд▓реЗрдЦреНрдиреБ рдкрд░реНрджреИрдиред рдЕрдм рд╣рд╛рдореАрд▓рд╛рдИ рдкреНрд░рдгрд╛рд▓реА рдЕрджреНрдпрд╛рд╡рдзрд┐рдХ рдЧрд░реНрди рд░ рдкреНрд░рдгрд╛рд▓реА рдкреНрдпрд╛рдХреЗрдЬрд╣рд░реВ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрди рдпреА рдореЛрдбреНрдпреБрд▓рд╣рд░реВ рдордзреНрдпреЗ рдПрдЙрдЯрд╛ рдЪрд╛рд╣рд┐рдиреНрдЫред рдорд╕рдБрдЧ рдореЗрд░реЛ VPS рдорд╛ Ubuntu Linux рдЫ, рддреНрдпрд╕реИрд▓реЗ рдореИрд▓реЗ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдкреНрдпрд╛рдХреЗрдЬрд╣рд░реВ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрди 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') }}"

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

---
- 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') }}"ред рдХреБрд░рд╛ рдпреЛ рд╣реЛ рдХрд┐ ansible рдорд╛рд░реНрдлрдд рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрджреИрди 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

рдпрджрд┐ рд╣рд╛рдореАрд▓реЗ рдЕрдм рд╣рд╛рдореНрд░реЛ рдкреНрд▓реЗрдмреБрдХ рд╕реБрд░реБ рдЧрд░реНрдпреМрдВ рднрдиреЗ, рдпрд╕рд▓реЗ рджреБрд╡реИ рд╣реЛрд╕реНрдЯрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╣рд░реВ рдЧрд░реНрдиреЗрдЫред рддрд░ рдПрдХреИ рд╕рдордпрдорд╛, рд╕реНрдЯреЗрдЬрд┐рдЩ рд╣реЛрд╕реНрдЯрдХреЛ рд▓рд╛рдЧрд┐, рдЪрд░ рдЙрддреНрдкрд╛рджрдирд╣рд░реВ рднрдиреНрджрд╛ рдлрд░рдХ рд╣реБрдиреЗрдЫ, рд░ рднреВрдорд┐рдХрд╛ рд░ рдкреНрд▓реЗрдмреБрдХрд╣рд░реВрдорд╛ рдорд╛рддреНрд░ рд╣реЛрдЗрди, рддрд░ nginx рдХрдиреНрдлрд┐рдЧрд╣рд░реВрдорд╛ рдкрдирд┐ред {{ 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ред рддрдереНрдп рдпреЛ рд╣реЛ рдХрд┐ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд░реВрдкрдорд╛, рдХреЗрд╡рд▓ postgres рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╕рдБрдЧ postgresql рдбрд╛рдЯрд╛рдмреЗрд╕рдорд╛ рдкрд╣реБрдБрдЪ рдЫ рд░ рдХреЗрд╡рд▓ рд╕реНрдерд╛рдиреАрдп рд░реВрдкрдорд╛ред рдпреЛ рдирд┐рд░реНрджреЗрд╢рдирд▓реЗ рд╣рд╛рдореАрд▓рд╛рдИ рдпрд╕ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рдХреЛ рддрд░реНрдлрдмрд╛рдЯ рдЖрджреЗрд╢рд╣рд░реВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫ (рдпрджрд┐ рд╣рд╛рдореАрд╕рдБрдЧ рдкрд╣реБрдБрдЪ рдЫ рднрдиреЗ, рдЕрд╡рд╢реНрдп)ред
рд╕рд╛рдереИ, рддрдкрд╛рдИрд▓реЗ рдирдпрд╛рдБ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд▓рд╛рдИ рдбрд╛рдЯрд╛рдмреЗрд╕рдорд╛ рдкрд╣реБрдБрдЪ рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рди 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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди