Ansible + outo git trek in 'n groep virtuele masjiene in die wolk

Ansible + outo git trek in 'n groep virtuele masjiene in die wolk

Goeie dag

Ons het verskeie wolkklusters met 'n groot aantal virtuele masjiene in elk. Ons huisves hierdie hele besigheid by Hetzner. In elke kluster het ons een meestermasjien, 'n momentopname word daaruit geneem en outomaties na alle virtuele masjiene binne die cluster versprei.

Hierdie skema laat ons nie toe om gitlab-runners normaalweg te gebruik nie, aangesien baie probleme ontstaan ​​wanneer baie identiese geregistreerde hardlopers verskyn, wat ons gevra het om 'n oplossing te vind en hierdie artikel/handleiding te skryf.

Dit is waarskynlik nie die beste praktyk nie, maar hierdie oplossing het so gerieflik en eenvoudig as moontlik gelyk.

Vir die tutoriaal, sien asseblief kat.

Vereiste pakkette op die hoofmasjien:

  • python
  • git
  • lêer met ssh sleutels

Die algemene beginsel van die implementering van outomatiese gut pull op alle virtuele masjiene is dat jy 'n masjien benodig waarop Ansible geïnstalleer sal word. Vanaf hierdie masjien sal ansible git pull-opdragte stuur en die diens wat opgedateer is, herbegin. Vir hierdie doeleindes het ons 'n aparte virtuele masjien buite die trosse geskep en daarop geïnstalleer:

  • python
  • ansible
  • gitlab-runner

Van organisatoriese kwessies - jy moet gitlab-runner registreer, ssh-keygen maak, die publieke ssh-sleutel van hierdie masjien oplaai na .ssh/authorized_keys op die hoofmasjien, maak poort 22 oop vir ansible op die hoofmasjien.

Kom ons stel nou ansible op

Aangesien ons doel is om alles wat moontlik is te outomatiseer. In lêer /etc/ansible/ansible.cfg ons sal die reël verwyder host_key_checking = Falsesodat ansible nie vir bevestiging van nuwe masjiene vra nie.

Vervolgens moet jy outomaties 'n voorraadlêer vir ansible genereer, vanwaar dit die ip van die masjiene sal neem waarop jy git pull moet doen.

Ons genereer hierdie lêer met behulp van Hetzner se API, jy kan die lys van gashere van jou AWS, Asure, databasis neem (jy het 'n API iewers om jou lopende masjiene te vertoon, reg?).

Die struktuur van die voorraadlêer is baie belangrik vir Ansible; dit moet so lyk:

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

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

Om so 'n lêer te genereer, sal ons 'n eenvoudige skrif maak (kom ons noem dit 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

Dit is tyd om seker te maak dat Ansible werk en vriendelik is met die ontvangs van IP-adresse:

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

Die uitvoer moet die gasheername bevat van die masjiene waarop die opdrag uitgevoer is.
'n Paar woorde oor sintaksis:

  • /etc/ansible/./vm_list - genereer 'n lys masjiene
  • -i - absolute pad na die voorraadlêer
  • -m - sê aan ansible om die dopmodule te gebruik
  • -a is die argument. Enige opdrag kan hier ingevoer word
  • groep — die naam van jou groep. As jy dit op alle groepe moet doen, verander groep na almal

Kom ons gaan verder - kom ons probeer om git pull op ons virtuele masjiene te doen:

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

As ons in die uitvoer sien dat ons reeds op datum is of uit die bewaarplek afgelaai word, dan werk alles.

Dit is nou waarvoor dit alles bedoel was

Kom ons leer ons script om outomaties te loop wanneer ons tot die meestertak in gitlab verbind

Kom ons maak eers ons skrif mooier en plaas dit in 'n uitvoerbare lêer (kom ons noem dit exec_pull) -

#!/bin/bash

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

Kom ons gaan na ons gitlab en skep 'n lêer in die projek .gitlab-ci.yml
Ons sit die volgende binne:

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 

Alles is gereed. Nou -

  • maak 'n commit
  • Ek is bly dat alles werk

Wanneer u .yml na ander projekte oordra, hoef u net die naam van die diens te verander om weer te begin en die naam van die groepering waarop die moontlike opdragte uitgevoer sal word.

Bron: will.com

Voeg 'n opmerking