рдмрд╣реБрдд рдкрд╣рд▓реЗ рдирд╣реАрдВ, рдореБрдЭреЗ рд░реЗрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рдХреЛ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдЕрдЦрдгреНрдбрдиреАрдп рдкреНрд▓реЗрдмреБрдХ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдФрд░, рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд░реВрдк рд╕реЗ, рдореБрдЭреЗ рдПрдХ рд╕рд░рд▓ рдЪрд░рдг-рджрд░-рдЪрд░рдг рдореИрдиреБрдЕрд▓ рдирд╣реАрдВ рдорд┐рд▓рд╛ред рдореИрдВ рдпрд╣ рд╕рдордЭреЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдФрд░ рдХреА рдкреНрд▓реЗрдмреБрдХ рдХреЛ рдХреЙрдкреА рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рдерд╛ рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдореБрдЭреЗ рд╕рдм рдХреБрдЫ рдЗрдХрдЯреНрдард╛ рдХрд░рддреЗ рд╣реБрдП, рдбреЙрдХреНрдпреВрдореЗрдВрдЯреЗрд╢рди рдкрдврд╝рдирд╛ рдкрдбрд╝рд╛ред рд╢рд╛рдпрдж рдХреЛрдИ рдореИрдВ рдЗрд╕ рд▓реЗрдЦ рдХреЗ рд╕рд╛рде рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЧрддрд┐ рджреЗрдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред
рд╕рдордЭрдиреЗ рд╡рд╛рд▓реА рдкрд╣рд▓реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдПрд╕рдПрд╕рдПрдЪ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░рд┐рдореЛрдЯ рд╕рд░реНрд╡рд░ (рдПрд╕) рдкрд░ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╕реВрдЪреА рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдЖрдкрдХреЛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдХреЛрдИ рдЬрд╛рджреВ рдирд╣реАрдВ рд╣реИ, рдЖрдк рдкреНрд▓рдЧрдЗрди рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╢реВрдиреНрдп рдбрд╛рдЙрдирдЯрд╛рдЗрдо рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдХреА рддреИрдирд╛рддреА рдбреЙрдХрдЯрд░, рдирд┐рдЧрд░рд╛рдиреА рдФрд░ рдЕрдиреНрдп рдЙрдкрд╣рд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рд╣реЛ рд╕рдХрддреА рд╣реИред рдкреНрд▓реЗрдмреБрдХ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдХреИрд╕реЗ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдЬреАрдердм рд╕реЗ рддреИрдпрд╛рд░ рдХреА рдЧрдИ рдкреНрд▓реЗрдмреБрдХ рдпрд╛ рдРрд╕реЗ рд▓реЗрдЦ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддрд╛ рдЬреИрд╕реЗ: "рдХреЙрдкреА рдФрд░ рд░рди рдХрд░реЗрдВ, рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред"
рд╣рдореЗрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП?
рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛, рдкреНрд▓реЗрдмреБрдХ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдХреИрд╕реЗ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЖрдЗрдП рдлреИрд╕рд▓рд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдореЗрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдПред рд░реЗрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХрдИ рд╕рд┐рд╕реНрдЯрдо рдкреИрдХреЗрдЬреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА: nginx, postgresql (redis, рдЖрджрд┐)ред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рд╣рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдорд╛рдгрд┐рдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред Rbenv (rvm, asdf ...) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдореВрд▓ рд╕реЗ рдпрд╣ рд╕рдм рдЪрд▓рд╛рдирд╛ рд╣рдореЗрд╢рд╛ рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдПрдХ рдЕрд▓рдЧ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдирд╛рдиреЗ рдФрд░ рдЙрд╕рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреЛ рд╕рд░реНрд╡рд░ рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдирдЧреНрдиреЗрдХреНрд╕, рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВ рдФрд░ рдЗрди рд╕рднреА рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдЪрд▓рд╛рдПрдВред
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдХреНрд░рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
- рд░реВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░реЗрдВ
- рд╕рд┐рд╕реНрдЯрдо рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ
- рдПрдХ рдирдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдирд╛рдПрдВ, рдЕрдзрд┐рдХрд╛рд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ, ssh рдХреБрдВрдЬреА
- рд╕рд┐рд╕реНрдЯрдо рдкреИрдХреЗрдЬ (nginx рдЖрджрд┐) рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЪрд▓рд╛рдПрдВ
- рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдирд╛рдПрдБ (рдЖрдк рддреБрд░рдВрдд рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ)
- рдПрдХ рдирдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░реЗрдВ
- рд░реЗрдВрдмрд╡ рдФрд░ рд░реВрдмреА рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ
- рдмрдВрдбрд▓ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ
- рдЖрд╡реЗрджрди рдХреЛрдб рднрд░реЗрдВ
- рд╣рдо рдкреНрдпреВрдорд╛ рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдВрддрд┐рдо рдЪрд░рдг рдХреИрдкрд┐рд╕реНрдЯреНрд░рд╛рдиреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рд╡рд╣ рдмреЙрдХреНрд╕ рд╕реЗ рд░рд┐рд▓реАрдЬ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рдХреЛрдб рдХреЛ рдХреЙрдкреА рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдПрдХ рд╕рдлрд▓ рддреИрдирд╛рддреА рдкрд░ рдПрдХ рд╕рд┐рдорд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде рд░рд┐рд▓реАрдЬ рдХреЛ рд╕реНрд╡рд┐рдЪ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд╕рд╛рдЭрд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реЗ рдХреЙрдкреА рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдкреНрдпреВрдорд╛ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЖрджрд┐ред рдпрд╣ рд╕рдм Ansible рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВ?
рдлрд╝рд╛рдЗрд▓ рд╕рдВрд░рдЪрдирд╛
рдЕрдкрдиреА рд╕рднреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП Ansible рдХреЗ рдкрд╛рд╕ рдПрдХ рд╕рдЦреНрдд рдлрд╝рд╛рдЗрд▓ рд╕рдВрд░рдЪрдирд╛ рд╣реИ , рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд╕рднреА рдХреЛ рдПрдХ рдЕрд▓рдЧ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд░рдЦрдирд╛ рд╕рд░реНрд╡реЛрддреНрддрдо рд╣реИред рдФрд░ рдпрд╣ рдЗрддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд░реЗрд▓ рдХреЗ рдЖрд╡реЗрджрди рдореЗрдВ рд╣реА рд╣реЛрдЧрд╛, рдпрд╛ рдЕрд▓рдЧ рд╕реЗред рдЖрдк рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдЧрд┐рдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдерд╛ рдХрд┐ рдореИрдВ рдЖрд╡реЗрджрди рдХреА рд░реЗрд▓ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рдЗрди-рдбрд┐рд╕рд┐рдкреНрд▓рд┐рди рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА / рдХреЙрдиреНрдлрд┐рдЧ рдХреЛ рддреИрдпрд╛рд░ рдХрд░реВрдВ рдФрд░ рдПрдХ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рд╕рдм рдХреБрдЫ рд╕реНрдЯреЛрд░ рдХрд░реВрдВред
рд╕рд┐рдВрдкрд▓ рдкреНрд▓реЗрдмреБрдХ
Playbook рдПрдХ yml рдлрд╝рд╛рдЗрд▓ рд╣реИ рдЬреЛ рдмрддрд╛рддреА рд╣реИ рдХрд┐ рд╡рд┐рд╢реЗрд╖ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрдпрд╛ рдФрд░ рдХреИрд╕реЗ ansible рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЪрд▓рд┐рдП рдкрд╣рд▓реА рдРрд╕реА рдкреНрд▓реЗрдмреБрдХ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ:
--- - name: Simple playbook hosts: all
рдпрд╣рд╛рдВ, рд╣рдо рдХреЗрд╡рд▓ рдпрд╣ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реА рдкреНрд▓реЗрдмреБрдХ рдХреЛ Simple Playbook
рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рд╕рднреА рдореЗрдЬрдмрд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЪрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдо рдЗрд╕реЗ playbook.yml
рдирд╛рдо рдХреЗ рд╕рд╛рде / ansible рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕рд╣реЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЪрд▓рд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
ansible-playbook ./playbook.yml PLAY [Simple Playbook] ************************************************************************************************************************************ skipping: no hosts matched
Ansible рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдпрд╣ рдореЗрдЬрдмрд╛рди рдХреЛ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИ рдЬреЛ рд╕рднреА рд╕реВрдЪреА рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЗрдиреНрд╡реЗрдВрдЯреНрд░реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЖрдЗрдП рдЗрд╕реЗ рдЙрд╕реА рдЖрдиреБрд╖рдВрдЧрд┐рдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдмрдирд╛рдПрдБ:
123.123.123.123
рддреЛ рдмрд╕ рд╣реЛрд╕реНрдЯ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ (рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рд╡реАрдкреАрдПрд╕ рдХреЗ рдореЗрдЬрдмрд╛рди, рдпрд╛ рдЖрдк рд╕реНрдерд╛рдиреАрдпрд╣реЛрд╕реНрдЯ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ) рдФрд░ рдЗрд╕реЗ рдирд╛рдо inventory
рддрд╣рдд рд╕рд╣реЗрдЬ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдк рдПрдХ рдЕрдирд┐рд╡рд╛рд░реНрдп рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде ansible рдЪрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
ansible-playbook ./playbook.yml -i inventory PLAY [Simple Playbook] ************************************************************************************************************************************ TASK [Gathering Facts] ************************************************************************************************************************************ PLAY RECAP ************************************************************************************************************************************
рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реЛрд╕реНрдЯ рддрдХ рдкрд╣реБрдВрдЪ рд╣реИ, рддреЛ ansible рд░рд┐рдореЛрдЯ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХрдиреЗрдХреНрдЯ рдФрд░ рдПрдХрддреНрд░рд┐рдд рдХрд░реЗрдЧрд╛ред (рдбрд┐рдлрд╝реЙрд▓реНрдЯ TASK [рдПрдХрддреНрд░реАрдХрд░рдг рддрдереНрдп]) рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдпрд╣ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдкреНрд░рдЧрддрд┐ рд░рд┐рдкреЛрд░реНрдЯ (PLAY RECAP) рджреЗрдЧрд╛ред
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдЬрд┐рд╕рдХреЗ рддрд╣рдд рдЖрдк рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд▓реЙрдЧ рдЗрди рд╣реИрдВ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рдореЗрдЬрдмрд╛рди рдкрд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдкреНрд▓реЗрдмреБрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рдЖрдк рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕рд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд░рд┐рдореЛрдЯ_реНрдпреВрд╕рд░ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рд╕рд╛рде рд╣реА, рд░рд┐рдореЛрдЯ рд╕рд┐рд╕реНрдЯрдо рдХреА рдЬрд╛рдирдХрд╛рд░реА рдЕрдХреНрд╕рд░ рдЖрдкрдХреЗ рд▓рд┐рдП рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реЛ рд╕рдХрддреА рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдЗрд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдордп рдмрд░реНрдмрд╛рдж рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдк рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рднреА рдмрдВрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
--- - name: Simple playbook hosts: all remote_user: root become: true gather_facts: no
рдлрд┐рд░ рд╕реЗ рдкреНрд▓реЗрдмреБрдХ рдЪрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдХрдиреЗрдХреНрд╢рди рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред (рдпрджрд┐ рдЖрдкрдиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдЬрдбрд╝ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреА рд╣реИ, рддреЛ рдЖрдкрдХреЛ рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛: рдЙрдиреНрдирдд рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдирд┐рд░реНрджреЗрд╢ред рдЬреИрд╕рд╛ рдХрд┐ рдкреНрд░рд▓реЗрдЦрди рдХрд╣рддрд╛ рд╣реИ: become set to 'true'/'yes' to activate privilege escalation.
рдЬрд╛рддрд╛ рд╣реИ become set to 'true'/'yes' to activate privilege escalation.
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпреЛрдВред) ред
рд╢рд╛рдпрдж рдЖрдкрдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рдХрд╛рд░рдг рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ рдХрд┐ рдЕрдЬрдЧрд░ рджреБрднрд╛рд╖рд┐рдпрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
ansible_python_interpreter: /usr/bin/python3
рдЬрд╣рд╛рдБ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрдЬрдЧрд░ рд╣реИ, рдЬрд╣рд╛рдБ рдкрд░ whereis python
рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╕рд┐рд╕реНрдЯрдо рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ
рд╡рд┐рднрд┐рдиреНрди рд╕рд┐рд╕реНрдЯрдо рдкреИрдХреЗрдЬ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрддрд░ рджреЗрдиреЗ рдпреЛрдЧреНрдп рдХрдИ рдореЙрдбреНрдпреВрд▓ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдХрд┐рд╕реА рднреА рдХрд╛рд░рдг рд╕реЗ рдмреИрд╢ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд╣реАрдВ рд▓рд┐рдЦрдиреА рд╣реИред рдЕрдм рд╣рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдирдореЗрдВ рд╕реЗ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ рдХреНрд░рдорд╢рдГ 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
рдмрджрд▓рдХрд░ред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкреЛрд╕реНрдЯрдЧреНрд░реИрд╕реЗрдХрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░реЗрд▓реНрд╕ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдкреЛрд╕реНрдЯрдЧреНрд░реИрд╕реНрдХрд▓-рдХрдВрдЯреНрд░реАрдм рдкреИрдХреЗрдЬ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЬрд╛рдирдиреЗ рдФрд░ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдЕрдкрдиреЗ рдЖрдк рд╕реЗ рдпрд╣ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдкреНрд▓реЗрдмреБрдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдФрд░ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рд╣реИрдВред
рдирдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдгред
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, 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') }}"
рдЪрд░ рдХреЛ Playbooks рдореЗрдВ рдбрдмрд▓ рдШреБрдВрдШрд░рд╛рд▓реЗ рдХреЛрд╖реНрдардХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╣рдо рдЗрдиреНрд╡реЗрдВрдЯреНрд░реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЪрд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВрдЧреЗ:
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"
рдпрд╣ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рдореВрд╣ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдореВрд╣ рдореЙрдбреНрдпреВрд▓ рднреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдмрд╣реБрдд рд╣реА рдЙрдкрдпреБрдХреНрдд рд╣реИред рдлрд┐рд░ рдЗрд╕ рд╕рдореВрд╣ рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ ( 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
рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП pre_tasks
ред
Nginx рд╕реЗрдЯрдЕрдк
Nginx рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣рдорд╛рд░реЗ рд╕рд╛рде рд╕реНрдерд╛рдкрд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдЗрдП рдЗрд╕реЗ рдЕрднреА рднреВрдорд┐рдХрд╛ рдореЗрдВ рдХрд░реЗрдВред рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рдПрдБ:
- ansible - roles - nginx - files - tasks - main.yml - templates
рдЕрдм рд╣рдореЗрдВ рдлрд╛рдЗрд▓ рдФрд░ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЪрд╛рд╣рд┐рдПред рджреЛрдиреЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ ansible рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕реАрдзреЗ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╣реИред рдФрд░ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рдПрдХреНрд╕рдЯреЗрдВрд╢рди j2 рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╡реЗ рдПрдХ рд╣реА рдбрдмрд▓ рдШреБрдВрдШрд░рд╛рд▓реЗ рдХреЛрд╖реНрдардХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЪрд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЪрд▓рд┐рдП main.yml
рдлрд╛рдЗрд▓ рдореЗрдВ nginx рдХреЛ рд╢рд╛рдорд┐рд▓ main.yml
рд╣реИрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рд┐рд╕реНрдЯрдо рдореЙрдбреНрдпреВрд▓ рд╣реИ:
# Copy nginx configs and start it - name: enable service nginx and start systemd: name: nginx state: started enabled: yes
рдпрд╣рд╛рдВ рд╣рдо рди рдХреЗрд╡рд▓ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдирдЧрдиреЗрдХреНрд╕ рдХреЛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдпрд╛рдиреА, рдЗрд╕реЗ рдЪрд▓рд╛рдПрдВ), рд▓реЗрдХрд┐рди рддреБрд░рдВрдд рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕реЗ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЕрдм рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдПрдБ:
# 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 рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ (рдЖрдк рдЗрд╕реЗ рд╕реАрдзреЗ рд╕рд░реНрд╡рд░ рд╕реЗ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ)ред рдФрд░ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рднреА sites_available рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ (рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧреА рд╣реИ)ред рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ (рдлрд╝рд╛рдЗрд▓ /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 }}
- рдпреЗ рд╕рднреА рдЪрд░ рд╣реИрдВ рдЬрд┐рдирдХреЗ рдорд╛рдиреЛрдВ рдХреЛ рдХреЙрдкреА рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдкрдиреНрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐ рдЖрдк рд╡рд┐рднрд┐рдиреНрди рд╣реЛрд╕реНрдЯ рд╕рдореВрд╣реЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд▓реЗрдмреБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреА рдЗрдиреНрд╡реЗрдВрдЯреНрд░реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкреВрд░рдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
[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 рд╣реИ рдФрд░ рдЬрд┐рд╕ рд╣реЛрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдкреНрд▓реЗрдмреБрдХ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реИ рд╡рд╣ рд╡рд╣рд╛рдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред
рдпрджрд┐ рдЖрдк рдХрдИ рдореЗрдЬрдмрд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдиреНрд╡реЗрдВрдЯреНрд░реА рдлрд╝рд╛рдЗрд▓ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рд╕рдореВрд╣ рдХреЗ рд▓рд┐рдП рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
ansible-playbook -i inventory ./playbook.yml -l "staging"
рдПрдХ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдореВрд╣реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЗрдиреНрд╡реЗрдВрдЯреНрд░реА рдлрд╛рдЗрд▓реЗрдВ рд░рдЦрдирд╛ рд╣реИред рдпрд╛ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛрд╕реНрдЯ рд╣реИрдВ, рддреЛ рдЖрдк рджреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдЪрд▓реЛ nginx рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдкрд╕ рдЖрддреЗ рд╣реИрдВред рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рд╕рд╛рдЗрдЯ_рдЕрд╡рд▓реЗ рд╕реЗ my_app.conf рдкрд░ sitest_enabled рдореЗрдВ рдПрдХ рд╕рд┐рдорд▓рд┐рдВрдХ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдФрд░ рдирдЧреНрдиреЗрдХреНрд╕ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░реЗрдВред
... # 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
рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ - рдлрд┐рд░ рд╕реЗ, рдХрд╛рдлреА рдорд╛рдирдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд╕рд╛рде ansible рдореЙрдбреНрдпреВрд▓ред рд▓реЗрдХрд┐рди рдПрдХ рдмрд┐рдВрджреБ рд╣реИред рд╣рд░ рдмрд╛рд░ рдирдЧреНрдиреЗрдХреНрд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред рдЖрдкрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рд╣рдо рдлрд╝реЙрд░реНрдо рдХреА рдХрдорд╛рдВрдб рдирд╣реАрдВ рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ: "рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд░реЗрдВ", рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ "рдЗрд╕ рд░рд╛рдЬреНрдп рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП" рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред рдФрд░ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рд╕рдореВрд╣ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ рдпрд╛ рд╕рд┐рд╕реНрдЯрдо рдкреИрдХреЗрдЬ рдкрд╣рд▓реЗ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рд╣реИ, рддреЛ ansible рдЗрд╕ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдЧрд╛ рдФрд░ рдХрд╛рд░реНрдп рдХреЛ рдЫреЛрдбрд╝ рджреЗрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдХреЙрдкреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдпрджрд┐ рд╡реЗ рд╕рд░реНрд╡рд░ рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВред рд╣рдо рдЗрд╕рдХрд╛ рд▓рд╛рдн рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ 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
рдкрдВрдЬреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдФрд░ рдХреЗрд╡рд▓ рдЕрдЧрд░ рдпрд╣ рдЪрд░ рдкрдВрдЬреАрдХреГрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╕реЗрд╡рд╛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдЧреАред
рдареАрдХ рд╣реИ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЖрдкрдХреЛ рдирдЧреНрдиреЗрдХреНрд╕ рдХреА рднреВрдорд┐рдХрд╛ рдХреЛ рдореБрдЦреНрдп рдкреНрд▓реЗрдмреБрдХ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред
Postgresql рд╕реЗрдЯрдЕрдк
рд╣рдореЗрдВ рд╕рд┐рд╕реНрдЯрдордЧреНрд░реИрдб рдХреЗ рд╕рд╛рде postgresql рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ nginx рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдерд╛, рдФрд░ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рднреА рдмрдирд╛рдПрдВ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗред
рднреВрдорд┐рдХрд╛ / /ansible/roles/postgresql/tasks/main.yml
/ /ansible/roles/postgresql/tasks/main.yml
/ /ansible/roles/postgresql/tasks/main.yml
/ /ansible/roles/postgresql/tasks/main.yml
/ /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 }}"
рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдЗрдиреНрд╡реЗрдВрдЯреНрд░реА рдореЗрдВ рд╡реИрд░рд┐рдПрдмрд▓ рдХреЛ рдХреИрд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдП, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрдИ рдмрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдкреЛрд╕реНрдЯрдЧреНрд░реИрд╕рдХреНрд▓рд╛_рдбрдм рдФрд░ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдХреНрд╕реНрд▓_рд╕реБрдЕрд░ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рднреА рд╣реИред рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдЕрдзрд┐рдХ рдбреЗрдЯрд╛ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдирд┐рд░реНрджреЗрд╢рдХ become_user: postgres
рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк become_user: postgres
ред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдХреЗрд╡рд▓ рдкреЛрд╕реНрдЯрдЧреНрд░реИрдЬ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рдкреЛрд╕реНрдЯрдЧреНрд░реИрд╕рдХреНрд▓ рдбреЗрдЯрд╛рдмреЗрд╕ рддрдХ рдкрд╣реБрдВрдЪ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рд╣реИред рдпрд╣ рдирд┐рд░реНрджреЗрд╢ рд╣рдореЗрдВ рдЗрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдУрд░ рд╕реЗ рдЖрджреЗрд╢реЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рдЬрдм рддрдХ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣реБрдВрдЪ рди рд╣реЛ)ред
рд╕рд╛рде рд╣реА, рдирдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛рдмреЗрд╕ рддрдХ рдкрд╣реБрдБрдЪ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ pg_hba.conf рдореЗрдВ рдПрдХ рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреИрд╕реЗ рд╣рдордиреЗ nginx config рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ред
рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрдкрдХреЛ рдкреЛрд╕реНрдЯрдЧреНрд░реИрдХреНрд╕реНрд▓ рдХреА рднреВрдорд┐рдХрд╛ рдХреЛ рдореБрдЦреНрдп рдкреНрд▓реЗрдмреБрдХ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред
рд░реВрдмреЗрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░реВрдмреА рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ
рдЖрд░рдиреЗрдмрд▓ рдХреЗ рдкрд╛рд╕ рд░реЗрдВрдмрд╡ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдореЙрдбреНрдпреВрд▓ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЧрд┐рдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдХреНрд▓реЛрди рдХрд░рдХреЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрд╣ рдХрд╛рд░реНрдп рд╕рдмрд╕реЗ рдЧреИрд░-рдорд╛рдирдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдЗрдП, рдЙрд╕рдХреЗ рд▓рд┐рдП рднреВрдорд┐рдХрд╛ / /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 рдЕрдкрдиреЗ рд╣реЛрдо рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рд╣реИ, рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ рдирд╣реАрдВред рдФрд░ рд╣рдо рд░реЗрдкреЛ рдФрд░ рдбрд┐рд╕реНрдЯрд┐рдХреНрдЯ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдХреНрд▓реЛрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрд┐рдЯ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ bashrc рдореЗрдВ rbenv рдЗрдирд┐рдЯ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдФрд░ рдЙрд╕реА рд╕реНрдерд╛рди рдкрд░ PATH рдореЗрдВ rbenv рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд▓рд╛рдЗрдирдЗрдирдлрд╛рдЗрд▓ рдореЙрдбреНрдпреВрд▓ рд╣реИ:
- 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 -)"'
рдЗрд╕рдХреЗ рдмрд╛рдж рдорд╛рдгрд┐рдХреНрдп рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
- 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
рдФрд░ рдлрд┐рд░ рд╕реЗ, рд╣рдорд╛рд░реА playy_rbenv рднреВрдорд┐рдХрд╛ рдХреЛ рдореБрдЦреНрдп рдкреНрд▓реЗрдмреБрдХ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред
рдлрд╝рд╛рдЗрд▓реЗрдВ рд╕рд╛рдЭрд╛ рдХреА рд╣реИрдВред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рд╕реЗрдЯрд┐рдВрдЧ рдкреВрд░реА рд╣реЛ рд╕рдХрддреА рд╣реИред рдлрд┐рд░ рдпрд╣ рдХреИрдкрд┐рд╕реНрдЯреНрд░рд╛рдиреЛ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдХреЛрдб рдХреЛ рдХреЙрдкреА рдХрд░реЗрдЧрд╛, рдЖрд╡рд╢реНрдпрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдПрдВ рдмрдирд╛рдПрдЧрд╛ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░реЗрдЧрд╛ (рдпрджрд┐ рд╕рдм рдХреБрдЫ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдХреНрд╕рд░ рдХреИрдкрд┐рд╕реНрдЯреНрд░рд╛рдиреЛ рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреИрд╕реЗ .env
рдпрд╛ .env
рдЙрдиреНрд╣реЗрдВ рдХреЙрдкреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ nginx рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓реЗрдВ рдФрд░ рдЯреЗрдореНрдкрд▓реЗрдЯред рдХреЗрд╡рд▓ рдПрдХ рд╕реВрдХреНрд╖реНрдорддрд╛ рд╣реИред рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдЙрдирдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ:
# Copy shared files for deploy - name: Ensure shared dir become_user: "{{ user }}" file: path: "{{ app_path }}/shared/config" state: directory
рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ ansible рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдЧрд╛ред
рдЕрд╕реНрдерд┐рд░ рддрд┐рдЬреЛрд░реА
рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рддрдереНрдп рдкрд░ рдареЛрдХрд░ рдЦрд╛ рдЪреБрдХреЗ рд╣реИрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд╛рд╕рд╡рд░реНрдб рдЬреИрд╕реЗ рдЧреБрдкреНрдд рдбреЗрдЯрд╛ рдЪрд░ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдФрд░ database.yml
рд▓рд┐рдП рдПрдХ .env
рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдИ рд╣реИ, рддреЛ database.yml
рдРрд╕реЗ рдФрд░ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдбреЗрдЯрд╛ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рдЖрдБрдЦреЛрдВ рдХреЛ рдЪреБрднрдиреЗ рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдЫреБрдкрд╛рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рд▓рд┐рдП Ansible рд╡реЙрд▓реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЪрд▓реЛ рд╡реИрд░рд┐рдПрдмрд▓ /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
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ ansible-vault decrypt
рдлрд╝рд╛рдЗрд▓ рдХреЛ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ, рд╕рдВрд╢реЛрдзрд┐рдд рдФрд░ рдлрд┐рд░ рд╕реЗ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдлрд╝рд╛рдЗрд▓ рдХреЛ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред рдЖрдк рдЗрд╕реЗ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд▓реЗрдмреБрдХ рдХреЛ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдЪрд▓рд╛рддреЗ рд╣реИрдВ --ask-vault-pass
ред рдЬрд╡рд╛рдмрджреЗрд╣ рдПрдХ рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рд▓рд┐рдП рдкреВрдЫреЗрдЧрд╛, рдЪрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ, рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░реЗрдВред рд╕рднреА рдбреЗрдЯрд╛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рд░рд╣реЗрдВрдЧреЗред
рдХрдИ рдореЗрдЬрдмрд╛рди рд╕рдореВрд╣реЛрдВ рдФрд░ ansible рддрд┐рдЬреЛрд░реА рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реНрдг рдЖрджреЗрд╢ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
ansible-playbook -i inventory ./playbook.yml -l "staging" --ask-vault-pass
рдФрд░ рдореИрдВрдиреЗ рдЖрдкрдХреЛ рдкреНрд▓реЗрдмреБрдХ рдФрд░ рднреВрдорд┐рдХрд╛рдУрдВ рдХрд╛ рдкреВрд░рд╛ рдкрд╛рда рдирд╣реАрдВ рджрд┐рдпрд╛, рдЕрдкрдиреЗ рд▓рд┐рдП рд▓рд┐рдЦреЗрдВред рдХреНрдпреЛрдВрдХрд┐ рд╕реВрдХреНрд╖реНрдорддрдо рдмрд╛рдд рдпрд╣ рд╣реИ - рдпрджрд┐ рдЖрдк рдпрд╣ рдирд╣реАрдВ рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред