Ansible + auto git pull yn in kluster fan firtuele masines yn 'e wolk

Ansible + auto git pull yn in kluster fan firtuele masines yn 'e wolk

Goeie

Wy hawwe ferskate wolkklusters mei in grut oantal firtuele masines yn elk. Wy hostje dit hiele bedriuw by Hetzner. Yn elk kluster hawwe wy ien mastermasine, in momintopname wurdt derfan nommen en automatysk ferspraat nei alle firtuele masines binnen it kluster.

Dit skema lit ús net gewoan gitlab-runners brûke, om't in protte problemen ûntsteane as in protte identike registrearre runners ferskine, wat ús frege om in oplossing te finen en dit artikel / hânboek te skriuwen.

Dit is wierskynlik net de bêste praktyk, mar dizze oplossing like sa handich en ienfâldich mooglik.

Foar de tutorial, sjoch asjebleaft kat.

Fereaske pakketten op 'e mastermasine:

  • python
  • gean
  • triem mei ssh toetsen

It algemiene prinsipe fan it ymplementearjen fan automatyske gut pull op alle firtuele masines is dat jo in masine nedich hawwe wêrop Ansible sil wurde ynstalleare. Fan dizze masine sil ansible git pull-kommando's stjoere en de tsjinst opnij starte dy't is bywurke. Foar dizze doelen makken wy in aparte firtuele masine bûten de klusters en ynstalleare derop:

  • python
  • tawinske
  • gitlab-runner

Fan organisatoaryske problemen - jo moatte gitlab-runner registrearje, ssh-keygen meitsje, de iepenbiere ssh-kaai fan dizze masine oplade nei .ssh/authorized_keys op de master masine, iepen haven 22 foar ansible op de master masine.

No litte wy konfigurearje ansible

Sûnt ús doel is om alles te automatisearjen dat mooglik is. Yn triem /etc/ansible/ansible.cfg wy sille uncomment de line host_key_checking = Falsesadat ansible net freget om befêstiging fan nije masines.

Dêrnei moatte jo automatysk in ynventarisaasjebestân generearje foar ansible, wêrfan it de ip sil nimme fan 'e masines wêrop jo git pull moatte dwaan.

Wy generearje dit bestân mei de API fan Hetzner, jo kinne de list mei hosts nimme fan jo AWS, Asure, database (jo hawwe earne in API om jo rinnende masines wer te jaan, krekt?).

De struktuer fan it ynventarisaasjebestân is heul wichtich foar Ansible; it moat der sa útsjen:

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

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

Om sa'n bestân te generearjen, meitsje wy in ienfâldich skript (litte wy it neame 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

It is tiid om te kontrolearjen dat Ansible wurket en freonlik is mei it ûntfangen fan IP-adressen:

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

De útfier moat de hostnammen befetsje fan 'e masines wêrop it kommando útfierd is.
In pear wurden oer syntaksis:

  • /etc/ansible/./vm_list - generearje in list mei masines
  • -i - absolute paad nei de ynventarisaasje triem
  • -m - fertel ansible te brûken de shell module
  • -a is it argumint. Elk kommando kin hjir ynfierd wurde
  • groep - de namme fan jo kluster. As jo ​​​​dit moatte dwaan op alle klusters, feroarje groep nei allegear

Litte wy fierder gean - litte wy besykje git pull te dwaan op ús firtuele masines:

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

As wy yn 'e útfier al aktueel sjogge of loslitte fan' e repository, dan wurket alles.

No dit is wêr't it allegear foar bedoeld wie

Litte wy ús skript leare om automatysk te rinnen by it ynsette foar de mastertûke yn gitlab

Litte wy earst ús skript moaier meitsje en it yn in útfierber bestân pleatse (litte wy it exec_pull neame) -

#!/bin/bash

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

Litte wy nei ús gitlab gean en in bestân meitsje yn it projekt .gitlab-ci.yml
Wy sette it folgjende binnen:

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 klear. No -

  • meitsje in commit
  • Ik bin bliid dat alles wurket

By it oerdragen fan .yml nei oare projekten, moatte jo gewoan de namme fan 'e tsjinst feroarje om opnij te begjinnen en de namme fan it kluster wêrop de oanwêzige kommando's wurde útfierd.

Boarne: www.habr.com

Add a comment