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

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

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

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдИ рдХреНрд▓рд╛рдЙрдб рдХреНрд▓рд╕реНрдЯрд░ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрдиреЗрдВ рд╣реИрдВред рд╣рдо рд╣реЗрдЯреНрдЬрд╝рдирд░ рдореЗрдВ рдЗрд╕ рдкреВрд░реЗ рд╡реНрдпрд╡рд╕рд╛рдп рдХреА рдореЗрдЬрдмрд╛рдиреА рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдорд╛рд╕реНрдЯрд░ рдорд╢реАрди рд╣реЛрддреА рд╣реИ, рдЙрд╕рд╕реЗ рдПрдХ рд╕реНрдиреИрдкрд╢реЙрдЯ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рднреАрддрд░ рд╕рднреА рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрдиреЛрдВ рдореЗрдВ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

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

рдпрд╣ рд╕рдВрднрд╡рддрдГ рд╕рд░реНрд╡реЛрддреНрддрдо рдЕрднреНрдпрд╛рд╕ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдорд╛рдзрд╛рди рдпрдерд╛рд╕рдВрднрд╡ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рд╕рд░рд▓ рд▓рдЧрд╛ред

рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЗ рд▓рд┐рдП, рдХреГрдкрдпрд╛ рдмрд┐рд▓реНрд▓реА рджреЗрдЦреЗрдВред

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

  • рдЕрдЬрдЧрд░
  • Git
  • рдПрд╕рдПрд╕рдПрдЪ рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓

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

  • рдЕрдЬрдЧрд░
  • ansible
  • gitlab-рдзрд╛рд╡рдХ

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

рдЕрдм рдЖрдЗрдП ansible рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ

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

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

рд╣рдо рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣реЗрдЯреНрдЬрд╝рдирд░ рдХреЗ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЖрдк рдЕрдкрдиреЗ рдПрдбрдмреНрд▓реНрдпреВрдПрд╕, рдПрд╢реНрдпреЛрд░, рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рд╣реЛрд╕реНрдЯ рдХреА рд╕реВрдЪреА рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ (рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрдкрдиреА рдЪрд▓ рд░рд╣реА рдорд╢реАрдиреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реАрдВ рдПрдкреАрдЖрдИ рд╣реИ, рд╣реИ рдирд╛?)ред

рдЗрдиреНрд╡реЗрдВрдЯреНрд░реА рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рдВрд░рдЪрдирд╛ 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 - рдЗрдиреНрд╡реЗрдВрдЯреНрд░реА рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкреВрд░реНрдг рдкрде
  • -рдПрдо - рд╢реЗрд▓ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдиреНрд╕рд┐рдмрд▓ рдХреЛ рдмрддрд╛рдПрдВ
  • -рдП рддрд░реНрдХ рд╣реИ. рдпрд╣рд╛рдВ рдХреЛрдИ рднреА рдХрдорд╛рдВрдб рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
  • рд╕рдореВрд╣ - рдЖрдкрдХреЗ рдХреНрд▓рд╕реНрдЯрд░ рдХрд╛ рдирд╛рдо. рдпрджрд┐ рдЖрдкрдХреЛ рд╕рднреА рд╕рдореВрд╣реЛрдВ рдкрд░ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╕рдореВрд╣ рдХреЛ рд╕рднреА рдореЗрдВ рдмрджрд▓реЗрдВ

рдЖрдЗрдП рдЖрдЧреЗ рдмрдврд╝реЗрдВ - рдЖрдЗрдП рдЕрдкрдиреА рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрдиреЛрдВ рдкрд░ рдЧрд┐рдЯ рдкреБрд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:

/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-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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ