Ansible + auto git pull u klasteru virtualnih strojeva u oblaku

Ansible + auto git pull u klasteru virtualnih strojeva u oblaku

Dobar dan

Imamo nekoliko klastera u oblaku s velikim brojem virtualnih strojeva u svakom. Cijeli ovaj posao vodimo u Hetzneru. U svakom klasteru imamo jedan glavni stroj, s njega se uzima snimka i automatski se distribuira svim virtualnim strojevima unutar klastera.

Ova nam shema ne dopušta normalno korištenje gitlab-runnera, budući da se puno problema javlja kada se pojavi mnogo identičnih registriranih runnera, što nas je potaknulo da nađemo zaobilazno rješenje i napišemo ovaj članak/priručnik.

Ovo vjerojatno nije najbolja praksa, ali ovo se rješenje čini najprikladnijim i jednostavnijim.

Za poduku pogledajte kat.

Potrebni paketi na glavnom stroju:

  • piton
  • git
  • datoteka sa ssh ključevima

Općenito načelo implementacije automatskog gut pulla na svim virtualnim strojevima je da vam treba stroj na kojem će biti instaliran Ansible. S ovog stroja, ansible će poslati git pull naredbe i ponovno pokrenuti servis koji je ažuriran. Za te potrebe kreirali smo zasebno virtualno računalo izvan klastera i na njega instalirali:

  • piton
  • ansible
  • gitlab-trkač

Od organizacijskih pitanja - trebate registrirati gitlab-runner, napraviti ssh-keygen, prenijeti javni ssh ključ ovog stroja na .ssh/authorized_keys na glavnom stroju, otvorite port 22 za ansible na glavnom stroju.

Sada konfigurirajmo ansible

Budući da nam je cilj automatizirati sve što je moguće. U datoteci /etc/ansible/ansible.cfg odkomentirat ćemo redak host_key_checking = Falsetako da ansible ne traži potvrdu novih strojeva.

Zatim morate automatski generirati datoteku inventara za ansible, odakle će preuzeti ip računala na kojima trebate izvršiti git pull.

Generiramo ovu datoteku pomoću Hetznerovog API-ja, možete uzeti popis hostova iz vaše AWS, Asure, baze podataka (imate API negdje za prikaz vaših pokrenutih strojeva, zar ne?).

Struktura datoteke inventara vrlo je važna za Ansible; trebala bi izgledati ovako:

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

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

Da bismo generirali takvu datoteku, napravit ćemo jednostavnu skriptu (nazovimo je 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

Vrijeme je da provjerite radi li Ansible i je li prijateljski nastrojen prema primanju IP adresa:

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

Izlaz bi trebao sadržavati nazive računala na kojima je naredba izvršena.
Nekoliko riječi o sintaksi:

  • /etc/ansible/./vm_list - generira popis strojeva
  • -i - apsolutni put do datoteke inventara
  • -m - reći ansibleu da koristi modul ljuske
  • -a je argument. Ovdje se može unijeti bilo koja naredba
  • grupa — naziv vašeg klastera. Ako to trebate učiniti na svim klasterima, promijenite grupu u sve

Idemo dalje - pokušajmo napraviti git pull na našim virtualnim strojevima:

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

Ako u izlazu vidimo već ažurirano ili istovar iz repozitorija, onda sve radi.

Ovo je ono za što je sve to bilo namijenjeno

Naučimo našu skriptu da se automatski pokreće kada se obvezuje na glavnu granu u gitlabu

Prvo, učinimo našu skriptu ljepšom i stavimo je u izvršnu datoteku (nazovimo je exec_pull) -

#!/bin/bash

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

Idemo u naš gitlab i stvorimo datoteku u projektu .gitlab-ci.yml
Unutra stavljamo sljedeće:

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 

Sve je spremno. Sada -

  • izvršiti obvezu
  • Drago mi je da sve radi

Prilikom prijenosa .yml na druge projekte samo trebate promijeniti naziv servisa za ponovno pokretanje i naziv klastera na kojem će se izvršavati ansible naredbe.

Izvor: www.habr.com

Dodajte komentar