рдХреНрд▓рд╛рдЙрдбрдорд╛ рднрд░реНрдЪреБрдЕрд▓ рдореЗрд╕рд┐рдирд╣рд░реВрдХреЛ рдХреНрд▓рд╕реНрдЯрд░рдорд╛ Ansible + auto git рдкреБрд▓

рдХреНрд▓рд╛рдЙрдбрдорд╛ рднрд░реНрдЪреБрдЕрд▓ рдореЗрд╕рд┐рдирд╣рд░реВрдХреЛ рдХреНрд▓рд╕реНрдЯрд░рдорд╛ Ansible + auto git рдкреБрд▓

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

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

рдпрд╕ рдпреЛрдЬрдирд╛рд▓реЗ рд╣рд╛рдореАрд▓рд╛рдИ gitlab-рдзрд╛рд╡рдХрд╣рд░реВ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдкрдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдБрджреИрди, рдХрд┐рдирдХрд┐ рдзреЗрд░реИ рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рдЙрддреНрдкрдиреНрди рд╣реБрдиреНрдЫрдиреН рдЬрдм рдзреЗрд░реИ рд╕рдорд╛рди рджрд░реНрддрд╛ рдЧрд░рд┐рдПрдХрд╛ рдзрд╛рд╡рдХрд╣рд░реВ рджреЗрдЦрд╛ рдкрд░реНрдЫрдиреН, рдЬрд╕рд▓реЗ рд╣рд╛рдореАрд▓рд╛рдИ рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬреНрди рд░ рдпреЛ рд▓реЗрдЦ/рдореНрдпрд╛рдиреБрдЕрд▓ рд▓реЗрдЦреНрди рдкреНрд░реЗрд░рд┐рдд рдЧрд░реНтАНрдпреЛред

рдпреЛ рд╕рдореНрднрд╡рддрдГ рдЙрддреНрддрдо рдЕрднреНрдпрд╛рд╕ рд╣реЛрдЗрди, рддрд░ рдпреЛ рд╕рдорд╛рдзрд╛рди рд╕рдореНрднрд╡ рднрдПрд╕рдореНрдо рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд░ рд╕рд░рд▓ рджреЗрдЦрд┐рдиреНрдереНрдпреЛред

рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓рдХреЛ рд▓рд╛рдЧрд┐, рдХреГрдкрдпрд╛ рдмрд┐рд▓реНрд▓реА рд╣реЗрд░реНрдиреБрд╣реЛрд╕реНред

рдорд╛рд╕реНрдЯрд░ рдореЗрд╕рд┐рдирдорд╛ рдЖрд╡рд╢реНрдпрдХ рдкреНрдпрд╛рдХреЗрдЬрд╣рд░реВ:

  • рдЕрдЬрдЧрд░
  • рдЬрд╛рдиреБрд╣реЛрд╕реН
  • ssh рдХреБрдЮреНрдЬреАрд╣рд░реВрд╕рдБрдЧ рдлрд╛рдЗрд▓

рд╕рдмреИ рднрд░реНрдЪреБрдЕрд▓ рдореЗрд╕рд┐рдирд╣рд░реВрдорд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкреЗрдЯ рдкреБрд▓ рд▓рд╛рдЧреВ рдЧрд░реНрдиреЗ рд╕рд╛рдорд╛рдиреНрдп рд╕рд┐рджреНрдзрд╛рдиреНрдд рднрдиреЗрдХреЛ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдПрдЙрдЯрд╛ рдореЗрд╕рд┐рди рдЪрд╛рд╣рд┐рдиреНрдЫ рдЬрд╕рдорд╛ Ansible рд╕реНрдерд╛рдкрдирд╛ рд╣реБрдиреЗрдЫред рдпрд╕ рдореЗрд╕рд┐рдирдмрд╛рдЯ, ansible рд▓реЗ git рдкреБрд▓ рдЖрджреЗрд╢рд╣рд░реВ рдкрдард╛рдЙрдиреЗрдЫ рд░ рдЕрджреНрдпрд╛рд╡рдзрд┐рдХ рдЧрд░рд┐рдПрдХреЛ рд╕реЗрд╡рд╛ рдкреБрди: рд╕реБрд░реБ рдЧрд░реНрдиреЗрдЫред рдпреА рдЙрджреНрджреЗрд╢реНрдпрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐, рд╣рд╛рдореАрд▓реЗ рдХреНрд▓рд╕реНрдЯрд░рд╣рд░реВ рдмрд╛рд╣рд┐рд░ рдЫреБрдЯреНрдЯреИ рднрд░реНрдЪреБрдЕрд▓ рдореЗрд╕рд┐рди рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдпреМрдВ рд░ рдпрд╕рдорд╛ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдпреМрдВ:

  • рдЕрдЬрдЧрд░
  • рдЙрддреНрддрд░рджрд╛рдпреА
  • gitlab- рдзрд╛рд╡рдХ

рд╕рдВрдЧрдардирд╛рддреНрдордХ рдореБрджреНрджрд╛рд╣рд░реВрдмрд╛рдЯ - рддрдкрд╛рдИрдВрд▓реЗ gitlab-runner рджрд░реНрддрд╛ рдЧрд░реНрди, ssh-keygen рдмрдирд╛рдЙрди, рдпрд╕ рдореЗрд╕рд┐рдирдХреЛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ ssh рдХреБрдЮреНрдЬреА рдЕрдкрд▓реЛрдб рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред .ssh/authorized_keys рдорд╛рд╕реНрдЯрд░ рдореЗрд╕рд┐рдирдорд╛, рдорд╛рд╕реНрдЯрд░ рдореЗрд╕рд┐рдирдорд╛ рдЬрд╡рд╛рдлрджреЗрд╣реАрдХрд╛ рд▓рд╛рдЧрд┐ рдкреЛрд░реНрдЯ 22 рдЦреЛрд▓реНрдиреБрд╣реЛрд╕реНред

рдЕрдм рдЙрддреНрддрд░рджрд╛рдпреА рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реМрдВ

рдХрд┐рдирдХрд┐ рд╣рд╛рдореНрд░реЛ рд▓рдХреНрд╖реНрдп рднрдиреЗрдХреЛ рд╕рдмреИ рд╕рдореНрднрд╡ рдЫ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЧрд░реНрди рд╣реЛред рдлрд╛рдЗрд▓рдорд╛ /etc/ansible/ansible.cfg рд╣рд╛рдореА рд▓рд╛рдЗрди рдЕрдирдХрдореЗрдиреНрдЯ рдЧрд░реНрдиреЗрдЫреМрдВ host_key_checking = Falseрддрд╛рдХрд┐ рдЙрддреНрддрд░рджрд╛рдпреАрд╣рд░реВрд▓реЗ рдирдпрд╛рдБ рдореЗрд╕рд┐рдирд╣рд░реВрдХреЛ рдкреБрд╖реНрдЯрд┐рдХрд░рдгрдХреЛ рд▓рд╛рдЧрд┐ рд╕реЛрдзреНрджреИрдирдиреНред

рдЕрд░реНрдХреЛ, рддрдкрд╛рдИрдВрд▓реЗ рдЬрд╡рд╛рдлрдХреЛ рд▓рд╛рдЧрд┐ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрдорд╛ рдЗрдиреНрднреЗрдиреНрдЯрд░реА рдлрд╛рдЗрд▓ рдЙрддреНрдкрдиреНрди рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ, рдЬрд╣рд╛рдБрдмрд╛рдЯ рдпрд╕рд▓реЗ рдореЗрд╢рд┐рдирд╣рд░реВрдХреЛ рдЖрдИрдкреА рд▓рд┐рдиреЗрдЫ рдЬрд╕рдорд╛ рддрдкрд╛рдИрдВрд▓реЗ git рдкреБрд▓ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред

рд╣рд╛рдореАрд▓реЗ Hetzner рдХреЛ API рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдпреЛ рдлрд╛рдЗрд▓ рдЙрддреНрдкрдиреНрди рдЧрд░реНрдЫреМрдВ, рддрдкрд╛рдИрдВрд▓реЗ рдЖрдлреНрдиреЛ AWS, Asure, рдбреЗрдЯрд╛рдмреЗрд╕рдмрд╛рдЯ рд╣реЛрд╕реНрдЯрд╣рд░реВрдХреЛ рд╕реВрдЪреА рд▓рд┐рди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ (рддрдкрд╛рдИрдБрд╕рдБрдЧ рдЪрд▓рд┐рд░рд╣реЗрдХреЛ рдореЗрд╕рд┐рдирд╣рд░реВ рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрди рдХрддреИ API рдЫ, рд╣реИрди?)ред

рдЗрдиреНрднреЗрдиреНрдЯрд░реА рдлрд╛рдЗрд▓рдХреЛ рд╕рдВрд░рдЪрдирд╛ 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

рдпреЛ рдЬрд╛рдБрдЪ рдЧрд░реНрдиреЗ рд╕рдордп рд╣реЛ рдХрд┐ рдЙрддреНрддрд░рджрд╛рдпреА рдХрд╛рдо рдЧрд░реНрджрдЫ рд░ IP рдареЗрдЧрд╛рдирд╛рд╣рд░реВ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рдЕрдиреБрдХреВрд▓ рдЫ:

/etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'hostname' group

рдЖрдЙрдЯрдкреБрдЯрд▓реЗ рдореЗрд╕рд┐рдирд╣рд░реВрдХреЛ рд╣реЛрд╕реНрдЯрдирд╛рдорд╣рд░реВ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрдиреБрдкрд░реНрдЫ рдЬрд╕рдорд╛ рдЖрджреЗрд╢ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛред
рд╡рд╛рдХреНрдп рд░рдЪрдирд╛рдХреЛ рдмрд╛рд░реЗрдорд╛ рдХреЗрд╣реА рд╢рдмреНрджрд╣рд░реВ:

  • /etc/ansible/./vm_list - рдореЗрд╕рд┐рдирд╣рд░реВрдХреЛ рд╕реВрдЪреА рдЙрддреНрдкрдиреНрди рдЧрд░реНрдиреБрд╣реЛрд╕реН
  • -i - рд╕реВрдЪреА рдлрд╛рдЗрд▓рдорд╛ рдирд┐рд░рдкреЗрдХреНрд╖ рдорд╛рд░реНрдЧ
  • -m - рд╢реЗрд▓ рдореЛрдбреНрдпреБрд▓ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рдЙрддреНрддрд░рджрд╛рдпреА рдмрддрд╛рдЙрдиреБрд╣реЛрд╕реН
  • - рдПрдХ рддрд░реНрдХ рд╣реЛред рдХреБрдиреИ рдкрдирд┐ рдЖрджреЗрд╢ рдпрд╣рд╛рдБ рдкреНрд░рд╡рд┐рд╖реНрдЯ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ
  • рд╕рдореВрд╣ - рддрдкрд╛рдИрдВрдХреЛ рдХреНрд▓рд╕реНрдЯрд░рдХреЛ рдирд╛рдоред рдпрджрд┐ рддрдкрд╛рдЗрдБ рд╕рдмреИ рдХреНрд▓рд╕реНрдЯрд░рд╣рд░реВрдорд╛ рдпреЛ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ рднрдиреЗ, рд╕рдмреИрдорд╛ рд╕рдореВрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрдиреБрд╣реЛрд╕реН

рдЕрдЧрд╛рдбрд┐ рдмрдвреМрдВ - рд╣рд╛рдореНрд░реЛ рднрд░реНрдЪреБрдЕрд▓ рдореЗрд╕рд┐рдирд╣рд░реВрдорд╛ git рдкреБрд▓ рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реМрдВ:

/etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'cd /path/to/project && git pull' group 

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

рдЕрдм рдпреЛ рд╕рдмреИ рдХреЛ рд▓рд╛рдЧрд┐ рдорддрд▓рдм рдерд┐рдпреЛ

Gitlab рдорд╛ рдорд╛рд╕реНрдЯрд░ рд╢рд╛рдЦрд╛рдорд╛ рдХрдорд┐рдЯ рдЧрд░реНрджрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрдорд╛ рдЪрд▓рд╛рдЙрди рд╣рд╛рдореНрд░реЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рд┐рдХрд╛рдЙрдиреБрд╣реЛрд╕реН

рдкрд╣рд┐рд▓реЗ, рд╣рд╛рдореНрд░реЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд▓рд╛рдИ рдЕрдЭ рд╕реБрдиреНрджрд░ рдмрдирд╛рдЙрдиреБрд╣реЛрд╕реН рд░ рдпрд╕рд▓рд╛рдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдпреЛрдЧреНрдп рдлрд╛рдЗрд▓рдорд╛ рд░рд╛рдЦреНрдиреБрд╣реЛрд╕реН (рдпрд╕рд▓рд╛рдИ exec_pull рднрдирд┐рдиреНрдЫ) -

#!/bin/bash

/etc/ansible/./get_vms && ansible -i /etc/ansible/cloud_ip -m shell -a "$@"

рд╣рд╛рдореНрд░реЛ gitlab рдорд╛ рдЬрд╛рдиреБрд╣реЛрд╕реН рд░ рдкрд░рд┐рдпреЛрдЬрдирд╛рдорд╛ тАЛтАЛрдлрд╛рдЗрд▓ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН .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 

рд╕рдмреИ рддрдпрд╛рд░ рдЫред рдЕрдм -

  • рдПрдХ рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН
  • рдо рдЦреБрд╢реА рдЫреБ рдХрд┐ рд╕рдмреИ рдХрд╛рдо рдЧрд░рд┐рд░рд╣реЗрдХреЛ рдЫ

.yml рд▓рд╛рдИ рдЕрдиреНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реВрдорд╛ рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдЧрд░реНрджрд╛, рддрдкрд╛рдИрдВрд▓реЗ рдкреБрди: рд╕реБрд░реБ рдЧрд░реНрди рд╕реЗрд╡рд╛рдХреЛ рдирд╛рдо рд░ рдЬрд╡рд╛рдлрджреЗрд╣реА рдЖрджреЗрд╢рд╣рд░реВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░рд┐рдиреЗ рдХреНрд▓рд╕реНрдЯрд░рдХреЛ рдирд╛рдо рдорд╛рддреНрд░ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред

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

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