
Mirëdita
Ne kemi disa klastere cloud me numra të mëdha makinash virtuale në secilin prej tyre. Të gjitha këto janë hostuar në Hetzner. Në secilin klaster kemi nga një makinë master, nga ku merret një snapshot dhe automatikisht shpërndahet në të gjitha virtualkat brenda klasterit.
Kjo skemë nuk na lejon të përdorim normalisht gitlab-runner, sepse krijohen shumë probleme me numrin e madh të runnerëve të regjistruar të njëjtë, që na nxitën të kërkojmë një zgjidhje dhe të shkruajmë këtë artikull/faqe udhëzuese.
Ndoshta kjo nuk është best practice, por kjo zgjidhje duket maksimumi e përshtatshme dhe e thjeshtë.
Për tutorialin ju lutem klikoni këtu.
Paketat e nevojshme në makinën master:
- python
- git
- skedari me çelësat ssh
Parimi i përgjithshëm i realizimit të automatik git pull në të gjitha virtualkat është që nevojitet një makinë, në të cilën do të instalojmë Ansible. Nga kjo makinë, ansible do të dërgojë urdhra git pull dhe rinovon shërbimin që është përditësuar. Ne krijuam për këto qëllime një makinë virtuale të veçantë jashtë klastereve, e cila është instaluar me:
- python
- ansible
- gitlab-runner
Nga pyetjet organizative — është e nevojshme të regjistrohet gitlab-runner, të bëhet ssh-keygen, dhe të hedhë çelësin publik ssh të kësaj makine në .ssh/authorized_keys në makinën master, të hapni portin 22 në makinën master për ansible.
Tani le të konfiguroni ansible
Duke qenë se qëllimi ynë është të automatizojmë gjithçka që është e mundur. Në skedarin /etc/ansible/ansible.cfg ne do të heqim komentin nga rreshti host_key_checking = False, që ansible të mos kërkojë konfirmimin e makinave të reja.
Më pas, është e nevojshme të gjeneroni automatikisht një skedar inventar për ansible, nga ku do të marrë IP-të e makinave, në të cilat duam të bëjmë git pull.
Ne e gjenerojmë këtë skedar me anë të API-së së Hetzner, ndërsa ju mund të merrni listën e hosteve nga AWS tuaj, Azure, DB (ju ndoshta keni ndonjë API për të nxjerrë makinat tuaja të aktivizuara, apo jo?).
Për Ansible, struktura e skedarit të inventarit është shumë e rëndësishme, duhet të jetë si më poshtë:
[grupi]
ip-adresa
ip-adresa
[grupi2]
ip-adresa
ip-adresaPër të gjeneruar një skedë të tillë, le të bëjmë një skenar 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_ipKa ardhur koha të kontrollojmë se ansible funksionon dhe bashkëpunon me marrjen e adresave ip:
/etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'hostname' group
Në output duhet të marrim hostname-t e makinave, në të cilat është ekzekutuar komanda.
Një fjalë për sintaksën:
- /etc/ansible/./vm_list — генерируем список машин
- -i — rruga absolute deri te skedari i inventarit
- -m — thoni Ansible të përdorë modul 'shell'
- -a — argument. Këtu mund të shkruani çfarëdo komande
- group — emri i grupit tuaj të klasterit. Nëse duhet të bëjmë në të gjitha klasteret, e ndryshojmë group në all
Shkoi më tej — le të provojmë të bëjmë git pull në tonat makina 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' apo shkarkim nga repositori, atëherë gjithçka funksionon.
Tani, ajo që e menduam për këtë
Do të mësojmë skriptin tonë të ekzekutohet automatikisht kur bëhet komet në degën master në gitlab
Së pari do ta bëjmë skriptin tonë më të bukur dhe do ta fusim në një skedar ekzekutiv (të quajtur exec_pull) —
#!/bin/bash
/etc/ansible/./get_vms && ansible -i /etc/ansible/cloud_ip -m shell -a "$@" Shkoi në gitlab tonë dhe krijojmë një skedar në projekt .gitlab-ci.yml
Brenda vendosim të siguientes:
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 E gjithë është gati. Tani —
- bëjmë komet
- po shpresojmë se gjithçka funksionon
Kur të transferoni .yml në projekte të tjera, mjafton vetëm të ndryshoni emrin e shërbimit për rinisje dhe emrin e klasterit ku do të ekzekutohen komandat ansible.
Burimi: habr.com
