Ansible + automaattinen git-veto klusterin virtuaalikoneita pilvessä

Ansible + automaattinen git-veto klusterin virtuaalikoneita pilvessä

Mukava päivä

Meillä on useita pilviklustereita, joissa jokaisessa on suuri määrä virtuaalikoneita. Isännöimme koko tätä yritystä Hetznerissä. Jokaisessa klusterissa meillä on yksi pääkone, siitä otetaan tilannekuva ja jaetaan automaattisesti kaikkiin klusterin virtuaalikoneisiin.

Tämä järjestelmä ei salli meidän käyttää gitlab-runnereja normaalisti, koska monia ongelmia syntyy, kun useita identtisiä rekisteröityjä juoksijoita ilmestyy, mikä sai meidät löytämään ratkaisun ja kirjoittamaan tämän artikkelin/käsikirjan.

Tämä ei todennäköisesti ole paras käytäntö, mutta tämä ratkaisu vaikutti mahdollisimman kätevältä ja yksinkertaiselta.

Katso opetusohjelma kohdasta cat.

Vaaditut paketit pääkoneessa:

  • pytonkäärme
  • mennä
  • tiedosto ssh-avaimilla

Yleinen periaate automaattisen gut pull -vedon käyttöönotossa kaikissa virtuaalikoneissa on, että tarvitset koneen, johon Ansible asennetaan. Tältä koneelta ansible lähettää git pull -komennot ja käynnistää päivitetyn palvelun uudelleen. Näitä tarkoituksia varten loimme erillisen virtuaalikoneen klustereiden ulkopuolelle ja asensimme siihen:

  • pytonkäärme
  • ansible
  • gitlab-runner

Organisaatioongelmista - sinun täytyy rekisteröidä gitlab-runner, tehdä ssh-keygen, ladata tämän koneen julkinen ssh-avain .ssh/authorized_keys pääkoneessa avaa portti 22 mahdollistaaksesi pääsyn pääkoneeseen.

Nyt määritetään ansible

Koska tavoitteemme on automatisoida kaikki mahdollinen. Tiedostossa /etc/ansible/ansible.cfg poistamme rivin kommentin host_key_checking = Falsejotta ansible ei kysy uusien koneiden vahvistusta.

Seuraavaksi sinun on luotava automaattisesti inventaariotiedosto ansiblelle, josta se ottaa niiden koneiden IP-osoitteet, joilla sinun täytyy tehdä git pull.

Luomme tämän tiedoston Hetznerin API:lla, voit ottaa luettelon isännistä AWS:stä, Asuresta, tietokannastasi (sinulla on jossain API, jossa voit näyttää käynnissä olevat koneet, eikö niin?).

Varastotiedoston rakenne on erittäin tärkeä Ansiblelle; sen pitäisi näyttää tältä:

[группа]
ip-адрес
ip-адрес

[группа2]
ip-адрес
ip-адрес

Luodaksemme tällaisen tiedoston, teemme yksinkertaisen skriptin (kutsutaanko sitä 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

On aika tarkistaa, että Ansible toimii ja vastaanottaa IP-osoitteita ystävällisesti:

/etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'hostname' group

Tulosteen tulee sisältää niiden koneiden isäntänimet, joilla komento suoritettiin.
Muutama sana syntaksista:

  • /etc/ansible/./vm_list - luo luettelon koneista
  • -i - absoluuttinen polku inventaariotiedostoon
  • -m - kerro mahdollisuudesta käyttää shell-moduulia
  • -a on argumentti. Mikä tahansa komento voidaan syöttää tähän
  • ryhmä — klusterin nimi. Jos sinun on tehtävä tämä kaikissa klustereissa, vaihda ryhmäksi kaikki

Mennään pidemmälle - yritetään tehdä git pull virtuaalikoneillamme:

/etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'cd /path/to/project && git pull' group 

Jos lähdössä näemme jo ajan tasalla tai purkamisen arkistosta, kaikki toimii.

Nyt tähän kaikki oli tarkoitettu

Opetetaan skriptimme ajamaan automaattisesti, kun sitoudumme päähaaraan Gitlabissa

Tehdään ensin skriptistä kauniimpi ja laitetaan se suoritettavaan tiedostoon (kutsutaanko sitä exec_pull) -

#!/bin/bash

/etc/ansible/./get_vms && ansible -i /etc/ansible/cloud_ip -m shell -a "$@"

Siirrytään gitlabiin ja luodaan tiedosto projektiin .gitlab-ci.yml
Sisälle laitamme seuraavat:

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 

Kaikki on valmista. nyt -

  • tehdä sitoumus
  • Olen iloinen, että kaikki toimii

Kun siirrät .yml-tiedoston muihin projekteihin, sinun tarvitsee vain muuttaa uudelleenkäynnistettävän palvelun nimi ja sen klusterin nimi, jossa mahdolliset komennot suoritetaan.

Lähde: will.com

Lisää kommentti