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 = False
jotta 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