Ansible + auto git pull sa isang kumpol ng mga virtual machine sa cloud

Ansible + auto git pull sa isang kumpol ng mga virtual machine sa cloud

Magandang araw

Mayroon kaming ilang cloud cluster na may malaking bilang ng mga virtual machine sa bawat isa. Nagho-host kami ng buong negosyong ito sa Hetzner. Sa bawat cluster mayroon kaming isang master machine, isang snapshot ang kinukuha mula dito at awtomatikong ipapamahagi sa lahat ng virtual machine sa loob ng cluster.

Ang scheme na ito ay hindi nagpapahintulot sa amin na gumamit ng gitlab-runners nang normal, dahil maraming problema ang lumitaw kapag maraming magkakaparehong nakarehistrong runner ang lumitaw, na nag-udyok sa amin na maghanap ng solusyon at isulat ang artikulo/manwal na ito.

Marahil ito ay hindi pinakamahusay na kasanayan, ngunit ang solusyon na ito ay tila maginhawa at simple hangga't maaari.

Para sa tutorial, mangyaring tingnan ang pusa.

Mga kinakailangang pakete sa master machine:

  • python
  • pumunta
  • file na may mga ssh key

Ang pangkalahatang prinsipyo ng pagpapatupad ng awtomatikong gut pull sa lahat ng virtual machine ay kailangan mo ng makina kung saan mai-install ang Ansible. Mula sa makinang ito, magpapadala ang ansible ng git pull command at i-restart ang serbisyong na-update. Para sa mga layuning ito, gumawa kami ng hiwalay na virtual machine sa labas ng mga cluster at naka-install dito:

  • python
  • ansible
  • gitlab-runner

Mula sa mga isyu sa organisasyon - kailangan mong irehistro ang gitlab-runner, gumawa ng ssh-keygen, i-upload ang pampublikong ssh key ng makinang ito sa .ssh/authorized_keys sa master machine, buksan ang port 22 para sa ansible sa master machine.

Ngayon ay i-configure natin ang ansible

Dahil ang layunin namin ay i-automate ang lahat ng posible. Nasa file /etc/ansible/ansible.cfg aalisin namin ang komento sa linya host_key_checking = Falseupang ang ansible ay hindi humingi ng kumpirmasyon ng mga bagong makina.

Susunod, kailangan mong awtomatikong bumuo ng isang file ng imbentaryo para sa ansible, mula sa kung saan kukunin ang ip ng mga makina kung saan kailangan mong gawin ang git pull.

Binubuo namin ang file na ito gamit ang Hetzner's API, maaari mong kunin ang listahan ng mga host mula sa iyong AWS, Asure, database (mayroon kang API sa isang lugar upang ipakita ang iyong mga tumatakbong makina, tama ba?).

Ang istraktura ng file ng imbentaryo ay napakahalaga para sa Ansible; dapat itong magmukhang ganito:

[Π³Ρ€ΡƒΠΏΠΏΠ°]
ip-адрСс
ip-адрСс

[Π³Ρ€ΡƒΠΏΠΏΠ°2]
ip-адрСс
ip-адрСс

Para makabuo ng ganoong file, gagawa kami ng simpleng script (tawagin natin ito 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

Oras na para tingnan kung gumagana ang Ansible at magiliw sa pagtanggap ng mga IP address:

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

Ang output ay dapat maglaman ng mga hostname ng mga makina kung saan ang command ay naisakatuparan.
Ilang salita tungkol sa syntax:

  • /etc/ansible/./vm_list - bumuo ng listahan ng mga makina
  • -i - ganap na landas sa file ng imbentaryo
  • -m - sabihin sa ansible na gamitin ang shell module
  • -a ang argumento. Ang anumang utos ay maaaring ilagay dito
  • grupo β€” ang pangalan ng iyong cluster. Kung kailangan mong gawin ito sa lahat ng cluster, palitan ang grupo sa lahat

Pumunta pa tayo - subukan nating gawin ang git pull sa ating mga virtual machine:

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

Kung sa output ay nakikita natin na napapanahon o nag-aalis mula sa imbakan, kung gayon ang lahat ay gumagana.

Ngayon ito ay kung ano ang lahat ng ito ay sinadya para sa

Turuan natin ang ating script na awtomatikong tumakbo kapag nag-commit sa master branch sa gitlab

Una, gawin nating mas maganda ang ating script at ilagay ito sa isang executable file (tawagin natin itong exec_pull) -

#!/bin/bash

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

Pumunta tayo sa aming gitlab at lumikha ng isang file sa proyekto .gitlab-ci.yml
Inilalagay namin ang sumusunod sa loob:

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 

Handa na ang lahat. ngayon -

  • gumawa ng pangako
  • Natutuwa akong gumagana ang lahat

Kapag naglilipat ng .yml sa ibang mga proyekto, kailangan mo lang baguhin ang pangalan ng serbisyo upang mag-restart at ang pangalan ng cluster kung saan isasagawa ang mga ansible na command.

Pinagmulan: www.habr.com

Magdagdag ng komento