Ansible + Auto-Git-Pull in einem Cluster virtueller Maschinen in der Cloud

Ansible + Auto-Git-Pull in einem Cluster virtueller Maschinen in der Cloud

Guten Tag

Wir verfügen über mehrere Cloud-Cluster mit jeweils einer großen Anzahl virtueller Maschinen. Wir veranstalten dieses ganze Geschäft bei Hetzner. In jedem Cluster haben wir eine Master-Maschine, von dieser wird ein Snapshot erstellt und automatisch an alle virtuellen Maschinen innerhalb des Clusters verteilt.

Dieses Schema erlaubt uns nicht, Gitlab-Runner normal zu verwenden, da viele Probleme auftreten, wenn viele identische registrierte Runner auftauchen, was uns dazu veranlasste, einen Workaround zu finden und diesen Artikel/Handbuch zu schreiben.

Dies ist wahrscheinlich keine bewährte Methode, aber diese Lösung schien so bequem und einfach wie möglich zu sein.

Das Tutorial finden Sie unter Kat.

Erforderliche Pakete auf der Mastermaschine:

  • python
  • git
  • Datei mit SSH-Schlüsseln

Das allgemeine Prinzip der Implementierung des automatischen Gut-Pulls auf allen virtuellen Maschinen besteht darin, dass Sie eine Maschine benötigen, auf der Ansible installiert wird. Von diesem Computer aus sendet Ansible Git-Pull-Befehle und startet den aktualisierten Dienst neu. Zu diesem Zweck haben wir außerhalb der Cluster eine separate virtuelle Maschine erstellt und darauf installiert:

  • python
  • ansible
  • Gitlab-Runner

Aus organisatorischen Gründen müssen Sie Gitlab-Runner registrieren, SSH-Keygen erstellen und den öffentlichen SSH-Schlüssel dieses Computers hochladen .ssh/authorized_keys Öffnen Sie auf dem Master-Computer Port 22 für Ansible auf dem Master-Computer.

Jetzt konfigurieren wir Ansible

Denn unser Ziel ist es, alles Mögliche zu automatisieren. Im Ordner /etc/ansible/ansible.cfg Wir werden die Zeile auskommentieren host_key_checking = Falsedamit Ansible nicht nach einer Bestätigung neuer Maschinen fragt.

Als Nächstes müssen Sie automatisch eine Inventardatei für Ansible generieren, von der die IP-Adressen der Maschinen übernommen werden, auf denen Sie Git Pull ausführen müssen.

Wir generieren diese Datei mithilfe der Hetzner-API. Sie können die Liste der Hosts aus Ihrer AWS-, Asure-Datenbank übernehmen (Sie haben irgendwo eine API, um Ihre laufenden Maschinen anzuzeigen, oder?).

Die Struktur der Inventardatei ist für Ansible sehr wichtig; sie sollte wie folgt aussehen:

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

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

Um eine solche Datei zu generieren, erstellen wir ein einfaches Skript (nennen wir es 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

Es ist an der Zeit zu überprüfen, ob Ansible funktioniert und mit dem Empfang von IP-Adressen kompatibel ist:

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

Die Ausgabe sollte die Hostnamen der Maschinen enthalten, auf denen der Befehl ausgeführt wurde.
Ein paar Worte zur Syntax:

  • /etc/ansible/./vm_list – generiert eine Liste von Maschinen
  • -i – absoluter Pfad zur Inventardatei
  • -m – weist Ansible an, das Shell-Modul zu verwenden
  • -a ist das Argument. Hier kann ein beliebiger Befehl eingegeben werden
  • Gruppe – der Name Ihres Clusters. Wenn Sie dies auf allen Clustern tun müssen, ändern Sie die Gruppe in „Alle“.

Gehen wir weiter – versuchen wir, Git Pull auf unseren virtuellen Maschinen durchzuführen:

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

Wenn wir in der Ausgabe sehen, dass es bereits aktualisiert ist oder aus dem Repository entladen wird, funktioniert alles.

Nun, dafür war alles gedacht

Bringen wir unserem Skript bei, automatisch ausgeführt zu werden, wenn es sich auf den Master-Zweig in Gitlab festschreibt

Lassen Sie uns zunächst unser Skript schöner machen und es in eine ausführbare Datei einfügen (nennen wir es exec_pull) -

#!/bin/bash

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

Gehen wir zu unserem Gitlab und erstellen eine Datei im Projekt .gitlab-ci.yml
Wir haben Folgendes hineingelegt:

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 ist fertig. Jetzt -

  • eine Verpflichtung eingehen
  • Ich bin froh, dass alles funktioniert

Wenn Sie .yml in andere Projekte übertragen, müssen Sie lediglich den Namen des neu zu startenden Dienstes und den Namen des Clusters ändern, auf dem die Ansible-Befehle ausgeführt werden.

Source: habr.com

Kommentar hinzufügen