Καλή μέρα
Έχουμε πολλά συμπλέγματα 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