
ΠΠΎΠ±ΡΡ Π΄Π΅Π½
Π Π°Π·ΠΏΠΎΠ»Π°Π³Π°ΠΌΠ΅ Ρ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΎΠ±Π»Π°ΡΠ½ΠΈ ΠΊΠ»ΡΡΡΠ΅ΡΠ° Ρ Π³ΠΎΠ»ΡΠΌ Π±ΡΠΎΠΉ Π²ΠΈΡΡΡΠ°Π»Π½ΠΈ ΠΌΠ°ΡΠΈΠ½ΠΈ Π² Π²ΡΠ΅ΠΊΠΈ ΠΎΡ ΡΡΡ . ΠΡΠΈΡΠΊΠΎ ΡΠΎΠ²Π° ΡΠ΅ Ρ ΠΎΡΡΠ²Π° Π² Hetzner. ΠΡΠ² Π²ΡΠ΅ΠΊΠΈ ΠΊΠ»ΡΡΡΠ΅Ρ ΠΈΠΌΠ°ΠΌΠ΅ ΠΏΠΎ Π΅Π΄Π½Π° ΠΌΠ°ΡΡΠ΅Ρ ΠΌΠ°ΡΠΈΠ½Π°, ΠΎΡ ΠΊΠΎΡΡΠΎ ΡΠ΅ ΠΏΡΠ°Π²ΠΈ snapshot ΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΡΠ΅ ΡΠ°Π·ΠΏΡΠΎΡΡΡΠ°Π½ΡΠ²Π° ΠΏΠΎ Π²ΡΠΈΡΠΊΠΈ Π²ΠΈΡΡΡΠ°Π»ΠΊΠΈ Π² ΠΊΠ»ΡΡΡΠ΅ΡΠ°.
Π’Π°Π·ΠΈ ΡΡ Π΅ΠΌΠ° Π½Π΅ Π½ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π½ΠΎΡΠΌΠ°Π»Π½ΠΎ gitlab-runner-ΠΈΡΠ΅, ΡΡΠΉ ΠΊΠ°ΡΠΎ Π²ΡΠ·Π½ΠΈΠΊΠ²Π°Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ ΠΏΡΠΈ ΠΏΠΎΡΠ²Π°ΡΠ° Π½Π° ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΈ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°Π½ΠΈ ΡΡΠ½Π΅ΡΠΈ, ΠΊΠΎΠ΅ΡΠΎ ΠΈ Π΄ΠΎΠ²Π΅Π΄Π΅ Π΄ΠΎ Π½Π°ΠΌΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΠΎΠ±Ρ ΠΎΠ΄Π΅Π½ Π²Π°ΡΠΈΠ°Π½Ρ ΠΈ Π½Π°ΠΏΠΈΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ/ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ.
ΠΠ΅ΡΠΎΡΡΠ½ΠΎ ΡΠΎΠ²Π° Π½Π΅ Π΅ Π½Π°ΠΉ-Π΄ΠΎΠ±ΡΠ°ΡΠ° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ°, Π½ΠΎ ΡΠΎΠ²Π° ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π°ΡΠ΅ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»Π½ΠΎ ΡΠ΄ΠΎΠ±Π½ΠΎ ΠΈ ΠΏΡΠΎΡΡΠΈΡΠΊΠΎ.
ΠΠΎΠ»Ρ, ΡΠ»Π΅Π΄Π²Π°ΠΉΡΠ΅ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈΡΠ΅ Π² Π΄ΠΎΠ»Π½Π°ΡΠ° ΡΠ°ΡΡ.
ΠΠ΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΈ Π½Π° ΠΌΠ°ΡΡΠ΅Ρ ΠΌΠ°ΡΠΈΠ½Π°ΡΠ°:
- python
- git
- ΡΠ°ΠΉΠ» Ρ ssh ΠΊΠ»ΡΡΠΎΠ²Π΅
ΠΠ±ΡΠΈΡΡ ΠΏΡΠΈΠ½ΡΠΈΠΏ Π·Π° ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅Π½ git pull Π½Π° Π²ΡΠΈΡΠΊΠΈ Π²ΠΈΡΡΡΠ°Π»ΠΊΠΈ Π΅, ΡΠ΅ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ° ΠΌΠ°ΡΠΈΠ½Π°, Π½Π° ΠΊΠΎΡΡΠΎ ΡΠ΅ Π±ΡΠ΄Π΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ Ansible. ΠΡ ΡΠ°Π·ΠΈ ΠΌΠ°ΡΠΈΠ½Π° ansible ΡΠ΅ ΠΈΠ·ΠΏΡΠ°ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ git pull ΠΈ ΡΠ΅ΡΡΠ°ΡΡ Π½Π° ΡΡΠ»ΡΠ³Π°ΡΠ°, ΠΊΠΎΡΡΠΎ Π΅ ΠΎΠ±Π½ΠΎΠ²Π΅Π½Π°. Π‘ΡΠ·Π΄Π°Π΄ΠΎΡ ΠΌΠ΅ ΡΠΏΠ΅ΡΠΈΠ°Π»Π½Π° Π²ΠΈΡΡΡΠ°Π»Π½Π° ΠΌΠ°ΡΠΈΠ½Π° ΠΈΠ·Π²ΡΠ½ ΠΊΠ»ΡΡΡΠ΅ΡΠΈΡΠ΅, Π½Π° ΠΊΠΎΡΡΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Ρ ΠΌΠ΅:
- python
- ansible
- gitlab-runner
ΠΠΎ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΎΠ½Π½ΠΈ Π²ΡΠΏΡΠΎΡΠΈ β Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ Π΅ Π΄Π° ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°ΡΠ΅ gitlab-runner, Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ssh-keygen ΠΈ Π΄Π° ΠΊΠ°ΡΠΈΡΠ΅ ΠΏΡΠ±Π»ΠΈΡΠ½ΠΈΡ ssh ΠΊΠ»ΡΡ Π½Π° ΡΠ°Π·ΠΈ ΠΌΠ°ΡΠΈΠ½Π° Π² .ssh/authorized_keys Π½Π° ΠΌΠ°ΡΡΠ΅Ρ ΠΌΠ°ΡΠΈΠ½Π°ΡΠ° ΠΈ Π΄Π° ΠΎΡΠ²ΠΎΡΠΈΡΠ΅ ΠΏΠΎΡΡ 22 Π½Π° ΠΌΠ°ΡΡΠ΅Ρ ΠΌΠ°ΡΠΈΠ½Π°ΡΠ° Π·Π° ansible.
Π‘Π΅Π³Π° ΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΠΌΠ΅ ansible
Π’ΡΠΉ ΠΊΠ°ΡΠΎ ΡΠ΅Π»ΡΠ° Π½ΠΈ Π΅ Π΄Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ Π²ΡΠΈΡΠΊΠΎ, ΠΊΠΎΠ΅ΡΠΎ ΠΌΠΎΠΆΠ΅. Π ΡΠ°ΠΉΠ»Π° /etc/ansible/ansible.cfg ΡΠ΅ ΡΠ°Π·ΠΊΠΎΠΌΠ΅Π½ΡΠΈΡΠ°ΠΌΠ΅ ΡΠ΅Π΄Π° host_key_checking = False, Π·Π° Π΄Π° Π½Π΅ ΠΏΠΎΠΈΡΠΊΠ° ansible ΠΏΠΎΡΠ²ΡΡΠΆΠ΄Π΅Π½ΠΈΠ΅ Π·Π° Π½ΠΎΠ²ΠΈ ΠΌΠ°ΡΠΈΠ½ΠΈ.
Π‘Π»Π΅Π΄Π²Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ Π΄Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°ΠΌΠ΅ ΠΈΠ½Π²Π΅Π½ΡΠ°ΡΠ΅Π½ ΡΠ°ΠΉΠ» Π·Π° ansible, ΠΎΡ ΠΊΠΎΠΉΡΠΎ ΡΠΎΠΉ ΡΠ΅ Π²Π·Π΅ΠΌΠ° ip Π°Π΄ΡΠ΅ΡΠΈΡΠ΅ Π½Π° ΠΌΠ°ΡΠΈΠ½ΠΈΡΠ΅, Π½Π° ΠΊΠΎΠΈΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° git pull.
ΠΠ΅Π½Π΅ΡΠΈΡΠ°ΠΌΠ΅ ΡΠΎΠ·ΠΈ ΡΠ°ΠΉΠ» Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° API Π½Π° Hetzner, Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π²Π·Π΅ΠΌΠ΅ΡΠ΅ ΡΠΏΠΈΡΡΠΊ Ρ Ρ ΠΎΡΡΠΎΠ²Π΅ ΠΎΡ Π²Π°ΡΠ°ΡΠ° AWS, Azure, ΠΠ (ΡΡΡ ΡΠΈΠ³ΡΡΠ½ΠΎΡΡ ΠΈΠΌΠ°ΡΠ΅ 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Π‘Π΅Π³Π° Π΅ Π²ΡΠ΅ΠΌΠ΅ Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌ Π΄Π°Π»ΠΈ ansible ΡΠ°Π±ΠΎΡΠΈ ΠΈ ΠΎΠ±ΡΡΠ²Π° Ρ ΠΏΠΎΠ»ΡΡΠ°Π²Π°Π½Π΅ΡΠΎ Π½Π° ip Π°Π΄ΡΠ΅ΡΠΈ:
/etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'hostname' group
Π ΠΈΠ·Ρ
ΠΎΠ΄Π° ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΠΌ Ρ
ΠΎΡΡΠ½Π΅ΠΉΠΌΠΎΠ²Π΅ Π½Π° ΠΌΠ°ΡΠΈΠ½ΠΈΡΠ΅, Π½Π° ΠΊΠΎΠΈΡΠΎ Π΅ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ°.
ΠΡΠΊΠΎΠ»ΠΊΠΎ Π΄ΡΠΌΠΈ Π·Π° ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ°:
- /etc/ansible/./vm_list β Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΠΌ ΡΠΏΠΈΡΠΎΠΊ ΠΌΠ°ΡΠΈΠ½
- -i β Π°Π±ΡΠΎΠ»ΡΡΠ΅Π½ ΠΏΡΡ Π΄ΠΎ ΠΈΠ½Π²Π΅Π½ΡΠ°ΡΠ½ΠΈΡ ΡΠ°ΠΉΠ»
- -m β ΠΊΠ°Π·Π²Π°ΠΌΠ΅ Π½Π° ansible Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΌΠΎΠ΄ΡΠ»Π° shell
- -a β Π°ΡΠ³ΡΠΌΠ΅Π½Ρ. Π’ΡΠΊ ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ Π²ΡΡΠΊΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π°
- group β ΠΈΠΌΠ΅ΡΠΎ Π½Π° Π²Π°ΡΠΈΡ ΠΊΠ»ΡΡΡΠ΅Ρ. ΠΠΊΠΎ ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ Π½Π° Π²ΡΠΈΡΠΊΠΈ ΠΊΠ»ΡΡΡΠ΅ΡΠΈ, ΡΠΌΠ΅Π½Π΅ΡΠ΅ group Ρ all
ΠΡΠΎΠ΄ΡΠ»ΠΆΠ°Π²Π°ΠΌΠ΅ β ΡΠ΅ ΠΏΡΠΎΠ±Π²Π°ΠΌΠ΅ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ git pull Π½Π° Π½Π°ΡΠΈΡΠ΅ Π²ΠΈΡΡΡΠ°Π»Π½ΠΈ ΠΌΠ°ΡΠΈΠ½ΠΈ:
/etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'cd /path/to/project && git pull' group ΠΠΊΠΎ Π² Π°ΡΡΠΏΡΡΠ° Π²ΠΈΠ΄ΠΈΠΌ already up to date ΠΈΠ»ΠΈ ΠΈΠ·ΡΠ΅Π³Π»ΡΠ½Π΅ ΠΎΡ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ, Π·Π½Π°ΡΠΈ Π²ΡΠΈΡΠΊΠΎ ΡΠ°Π±ΠΎΡΠΈ.
Π‘Π΅Π³Π° ΡΠΎΠ²Π°, Π·Π° ΠΊΠΎΠ΅ΡΠΎ Π²ΡΠΈΡΠΊΠΎ ΡΠΎΠ²Π° Π±Π΅ΡΠ΅ Π·Π°ΠΌΠΈΡΠ»Π΅Π½ΠΎ
Π©Π΅ Π½Π°ΡΡΠΈΠΌ Π½Π°ΡΠΈΡ ΡΠΊΡΠΈΠΏΡ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΠΏΡΠΈ ΠΊΠΎΠΌΠΈΡ Π² Π³Π»Π°Π²Π½ΠΈΡ ΠΊΠ»ΠΎΠ½ Π² 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 Π² Π΄ΡΡΠ³ΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈ Π΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ ΡΠ°ΠΌΠΎ Π΄Π° ΡΠΌΠ΅Π½ΠΈΡΠ΅ ΠΈΠΌΠ΅ΡΠΎ Π½Π° ΡΡΠ»ΡΠ³Π°ΡΠ° Π·Π° ΡΠ΅ΡΡΠ°ΡΡ ΠΈ ΠΈΠΌΠ΅ΡΠΎ Π½Π° ΠΊΠ»ΡΡΡΠ΅ΡΠ°, Π½Π° ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡΠ΅ ansible.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
