рд╢реБрдн рджрд┐рд╡рд╕
рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдЕрдиреЗрдХ рдХреНрд▓рд╛рдЙрдб рдХреНрд▓рд╕реНрдЯрд░реНрд╕ рдЖрд╣реЗрдд рдЬреНрдпрд╛рдд рдкреНрд░рддреНрдпреЗрдХрд╛рдордзреНрдпреЗ рдореЛрдареНрдпрд╛ рд╕рдВрдЦреНрдпреЗрдиреЗ рд╡реНрд╣рд░реНрдЪреНрдпреБрдЕрд▓ рдорд╢реАрди рдЖрд╣реЗрдд. рдЖрдореНрд╣реА рд╣реЗрдЯрдЭрдирд░ рдпреЗрдереЗ рдпрд╛ рд╕рдВрдкреВрд░реНрдг рдЧреЛрд╖реНрдЯреАрдЪреЗ рдЖрдпреЛрдЬрди рдХрд░рддреЛ. рдкреНрд░рддреНрдпреЗрдХ рдХреНрд▓рд╕реНрдЯрд░рдордзреНрдпреЗ рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдПрдХ рдорд╛рд╕реНрдЯрд░ рдорд╢реАрди рдЖрд╣реЗ, рддреНрдпрд╛рддреВрди рдПрдХ рд╕реНрдиреЕрдкрд╢реЙрдЯ рдШреЗрддрд▓рд╛ рдЬрд╛рддреЛ рдЖрдгрд┐ рдХреНрд▓рд╕реНрдЯрд░рдордзреАрд▓ рд╕рд░реНрд╡ рд╡реНрд╣рд░реНрдЪреНрдпреБрдЕрд▓ рдорд╢реАрдирдордзреНрдпреЗ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рддрдкрдгреЗ рд╡рд┐рддрд░рд┐рдд рдХреЗрд▓рд╛ рдЬрд╛рддреЛ.
рд╣реА рдпреЛрдЬрдирд╛ рдЖрдореНрд╣рд╛рд▓рд╛ рд╕рд╛рдорд╛рдиреНрдпрдкрдгреЗ рдЧрд┐рдЯрд▓реЕрдм-рд░рдирд░ рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрдд тАЛтАЛтАЛтАЛрдирд╛рд╣реА, рдХрд╛рд░рдг рдЬреЗрд╡реНрд╣рд╛ рдЕрдиреЗрдХ рд╕рдорд╛рди рдиреЛрдВрджрдгреАрдХреГрдд рдзрд╛рд╡рдкрдЯреВ рджрд┐рд╕рддрд╛рдд рддреЗрд╡реНрд╣рд╛ рдмрд░реНтАНрдпрд╛рдЪ рд╕рдорд╕реНрдпрд╛ рдЙрджреНрднрд╡рддрд╛рдд, рдЬреНрдпрд╛рдореБрд│реЗ рдЖрдореНрд╣рд╛рд▓рд╛ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рд╢реЛрдзрдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рд╣рд╛ рд▓реЗрдЦ/рдкреБрд╕реНрддрд┐рдХрд╛ рд▓рд┐рд╣рд┐рдгреНрдпрд╛рд╕ рдкреНрд░рд╡реГрддреНрдд рдХреЗрд▓реЗ рдЬрд╛рддреЗ.
рд╣реЗ рдХрджрд╛рдЪрд┐рдд рд╕рд░реНрд╡реЛрддреНрддрдо рд╕рд░рд╛рд╡ рдирд╛рд╣реА, рдкрд░рдВрддреБ рд╣рд╛ рдЙрдкрд╛рдп рд╢рдХреНрдп рддрд┐рддрдХрд╛ рд╕реЛрдпреАрд╕реНрдХрд░ рдЖрдгрд┐ рд╕реЛрдкрд╛ рд╡рд╛рдЯрд▓рд╛.
рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓рд╕рд╛рдареА, рдХреГрдкрдпрд╛ рдорд╛рдВрдЬрд░ рдкрд╣рд╛.
рдорд╛рд╕реНрдЯрд░ рдорд╢реАрдирд╡рд░ рдЖрд╡рд╢реНрдпрдХ рдкреЕрдХреЗрдЬреЗрд╕:
- рдЕрдЬрдЧрд░
- рдЬрд╛
- 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