Ansible + automatikus git pull felhőbeli virtuális gépek klaszterében

Ansible + automatikus git pull felhőbeli virtuális gépek klaszterében

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ím

Egy 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_ip

Itt 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

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster