Ansible + auto git pull dans un cluster de machines virtuelles dans le cloud

Ansible + auto git pull dans un cluster de machines virtuelles dans le cloud

Passez une bonne journée

Nous disposons de plusieurs clusters cloud avec un grand nombre de machines virtuelles dans chacun. Nous hébergeons toute cette affaire chez Hetzner. Dans chaque cluster, nous avons une machine maître, un instantané en est pris et automatiquement distribué à toutes les machines virtuelles du cluster.

Ce schéma ne nous permet pas d'utiliser normalement les gitlab-runners, car de nombreux problèmes surviennent lorsque de nombreux runners identiques enregistrés apparaissent, ce qui nous a incité à trouver une solution de contournement et à rédiger cet article/manuel.

Ce n’est probablement pas la meilleure pratique, mais cette solution semble aussi pratique et simple que possible.

Pour le tutoriel, veuillez consulter cat.

Packages requis sur la machine maître :

  • python
  • jet
  • fichier avec les clés ssh

Le principe général de la mise en œuvre du gut pull automatique sur toutes les machines virtuelles est que vous avez besoin d'une machine sur laquelle Ansible sera installé. À partir de cette machine, ansible enverra des commandes git pull et redémarrera le service qui a été mis à jour. À ces fins, nous avons créé une machine virtuelle distincte en dehors des clusters et y avons installé :

  • python
  • ansible
  • gitlab-runner

Pour des problèmes d'organisation - vous devez enregistrer gitlab-runner, créer ssh-keygen, télécharger la clé ssh publique de cette machine sur .ssh/authorized_keys sur la machine maître, ouvrez le port 22 pour ansible sur la machine maître.

Maintenant, configurons ansible

Puisque notre objectif est d’automatiser tout ce qui est possible. Dans le fichier /etc/ansible/ansible.cfg nous allons décommenter la ligne host_key_checking = Falseafin qu'ansible ne demande pas de confirmation des nouvelles machines.

Ensuite, vous devez générer automatiquement un fichier d'inventaire pour ansible, à partir duquel il prendra l'adresse IP des machines sur lesquelles vous devez effectuer git pull.

Nous générons ce fichier en utilisant l'API de Hetzner, vous pouvez récupérer la liste des hôtes de votre base de données AWS, Asure (vous avez une API quelque part pour afficher vos machines en cours d'exécution, non ?).

La structure du fichier d'inventaire est très importante pour Ansible ; elle devrait ressembler à ceci :

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

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

Pour générer un tel fichier, nous allons créer un script simple (appelons-le 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

Il est temps de vérifier qu'Ansible fonctionne et est compatible avec la réception d'adresses IP :

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

La sortie doit contenir les noms d'hôte des machines sur lesquelles la commande a été exécutée.
Quelques mots sur la syntaxe :

  • /etc/ansible/./vm_list - génère une liste de machines
  • -i - chemin absolu vers le fichier d'inventaire
  • -m - indique à Ansible d'utiliser le module shell
  • -a est l'argument. N'importe quelle commande peut être saisie ici
  • group — le nom de votre cluster. Si vous devez faire cela sur tous les clusters, remplacez le groupe par tous

Allons plus loin - essayons de faire git pull sur nos machines virtuelles :

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

Si dans la sortie nous voyons déjà à jour ou en cours de déchargement du référentiel, alors tout fonctionne.

Maintenant, c'est à cela que tout était destiné

Apprenons à notre script à s'exécuter automatiquement lors de la validation dans la branche master dans gitlab

Tout d'abord, rendons notre script plus beau et mettons-le dans un fichier exécutable (appelons-le exec_pull) -

#!/bin/bash

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

Allons sur notre gitlab et créons un fichier dans le projet .gitlab-ci.yml
Nous mettons ce qui suit à l’intérieur :

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 

Tout est prêt. Maintenant -

  • s'engager
  • je suis content que tout fonctionne

Lors du transfert de .yml vers d'autres projets, il vous suffit de changer le nom du service à redémarrer et le nom du cluster sur lequel les commandes ansible seront exécutées.

Source: habr.com

Ajouter un commentaire