рдмрд╛рджрд▓ рдореЗрдВ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ Ansible + рдСрдЯреЛ рдЧрд┐рдЯ рдкреБрд▓



рд╢реБрдн рджрд┐рди


рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЖрднрд╛рд╕реА рдорд╢реАрдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрдИ рдХреНрд▓рд╛рдЙрдб рдХреНрд▓рд╕реНрдЯрд░ рд╣реИрдВред рдпрд╣ рд╕рдм рд╡реНрдпрд╡рд╕рд╛рдп 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 рдХрд╣рддреЗ рд╣реИрдВ):

 #!/bin/bash echo [group] > /etc/ansible/cloud_ip && " CLI    IP    " >> /etc/ansible/cloud_ip echo " " >> /etc/ansible/cloud_ip echo [group2] > /etc/ansible/cloud_ip && " CLI    IP     " >> /etc/ansible/cloud_ip 

рдпрд╣ рдЬрд╛рдБрдЪрдиреЗ рдХрд╛ рд╕рдордп рд╣реИ рдХрд┐ 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 

рдпрджрд┐ рд╣рдо рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдк рдЯреВ рдбреЗрдЯ рдпрд╛ рдЕрдирд▓реЛрдбрд┐рдВрдЧ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЕрдм рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рдерд╛


рд╣рдо рдЕрдкрдиреА рдкрдЯрдХрдерд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдЦрд╛рддреЗ рд╣реИрдВ рдЬрдм рдЧрд┐рдЯрд▓реИрдм рдореЗрдВ рдорд╛рд╕реНрдЯрд░ рд╢рд╛рдЦрд╛ рдореЗрдВ рдкреНрд░рддрд┐рдмрджреНрдз рд╣реЛрддреЗ рд╣реИрдВ

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЕрдкрдиреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдФрд░ рд╕реБрдВрджрд░ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдПрдХ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдбрд╛рд▓рддреЗ рд╣реИрдВ (рдЪрд▓реЛ рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд_рдкреЙрд▓ рдХрд╣рддреЗ рд╣реИрдВ) -

 #!/bin/bash /etc/ansible/./get_vms && ansible -i /etc/ansible/cloud_ip -m shell -a "$@" 

рд╣рдо рдЕрдкрдиреЗ рдЧрд┐рдЯрд▓реИрдм рдореЗрдВ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╣рдо рдлрд╝рд╛рдЗрд▓ .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 рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред

Source: https://habr.com/ru/post/hi472064/


All Articles