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