Ansible + auto git pull sa usa ka cluster sa mga virtual machine sa cloud

Ansible + auto git pull sa usa ka cluster sa mga virtual machine sa cloud

Maayong adlaw

Kami adunay daghang mga cloud cluster nga adunay daghang mga virtual machine sa matag usa. Among gi-host kining tibuok negosyo sa Hetzner. Sa matag cluster aduna kitay usa ka master machine, usa ka snapshot ang gikuha gikan niini ug awtomatikong ipanghatag sa tanang virtual machine sulod sa cluster.

Kini nga laraw wala magtugot kanamo sa paggamit sa gitlab-runners sa kasagaran, tungod kay daghang mga problema ang motumaw kung daghang parehas nga narehistro nga mga runner ang makita, nga nag-aghat kanamo nga mangita usa ka solusyon ug isulat kini nga artikulo / manwal.

Tingali dili kini ang labing kaayo nga praktis, apan kini nga solusyon ingon kadali ug yano kutob sa mahimo.

Para sa tutorial, palihog tan-awa ang iring.

Gikinahanglan nga mga pakete sa master machine:

  • python
  • git
  • file nga adunay ssh key

Ang kinatibuk-ang prinsipyo sa pagpatuman sa automatic gut pull sa tanang virtual machine mao nga kinahanglan nimo ang usa ka makina diin ang Ansible ma-install. Gikan niini nga makina, ang ansible magpadala sa git pull commands ug i-restart ang serbisyo nga na-update. Alang niini nga mga katuyoan, naghimo kami usa ka bulag nga virtual machine sa gawas sa mga pungpong ug gi-install kini:

  • python
  • ansible
  • gitlab-runner

Gikan sa mga isyu sa organisasyon - kinahanglan nimo nga magparehistro sa gitlab-runner, paghimo sa ssh-keygen, pag-upload sa publiko nga ssh key niini nga makina sa .ssh/authorized_keys sa master machine, ablihi ang port 22 para ansible sa master machine.

Karon atong i-configure ang ansible

Tungod kay ang among katuyoan mao ang pag-automate sa tanan nga mahimo. Sa file /etc/ansible/ansible.cfg atong uncomment ang linya host_key_checking = Falsearon ang ansible dili mangayo alang sa pagkumpirma sa mga bag-ong makina.

Sunod, kinahanglan nimo nga awtomatiko nga makamugna usa ka file sa imbentaryo alang sa ansible, gikan diin kuhaon ang ip sa mga makina diin kinahanglan nimo buhaton ang git pull.

Gihimo namo kini nga file gamit ang Hetzner's API, mahimo nimong kuhaon ang lista sa mga host gikan sa imong AWS, Asure, database (naa kay API sa usa ka dapit aron ipakita ang imong running machines, di ba?).

Ang istruktura sa file sa imbentaryo hinungdanon kaayo alang sa Ansible; kini kinahanglan tan-awon sama niini:

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

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

Aron makamugna og ingon nga file, maghimo kami usa ka yano nga script (tawagon nato kini 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

Panahon na aron susihon nga ang Ansible nagtrabaho ug mahigalaon sa pagdawat sa mga adres sa IP:

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

Ang output kinahanglan nga adunay mga hostname sa mga makina diin ang command gipatuman.
Pipila ka mga pulong mahitungod sa syntax:

  • /etc/ansible/./vm_list - paghimo ug lista sa mga makina
  • -i - hingpit nga agianan sa file sa imbentaryo
  • -m - tell ansible nga gamiton ang shell module
  • -a mao ang argumento. Ang bisan unsang sugo mahimong masulod dinhi
  • grupo — ang ngalan sa imong cluster. Kung kinahanglan nimo nga buhaton kini sa tanan nga mga cluster, usba ang grupo sa tanan

Magpadayon kita - sulayan nato ang paghimo sa git pull sa atong 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 atong makita nga up to date o unloading gikan sa repository, nan ang tanan nagtrabaho.

Karon mao kini ang katuyoan sa tanan

Atong tudloan ang atong script nga awtomatikong modagan sa dihang mo-commit sa master branch sa gitlab

Una, himoon nato nga mas nindot ang atong script ug ibutang kini sa usa ka executable file (tawgon nato kini nga exec_pull) -

#!/bin/bash

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

Adto ta sa atong gitlab ug maghimo ug file sa project .gitlab-ci.yml
Gibutang namon ang mosunod sa sulod:

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 

Andam na ang tanan. Karon-

  • paghimo ug pasalig
  • Nalipay ko nga ang tanan nagtrabaho

Kung gibalhin ang .yml sa ubang mga proyekto, kinahanglan nimo nga usbon ang ngalan sa serbisyo aron ma-restart ug ang ngalan sa cluster diin ang mga ansible nga mga mando ipatuman.

Source: www.habr.com

Idugang sa usa ka comment