Magandang araw
Mayroon kaming ilang cloud cluster na may malaking bilang ng mga virtual machine sa bawat isa. Nagho-host kami ng buong negosyong ito sa Hetzner. Sa bawat cluster mayroon kaming isang master machine, isang snapshot ang kinukuha mula dito at awtomatikong ipapamahagi sa lahat ng virtual machine sa loob ng cluster.
Ang scheme na ito ay hindi nagpapahintulot sa amin na gumamit ng gitlab-runners nang normal, dahil maraming problema ang lumitaw kapag maraming magkakaparehong nakarehistrong runner ang lumitaw, na nag-udyok sa amin na maghanap ng solusyon at isulat ang artikulo/manwal na ito.
Marahil ito ay hindi pinakamahusay na kasanayan, ngunit ang solusyon na ito ay tila maginhawa at simple hangga't maaari.
Para sa tutorial, mangyaring tingnan ang pusa.
Mga kinakailangang pakete sa master machine:
- python
- pumunta
- file na may mga ssh key
Ang pangkalahatang prinsipyo ng pagpapatupad ng awtomatikong gut pull sa lahat ng virtual machine ay kailangan mo ng makina kung saan mai-install ang Ansible. Mula sa makinang ito, magpapadala ang ansible ng git pull command at i-restart ang serbisyong na-update. Para sa mga layuning ito, gumawa kami ng hiwalay na virtual machine sa labas ng mga cluster at naka-install dito:
- python
- ansible
- gitlab-runner
Mula sa mga isyu sa organisasyon - kailangan mong irehistro ang gitlab-runner, gumawa ng ssh-keygen, i-upload ang pampublikong ssh key ng makinang ito sa .ssh/authorized_keys
sa master machine, buksan ang port 22 para sa ansible sa master machine.
Ngayon ay i-configure natin ang ansible
Dahil ang layunin namin ay i-automate ang lahat ng posible. Nasa file /etc/ansible/ansible.cfg
aalisin namin ang komento sa linya host_key_checking = False
upang ang ansible ay hindi humingi ng kumpirmasyon ng mga bagong makina.
Susunod, kailangan mong awtomatikong bumuo ng isang file ng imbentaryo para sa ansible, mula sa kung saan kukunin ang ip ng mga makina kung saan kailangan mong gawin ang git pull.
Binubuo namin ang file na ito gamit ang Hetzner's API, maaari mong kunin ang listahan ng mga host mula sa iyong AWS, Asure, database (mayroon kang API sa isang lugar upang ipakita ang iyong mga tumatakbong makina, tama ba?).
Ang istraktura ng file ng imbentaryo ay napakahalaga para sa Ansible; dapat itong magmukhang ganito:
[Π³ΡΡΠΏΠΏΠ°]
ip-Π°Π΄ΡΠ΅Ρ
ip-Π°Π΄ΡΠ΅Ρ
[Π³ΡΡΠΏΠΏΠ°2]
ip-Π°Π΄ΡΠ΅Ρ
ip-Π°Π΄ΡΠ΅Ρ
Para makabuo ng ganoong file, gagawa kami ng simpleng script (tawagin natin ito 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
Oras na para tingnan kung gumagana ang Ansible at magiliw sa pagtanggap ng mga IP address:
/etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'hostname' group
Ang output ay dapat maglaman ng mga hostname ng mga makina kung saan ang command ay naisakatuparan.
Ilang salita tungkol sa syntax:
- /etc/ansible/./vm_list - bumuo ng listahan ng mga makina
- -i - ganap na landas sa file ng imbentaryo
- -m - sabihin sa ansible na gamitin ang shell module
- -a ang argumento. Ang anumang utos ay maaaring ilagay dito
- grupo β ang pangalan ng iyong cluster. Kung kailangan mong gawin ito sa lahat ng cluster, palitan ang grupo sa lahat
Pumunta pa tayo - subukan nating gawin ang git pull sa ating mga virtual machine:
/etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'cd /path/to/project && git pull' group
Kung sa output ay nakikita natin na napapanahon o nag-aalis mula sa imbakan, kung gayon ang lahat ay gumagana.
Ngayon ito ay kung ano ang lahat ng ito ay sinadya para sa
Turuan natin ang ating script na awtomatikong tumakbo kapag nag-commit sa master branch sa gitlab
Una, gawin nating mas maganda ang ating script at ilagay ito sa isang executable file (tawagin natin itong exec_pull) -
#!/bin/bash
/etc/ansible/./get_vms && ansible -i /etc/ansible/cloud_ip -m shell -a "$@"
Pumunta tayo sa aming gitlab at lumikha ng isang file sa proyekto .gitlab-ci.yml
Inilalagay namin ang sumusunod sa loob:
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
Handa na ang lahat. ngayon -
- gumawa ng pangako
- Natutuwa akong gumagana ang lahat
Kapag naglilipat ng .yml sa ibang mga proyekto, kailangan mo lang baguhin ang pangalan ng serbisyo upang mag-restart at ang pangalan ng cluster kung saan isasagawa ang mga ansible na command.
Pinagmulan: www.habr.com