Ansible + auto git pull en un clúster de màquines virtuals al núvol

Ansible + auto git pull en un clúster de màquines virtuals al núvol

Bon dia

Tenim diversos clústers de núvol amb un gran nombre de màquines virtuals en cadascun. Acollim tot aquest negoci a Hetzner. A cada clúster tenim una màquina mestra, se'n pren una instantània i es distribueix automàticament a totes les màquines virtuals del clúster.

Aquest esquema no ens permet utilitzar gitlab-runners amb normalitat, ja que sorgeixen molts problemes quan apareixen molts corredors registrats idèntics, la qual cosa ens va portar a trobar una solució alternativa i escriure aquest article/manual.

Probablement no sigui la millor pràctica, però aquesta solució semblava tan còmoda i senzilla com era possible.

Per al tutorial, vegeu cat.

Paquets necessaris a la màquina mestra:

  • pitó
  • git
  • fitxer amb claus ssh

El principi general d'implementar l'extracció automàtica de l'intestí a totes les màquines virtuals és que necessiteu una màquina on s'instal·li Ansible. Des d'aquesta màquina, ansible enviarà ordres git pull i reiniciarà el servei que s'ha actualitzat. Amb aquests propòsits, vam crear una màquina virtual independent fora dels clústers i vam instal·lar-hi:

  • pitó
  • ansible
  • gitlab-runner

Des de problemes organitzatius: heu de registrar gitlab-runner, fer ssh-keygen, carregar la clau ssh pública d'aquesta màquina a .ssh/authorized_keys a la màquina mestra, obriu el port 22 per a l'ansible a la màquina mestra.

Ara configurem ansible

Ja que el nostre objectiu és automatitzar tot el que és possible. A l'arxiu /etc/ansible/ansible.cfg descomentarem la línia host_key_checking = Falsede manera que ansible no demana confirmació de noves màquines.

A continuació, heu de generar automàticament un fitxer d'inventari per a ansible, d'on agafarà la ip de les màquines en les quals heu de fer git pull.

Generem aquest fitxer mitjançant l'API d'Hetzner, podeu agafar la llista d'amfitrions de la vostra base de dades AWS, Asure (teniu una API en algun lloc per mostrar les vostres màquines en funcionament, oi?).

L'estructura del fitxer d'inventari és molt important per a Ansible; hauria de ser així:

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

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

Per generar aquest fitxer, farem un script senzill (anomenarem-lo 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

És hora de comprovar que Ansible funciona i és amigable amb la recepció d'adreces IP:

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

La sortida ha de contenir els noms d'amfitrió de les màquines en què s'ha executat l'ordre.
Unes quantes paraules sobre la sintaxi:

  • /etc/ansible/./vm_list - genera una llista de màquines
  • -i - camí absolut al fitxer d'inventari
  • -m - digueu a ansible que utilitzi el mòdul shell
  • -a és l'argument. Aquí es pot introduir qualsevol ordre
  • grup: el nom del vostre clúster. Si necessiteu fer-ho a tots els clústers, canvieu el grup a tots

Anem més enllà: intentem fer git pull a les nostres màquines virtuals:

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

Si a la sortida veiem ja actualitzat o descàrrega del repositori, aleshores tot funciona.

Ara per això estava destinat tot

Ensenyem el nostre script a executar-se automàticament quan ens comprometem amb la branca mestra a gitlab

Primer, fem que el nostre script sigui més bonic i el posem en un fitxer executable (anomenarem-lo exec_pull) -

#!/bin/bash

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

Anem al nostre gitlab i creem un fitxer al projecte .gitlab-ci.yml
Posem el següent a dins:

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 

Tot a punt. Ara -

  • fer un compromís
  • M'alegro que tot funcioni

Quan transferiu .yml a altres projectes, només heu de canviar el nom del servei per reiniciar-lo i el nom del clúster on s'executaran les ordres ansible.

Font: www.habr.com

Afegeix comentari