Ansible + automaatne git pull virtuaalmasinate pilves

Ansible + automaatne git pull virtuaalmasinate pilves

Tere päevast

Meil on mitmeid pilvekplease, kus igas on suur hulk virtuaalmasinaid. Kõik see on majutatud Hetzneris. Igas klastris on meil üks peamasin, millelt tehakse hetkeseis ja jagatakse see automaatselt kõikidele virtuaalmasinatele klastris.

See skeem ei võimalda meil korralikult kasutada gitlab-runner'eid, sest registreeritud runner'ite arv on liiga suur, mis tõi kaasa lahenduse leidmise ja selle artikli/õpetuse kirjutamise.

Tõenäoliselt ei ole see parim praktika, kuid see lahendus tundus olevat kõige mugavam ja lihtsam.

Juhendist palun allpool.

Peamasinas vajalikud paketid:

  • python
  • git
  • fail ssh võtmetega

Automaatse git pull'i rakendamise üldine põhimõte kõigil virtuaalmasinatel on, et vajalik on masin, kuhu Ansible on installitud. Just sellest masinast saadab ansible git pull käske ja restartib uuendatud teenust. Selleks eesmärgiks lõime ainulaadse virtuaalmasina klastritest väljaspool ja paigaldasime sellele:

  • python
  • ansible
  • gitlab-runner

Organisatsiooniliste küsimustega seoses tuleb registreerida gitlab-runner, teha ssh-keygen ning laadida selle masina avalik ssh-võti .ssh/authorized_keys peamasinas, avada peamasinas 22. port ansible jaoks.

Nüüd seadistame ansible'i

Kuna meie eesmärk on automatiseerida kõik, mis võimalik. Failis /etc/ansible/ansible.cfg kommenteerime välja read host_key_checking = False, et ansible ei küsiks uute masinate kinnitust.

Edasi tuleb automaatselt genereerida ansible'i inventarifail, kust ta võtab masinate IP-aadressid, millel tuleb teha git pull.

Me genereerime selle faili Hetzner'i API abil, teie aga võite võtta nimekirja hostidest oma AWS, Azure, DB-st (teie käes on ju kuskil API teie jooksvaid masinaid kuvamiseks, eks?).

Ansible'i jaoks on inventarifaili struktuur väga oluline, selle välimus peab olema järgmine:

[gruppe]
ip-aadress
ip-aadress

[gruppe2]
ip-aadress
ip-aadress

Sellise faili genereerimiseks teeme lihtsa skripti (nimetame selle 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

On viimane aeg kontrollida, kas ansible töötab ja suhtleb IP-aadresside hankimisega:

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

Väljundis peame saama masinate hostinimed, millel käidi läbi käsk.
Mõned sõnad süntaksi kohta:

  • /etc/ansible/./vm_list — генерируем список машин
  • -i — absoluutne tee inventeerimisfailini
  • -m — anname Ansible'le ülesande shelli moduli kasutamiseks
  • -a — argument. Siia saab kirjutada mis tahes käsu
  • group — teie klasteri nimi. Kui soovite teha kõikidel klasteritel, muutke group all-iks

Jätkame — proovime teha git pull meie ülesannete peale virtuaalmasinatel:

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

Kui väljundis näeme already up to date või repo laadimist, siis tähendab, et kõik töötab.

Nüüd see, milleks see kõik mõeldud oli

Õpetame meie skripti automaatselt käivituma gitlab'is master haru komiteerimisel

Esialgu teeme meie skripti ilusamaks ja paneme selle täidetavasse faili (nimetame selle exec_pull)

#!/bin/bash

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

Läheme meie gitlabi ja loome projektis faili .gitlab-ci.yml
Paneme sisse järgmise sisu:

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 

Kõik on valmis. Nüüd —

  • teeme komiteeru
  • loodame, et kõik töötab

Kui viite .yml teistesse projektidesse, piisab ainult teenuse nime muutmisest taaskäivitamiseks ja klasteri nime muutmisest, kus Ansible'i käsud käivitatakse.

Allikas: habr.com

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster