Ansible + Auto Git Pull im Cluster der virtuellen Maschine in der Cloud



Guten Tag


Wir haben mehrere Cloud-Cluster mit jeweils einer großen Anzahl virtueller Maschinen. All dieses Geschäft wird bei Hetzner'e gehostet. In jedem Cluster haben wir eine Master-Maschine, aus der ein Snapshot erstellt und automatisch an alle virtuellen Maschinen innerhalb des Clusters verteilt wird.

Dieses Schema erlaubt es uns nicht, Gitlab-Läufer normal zu verwenden, da viele Probleme auftreten, wenn viele identische registrierte Läufer auftreten, was uns dazu veranlasste, eine Problemumgehung zu finden und diesen Artikel / dieses Handbuch zu schreiben.

Dies ist wahrscheinlich nicht die beste Vorgehensweise, aber diese Lösung schien so bequem und einfach wie möglich zu sein.

Für das Tutorial bitte ich um eine Katze.

Erforderliche Pakete auf dem Master-Computer:

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

Das allgemeine Prinzip der Implementierung des automatischen Gut Pull 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 diesen Zwecken haben wir eine separate virtuelle Maschine außerhalb der Cluster erstellt und darauf installiert:

  • Python
  • ansible
  • Gitlab-Läufer

Aus organisatorischen Gründen: Sie müssen gitlab-running registrieren, ssh-keygen erstellen, den öffentlichen ssh-Schlüssel dieses Computers in .ssh/authorized_keys auf dem Master-Computer ablegen und Port 22 für ansible auf dem Master-Computer öffnen.

Konfigurieren Sie jetzt ansible


Denn unser Ziel ist es, alles zu automatisieren, was möglich ist. In der Datei /etc/ansible/ansible.cfg wir die Zeile host_key_checking = False damit ansible nicht nach einer Bestätigung neuer Computer fragt.

Als Nächstes müssen Sie automatisch eine Inventardatei für Ansible erstellen, von der aus die IP-Computer abgerufen werden, auf denen Sie Git Pull ausführen müssen.

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

Die Struktur der Inventardatei ist für Ansible sehr wichtig. Ihr Erscheinungsbild 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 Zeit zu überprüfen, ob ansible funktioniert und mit dem Empfänger der IP-Adressen befreundet ist:

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

Die Ausgabe sollte die Hostnamen der Computer erhalten, 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 den Ansible an, das Shell-Modul zu verwenden
  • -a ist ein Argument. Hier kann jedes Team eingetragen werden.
  • Gruppe ist der Name Ihres Clusters. Wenn Sie dies für alle Cluster tun müssen, ändern Sie die Gruppe in Alle

Machen Sie weiter - versuchen Sie, auf unseren virtuellen Maschinen Git Pull zu machen:

 /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 bereits sehen, dass es aktuell ist oder aus dem Repository entladen wird, funktioniert alles.

Nun, wofür war alles gedacht?


Wir bringen unserem Skript bei, dass es beim Festschreiben im Hauptzweig in gitlab automatisch ausgeführt wird

Lassen Sie uns zuerst 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 "$@" 

Wir gehen zu unserem Gitlab und erstellen im Projekt die Datei .gitlab-ci.yml
Im Inneren setzen wir Folgendes:

 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 -

  • Commit machen
  • freue dich, dass alles funktioniert

Wenn Sie .yml auf andere Projekte portieren, müssen Sie nur den Dienstnamen für den Neustart und den Namen des Clusters ändern, auf dem die ansible-Befehle ausgeführt werden.

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


All Articles