
Jó napot kívánok
Több felhő klaszterünk van, mindegyikben sok virtuális géppel. Mindezt a Hetzner-nél hosztoljuk. Minden klaszterben van egy mester gép, amelyről készült egy pillanatkép, és automatikusan eloszlik az összes virtuális gép között a klaszteren belül.
Ez a rendszer nem teszi lehetővé a gitlab-runner-ek normális használatát, mivel sok problémát okoz, ha sok azonos regisztrált futtató jelenik meg, ami arra ösztönzött, hogy alternatív megoldást keressünk és megírjuk ezt a cikket/manualt.
Valószínűleg ez nem a legjobb gyakorlat, de ez a megoldás tűnt a legkényelmesebbnek és legegyszerűbbnek.
A tutoriálért kérem kattintson a tovább gombra.
A szükséges csomagok a mester gépen:
- python
- git
- fájl ssh kulcsokkal
Az automatikus git pull megvalósításának alapelve az, hogy szükség van egy gépre, amelyre az Ansible kerül telepítésre. Erről a gépről az ansible parancsokat küld git pull és a frissített szolgáltatás újraindítására. E célokra létrehoztunk egy külön virtuális gépet a klasztereken kívül, és telepítettük rá:
- python
- ansible
- gitlab-runner-t használtam
Szervezési kérdésekben — szükséges regisztrálni a gitlab-runner-t, ssh-keygen-t készíteni, és a nyilvános ssh kulcsot elhelyezni ennél a gépnél a .ssh/authorized_keys a mester gépen, és megnyitni a 22-es portot a mesteren az ansible számára.
Most konfiguráljuk az ansiblet
Mivel a célunk, hogy automatizáljuk mindent, ami csak lehetséges. A fájlban /etc/ansible/ansible.cfg kibővítjük a sort host_key_checking = False, hogy az ansible ne kérjen megerősítést új gépeknél.
Ezután automatikusan generálni kell az ansible inventarizációs fájlt, ahonnan az ip címeket fogja beszerezni, amelyeken git pull-t kell végezni.
Ezt a fájlt a Hetzner API-jával generáljuk, de az ip címek listáját a saját AWS-ből, Azure-ból, adatbázisból is beszerezheti (valahol biztosan van egy API, amely kiszolgálja az ön által üzemeltetett gépek listáját, ugye?).
Az Ansible számára nagyon fontos az inventarizációs fájl struktúrája, a formátumának a következőnek kell lennie:
[csoport]
ip-cím
ip-cím
[csoport2]
ip-cím
ip-címEgy ilyen fájl generálásához készítünk egy egyszerű kis szkriptet (nevezhetjük 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_ipItt az ideje ellenőrizni, hogy az ansible működik-e és tud-e ip címeket szerezni:
/etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'hostname' group
A kimenetben meg kell kapnunk azokat a gépek hosztneveit, ahol a parancs végrehajtásra került.
Néhány szó a szintaxismól:
- /etc/ansible/./vm_list — генерируем список машин
- -i — az inventarizációs fájl abszolút elérési útja
- -m — mondjuk az ansiblenak, hogy használja a shell modult
- -a — argumentum. Ide bármilyen parancsot be lehet írni
- group — a klaszter neve. Ha minden klaszterre szükség van, változtassuk a group-ot all-ra
Tovább lépünk — próbáljuk meg a git pull parancsot végrehajtani a mieinkre virtuális gépekben:
/etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'cd /path/to/project && git pull' group Ha az outputban azt látjuk, hogy already up to date, vagy a repóból való kiadás, akkor minden rendben működik.
Most pedig az, amiért ezt az egészet terveztük
Megtanítjuk a szkriptünket automatikus végrehajtásra a gitlab master ágon történt commit esetén
Először szebbé tesszük a szkriptünket, és egy futtatható fájlba helyezzük (nevezzük exec_pull-nak) —
#!/bin/bash
/etc/ansible/./get_vms && ansible -i /etc/ansible/cloud_ip -m shell -a "$@" Lépjünk be a gitlabba, és a projektben hozzunk létre egy fájlt .gitlab-ci.yml
A következőket helyezzük bele:
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 Minden kész. Most —
- csinálj egy commit-ot
- bízva abban, hogy minden jól működik
A .yml átvitelénél más projektekbe elegendő csak a szolgáltatás nevét és a klaszter nevét megváltoztatni, ahol az ansible parancsokat végrehajtják.
Forrás: habr.com
