Ansible + auto git pull virtuális gépek klaszterében a felhőben

Ansible + auto git pull virtuális gépek klaszterében a felhőben

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 = Falsehogy 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

Hozzászólás