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 = False
afin 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