Ansible + auto git pull in virtual machine cluster in the cloud



Bonne journée


Nous avons plusieurs clusters cloud avec un grand nombre de machines virtuelles dans chacune. Toutes ces affaires sont hébergées chez Hetzner'e. Dans chaque cluster, nous avons une machine principale, un instantané en est créé et est automatiquement distribué à toutes les machines virtuelles du cluster.

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

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

Pour le tutoriel, je demande un chat.

Packages requis sur la machine maître:

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

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

  • python
  • ansible
  • gitlab-runner

Pour les problèmes d'organisation - vous devez enregistrer gitlab-runner, créer ssh-keygen, déposer la clé publique ssh de cette machine dans .ssh/authorized_keys sur la machine principale, ouvrir le port 22 pour ansible sur la machine principale.

Configurez maintenant ansible


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

Ensuite, vous devez générer automatiquement un fichier d'inventaire pour ansible, d'où il récupérera l'ip des machines sur lesquelles vous devez faire git pull.

Nous générons ce fichier en utilisant l'API Hetzner, mais vous pouvez prendre 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, son apparence devrait être la suivante:

 [] ip- ip- [2] ip- ip- 


Pour générer un tel fichier, vm_list 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 que ansible fonctionne et est ami avec le destinataire des adresses IP:

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

La sortie doit recevoir 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érer une liste de machines
  • -i - chemin absolu vers le fichier d'inventaire
  • -m - indique à l'ansible d'utiliser le module shell
  • -a est un argument. Toute équipe peut être inscrite ici.
  • groupe est le nom de votre cluster. Si vous devez faire sur tous les clusters, changez le groupe en all

Allez-y - essayez 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 nous voyons déjà à jour ou déchargement du référentiel dans la sortie, alors tout fonctionne.

Maintenant à quoi tout cela était destiné


Nous apprenons que notre script doit être exécuté automatiquement lors de la validation dans la branche master de gitlab

Tout d'abord, nous allons rendre notre script plus beau et le mettre dans un fichier exécutable (appelons-le exec_pull) -

 #!/bin/bash /etc/ansible/./get_vms && ansible -i /etc/ansible/cloud_ip -m shell -a "$@" 

Nous allons dans notre gitlab et dans le projet nous créons le fichier .gitlab-ci.yml
À l'intérieur, nous mettons ce qui suit:

 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 -

  • faire commettre
  • réjouis-toi que tout fonctionne

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

Source: https://habr.com/ru/post/fr472064/


All Articles