Ansible + auto git pull në klasterin e makinave virtuale në re

Ansible + auto git pull në klasterin e makinave virtuale në re

Mirëmëngjes

Ne kemi disa klasterë në re me numër të madh makinash virtuale në secilin. Të gjitha këto janë hostuar në Hetzner. Në secilin klaster kemi një makinë master, nga e cila bëhet një snapshot dhe shpërndahet automatikisht në të gjitha makinat virtuale brenda klasterit.

Ky skemë nuk na lejon të përdorim normalisht gitlab-runners, pasi krijohet shumë probleme për shkak të numrit të madh të runners të regjistruar të njëjtë, gjë që na çoi në kërkimin e një rruge alternative dhe në shkrimin e këtij artikulli/manuali.

Ndoshta kjo nuk është praktikë optimale, por kjo zgjidhje dukej më e përshtatshme dhe e thjeshtë.

Për tutorialin, ju lutem shihni poshtë.

Paketa të nevojshme në makinën master:

  • python
  • git
  • skedari me çelësa ssh

Princi i përgjithshëm i realizimit të automatizuar të git pull në të gjitha makinat virtuale konsiston në atë se na nevojitet një makinë, në të cilën do të jetë instaluar Ansible. Nga kjo makinë, ansible do të dërgojë komandat git pull dhe do të rikthejë shërbimin që është përditësuar. Ne krijuam për këto qëllime një makinë virtuale të veçantë jashtë klasterëve dhe i vendosëm atje:

  • python
  • ansible
  • gitlab-runner

Për çështje organizative — është e nevojshme të regjistrohet gitlab-runner, të bëhet ssh-keygen, dhe të dërgohet çelësi publik ssh i kësaj mašine në .ssh/authorized_keys në makinat master, të hapet porta 22 në makinën master për ansible.

Tani do ta konfigurojmë ansible

Sepse qëllimi ynë — është të automatizojmë gjithçka që është e mundur. Në skedarin /etc/ansible/ansible.cfg ne do të heqim komentimin nga rreshti host_key_checking = False, në mënyrë që ansible të mos kërkojë konfirmimin e makinave të reja.

Më pas, është e nevojshme të gjenerohet automatikisht një skedar inventar për ansible, nga ku do të tërheqë ip-të e makinave, në të cilat duhet të bëhet git pull.

Ne e gjenerojmë këtë skedar me ndihmën e API-së së Hetzner, ju mund të merrni listën e hosteve nga AWS, Azure, DB (po, keni ndonjë API për të shfaqur makinat tuaja të aktive, apo?).

Për Ansible struktura e skedarit të inventarit është shumë e rëndësishme, pamja e tij duhet të jetë si më poshtë:

[grupi]
ip-adresa
ip-adresa

[grupi2]
ip-adresa
ip-adresa

Për të gjeneruar një skedar të tillë, do të bëjmë një skedar të thjeshtë (do ta quajmë 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ë kontroluar nëse ansible funksionon dhe është në përputhje me marrësin e ip adresave:

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

Në output duhet të marrim emrat e hosteve të makinave, në të cilat është ekzekutuar komanda.
Paarë një fjalë për sintaksën:

  • /etc/ansible/./vm_list — генерируем список машин
  • -i — rruga absolute deri te skedari i inventarizimit
  • -m — i thotë Ansible të përdorë modulën shell
  • -a — argumenti. Këtu mund të shkruajmë çdo komandë
  • group — emri i grupit tuaj. Nëse duhet të bëjmë në të gjitha grupet, e ndërojmë group me all

Le të vazhdojmë — do të përpiqemi të bëjmë git pull në tonat makinat virtuale:

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

Nëse në output shohim already up to date ose shkarkimin nga repository, atëherë gjithçka funksionon.

Tani për atë që është menduar gjithçka

Do të mësojmë skriptin tonë të ekzekutohet automatikisht gjatë commit-it në degën master në GitLab

Së pari do ta bëjmë skriptin tonë më të bukur dhe do ta vendosim në një skedar ekzekutues (do ta quajmë exec_pull) —

#!/bin/bash

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

Shkëmbejmë në GitLab tonë dhe në projekt krijojmë skedarin .gitlab-ci.yml
Brenda vendosim të mëposhtmet:

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 

Të gjitha janë gati. Tani —

  • bëjmë commit
  • duke shpresuar se gjithçka funksionon

Kur transferoni .yml në projekte të tjera, mjafton të ndryshoni emrin e shërbimit për restart dhe emrin e grupit, ku do të ekzekutohen komandat ansible.

Burimi: habr.com

Bli një hosting të besueshëm për faqet me mbrojtje DDoS, VPS VDS serverë 🔥 Bli një hosting të besueshëm për faqet me mbrojtje DDoS, VPS VDS serverë | ProHoster