Dobrý deň
Máme niekoľko cloudových klastrov s veľkým počtom virtuálnych strojov v každom z nich. Celý tento podnik hostíme u Hetznera. V každom klastri máme jeden hlavný stroj, z neho sa urobí snímka a automaticky sa distribuuje na všetky virtuálne stroje v rámci klastra.
Táto schéma nám neumožňuje normálne používať gitlab-runners, pretože veľa problémov vzniká, keď sa objaví veľa rovnakých registrovaných bežcov, čo nás podnietilo nájsť riešenie a napísať tento článok/manuál.
Pravdepodobne to nie je najlepší postup, ale toto riešenie sa zdalo byť maximálne pohodlné a jednoduché.
Návod nájdete v kat.
Požadované balíčky na hlavnom počítači:
- krajta
- ísť
- súbor s kľúčmi ssh
Všeobecným princípom implementácie automatického vytiahnutia čreva na všetkých virtuálnych strojoch je, že potrebujete stroj, na ktorom bude nainštalovaný Ansible. Z tohto počítača ansible odošle príkazy git pull a reštartuje službu, ktorá bola aktualizovaná. Na tieto účely sme vytvorili samostatný virtuálny stroj mimo klastrov a nainštalovali sme naň:
- krajta
- ansible
- gitlab-runner
Z organizačných problémov - musíte zaregistrovať gitlab-runner, vytvoriť ssh-keygen, nahrať verejný ssh kľúč tohto počítača do .ssh/authorized_keys
na hlavnom stroji otvorte port 22, aby ste ho mohli aktivovať na hlavnom stroji.
Teraz nakonfigurujme ansible
Keďže naším cieľom je automatizovať všetko, čo je možné. V súbore /etc/ansible/ansible.cfg
riadok odkomentujeme host_key_checking = False
aby ansible nepýtal potvrdenie o nových strojoch.
Ďalej musíte automaticky vygenerovať súbor inventára pre ansible, odkiaľ vezme ip počítačov, na ktorých potrebujete vykonať git pull.
Tento súbor generujeme pomocou Hetznerovho API, zoznam hostiteľov si môžete vziať z vašej AWS, Asure, databázy (máte niekde API na zobrazenie vašich bežiacich strojov, však?).
Štruktúra inventárneho súboru je pre Ansible veľmi dôležitá, mala by vyzerať takto:
[группа]
ip-адрес
ip-адрес
[группа2]
ip-адрес
ip-адрес
Na vygenerovanie takéhoto súboru si vytvoríme jednoduchý skript (nazvime ho 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
Je čas skontrolovať, či Ansible funguje a je priateľský k prijímaniu adries IP:
/etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'hostname' group
Výstup by mal obsahovať názvy počítačov, na ktorých bol príkaz vykonaný.
Pár slov o syntaxi:
- /etc/ansible/./vm_list - vygeneruje zoznam počítačov
- -i - absolútna cesta k súboru inventára
- -m - povedať, aby bolo možné použiť modul shell
- -a je argument. Tu je možné zadať ľubovoľný príkaz
- skupina — názov vášho klastra. Ak to potrebujete urobiť na všetkých klastroch, zmeňte skupinu na všetky
Poďme ďalej – skúsme použiť git pull na našich virtuálnych strojoch:
/etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'cd /path/to/project && git pull' group
Ak vo výstupe vidíme už aktuálne alebo vykladanie z úložiska, potom všetko funguje.
Teraz to všetko bolo určené
Naučme náš skript, aby sa spúšťal automaticky pri odovzdaní do hlavnej vetvy v gitlabe
Najprv urobme náš skript krajším a vložme ho do spustiteľného súboru (nazvime ho exec_pull) -
#!/bin/bash
/etc/ansible/./get_vms && ansible -i /etc/ansible/cloud_ip -m shell -a "$@"
Poďme do nášho gitlabu a vytvorte súbor v projekte .gitlab-ci.yml
Do vnútra vložíme nasledovné:
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
Všetko je pripravené. teraz -
- urobiť záväzok
- Som rád, že všetko funguje
Pri prenose .yml do iných projektov stačí zmeniť názov služby na reštart a názov klastra, na ktorom sa budú vykonávať príkazy ansible.
Zdroj: hab.com