Ansible + auto git pull in un cluster di macchine virtuali in u nuvulu

Ansible + auto git pull in un cluster di macchine virtuali in u nuvulu

Bella ghjurnata

Avemu parechji clusters di nuvola cù un gran numaru di macchine virtuali in ognunu. Ospitemu tutta sta attività in Hetzner. In ogni cluster avemu una macchina maestra, una snapshot hè presa da ellu è automaticamente distribuitu à tutte e macchine virtuale in u cluster.

Stu schema ùn ci permette micca di usà gitlab-runners nurmale, postu chì una mansa di prublemi nascenu quandu parechji corridori registrati identici appariscenu, chì ci hà incitatu à truvà una soluzione è scrive stu articulu / manuale.

Questa ùn hè micca prubabilmente a megliu pratica, ma sta suluzione pareva cusì còmuda è simplice pussibule.

Per u tutoriale, vede cat.

Pacchetti richiesti nantu à a macchina maestra:

  • pitone
  • andà
  • schedariu cù chjavi ssh

U principiu generale di l'implementazione automatica di gut pull in tutte e macchine virtuali hè chì avete bisognu di una macchina nantu à quale Ansible serà installatu. Da sta macchina, ansible mandarà cumandamenti git pull è riavvia u serviziu chì hè statu aghjurnatu. Per questi scopi, avemu creatu una macchina virtuale separata fora di i clusters è installatu nantu à questu:

  • pitone
  • ansible
  • gitlab-runner

Da i prublemi organizzativi - avete bisognu di registrà gitlab-runner, fate ssh-keygen, caricate a chjave ssh publica di sta macchina à .ssh/authorized_keys nantu à a macchina maestra, apre u portu 22 per ansible nantu à a macchina maestra.

Avà cunfiguremu l'ansible

Perchè u nostru scopu hè di automatizà tuttu ciò chì hè pussibule. In u schedariu /etc/ansible/ansible.cfg avemu da annunzià a linea host_key_checking = Falsecusì chì ansible ùn dumanda micca a cunferma di novi machini.

In seguitu, avete bisognu di generà automaticamente un schedariu d'inventariu per ansible, da induve piglià l'ip di e macchine nantu à quale avete bisognu di fà git pull.

Generemu stu schedariu utilizendu l'API di Hetzner, pudete piglià a lista di l'ospiti da a vostra basa di dati AWS, Asure (avete una API in qualchì locu per vede e vostre macchine in esecuzione, nò?).

A struttura di u schedariu d'inventariu hè assai impurtante per Ansible; duverebbe vede cusì:

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

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

Per generà un tali schedariu, faremu un script simplice (chjamemu 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

Hè u tempu di verificà chì Ansible funziona è hè amichevule cù riceve indirizzi IP:

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

L'output deve cuntene i nomi d'ospiti di e macchine nantu à quale u cumandamentu hè statu eseguitu.
Uni pochi parolle nantu à a sintassi:

  • /etc/ansible/./vm_list - generà una lista di macchine
  • -i - percorso assolutu à u schedariu d'inventariu
  • -m - dì à l'ansible di utilizà u modulu di shell
  • -a hè l'argumentu. Ogni cumanda pò esse inserita quì
  • gruppu - u nome di u vostru cluster. Sè avete bisognu di fà questu nantu à tutti i clusters, cambia u gruppu à tutti

Andemu più in là - pruvemu à fà git pull nantu à e nostre macchine virtuali:

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

Se in l'output vedemu digià aghjurnatu o scaricate da u repository, allora tuttu funziona.

Avà questu hè tuttu ciò chì era destinatu

Insegnemu à u nostru script per eseguisce automaticamente quandu ci hè impegnatu in u ramu maestru in gitlab

Prima, facemu u nostru script più bellu è mettemu in un schedariu eseguibile (chjamemu exec_pull) -

#!/bin/bash

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

Andemu à u nostru gitlab è creanu un schedariu in u prugettu .gitlab-ci.yml
Pudemu i seguenti in l'internu:

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 

Tuttu hè prontu. Avà -

  • fà un impegnu
  • Sò cuntentu chì tuttu funziona

Quandu si trasferisce .yml à altri prughjetti, basta à cambià u nome di u serviziu per riavvia è u nome di u cluster in quale l'ansible cumandamenti seranu eseguiti.

Source: www.habr.com

Add a comment