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