Ansible + automatinis git įtraukimas į virtualių mašinų grupę debesyje

Ansible + automatinis git įtraukimas į virtualių mašinų grupę debesyje

Gera diena

Turime keletą debesų grupių, kurių kiekvienoje yra daug virtualių mašinų. Visą šį verslą priimame Hetzner. Kiekviename klasteryje turime vieną pagrindinį įrenginį, iš jo paimama momentinė nuotrauka ir automatiškai paskirstoma visoms klasterio virtualioms mašinoms.

Ši schema neleidžia mums įprastai naudoti gitlab-runners, nes atsiranda daug problemų, kai atsiranda daug identiškų registruotų bėgikų, todėl mus paskatino rasti sprendimą ir parašyti šį straipsnį / vadovą.

Tai tikriausiai nėra geriausia praktika, tačiau šis sprendimas atrodė kiek įmanoma patogesnis ir paprastesnis.

Mokomąją programą rasite kat.

Reikalingi paketai pagrindiniame aparate:

  • pitonas
  • Git
  • failą su ssh raktais

Bendras automatinio gut pull diegimo principas visose virtualiose mašinose yra tas, kad jums reikia mašinos, kurioje bus įdiegtas Ansible. Iš šio įrenginio ansible išsiųs git pull komandas ir iš naujo paleis atnaujintą paslaugą. Šiems tikslams sukūrėme atskirą virtualią mašiną už klasterių ribų ir joje įdiegėme:

  • pitonas
  • įmanoma
  • gitlab bėgikas

Iš organizacinių problemų - reikia užregistruoti gitlab-runner, padaryti ssh-keygen, įkelti viešąjį šio įrenginio ssh raktą į .ssh/authorized_keys pagrindiniame įrenginyje atidarykite 22 prievadą, kad galėtumėte naudotis pagrindiniame įrenginyje.

Dabar sukonfigūruokime ansible

Kadangi mūsų tikslas yra automatizuoti viską, kas įmanoma. Byloje /etc/ansible/ansible.cfg mes panaikinsime eilutę host_key_checking = Falsekad ansible neprašytų patvirtinti naujų mašinų.

Tada turite automatiškai sugeneruoti ansible inventoriaus failą, iš kurio jis paims mašinų, kuriose reikia atlikti git pull, IP.

Mes generuojame šį failą naudodami Hetzner API, galite paimti pagrindinių kompiuterių sąrašą iš savo AWS, Asure, duomenų bazės (kur nors turite API, kad būtų rodomos veikiančios mašinos, tiesa?).

Ansible labai svarbi inventoriaus failo struktūra; ji turėtų atrodyti taip:

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

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

Norėdami sukurti tokį failą, sukursime paprastą scenarijų (pavadinkime jį 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

Atėjo laikas patikrinti, ar Ansible veikia ir draugiškai priima IP adresus:

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

Išvestyje turi būti kompiuterių, kuriuose buvo vykdoma komanda, pavadinimai.
Keletas žodžių apie sintaksę:

  • /etc/ansible/./vm_list – generuoja mašinų sąrašą
  • -i - absoliutus kelias į inventoriaus failą
  • -m - nurodykite, ar galima naudoti apvalkalo modulį
  • -a yra argumentas. Čia galima įvesti bet kurią komandą
  • grupė – jūsų grupės pavadinimas. Jei tai reikia padaryti visuose klasteriuose, pakeiskite grupę į visus

Eikime toliau – pabandykime atlikti „git pull“ savo virtualiose mašinose:

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

Jei išvestyje matome jau atnaujintą arba iškraunamą iš saugyklos, tada viskas veikia.

Dabar visa tai buvo skirta

Išmokykime savo scenarijų paleisti automatiškai, kai prisijungiate prie pagrindinės šakos „gitlab“.

Pirma, padarykime savo scenarijų gražesnį ir įdėkite jį į vykdomąjį failą (pavadinkime jį exec_pull) -

#!/bin/bash

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

Eikime į „gitlab“ ir sukurkime failą projekte .gitlab-ci.yml
Į vidų įdedame:

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 

Viskas paruošta. Dabar -

  • įsipareigoti
  • Džiaugiuosi, kad viskas veikia

Perkeliant .yml į kitus projektus, tereikia pakeisti paslaugos pavadinimą, kad paleistumėte iš naujo, ir grupės, kurioje bus vykdomos galimos komandos, pavadinimą.

Šaltinis: www.habr.com

Добавить комментарий