
рд╢реБрдн рджрд┐рди
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЖрднрд╛рд╕реА рдорд╢реАрдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрдИ рдХреНрд▓рд╛рдЙрдб рдХреНрд▓рд╕реНрдЯрд░ рд╣реИрдВред рдпрд╣ рд╕рдм рд╡реНрдпрд╡рд╕рд╛рдп Hetzner'e рдореЗрдВ рд╣реЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдорд╛рд╕реНрдЯрд░ рдорд╢реАрди рд╣реИ, рдЗрд╕рдореЗрдВ рд╕реЗ рдПрдХ рд╕реНрдиреИрдкрд╢реЙрдЯ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рднреАрддрд░ рд╕рднреА рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрдиреЛрдВ рдХреЛ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдпрд╣ рдпреЛрдЬрдирд╛ рд╣рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЧрд┐рдЯрд▓реИрдм-рд░рдирд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХрдИ рд╕рдорд╛рди рдкрдВрдЬреАрдХреГрдд рдзрд╛рд╡рдХ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рдкрд░ рдмрд╣реБрдд рд╕рд╛рд░реА рд╕рдорд╕реНрдпрд╛рдПрдВ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИрдВ, рдЬрд┐рд╕рдиреЗ рд╣рдореЗрдВ рдПрдХ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдЦреЛрдЬрдиреЗ рдФрд░ рдЗрд╕ рд▓реЗрдЦ / рдореИрдиреБрдЕрд▓ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ред
рдпрд╣ рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдорд╛рдзрд╛рди рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рд╕рд░рд▓ рд▓рдЧ рд░рд╣рд╛ рдерд╛ред
рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдПрдХ рдмрд┐рд▓реНрд▓реА рдХреЗ рд▓рд┐рдП рдкреВрдЫрдирд╛ред
рдорд╛рд╕реНрдЯрд░ рдорд╢реАрди рдкрд░ рдЖрд╡рд╢реНрдпрдХ рдкреИрдХреЗрдЬ:- рдЕрдЬрдЧрд░
- Git
- ssh рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓
рд╕рднреА рдЖрднрд╛рд╕реА рдорд╢реАрдиреЛрдВ рдкрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЖрдВрдд рдЦреАрдВрдЪрдиреЗ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рд╕рд┐рджреНрдзрд╛рдВрдд рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдПрдХ рдорд╢реАрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ Ansible рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рдорд╢реАрди рд╕реЗ, ansible рдЧрд┐рдЯ рдкреБрд▓ рдХрдорд╛рдВрдб рднреЗрдЬреЗрдЧрд╛ рдФрд░ рдЕрдкрдбреЗрдЯ рдХреА рдЧрдИ рд╕реЗрд╡рд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдЧрд╛ред рд╣рдордиреЗ рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рдмрд╛рд╣рд░ рдПрдХ рдЕрд▓рдЧ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдмрдирд╛рдИ, рдФрд░ рдЙрд╕ рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛:
- рдЕрдЬрдЧрд░
- ansible
- gitlab-рдзрд╛рд╡рдХ
рд╕рдВрдЧрдардирд╛рддреНрдордХ рдореБрджреНрджреЛрдВ рд╕реЗ - рдЖрдкрдХреЛ рдЧрд┐рдЯрд▓реИрдм-рд░рдирд░ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ, ssh-keygen рдмрдирд╛рдиреЗ, рдорд╛рд╕реНрдЯрд░ рдорд╢реАрди рдкрд░ рдЗрд╕ рдорд╢реАрди рдХреА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ ssh рдХреБрдВрдЬреА рдХреЛ рдбреНрд░реЙрдк рдХрд░рдиреЗ, рдорд╛рд╕реНрдЯрд░ рдорд╢реАрди рдкрд░ ansible рдХреЗ рд▓рд┐рдП 22 рдкреЛрд░реНрдЯ рдЦреЛрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЕрдм ansible рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ
рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░рд╛ рд▓рдХреНрд╖реНрдп рд╣рд░ рдЙрд╕ рдЪреАрдЬ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдирд╛ рд╣реИ рдЬреЛ рд╕рдВрднрд╡ рд╣реИред
/etc/ansible/ansible.cfg
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ
/etc/ansible/ansible.cfg
рд╣рдо рд▓рд╛рдЗрди
host_key_checking = False
рддрд╛рдХрд┐ ansible рдирдИ рдорд╢реАрдиреЛрдВ рдХреА рдкреБрд╖реНрдЯрд┐ рдХреЗ рд▓рд┐рдП рди
host_key_checking = False
ред
рдЕрдЧрд▓рд╛, рдЖрдкрдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ ansible рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдиреНрд╡реЗрдВрдЯреНрд░реА рдлрд╝рд╛рдЗрд▓ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд╕реЗ рдпрд╣ рдЙрди рдорд╢реАрдиреЛрдВ рдХреЗ рдЖрдИрдкреА рдХреЛ рдЙрдард╛рдПрдЧрд╛ рдЬрд┐рд╕ рдкрд░ рдЖрдкрдХреЛ рдЧрд┐рдЯ рдкреБрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рд╣рдо Hetzner API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЬреЗрдирд░реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдЕрдкрдиреЗ AWS, Asure, рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдореЗрдЬрдмрд╛рдиреЛрдВ рдХреА рд╕реВрдЪреА рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ (рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрдкрдиреА рдЪрд▓ рд░рд╣реА рдорд╢реАрдиреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реАрдВ рдПрдкреАрдЖрдИ рд╣реИ, рд╣реИ рдирд╛?)ред
рдЗрдиреНрд╡реЗрдВрдЯреЗрдмрд▓ рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рдВрд░рдЪрдирд╛ Ansible рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдЗрд╕рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП:
[] ip- ip- [2] ip- ip-
рдРрд╕реА рдлрд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдПрдХ рд╕рд░рд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ (рдЗрд╕реЗ
vm_list
рдХрд╣рддреЗ рд╣реИрдВ):
рдпрд╣ рдЬрд╛рдБрдЪрдиреЗ рдХрд╛ рд╕рдордп рд╣реИ рдХрд┐ ansible рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ ip рдкрддреЛрдВ рдХреЗ рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рджреЛрд╕реНрдд рд╣реИ
/etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'hostname' group
рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдЙрди рдорд╢реАрдиреЛрдВ рдХреЗ рд╣реЛрд╕реНрдЯрдирд╛рдо рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рди рдкрд░ рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрдж:
- /etc/ansible/./vm_list - рдорд╢реАрдиреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рддреИрдпрд╛рд░ рдХрд░реЗрдВ
- -i - рдЗрдиреНрд╡реЗрдВрдЯреНрд░реА рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкреВрд░реНрдг рдкрде
- -m - ansible рдХреЛ рд╢реЗрд▓ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реЗрдВ
- -рдПрдХ рддрд░реНрдХ рд╣реИред рдХрд┐рд╕реА рднреА рдЯреАрдо рдХреЛ рдпрд╣рд╛рдВ рдкреНрд░рд╡реЗрд╢ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
- рд╕рдореВрд╣ рдЖрдкрдХреЗ рдХреНрд▓рд╕реНрдЯрд░ рдХрд╛ рдирд╛рдо рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рд╕рднреА рд╕рдореВрд╣реЛрдВ рдкрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╕рдореВрд╣ рдХреЛ рд╕рднреА рдореЗрдВ рдмрджрд▓реЗрдВ
рдЖрдЧреЗ рдмрдврд╝реЗрдВ - рд╣рдорд╛рд░реЗ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрдиреЛрдВ рдкрд░ рдЧрд┐рдЯ рдкреБрд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ:
/etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'cd /path/to/project && git pull' group
рдпрджрд┐ рд╣рдо рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдк рдЯреВ рдбреЗрдЯ рдпрд╛ рдЕрдирд▓реЛрдбрд┐рдВрдЧ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдЕрдм рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рдерд╛
рд╣рдо рдЕрдкрдиреА рдкрдЯрдХрдерд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдЦрд╛рддреЗ рд╣реИрдВ рдЬрдм рдЧрд┐рдЯрд▓реИрдм рдореЗрдВ рдорд╛рд╕реНрдЯрд░ рд╢рд╛рдЦрд╛ рдореЗрдВ рдкреНрд░рддрд┐рдмрджреНрдз рд╣реЛрддреЗ рд╣реИрдВ
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЕрдкрдиреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдФрд░ рд╕реБрдВрджрд░ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдПрдХ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдбрд╛рд▓рддреЗ рд╣реИрдВ (рдЪрд▓реЛ рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд_рдкреЙрд▓ рдХрд╣рддреЗ рд╣реИрдВ) -
рд╣рдо рдЕрдкрдиреЗ рдЧрд┐рдЯрд▓реИрдм рдореЗрдВ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╣рдо рдлрд╝рд╛рдЗрд▓
.gitlab-ci.yml
рдЕрдВрджрд░ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдбрд╛рд▓:
variables: GIT_STRATEGY: none VM_GROUP: group stages: - pull - restart run_exec_pull: stage: pull script: - /etc/ansible/exec_pull 'cd /path/to/project/'$CI_PROJECT_NAME' && git pull' $VM_GROUP only: - master run_service_restart: stage: restart script: - /etc/ansible/exec_pull 'your_app_stop && your_app_start' $VM_GROUP only: - master
рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИред рдЕрдм -
- рдХрдорд┐рдЯ рдХрд░рдирд╛
- рдЦреБрд╢реА рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
рдЕрдиреНрдп рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдкреЛрд░реНрдЯ рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдмрд╕ рдкреБрдирд░рд╛рд░рдВрдн рдХреЗ рд▓рд┐рдП рд╕реЗрд╡рд╛ рдХрд╛ рдирд╛рдо рдФрд░ рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рдирд╛рдо рдХреЛ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕ рдкрд░ ansible рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред