
Mirëmëngjes
Ne kemi disa klasterë në re me numër të madh makinash virtuale në secilin. Të gjitha këto janë hostuar në Hetzner. Në secilin klaster kemi një makinë master, nga e cila bëhet një snapshot dhe shpërndahet automatikisht në të gjitha makinat virtuale brenda klasterit.
Ky skemë nuk na lejon të përdorim normalisht gitlab-runners, pasi krijohet shumë probleme për shkak të numrit të madh të runners të regjistruar të njëjtë, gjë që na çoi në kërkimin e një rruge alternative dhe në shkrimin e këtij artikulli/manuali.
Ndoshta kjo nuk është praktikë optimale, por kjo zgjidhje dukej më e përshtatshme dhe e thjeshtë.
Për tutorialin, ju lutem shihni poshtë.
Paketa të nevojshme në makinën master:
- python
- git
- skedari me çelësa ssh
Princi i përgjithshëm i realizimit të automatizuar të git pull në të gjitha makinat virtuale konsiston në atë se na nevojitet një makinë, në të cilën do të jetë instaluar Ansible. Nga kjo makinë, ansible do të dërgojë komandat git pull dhe do të rikthejë shërbimin që është përditësuar. Ne krijuam për këto qëllime një makinë virtuale të veçantë jashtë klasterëve dhe i vendosëm atje:
- python
- ansible
- gitlab-runner
Për çështje organizative — është e nevojshme të regjistrohet gitlab-runner, të bëhet ssh-keygen, dhe të dërgohet çelësi publik ssh i kësaj mašine në .ssh/authorized_keys në makinat master, të hapet porta 22 në makinën master për ansible.
Tani do ta konfigurojmë ansible
Sepse qëllimi ynë — është të automatizojmë gjithçka që është e mundur. Në skedarin /etc/ansible/ansible.cfg ne do të heqim komentimin nga rreshti host_key_checking = False, në mënyrë që ansible të mos kërkojë konfirmimin e makinave të reja.
Më pas, është e nevojshme të gjenerohet automatikisht një skedar inventar për ansible, nga ku do të tërheqë ip-të e makinave, në të cilat duhet të bëhet git pull.
Ne e gjenerojmë këtë skedar me ndihmën e API-së së Hetzner, ju mund të merrni listën e hosteve nga AWS, Azure, DB (po, keni ndonjë API për të shfaqur makinat tuaja të aktive, apo?).
Për Ansible struktura e skedarit të inventarit është shumë e rëndësishme, pamja e tij duhet të jetë si më poshtë:
[grupi]
ip-adresa
ip-adresa
[grupi2]
ip-adresa
ip-adresaPër të gjeneruar një skedar të tillë, do të bëjmë një skedar të thjeshtë (do ta quajmë 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Është koha për të kontroluar nëse ansible funksionon dhe është në përputhje me marrësin e ip adresave:
/etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'hostname' group
Në output duhet të marrim emrat e hosteve të makinave, në të cilat është ekzekutuar komanda.
Paarë një fjalë për sintaksën:
- /etc/ansible/./vm_list — генерируем список машин
- -i — rruga absolute deri te skedari i inventarizimit
- -m — i thotë Ansible të përdorë modulën shell
- -a — argumenti. Këtu mund të shkruajmë çdo komandë
- group — emri i grupit tuaj. Nëse duhet të bëjmë në të gjitha grupet, e ndërojmë group me all
Le të vazhdojmë — do të përpiqemi të bëjmë git pull në tonat makinat virtuale:
/etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'cd /path/to/project && git pull' group Nëse në output shohim already up to date ose shkarkimin nga repository, atëherë gjithçka funksionon.
Tani për atë që është menduar gjithçka
Do të mësojmë skriptin tonë të ekzekutohet automatikisht gjatë commit-it në degën master në GitLab
Së pari do ta bëjmë skriptin tonë më të bukur dhe do ta vendosim në një skedar ekzekutues (do ta quajmë exec_pull) —
#!/bin/bash
/etc/ansible/./get_vms && ansible -i /etc/ansible/cloud_ip -m shell -a "$@" Shkëmbejmë në GitLab tonë dhe në projekt krijojmë skedarin .gitlab-ci.yml
Brenda vendosim të mëposhtmet:
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 Të gjitha janë gati. Tani —
- bëjmë commit
- duke shpresuar se gjithçka funksionon
Kur transferoni .yml në projekte të tjera, mjafton të ndryshoni emrin e shërbimit për restart dhe emrin e grupit, ku do të ekzekutohen komandat ansible.
Burimi: habr.com
