Ansible + auto git inserisce un cluster di macchine virtuali nel cloud

Ansible + auto git inserisce un cluster di macchine virtuali nel cloud

buongiorno

Disponiamo di diversi cluster cloud con un gran numero di macchine virtuali ciascuno. Ospitiamo l'intera faccenda presso Hetzner. In ogni cluster abbiamo una macchina master, da essa viene scattata un'istantanea e distribuita automaticamente a tutte le macchine virtuali all'interno del cluster.

Questo schema non ci consente di utilizzare normalmente i gitlab-runner, poiché sorgono molti problemi quando compaiono molti corridori registrati identici, il che ci ha spinto a trovare una soluzione alternativa e scrivere questo articolo/manuale.

Probabilmente non è la migliore pratica, ma questa soluzione sembrava la più comoda e semplice possibile.

Per il tutorial, vedere cat.

Pacchetti richiesti sulla macchina master:

  • python
  • git
  • file con chiavi ssh

Il principio generale per implementare il gut pull automatico su tutte le macchine virtuali è che è necessaria una macchina su cui verrà installato Ansible. Da questa macchina, ansible invierà comandi git pull e riavvierà il servizio che è stato aggiornato. A tal fine, abbiamo creato una macchina virtuale separata all'esterno dei cluster e su di essa abbiamo installato:

  • python
  • ansible
  • gitlab runner

Per questioni organizzative: è necessario registrare gitlab-runner, creare ssh-keygen, caricare la chiave ssh pubblica di questa macchina su .ssh/authorized_keys sulla macchina master, aprire la porta 22 per ansible sulla macchina master.

Ora configuriamo ansible

Poiché il nostro obiettivo è automatizzare tutto ciò che è possibile. In archivio /etc/ansible/ansible.cfg rimuoveremo il commento dalla riga host_key_checking = Falsein modo che ansible non chieda conferma di nuove macchine.

Successivamente, devi generare automaticamente un file di inventario per ansible, da dove prenderà l'ip delle macchine su cui devi eseguire git pull.

Generiamo questo file utilizzando l'API di Hetzner, puoi prendere l'elenco degli host dal tuo database AWS, Asure, (hai un'API da qualche parte per visualizzare le tue macchine in esecuzione, giusto?).

La struttura del file di inventario è molto importante per Ansible; dovrebbe assomigliare a questa:

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

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

Per generare un file di questo tipo, creeremo 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 verificare che Ansible funzioni e sia compatibile con la ricezione degli indirizzi IP:

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

L'output dovrebbe contenere i nomi host delle macchine su cui è stato eseguito il comando.
Qualche parola sulla sintassi:

  • /etc/ansible/./vm_list - genera un elenco di macchine
  • -i - percorso assoluto del file di inventario
  • -m - indica ad Ansible di utilizzare il modulo shell
  • -a è l'argomento. Qui è possibile inserire qualsiasi comando
  • gruppo: il nome del tuo cluster. Se è necessario eseguire questa operazione su tutti i cluster, modificare il gruppo in All

Andiamo oltre: proviamo a eseguire git pull sulle nostre 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 già aggiornato o in fase di scarico dal repository, allora funziona tutto.

Ecco a cosa serviva tutto

Insegniamo al nostro script ad essere eseguito automaticamente quando ci si impegna nel ramo master in gitlab

Innanzitutto, rendiamo il nostro script più bello e inseriamolo in un file eseguibile (chiamiamolo exec_pull) -

#!/bin/bash

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

Andiamo nel nostro gitlab e creiamo un file nel progetto .gitlab-ci.yml
All'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 -

  • prendere un impegno
  • Sono contento che tutto funzioni

Quando trasferisci il file .yml su altri progetti, ti basterà cambiare il nome del servizio da riavviare e il nome del cluster su cui verranno eseguiti i comandi ansible.

Fonte: habr.com

Aggiungi un commento