ΠΠΎΠ±ΡΠΎΠ³ΠΎ Π΄Π½Ρ
Π£ Π½Π°Ρ ΠΈΠΌΠ΅Π΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΎΠ±Π»Π°ΡΠ½ΡΡ ΠΊΠ»Π°ΡΡΠ΅ΡΠΎΠ² Ρ Π±ΠΎΠ»ΡΡΠΈΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ ΠΌΠ°ΡΠΈΠ½ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ. ΠΡΠ΅ ΡΡΠΎ Π΄Π΅Π»ΠΎ Ρ Π½Π°Ρ Ρ ΠΎΡΡΠΈΡΡΡ Π² Hetzner’e. Π ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΊΠ»Π°ΡΡΠ΅ΡΠ΅ Ρ Π½Π°Ρ ΠΈΠΌΠ΅Π΅ΡΡΡ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ ΠΌΠ°ΡΡΠ΅Ρ-ΠΌΠ°ΡΠΈΠ½Π΅, Ρ Π½Π΅Π΅ Π΄Π΅Π»Π°Π΅ΡΡΡ ΡΠ½ΡΠΏΡΠΎΡ ΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ°Π·Π½ΠΎΡΠΈΡΡΡ ΠΏΠΎ Π²ΡΠ΅ΠΌ Π²ΠΈΡΡΡΠ°Π»ΠΊΠ°ΠΌ Π²Π½ΡΡΡΠΈ ΠΊΠ»Π°ΡΡΠ΅ΡΠ°.
ΠΡΠ° ΡΡ Π΅ΠΌΠ° Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π°ΠΌ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ gitlab-runner’Ρ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΠΎΡΠ΅Π½Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΠΏΡΠΈ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΠΈ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΡ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΡΠ°Π½Π½Π΅ΡΠΎΠ², ΡΡΠΎ ΠΈ ΠΏΠΎΠ±ΡΠ΄ΠΈΠ»ΠΎ ΠΊ Π½Π°Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΡ ΠΎΠ±Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΡΡΠΈ ΠΈ ΠΊ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠΈ/ΠΌΠ°Π½ΡΠ°Π»Π°.
ΠΠ΅ΡΠΎΡΡΠ½ΠΎ, ΡΡΠΎ Π½Π΅ best practice, Π½ΠΎ ΡΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΎΡΡ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎ ΡΠ΄ΠΎΠ±Π½ΡΠΌ ΠΈ ΠΏΡΠΎΡΡΡΠΌ.
ΠΠ° ΡΡΡΠΎΡΠΈΠ°Π»ΠΎΠΌ ΠΏΡΠΎΡΡ ΠΏΠΎΠ΄ ΠΊΠ°Ρ.
ΠΠ΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΡ Π½Π° ΠΌΠ°ΡΡΠ΅Ρ-ΠΌΠ°ΡΠΈΠ½Π΅:
- python
- git
- ΡΠ°ΠΉΠ» Ρ ssh ΠΊΠ»ΡΡΠ°ΠΌΠΈ
ΠΠ±ΡΠΈΠΉ ΠΏΡΠΈΠ½ΡΠΈΠΏ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ gut pull’a Π½Π° Π²ΡΠ΅Ρ Π²ΠΈΡΡΡΠ°Π»ΠΊΠ°Ρ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ° ΠΌΠ°ΡΠΈΠ½Π°, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΉ Π±ΡΠ΄Π΅Ρ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ 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’a, Π²Ρ ΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π±ΡΠ°ΡΡ ΡΠΏΠΈΡΠΎΠΊ Ρ ΠΎΡΡΠΎΠ² ΠΈΠ· Π²Π°ΡΠ΅ΠΉ 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
Π‘Π°ΠΌΠΎΠ΅ Π²ΡΠ΅ΠΌΡ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ, ΡΡΠΎ ansible ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΈ Π΄ΡΡΠΆΠΈΡ Ρ ΠΏΠΎΠ»ΡΡΠ°Π»ΠΊΠΎΠΉ ip Π°Π΄ΡΠ΅ΡΠΎΠ²:
/etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'hostname' group
Π Π°ΡΡΠΏΡΡΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ Ρ
ΠΎΡΡΠ½ΡΠΉΠΌΡ ΠΌΠ°ΡΠΈΠ½, Π½Π° ΠΊΠΎΡΠΎΡΡΡ
Π²ΡΠΏΠΎΠ»Π½ΠΈΠ»Π°ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π°.
ΠΠ°ΡΠ° ΡΠ»ΠΎΠ² ΠΎ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅:
- /etc/ansible/./vm_list β Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΠΌ ΡΠΏΠΈΡΠΎΠΊ ΠΌΠ°ΡΠΈΠ½
- -i β Π°Π±ΡΠΎΠ»ΡΡΠ½ΡΠΉ ΠΏΡΡΡ Π΄ΠΎ ΠΈΠ½Π²Π΅Π½ΡΠ°ΡΠΈΠ·Π°ΡΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°
- -m β Π³ΠΎΠ²ΠΎΡΠΈΠΌ Π°Π½ΡΠΈΠ±Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠΎΠ΄ΡΠ»Ρ 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’e
Π‘Π½Π°ΡΠ°Π»Π° ΡΠ΄Π΅Π»Π°Π΅ΠΌ Π½Π°Ρ ΡΠΊΡΠΈΠΏΡ ΠΊΡΠ°ΡΠΈΠ²Π΅Π΅ ΠΈ Π·Π°ΡΡΠ½Π΅ΠΌ Π΅Π³ΠΎ Π² ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠΉ ΡΠ°ΠΉΠ» (Π½Π°Π·ΠΎΠ²Π΅ΠΌ Π΅Π³ΠΎ 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