
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
):
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) -
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.