Το Ansible + auto git pull σε ένα σύμπλεγμα εικονικών μηχανών στο cloud

Το Ansible + auto git pull σε ένα σύμπλεγμα εικονικών μηχανών στο cloud

Καλή μέρα

Έχουμε πολλά συμπλέγματα cloud με μεγάλο αριθμό εικονικών μηχανών σε κάθε ένα. Φιλοξενούμε όλη αυτή την επιχείρηση στο Hetzner. Σε κάθε σύμπλεγμα έχουμε ένα κύριο μηχάνημα, λαμβάνεται ένα στιγμιότυπο από αυτό και διανέμεται αυτόματα σε όλες τις εικονικές μηχανές εντός του συμπλέγματος.

Αυτό το σχήμα δεν μας επιτρέπει να χρησιμοποιούμε κανονικά gitlab-runners, καθώς προκύπτουν πολλά προβλήματα όταν εμφανίζονται πολλοί ίδιοι εγγεγραμμένοι δρομείς, κάτι που μας ώθησε να βρούμε μια λύση και να γράψουμε αυτό το άρθρο/εγχειρίδιο.

Αυτή μάλλον δεν είναι η βέλτιστη πρακτική, αλλά αυτή η λύση φαινόταν όσο πιο βολική και απλή γίνεται.

Για το σεμινάριο, δείτε το cat.

Απαιτούμενα πακέτα στο κύριο μηχάνημα:

  • Πύθων
  • πηγαίνω
  • αρχείο με κλειδιά ssh

Η γενική αρχή της εφαρμογής του αυτόματου gut pull σε όλες τις εικονικές μηχανές είναι ότι χρειάζεστε ένα μηχάνημα στο οποίο θα εγκατασταθεί το Ansible. Από αυτό το μηχάνημα, το ansible θα στείλει εντολές git pull και θα επανεκκινήσει την υπηρεσία που έχει ενημερωθεί. Για τους σκοπούς αυτούς, δημιουργήσαμε μια ξεχωριστή εικονική μηχανή έξω από τα συμπλέγματα και εγκαταστήσαμε σε αυτήν:

  • Πύθων
  • αδύνατο
  • gitlab-runner

Από οργανωτικά ζητήματα - πρέπει να εγγραφείτε στο gitlab-runner, να κάνετε ssh-keygen, να ανεβάσετε το δημόσιο κλειδί ssh αυτού του μηχανήματος στο .ssh/authorized_keys στο κύριο μηχάνημα, ανοίξτε τη θύρα 22 για ansible στο κύριο μηχάνημα.

Τώρα ας ρυθμίσουμε το ansible

Αφού στόχος μας είναι να αυτοματοποιήσουμε οτιδήποτε είναι δυνατό. Στο αρχείο /etc/ansible/ansible.cfg θα αποσχολιάσουμε τη γραμμή host_key_checking = Falseώστε η ansible να μην ζητά επιβεβαίωση νέων μηχανημάτων.

Στη συνέχεια, πρέπει να δημιουργήσετε αυτόματα ένα αρχείο αποθέματος για το ansible, από όπου θα πάρει την ip των μηχανημάτων στα οποία πρέπει να κάνετε το git pull.

Δημιουργούμε αυτό το αρχείο χρησιμοποιώντας το API του Hetzner, μπορείτε να πάρετε τη λίστα των κεντρικών υπολογιστών από τη βάση δεδομένων AWS, Asure (έχετε κάπου ένα API για να εμφανίσετε τα μηχανήματα που λειτουργούν, σωστά;).

Η δομή του αρχείου αποθέματος είναι πολύ σημαντική για το Ansible· θα πρέπει να μοιάζει με αυτό:

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

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

Για να δημιουργήσουμε ένα τέτοιο αρχείο, θα φτιάξουμε ένα απλό σενάριο (ας το ονομάσουμε 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

Ήρθε η ώρα να ελέγξετε ότι το Ansible λειτουργεί και είναι φιλικό με τη λήψη διευθύνσεων IP:

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

Η έξοδος πρέπει να περιέχει τα ονόματα κεντρικών υπολογιστών των μηχανημάτων στα οποία εκτελέστηκε η εντολή.
Λίγα λόγια για τη σύνταξη:

  • /etc/ansible/./vm_list - δημιουργία λίστας μηχανημάτων
  • -i - απόλυτη διαδρομή προς το αρχείο αποθέματος
  • -m - πείτε στον ansible να χρησιμοποιήσει τη μονάδα κελύφους
  • -α είναι το επιχείρημα. Οποιαδήποτε εντολή μπορεί να εισαχθεί εδώ
  • ομάδα — το όνομα του συμπλέγματός σας. Εάν χρειάζεται να το κάνετε αυτό σε όλα τα συμπλέγματα, αλλάξτε την ομάδα σε όλα

Ας πάμε παρακάτω - ας προσπαθήσουμε να κάνουμε git pull στις εικονικές μας μηχανές:

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

Εάν στην έξοδο βλέπουμε ήδη ενημερωμένο ή ξεφόρτωμα από το αποθετήριο, τότε όλα λειτουργούν.

Τώρα για αυτό προορίζονταν όλα

Ας μάθουμε το σενάριό μας να εκτελείται αυτόματα κατά τη δέσμευση στον κύριο κλάδο στο gitlab

Αρχικά, ας κάνουμε το σενάριό μας πιο όμορφο και ας το βάλουμε σε ένα εκτελέσιμο αρχείο (ας το ονομάσουμε exec_pull) -

#!/bin/bash

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

Ας πάμε στο gitlab μας και ας δημιουργήσουμε ένα αρχείο στο έργο .gitlab-ci.yml
Μέσα βάζουμε τα εξής:

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 

Όλα είναι έτοιμα. Τώρα -

  • δεσμεύσου
  • Χαίρομαι που όλα λειτουργούν

Κατά τη μεταφορά του .yml σε άλλα έργα, χρειάζεται απλώς να αλλάξετε το όνομα της υπηρεσίας για επανεκκίνηση και το όνομα του συμπλέγματος στο οποίο θα εκτελεστούν οι εντολές ansible.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο