рдХреНрд▓рд╛рдЙрдбрдордзреНрдпреЗ рд╡реНрд╣рд░реНрдЪреНрдпреБрдЕрд▓ рдорд╢реАрдирдЪреНрдпрд╛ рдХреНрд▓рд╕реНрдЯрд░рдордзреНрдпреЗ рдЙрддреНрддрд░рджрд╛рдпреА + рдСрдЯреЛ рдЧрд┐рдЯ рдкреБрд▓

рдХреНрд▓рд╛рдЙрдбрдордзреНрдпреЗ рд╡реНрд╣рд░реНрдЪреНрдпреБрдЕрд▓ рдорд╢реАрдирдЪреНрдпрд╛ рдХреНрд▓рд╕реНрдЯрд░рдордзреНрдпреЗ рдЙрддреНрддрд░рджрд╛рдпреА + рдСрдЯреЛ рдЧрд┐рдЯ рдкреБрд▓

рд╢реБрдн рджрд┐рд╡рд╕

рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдЕрдиреЗрдХ рдХреНрд▓рд╛рдЙрдб рдХреНрд▓рд╕реНрдЯрд░реНрд╕ рдЖрд╣реЗрдд рдЬреНрдпрд╛рдд рдкреНрд░рддреНрдпреЗрдХрд╛рдордзреНрдпреЗ рдореЛрдареНрдпрд╛ рд╕рдВрдЦреНрдпреЗрдиреЗ рд╡реНрд╣рд░реНрдЪреНрдпреБрдЕрд▓ рдорд╢реАрди рдЖрд╣реЗрдд. рдЖрдореНрд╣реА рд╣реЗрдЯрдЭрдирд░ рдпреЗрдереЗ рдпрд╛ рд╕рдВрдкреВрд░реНрдг рдЧреЛрд╖реНрдЯреАрдЪреЗ рдЖрдпреЛрдЬрди рдХрд░рддреЛ. рдкреНрд░рддреНрдпреЗрдХ рдХреНрд▓рд╕реНрдЯрд░рдордзреНрдпреЗ рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдПрдХ рдорд╛рд╕реНрдЯрд░ рдорд╢реАрди рдЖрд╣реЗ, рддреНрдпрд╛рддреВрди рдПрдХ рд╕реНрдиреЕрдкрд╢реЙрдЯ рдШреЗрддрд▓рд╛ рдЬрд╛рддреЛ рдЖрдгрд┐ рдХреНрд▓рд╕реНрдЯрд░рдордзреАрд▓ рд╕рд░реНрд╡ рд╡реНрд╣рд░реНрдЪреНрдпреБрдЕрд▓ рдорд╢реАрдирдордзреНрдпреЗ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рддрдкрдгреЗ рд╡рд┐рддрд░рд┐рдд рдХреЗрд▓рд╛ рдЬрд╛рддреЛ.

рд╣реА рдпреЛрдЬрдирд╛ рдЖрдореНрд╣рд╛рд▓рд╛ рд╕рд╛рдорд╛рдиреНрдпрдкрдгреЗ рдЧрд┐рдЯрд▓реЕрдм-рд░рдирд░ рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрдд тАЛтАЛтАЛтАЛрдирд╛рд╣реА, рдХрд╛рд░рдг рдЬреЗрд╡реНрд╣рд╛ рдЕрдиреЗрдХ рд╕рдорд╛рди рдиреЛрдВрджрдгреАрдХреГрдд рдзрд╛рд╡рдкрдЯреВ рджрд┐рд╕рддрд╛рдд рддреЗрд╡реНрд╣рд╛ рдмрд░реНтАНрдпрд╛рдЪ рд╕рдорд╕реНрдпрд╛ рдЙрджреНрднрд╡рддрд╛рдд, рдЬреНрдпрд╛рдореБрд│реЗ рдЖрдореНрд╣рд╛рд▓рд╛ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рд╢реЛрдзрдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рд╣рд╛ рд▓реЗрдЦ/рдкреБрд╕реНрддрд┐рдХрд╛ рд▓рд┐рд╣рд┐рдгреНрдпрд╛рд╕ рдкреНрд░рд╡реГрддреНрдд рдХреЗрд▓реЗ рдЬрд╛рддреЗ.

рд╣реЗ рдХрджрд╛рдЪрд┐рдд рд╕рд░реНрд╡реЛрддреНрддрдо рд╕рд░рд╛рд╡ рдирд╛рд╣реА, рдкрд░рдВрддреБ рд╣рд╛ рдЙрдкрд╛рдп рд╢рдХреНрдп рддрд┐рддрдХрд╛ рд╕реЛрдпреАрд╕реНрдХрд░ рдЖрдгрд┐ рд╕реЛрдкрд╛ рд╡рд╛рдЯрд▓рд╛.

рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓рд╕рд╛рдареА, рдХреГрдкрдпрд╛ рдорд╛рдВрдЬрд░ рдкрд╣рд╛.

рдорд╛рд╕реНрдЯрд░ рдорд╢реАрдирд╡рд░ рдЖрд╡рд╢реНрдпрдХ рдкреЕрдХреЗрдЬреЗрд╕:

  • рдЕрдЬрдЧрд░
  • рдЬрд╛
  • ssh рдХреА рд╕рд╣ рдлрд╛рдЗрд▓

рд╕рд░реНрд╡ рд╡реНрд╣рд░реНрдЪреНрдпреБрдЕрд▓ рдорд╢реАрдиреНрд╕рд╡рд░ рдСрдЯреЛрдореЕрдЯрд┐рдХ рдЧреЗрдЯ рдкреБрд▓ рд▓рд╛рдЧреВ рдХрд░рдгреНрдпрд╛рдЪреЗ рд╕рд╛рдорд╛рдиреНрдп рддрддреНрд╡ рдореНрд╣рдгрдЬреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рдПрдХ рдорд╢реАрди рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рдЬреНрдпрд╛рд╡рд░ Ansible рд╕реНрдерд╛рдкрд┐рдд рдХреЗрд▓реЗ рдЬрд╛рдИрд▓. рдпрд╛ рдорд╢реАрдирд╡рд░реВрди, рдЙрддреНрддрд░рджрд╛рдпреА рдЧрд┐рдЯ рдкреБрд▓ рдХрдорд╛рдВрдб рдкрд╛рдард╡реЗрд▓ рдЖрдгрд┐ рдЕрдкрдбреЗрдЯ рдХреЗрд▓реЗрд▓реА рд╕реЗрд╡рд╛ рдкреБрдиреНрд╣рд╛ рд╕реБрд░реВ рдХрд░реЗрд▓. рдпрд╛ рд╣реЗрддреВрдВрд╕рд╛рдареА, рдЖрдореНрд╣реА рдХреНрд▓рд╕реНрдЯрд░реНрд╕рдЪреНрдпрд╛ рдмрд╛рд╣реЗрд░ рдПрдХ рд╡реЗрдЧрд│реЗ рд╡реНрд╣рд░реНрдЪреНрдпреБрдЕрд▓ рдорд╢реАрди рддрдпрд╛рд░ рдХреЗрд▓реЗ рдЖрдгрд┐ рддреНрдпрд╛рд╡рд░ рд╕реНрдерд╛рдкрд┐рдд рдХреЗрд▓реЗ:

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

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

рдЖрддрд╛ ansible рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░реВ

рдЖрдордЪреЗ рдзреНрдпреЗрдп рд╣реЗ рд╢рдХреНрдп рдЖрд╣реЗ рдХреА рд╕рд░реНрд╡рдХрд╛рд╣реА рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдХрд░рдгреЗ рдЖрд╣реЗ. рдлрд╛рдИрд▓рдордзреНрдпреЗ /etc/ansible/ansible.cfg рдЖрдореНрд╣реА рдУрд│ рдЕрдирдХрдореЗрдВрдЯ рдХрд░реВ host_key_checking = FalseрдЬреЗрдгреЗрдХрд░реВрди рдЙрддреНрддрд░рджрд╛рдпреА рдирд╡реАрди рдорд╢реАрдирдЪреА рдкреБрд╖реНрдЯреА рдХрд░рдгреНрдпрд╛рд╕ рд╕рд╛рдВрдЧрдд рдирд╛рд╣реА.

рдкреБрдвреЗ, рддреБрдореНрд╣рд╛рд▓рд╛ рдЙрддреНрддрд░рджрд╛рдпрд┐рддреНрд╡рд╛рд╕рд╛рдареА рдЖрдкреЛрдЖрдк рдЗрдиреНрд╡реНрд╣реЗрдВрдЯрд░реА рдлрд╛рдЗрд▓ рддрдпрд╛рд░ рдХрд░рд╛рд╡реА рд▓рд╛рдЧреЗрд▓, рдЬрд┐рдереВрди рддреА рдЬреНрдпрд╛ рдорд╢реАрдиреНрд╕рд╡рд░ рддреБрдореНрд╣рд╛рд▓рд╛ git рдкреБрд▓ рдХрд░рд╛рдпрдЪреА рдЖрд╣реЗ рддреНрдпрд╛рдВрдЪрд╛ ip рдШреЗрдИрд▓.

рдЖрдореНрд╣реА Hetzner's API рд╡рд╛рдкрд░реВрди рд╣реА рдлрд╛рдИрд▓ рдЬрдирд░реЗрдЯ рдХрд░рддреЛ, рддреБрдореНрд╣реА рддреБрдордЪреНрдпрд╛ AWS, Asure, рдбреЗрдЯрд╛рдмреЗрд╕рдордзреВрди рд╣реЛрд╕реНрдЯрдЪреА рдпрд╛рджреА рдШреЗрдК рд╢рдХрддрд╛ (рддреБрдордЪреА рдЪрд╛рд▓рдгрд╛рд░реА рдорд╢реАрди рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рддреБрдордЪреНрдпрд╛рдХрдбреЗ рдХреБрдареЗрддрд░реА API рдЖрд╣реЗ, рдмрд░реЛрдмрд░?).

рдЗрдиреНрд╡реНрд╣реЗрдВрдЯрд░реА рдлрд╛рдЗрд▓рдЪреА рд░рдЪрдирд╛ рдЙрддреНрддрд░рджрд╛рдпреАрд╕рд╛рдареА рдЦреВрдк рдорд╣рддреНрддреНрд╡рд╛рдЪреА рдЖрд╣реЗ; рддреА рдпрд╛рд╕рд╛рд░рдЦреА рджрд┐рд╕рд▓реА рдкрд╛рд╣рд┐рдЬреЗ:

[╨│╤А╤Г╨┐╨┐╨░]
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 

рдЬрд░ рдЖрдЙрдЯрдкреБрдЯрдордзреНрдпреЗ рдЖрдкрдг рдЖрдзреАрдЪ рдЕрджреНрдпрдпрд╛рд╡рдд рдХрд┐рдВрд╡рд╛ рд░реЗрдкреЙрдЬрд┐рдЯрд░реАрдордзреВрди рдЕрдирд▓реЛрдбрд┐рдВрдЧ рдкрд╛рд╣рд┐рд▓реЗ рддрд░ рд╕рд░реНрд╡рдХрд╛рд╣реА рдХрд╛рд░реНрдп рдХрд░рдд рдЖрд╣реЗ.

рдЖрддрд╛ рд╣реЗ рд╕рд░реНрд╡ рдпрд╛рд╕рд╛рдареАрдЪ рд╣реЛрддреЗ

рдЧрд┐рдЯрд▓реЕрдмрдордзреАрд▓ рдорд╛рд╕реНрдЯрд░ рдмреНрд░рдБрдЪрд▓рд╛ рдХрдорд┐рдЯ рдХрд░рддрд╛рдирд╛ рдЖрдордЪреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЖрдкреЛрдЖрдк рд░рди рд╡реНрд╣рд╛рдпрд▓рд╛ рд╢рд┐рдХрд╡реВ

рдкреНрд░рдердо, рдЖрдкрд▓реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрдзрд┐рдХ рд╕реБрдВрджрд░ рдмрдирд╡реВ рдЖрдгрд┐ рддреА рдПрдХреНрдЭрд┐рдХреНрдпреБрдЯреЗрдмрд▓ рдлрд╛рдИрд▓рдордзреНрдпреЗ рдареЗрд╡реВ (рдпрд╛рд▓рд╛ 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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛