Ansible + tërheqje automatike në një grup makinerish virtuale në re

Ansible + tërheqje automatike në një grup makinerish virtuale në re

Keni një ditë të këndshme

Ne kemi disa grupime cloud me një numër të madh makinash virtuale në secilin. Ne e presim të gjithë këtë biznes në Hetzner. Në çdo grup kemi një makineri kryesore, prej saj merret një fotografi dhe shpërndahet automatikisht në të gjitha makinat virtuale brenda grupit.

Kjo skemë nuk na lejon të përdorim normalisht gitlab-runners, pasi lindin shumë probleme kur shfaqen shumë vrapues identikë të regjistruar, gjë që na shtyu të gjejmë një zgjidhje dhe të shkruajmë këtë artikull/manual.

Kjo ndoshta nuk është praktika më e mirë, por kjo zgjidhje dukej sa më e përshtatshme dhe e thjeshtë.

Për tutorialin, ju lutemi shihni cat.

Paketat e kërkuara në makinën kryesore:

  • piton
  • git
  • skedar me çelësat ssh

Parimi i përgjithshëm i zbatimit të tërheqjes automatike të zorrëve në të gjitha makinat virtuale është se ju nevojitet një makinë në të cilën do të instalohet Ansible. Nga kjo makinë, ansible do të dërgojë komandat e tërheqjes së git dhe do të rifillojë shërbimin që është përditësuar. Për këto qëllime, ne krijuam një makinë virtuale të veçantë jashtë grupimeve dhe instaluam në të:

  • piton
  • ansible
  • gitlab-vrapues

Nga çështjet organizative - ju duhet të regjistroheni gitlab-runner, të bëni ssh-keygen, të ngarkoni çelësin publik ssh të kësaj makine në .ssh/authorized_keys në makinën kryesore, hapni portën 22 për ansible në makinën kryesore.

Tani le të konfigurojmë ansible

Meqenëse qëllimi ynë është të automatizojmë gjithçka që është e mundur. Në dosje /etc/ansible/ansible.cfg do ta çkomentojmë rreshtin host_key_checking = Falsenë mënyrë që ansible të mos kërkojë konfirmimin e makinerive të reja.

Më pas, duhet të gjeneroni automatikisht një skedar inventar për ansible, nga ku do të marrë ip-në e makinerive në të cilat duhet të bëni git pull.

Ne e gjenerojmë këtë skedar duke përdorur API-në e Hetzner-it, ju mund të merrni listën e hosteve nga databaza juaj AWS, Asure (ju keni një API diku për të shfaqur makinat tuaja që funksionojnë, apo jo?).

Struktura e skedarit të inventarit është shumë e rëndësishme për Ansible; duhet të duket kështu:

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

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

Për të gjeneruar një skedar të tillë, ne do të bëjmë një skenar të thjeshtë (le ta quajmë atë 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

Është koha për të kontrolluar nëse Ansible funksionon dhe është miqësor me marrjen e adresave IP:

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

Dalja duhet të përmbajë emrat e hosteve të makinave në të cilat është ekzekutuar komanda.
Disa fjalë për sintaksën:

  • /etc/ansible/./vm_list - gjeneron një listë të makinave
  • -i - rruga absolute për në skedarin e inventarit
  • -m - thuaj ansible të përdorë modulin shell
  • -a është argumenti. Këtu mund të futet çdo komandë
  • grupi - emri i grupit tuaj. Nëse duhet ta bëni këtë në të gjitha grupimet, ndryshoni grupin në të gjithë

Le të shkojmë më tej - le të përpiqemi të bëjmë git pull në makinat tona virtuale:

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

Nëse në dalje shohim tashmë të përditësuar ose shkarkim nga depoja, atëherë gjithçka po funksionon.

Tani kjo është ajo për të cilën ishte menduar e gjitha

Le të mësojmë skriptin tonë të ekzekutohet automatikisht kur angazhohemi në degën master në gitlab

Së pari, le ta bëjmë skriptin tonë më të bukur dhe ta vendosim në një skedar të ekzekutueshëm (le ta quajmë exec_pull) -

#!/bin/bash

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

Le të shkojmë në gitlab tonë dhe të krijojmë një skedar në projekt .gitlab-ci.yml
Ne vendosim brenda:

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 

Gjithçka është gati. Tani -

  • bëj një zotim
  • Më vjen mirë që gjithçka funksionon

Kur transferoni .yml në projekte të tjera, ju vetëm duhet të ndryshoni emrin e shërbimit për të rifilluar dhe emrin e grupit në të cilin do të ekzekutohen komandat ansible.

Burimi: www.habr.com

Shto një koment