Ansible + auto git pull in een cluster van virtuele machines in de cloud

Ansible + auto git pull in een cluster van virtuele machines in de cloud

Goedendag

We hebben verschillende cloudclusters met een groot aantal virtuele machines in elk. Dit alles wordt gehost bij Hetzner. In elk cluster hebben we één master-machine, waarvan een snapshot wordt gemaakt en automatisch verspreid over alle virtuele machines binnen het cluster.

Dit schema laat ons niet normaal gebruikmaken van gitlab-runners, omdat er veel problemen optreden bij het verschijnen van meerdere geregistreerde runners, wat ons heeft aangezet tot het zoeken naar een alternatieve oplossing en het schrijven van dit artikel/manual.

Waarschijnlijk is dit niet de beste praktijk, maar deze oplossing lijkt het meest handig en eenvoudig.

Voor de tutorial zie het onderstaande.

Benodigde pakketten op de master-machine:

  • python
  • git
  • bestand met ssh-sleutels

Het algemene principe van het implementeren van automatische git pull op alle virtuele machines is dat er een machine nodig is waarop Ansible is geïnstalleerd. Van deze machine zal Ansible de git pull-commando's en de herstart van de geüpdatete service verzenden. We hebben hiervoor een aparte virtuele machine buiten de clusters gemaakt en daarop geïnstalleerd:

  • python
  • ansible
  • gitlab-runner

Wat betreft organisatorische vragen: het is nodig om de gitlab-runner te registreren, ssh-keygen uit te voeren, en de publieke ssh-sleutel van deze machine in te voegen in .ssh/authorized_keys op de master-machine, poort 22 op de master-machine openen voor Ansible.

Laten we Ansible nu instellen

Omdat ons doel is om alles te automatiseren wat mogelijk is. In het bestand /etc/ansible/ansible.cfg verwijderen we het commentaar voor de regel host_key_checking = False, zodat Ansible geen bevestiging vraagt voor nieuwe machines.

Daarna is het noodzakelijk om een inventarisbestand voor Ansible automatisch te genereren, waaruit het de IP-adressen haalt van de machines waarop git pull moet worden uitgevoerd.

We genereren dit bestand met behulp van de API van Hetzner; u kunt de lijst met hosts uit uw AWS, Azure, database halen (u heeft ergens een API voor het ophalen van uw actieve machines, toch?).

Voor Ansible is de structuur van het inventarisbestand erg belangrijk; het moet er als volgt uitzien:

[groep]
ip-adres
ip-adres

[groep2]
ip-adres
ip-adres

Om een dergelijk bestand te genereren, maken we een eenvoudig script (laten we het noemen 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

Het is tijd om te controleren of Ansible werkt en samenwerkt met het ophalen van IP-adressen:

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

In de output moeten we de hostnamen van de machines ontvangen waarop het commando is uitgevoerd.
Een paar woorden over de syntaxis:

  • /etc/ansible/./vm_list — генерируем список машин
  • -i — absolute pad naar het inventarisbestand
  • -m — we vertellen Ansible om de shell-module te gebruiken
  • -a — argument. Hier kunt u elke opdracht invoeren.
  • group — de naam van uw cluster. Als u het voor alle clusters wilt doen, verandert u group in all.

Laten we verder gaan — we proberen een git pull uit te voeren op onze virtuele machines:

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

Als we in de output already up to date of een dump uit de repository zien, betekent dit dat alles werkt.

Nu is het tijd voor waarvoor dit allemaal is bedacht.

We leren ons script automatisch uit te voeren bij een commit in de masterbranch in gitlab.

Eerst maken we ons script mooier en stoppen we het in een uitvoerbaar bestand (we noemen het exec_pull) —

#!/bin/bash

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

Laten we naar onze gitlab gaan en in het project een bestand aanmaken. .gitlab-ci.yml
Plaats het volgende erin:

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 

Alles is klaar. Nu —

  • maken we een commit.
  • vertrouwen dat alles werkt.

Bij het verplaatsen van .yml naar andere projecten is het voldoende om alleen de naam van de service voor herstart en de naam van het cluster waarmee de ansible-opdrachten zullen worden uitgevoerd te wijzigen.

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster