Ansible + auto git povlači klaster virtuelnih mašina u oblaku

Ansible + auto git povlači klaster virtuelnih mašina u oblaku

Dobar dan

Imamo nekoliko klastera oblaka sa velikim brojem virtuelnih mašina u svakom. Cijeli ovaj posao ugošćujemo u Hetzneru. U svakom klasteru imamo jednu glavnu mašinu, sa nje se uzima snimak i automatski se distribuira na sve virtuelne mašine unutar klastera.

Ova šema nam ne dozvoljava da normalno koristimo gitlab-runnere, budući da se javljaju mnogi problemi kada se pojavi mnogo identičnih registrovanih runnera, što nas je navelo da pronađemo rješenje i napišemo ovaj članak/priručnik.

Ovo vjerovatno nije najbolja praksa, ali ovo rješenje se činilo što je moguće praktičnijim i jednostavnijim.

Za tutorijal, pogledajte kat.

Potrebni paketi na glavnoj mašini:

  • python
  • git
  • fajl sa ssh ključevima

Opšti princip implementacije automatskog povlačenja creva na svim virtuelnim mašinama je da vam je potrebna mašina na kojoj će biti instaliran Ansible. Sa ove mašine, ansible će poslati git pull komande i ponovo pokrenuti servis koji je ažuriran. U ove svrhe kreirali smo zasebnu virtuelnu mašinu izvan klastera i instalirali na nju:

  • python
  • ansible
  • gitlab-runner

Od organizacionih pitanja - potrebno je registrovati gitlab-runner, napraviti ssh-keygen, postaviti javni ssh ključ ove mašine na .ssh/authorized_keys na glavnoj mašini, otvorite port 22 za ansible na glavnoj mašini.

Sada da konfigurišemo ansible

Budući da nam je cilj automatizirati sve što je moguće. U fajlu /etc/ansible/ansible.cfg dekomentiraćemo red host_key_checking = Falsetako da ansible ne traži potvrdu novih mašina.

Zatim morate automatski generirati datoteku inventara za ansible, odakle će uzeti ip strojeva na kojima trebate izvršiti git pull.

Ovu datoteku generišemo pomoću Hetznerovog API-ja, možete uzeti listu hostova iz vaše AWS, Asure, baze podataka (imate API negdje da prikažete vaše pokrenute mašine, zar ne?).

Struktura datoteke inventara je veoma važna za Ansible; trebalo bi da izgleda ovako:

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

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

Da bismo generisali takav fajl, napravić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 da li Ansible radi i da je prijateljski s prijemom IP adresa:

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

Izlaz treba da sadrži imena hostova mašina na kojima je naredba izvršena.
Nekoliko riječi o sintaksi:

  • /etc/ansible/./vm_list - generiše listu mašina
  • -i - apsolutna putanja do datoteke inventara
  • -m - reci ansible 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 - hajde da pokušamo da uradimo git pull na našim virtuelnim mašinama:

/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 spremišta, onda sve radi.

Ovo je ono čemu je sve to bilo namijenjeno

Naučimo našu skriptu da se pokreće automatski kada se predaje 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 kreiramo datoteku u projektu .gitlab-ci.yml
Unutra stavljamo sledeć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. Sad -

  • napraviti obavezu
  • Drago mi je da sve radi

Kada prenosite .yml na druge projekte, potrebno je samo promijeniti naziv servisa za ponovno pokretanje i naziv klastera na kojem će se izvršavati ansible komande.

izvor: www.habr.com

Dodajte komentar