Jó nap
Számos felhőfürttel rendelkezünk, mindegyikben nagyszámú virtuális géppel. Ezt az egész üzletet a Hetznerben adjuk otthon. Minden fürtben van egy főgépünk, amelyről pillanatfelvétel készül, és automatikusan elosztásra kerül a fürtön belüli összes virtuális gépre.
Ez a séma nem teszi lehetővé a gitlab-runnerek normál használatát, mivel sok probléma merül fel, ha sok azonos regisztrált futó jelenik meg, ami arra késztetett, hogy megtaláljuk a megoldást és megírjuk ezt a cikket/kézikönyvet.
Ez valószínűleg nem a legjobb gyakorlat, de ez a megoldás a lehető legkényelmesebbnek és egyszerűbbnek tűnt.
Az oktatóanyagért lásd a kat.
Szükséges csomagok a főgépen:
- piton
- csoportos it
- fájl ssh kulcsokkal
Az automatikus gut pull megvalósításának általános elve minden virtuális gépen az, hogy szüksége van egy olyan gépre, amelyre az Ansible telepítve lesz. Erről a gépről az ansible git pull parancsokat küld, és újraindítja a frissített szolgáltatást. Ebből a célból létrehoztunk egy külön virtuális gépet a fürtökön kívül, és telepítettük rá:
- piton
- ansible
- gitlab-runner
Szervezeti problémákból - regisztrálni kell a gitlab-runnert, meg kell csinálni az ssh-keygen-t, feltölteni a gép nyilvános ssh kulcsát ide .ssh/authorized_keys
a fő gépen nyissa meg a 22-es portot, hogy a fő gépen lehetséges legyen.
Most konfiguráljuk az ansible-t
Mivel az a célunk, hogy mindent automatizáljunk, ami csak lehetséges. Fájlban /etc/ansible/ansible.cfg
töröljük a sor megjegyzését host_key_checking = False
hogy az ansible ne kérjen visszaigazolást új gépekről.
Ezután automatikusan generálnod kell egy inventory fájlt az ansible-hez, ahonnan átveszi azoknak a gépeknek az ip-jét, amelyeken git pull-ot kell csinálni.
Ezt a fájlt Hetzner API-jával állítjuk elő, a gazdagépek listáját az AWS-ből, Asure-ból, adatbázisunkból vehetjük át (van valahol API-ja a futó gépek megjelenítéséhez, ugye?).
A leltárfájl szerkezete nagyon fontos az Ansible számára, így kell kinéznie:
[группа]
ip-адрес
ip-адрес
[группа2]
ip-адрес
ip-адрес
Egy ilyen fájl létrehozásához egy egyszerű szkriptet készítünk (nevezzü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_ip
Itt az ideje ellenőrizni, hogy az Ansible működik-e, és barátságos-e az IP-címek fogadásával:
/etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'hostname' group
A kimenetnek tartalmaznia kell azoknak a gépeknek a gazdagépnevét, amelyeken a parancs végrehajtásra került.
Néhány szó a szintaxisról:
- /etc/ansible/./vm_list - generálja a gépek listáját
- -i - a leltárfájl abszolút elérési útja
- -m - megmondja az ansible-nek a shell modul használatát
- -a az érv. Ide bármilyen parancs beírható
- csoport – a klaszter neve. Ha ezt minden klaszteren meg kell tennie, módosítsa a csoportot az összesre
Menjünk tovább – próbáljuk meg a git pull-ot a virtuális gépeinken:
/etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'cd /path/to/project && git pull' group
Ha a kimenetben azt látjuk, hogy már naprakész vagy a tárolóból való kitöltés, akkor minden működik.
Most ez volt az egész
Tanítsuk meg a szkriptünket, hogy automatikusan fusson, amikor a gitlab fő ágához kötünk
Először is tegyük szebbé a szkriptünket, és tegyük egy futtatható fájlba (nevezzük exec_pull-nak) -
#!/bin/bash
/etc/ansible/./get_vms && ansible -i /etc/ansible/cloud_ip -m shell -a "$@"
Lépjünk a gitlabba, és hozzunk létre egy fájlt a projektben .gitlab-ci.yml
Belül a következőket tettük:
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észen áll. Most -
- vállalkozni
- Örülök, hogy minden működik
Amikor .yml fájlt más projektekbe visz át, csak meg kell változtatnia az újraindítandó szolgáltatás nevét és annak a fürtnek a nevét, amelyen az ansible parancsok végrehajtásra kerülnek.
Forrás: will.com