Ansible + auto git pull v gručo virtualnih strojev v oblaku

Ansible + auto git pull v gručo virtualnih strojev v oblaku

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 = Falsetako 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

Dodaj komentar