Ansible + auto git vtiahne klaster virtuálnych strojov v cloude

Ansible + auto git vtiahne klaster virtuálnych strojov v cloude

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

Pridať komentár