Dober dan
Imamo več grozdov v oblaku z velikim številom virtualnih strojev v vsakem. Celoten posel gostimo pri Hetznerju. V vsaki gruči imamo en glavni stroj, iz njega se naredi posnetek in se samodejno razdeli na vse virtualne stroje znotraj gruče.
Ta shema nam ne dovoljuje normalne uporabe gitlab-runners, saj nastane veliko težav, ko se pojavi veliko enakih registriranih runnerjev, kar nas je spodbudilo, da smo našli rešitev in napisali ta članek/priročnik.
To verjetno ni najboljša praksa, vendar se je ta rešitev zdela čim bolj priročna in preprosta.
Za vadnico glejte kat.
Zahtevani paketi na glavnem stroju:
- python
- git
- datoteko s ključi ssh
Splošno načelo izvajanja samodejnega črevesja na vseh virtualnih strojih je, da potrebujete stroj, na katerem bo nameščen Ansible. S tega računalnika bo ansible poslal ukaze git pull in znova zagnal storitev, ki je bila posodobljena. Za te namene smo ustvarili ločen virtualni stroj zunaj gruč in nanj namestili:
- python
- odgovoren
- gitlab-runner
Od organizacijskih vprašanj - registrirati morate gitlab-runner, narediti ssh-keygen, naložiti javni ključ ssh tega računalnika v .ssh/authorized_keys
na glavnem stroju odprite vrata 22 za ansible na glavnem stroju.
Zdaj pa konfigurirajmo ansible
Ker je naš cilj avtomatizirati vse, kar je mogoče. V datoteki /etc/ansible/ansible.cfg
vrstico bomo odkomentirali host_key_checking = False
tako da ansible ne zahteva potrditve novih strojev.
Nato morate samodejno ustvariti datoteko inventarja za ansible, od koder bo prevzel ip strojev, na katerih morate izvesti git pull.
To datoteko ustvarimo z uporabo Hetznerjevega API-ja, seznam gostiteljev lahko vzamete iz svoje baze podatkov AWS, Asure (nekje imate API za prikaz svojih delujočih strojev, kajne?).
Struktura datoteke inventarja je zelo pomembna za Ansible; videti bi morala takole:
[группа]
ip-адрес
ip-адрес
[группа2]
ip-адрес
ip-адрес
Za ustvarjanje takšne datoteke bomo naredili preprost skript (recimo mu 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
Čas je, da preverimo, ali Ansible deluje in je prijazen do prejemanja naslovov IP:
/etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'hostname' group
Izhod mora vsebovati imena gostiteljev strojev, na katerih je bil ukaz izveden.
Nekaj besed o sintaksi:
- /etc/ansible/./vm_list - ustvari seznam strojev
- -i - absolutna pot do datoteke popisa
- -m - povejte ansibleu, naj uporabi lupinski modul
- -a je argument. Tu lahko vnesete poljuben ukaz
- skupina — ime vaše gruče. Če morate to narediti v vseh gručah, spremenite skupino v vse
Pojdimo dlje - poskusimo narediti git pull na naših virtualnih strojih:
/etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'cd /path/to/project && git pull' group
Če v izhodu vidimo že posodobljeno ali razkladanje iz repozitorija, potem vse deluje.
Zdaj je bilo temu namenjeno
Naučimo naš skript, da se zažene samodejno, ko se zaveže glavni veji v gitlabu
Najprej naredimo naš skript lepši in ga vstavimo v izvedljivo datoteko (imenujmo jo exec_pull) -
#!/bin/bash
/etc/ansible/./get_vms && ansible -i /etc/ansible/cloud_ip -m shell -a "$@"
Pojdimo v naš gitlab in ustvarimo datoteko v projektu .gitlab-ci.yml
Notri smo dali naslednje:
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
Vse je pripravljeno. zdaj -
- zavezati se
- Vesel sem, da vse deluje
Ko prenašate .yml v druge projekte, morate samo spremeniti ime storitve, ki jo želite znova zagnati, in ime gruče, na kateri se bodo izvajali ansible ukazi.
Vir: www.habr.com