Ansible + automaatne git pull virtuaalmasinate klistris

Ansible + automaatne git pull virtuaalmasinate klistris

Tere päevast

Meil on mitmeid pilviklastrit, kus igas on palju virtuaalmasinaid. Kõike seda majutame Hetzneris. Igas klastris on meil üks peamasin, millelt tehakse snapshot ja jagatakse automaatselt kõigi virtuaalmasinate vahel klistris.

See skeem ei luba meil normaalselt kasutada gitlab-runnerit, kuna tekib palju probleeme, kui registreeritakse liiga palju samu runnereid, mis ajendas meid leidma väljapääsemise viisi ja kirjutama seda artiklit/õpetust.

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

Juhendi jaoks palun kliki siia.

Vajalikud paketid peamasinas:

  • python
  • git
  • fail ssh võtmetega

Automaatse git pull'i rakendamise üldine põhimõte kõigis virtuaalmasinates seisneb selles, et vajalik on masin, kuhu Ansible on installitud. Sellelt masinalt saadab ansible git pull käsud ja teenuse, mis on uuendatud, taaskäivitamise käsud. Me loodud selleks otstarbeks eraldi virtuaalmasin klistrite väliselt, kuhu installisime:

  • python
  • ansible
  • gitlab-runner

Organisatsiooniliste küsimuste osas — tuleb registreerida gitlab-runner, teha ssh-keygen ning lisada selle masina avalik ssh võtme .ssh/authorized_keys peamasinas, avada peamasinas 22. port ansible jaoks.

Nüüd seadistame ansible

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

Edasi on vajalik automaatselt genereerida ansible inventeerimisfail, kust see toob üles masinate IP-aadressid, millel tuleb teha git pull.

Generatsioonime seda faili Hetzneri API kaudu; te võite võtta hostide nimekirja oma AWS, Azure, andmebaasist (teil on ju mingi API, mis näitab teie jooksvaid masinaid).

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

[rühm]
ip-aadress
ip-aadress

[rühm2]
ip-aadress
ip-aadress

Selle 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 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 peaksime saama masinate hostinimed, kus käidi käsu täitmine.
Mõned sõnad süntaksist:

  • /etc/ansible/./vm_list — генерируем список машин
  • -i — absoluutne tee inventeerimisfailini
  • -m — ütleme ansiblile kasutada shell moodulit
  • -a — argument. Siia saab kirjutada mis tahes käsu
  • group — teie klastrinimi. Kui soovite seda kõigis klastrites teha, muutke group all-iks

Liigume edasi — proovime teha git pull meie peal virtuaalmasinaid:

/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 väljastust, siis kõik töötab.

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

Õpetame meie skripti automaatselt töötama, kui komiteerime gitlabis master haru

Esmalt muudame 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
Sisestame järgmise:

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 commit'i
  • loodame, et kõik töötab

Kui .yml teistesse projektidesse kantakse, on piisav ainult muuta teenuse nime restartimiseks ja klastrinime, millel antakse ansible käske.

Allikas: habr.com

Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster