Ansible + auto git pull nel cluster di macchine virtuali nel cloud

Ansible + auto git pull nel cluster di macchine virtuali nel cloud

Buongiorno

Abbiamo diversi cluster cloud con un gran numero di macchine virtuali in ciascuno. Tutto questo è ospitato da Hetzner. In ogni cluster abbiamo una macchina master, da cui viene creato uno snapshot e distribuito automaticamente a tutte le virtual machine all'interno del cluster.

Questo schema non ci consente di utilizzare correttamente i gitlab-runner, poiché sorgono molti problemi con la presenza di molti runner registrati identici, il che ci ha spinti a trovare una soluzione alternativa e a scrivere questo articolo/manuale.

Probabilmente, non si tratta di una best practice, ma questa soluzione ci è sembrata la più comoda e semplice.

Per il tutorial, vi prego di fare clic per leggere di più.

Pacchetti necessari sulla macchina master:

  • python
  • git
  • file con le chiavi SSH

Il principio generale per realizzare un git pull automatico su tutte le macchine virtuali consiste nel dover avere una macchina su cui sia installato Ansible. Da questa macchina, ansible invierà i comandi git pull e riavviare il servizio che è stato aggiornato. Abbiamo creato per questi scopi una macchina virtuale separata al di fuori dei cluster, su cui abbiamo installato:

  • python
  • ansible
  • gitlab-runner

Per questioni organizzative, è necessario registrare il gitlab-runner, eseguire ssh-keygen e inserire la chiave ssh pubblica di questa macchina in .ssh/authorized_keys sulla macchina master, aprire la porta 22 sulla macchina master per ansible.

Ora configuriamo ansible

Dato che il nostro obiettivo è automatizzare tutto ciò che è possibile. Nel file /etc/ansible/ansible.cfg decommenteremo la riga host_key_checking = False, in modo che ansible non richieda conferma per le nuove macchine.

Inoltre, è necessario generare automaticamente un file di inventario per ansible, da cui prenderà gli indirizzi IP delle macchine su cui eseguire git pull.

Generiamo questo file utilizzando l'API di Hetzner; voi potete ottenere l'elenco degli host dalla vostra AWS, Azure, DB (avete un'API per visualizzare le vostre macchine avviate, giusto?).

Per Ansible, è molto importante la struttura del file di inventario; deve apparire nel seguente modo:

[gruppo]
ip-indirizzo
ip-indirizzo

[gruppo2]
ip-indirizzo
ip-indirizzo

Per generare un tale file, realizziamo un semplice script (chiamiamolo 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

È ora di controllare che ansible funzioni e si interfacci con il recupero degli indirizzi IP:

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

Nell'output dovremmo ottenere i nomi host delle macchine su cui è stata eseguita la comando.
Qualche parola sulla sintassi:

  • /etc/ansible/./vm_list — генерируем список машин
  • -i — percorso assoluto al file di inventario
  • -m — indichiamo ad Ansible di usare il modulo shell
  • -a — argomento. Qui puoi inserire qualsiasi comando
  • group — nome del tuo cluster. Se vogliamo farlo su tutti i cluster, cambiamo group in all

Andiamo avanti — proviamo a fare git pull sui nostri macchine virtuali:

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

Se nell'output vediamo already up to date o l'uscita dal repository, significa che tutto funziona.

Ora, ciò per cui era stato pensato tutto questo

Insegneremo al nostro script di essere eseguito automaticamente al commit nel branch master in GitLab

Iniziamo a rendere il nostro script più bello e mettiamolo in un file eseguibile (lo chiameremo exec_pull) —

#!/bin/bash

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

Andiamo su GitLab e creiamo un file nel progetto .gitlab-ci.yml
Al suo interno inseriamo quanto segue:

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 

Tutto è pronto. Ora —

  • facciamo un commit
  • sperando che tutto funzioni

Quando trasferisci .yml in altri progetti, basta cambiare solo il nome del servizio per il riavvio e il nome del cluster su cui verranno eseguiti i comandi Ansible.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster