Introduction
Στις μέρες μας, οι διακομιστές πρέπει να δημιουργούνται και να καταστρέφονται πολύ συχνά. Αυτό συμβαίνει επειδή, μερικές φορές, οι διακομιστές δέχονται μεγάλο φόρτο εκτέλεσης, ενώ άλλες φορές ο φόρτος μειώνεται, σπαταλώντας έτσι τους πόρους του συστήματος. Ένα κοινό παράδειγμα είναι οι ιστότοποι ηλεκτρονικού εμπορίου κατά τη διάρκεια των εορταστικών περιόδων που προσελκύουν πολλή κίνηση. Όταν η φύση της εφαρμογής απαιτεί να είναι επεκτάσιμη, υπάρχει πάντα η ανάγκη για εργαλεία διαχείρισης ρυθμίσεων (configuration management) ώστε να διευκολύνεται η συνολική διαδικασία δημιουργίας διακομιστών. Ansible είναι ένα εξαιρετικό εργαλείο διαχείρισης ρυθμίσεων που αυτοματοποιεί τη δημιουργία διακομιστών χρησιμοποιώντας τυποποιημένες διαδικασίες, μειώνοντας τα ανθρώπινα σφάλματα.
Το Ansible δεν απαιτεί την εγκατάσταση ειδικού λογισμικού στους κόμβους των διακομιστών. Διαθέτει όλα τα απαραίτητα εργαλεία για τη συγγραφή, τη δημιουργία και τη διευκόλυνση της αυτοματοποίησης των σεναρίων (scripts). Αυτός ο οδηγός αναλύει πώς να χρησιμοποιήσετε το Ansible για να αυτοματοποιήσετε τα βήματα που περιέχονται στον οδηγό μας How to set up your Ubuntu server οδηγό.
Προαπαιτούμενα
Για να ολοκληρώσετε αυτόν τον οδηγό θα χρησιμοποιήσουμε το Ubuntu 20.04. Επιπλέον, θα χρειαστείτε επίσης:
-
An Ansible Control Node: Μια μηχανή Ubuntu που εκτελεί την τελευταία έκδοση Ubuntu. Το κύριο εκτελέσιμο (master binary) του Ansible πρέπει να είναι εγκατεστημένο και να εκτελείται σε αυτή τη μηχανή. Αυτή η μηχανή θα πρέπει να μπορεί να συνδεθεί στους κόμβους Ansible. Για αυτές τις συνδέσεις, πρέπει να χρησιμοποιήσετε κλειδιά SSH. Για να αποφύγετε προβλήματα κατά τη σύνδεση, βεβαιωθείτε ότι ο κόμβος ελέγχου Ansible έχει ενεργοποιημένο τείχος προστασίας (firewall). Εάν χρειάζεστε βοήθεια, δείτε το άρθρο μας Installing and Configuring Ansible on Ubuntu 20.04 blog.
-
Ansible Hosts: Απαιτούνται ένας ή περισσότεροι κεντρικοί υπολογιστές (hosts) για σύνδεση. Οι κεντρικοί υπολογιστές είναι ουσιαστικά οι διαχειριζόμενοι κόμβοι στο Ansible. Αυτοί πρέπει να είναι διακομιστές Ubuntu.
Functions of the Ansible Playbook
Μπορείτε να ρυθμίσετε χειροκίνητα όλα τα παρακάτω βήματα. Ωστόσο, εμείς θα αυτοματοποιήσουμε αυτήν την εκτέλεση. Όταν εκτελείτε αυτό το playbook, θα πραγματοποιήσει τις παρακάτω λειτουργίες στη μηχανή σας:
-
Θα εγκαταστήσει το aptitude, το οποίο προτιμάται από το Ansible ως διαχειριστής πακέτων του.
-
Θα δημιουργήσει μια ομάδα διαχειριστών wheel με δικαιώματα sudo χωρίς κωδικό πρόσβασης.
-
Θα δημιουργήσει έναν νέο χρήστη sudo.
-
Θα αντιγράψει ένα τοπικό κλειδί SSH στο authorized_keys. Αυτό θα χρησιμοποιηθεί για έναν νέο διαχειριστή σε έναν απομακρυσμένο κεντρικό υπολογιστή.
-
Θα απενεργοποιήσει τον έλεγχο ταυτότητας με βάση τον κωδικό πρόσβασης για τον χρήστη root.
-
Θα εγκαταστήσει τα απαραίτητα πακέτα.
-
Θα ρυθμίσει το UFW firewall ώστε να επιτρέπει μόνο συνδέσεις SSH. Οποιεσδήποτε άλλες συνδέσεις θα διακόπτονται.
Μόλις ολοκληρωθεί η εκτέλεση του Playbook, ένας νέος χρήστης θα είναι διαθέσιμος. Μπορείτε να χρησιμοποιήσετε αυτόν τον χρήστη για να συνδεθείτε στο σύστημα.
Using the Ansible Playbook
Για να ρυθμίσετε τον διακομιστή, θα χρειαστείτε το playbook αρχικής ρύθμισης διακομιστή και τις εξαρτήσεις του. Εάν το χρησιμοποιείτε για πρώτη φορά, τότε θα πρέπει να κλωνοποιήσετε το αποθετήριο χρησιμοποιώντας τον παρακάτω σύνδεσμο:
|
1 |
cd ~ |
|
1 |
git clone https://github.com/do-community/ansible-playbooks.git |
|
1 |
cd ansible-playbooks |
Εάν το αποθετήριο υπάρχει ήδη στο σύστημά σας, εκτελέστε την παρακάτω εντολή για να λάβετε τις τελευταίες ενημερώσεις:
|
1 |
cd ~/ansible-playbooks |
|
1 |
git pull |
Θα λάβετε την παρακάτω δομή αρχείων στη μηχανή σας:
|
1 2 3 4 |
setup |-- playbook.yml |__vars |-- default,yml |
Παρακάτω είναι η περιγραφή των αρχείων:
-
vars/default.yml: Αυτό το αρχείο περιέχει τις μεταβλητές για τη ρύθμιση του κόμβου Ansible.
-
playbook.yml: Αυτό το αρχείο περιέχει τις εργασίες που πρόκειται να εκτελεστούν στον διακομιστή.
Το αρχείο vars/default.yml μοιάζει κάπως έτσι:
|
1 2 3 4 |
--- create_user: my_user copy_local_key: "{{ lookup('file', lookup('env','HOME') + '/.ssh/id_rsa.pub') }}" sys_packages: [ 'curl', 'vim', 'git', 'ufw'] |
Παρακάτω είναι η περιγραφή αυτών των μεταβλητών. Εάν επιθυμείτε να τις επεξεργαστείτε, μπορείτε να αντικαταστήσετε τις τιμές τους με τις δικές σας:
-
create_user: Αυτός είναι ο χρήστης που δημιουργείται. Αυτός ο χρήστης έχει sudo προνόμια.
-
copy_local_key: Αυτό περιέχει τη διαδρομή προς το τοπικό δημόσιο κλειδί SSH. Θα αντιγραφεί στον απομακρυσμένο διακομιστή ως authorized_key.
-
sys_packages: Εάν θέλετε να εγκαταστήσετε ένα ή περισσότερα πακέτα στον διακομιστή σας, αναφέρετέ τα εδώ ως πίνακα.
Αφού επεξεργαστείτε αυτό το αρχείο, αποθηκεύστε τα περιεχόμενα. Μετά από αυτό, στο nano, πατήστε CTRL+X , Y. Στη συνέχεια, ENTER για να αποθηκεύσετε τα περιεχόμενα του αρχείου.
Τώρα είστε έτοιμοι να εκτελέσετε αυτό το playbook σε πολλούς διακομιστές. Από προεπιλογή, τα Playbooks είναι έτοιμα να εκτελεστούν στους διακομιστές του inventory σας. Εάν θέλετε να χρησιμοποιήσετε το Playbook σε ορισμένους συγκεκριμένους διακομιστές, μπορείτε να χρησιμοποιήσετε τη -l σημαία. Τώρα υποθέστε ότι ο απομακρυσμένος διακομιστής έχει πολλούς χρήστες, μπορείτε να χρησιμοποιήσετε τη -u σημαία για να αναφέρετε με ποιον χρήστη θα συνδεθείτε.
Εάν το όνομα του διακομιστή σας είναι my_server και το όνομα χρήστη είναι my_user, τότε εκτελέστε την παρακάτω εντολή για εκτέλεση στους κόμβους Ansible:
|
1 |
ansible-playbook playbook.yml -l my_server -u my_user |
Θα λάβετε ένα αποτέλεσμα παρόμοιο με το εξής:
|
1 2 3 4 5 6 7 8 9 |
PLAY [all] ***************************************************************************************************************************** TASK [Gathering Facts] ***************************************************************************************************************** ok: [my_server] TASK [Install Prerequisites] *********************************************************************************************************** changed: [my_server] TASK [Make sure we have a 'wheel' group] *********************************************************************************************** changed: [my_server] TASK [Allow 'wheel' group to have passwordless sudo] *********************************************************************************** changed: [my_server] |
Μόλις ολοκληρωθεί αυτή η εκτέλεση, μπορείτε να συνδεθείτε χρησιμοποιώντας την παρακάτω εντολή:
|
1 |
ssh my_user@server_host_or_IP |
Θυμηθείτε my_user ήταν το όνομα που είχαμε χρησιμοποιήσει στο αρχείο vars/default.yml. Θα χρειαστεί επίσης να αλλάξετε την IP του διακομιστή στην IP του δικού σας διακομιστή στην παραπάνω εντολή. Εάν είχατε ορίσει τη μεταβλητή copy_local_key ώστε να δείχνει σε κάποιο προσαρμοσμένο κλειδί SSH, καθορίστε την τοποθεσία με τον -i διακόπτη:
|
1 |
ssh my_user@server_host_or_IP -i ~/.ssh/ansible_controller_key |
Στη συνέχεια, συνδεθείτε στον διακομιστή σας για να ελέγξετε τους κανόνες του τείχους προστασίας UFW:
|
1 |
sudo ufw status |
Θα λάβετε το παρακάτω αποτέλεσμα:
|
1 2 3 4 5 |
Κατάσταση: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) |
Το παραπάνω αποτέλεσμα επιβεβαιώνει ότι το τείχος προστασίας UFW έχει ρυθμιστεί επιτυχώς. Αυτό ήταν το τελευταίο βήμα στο playbook μας. Εάν αυτό εκτελεστεί σωστά, σημαίνει ότι η εκτέλεση ήταν επιτυχής.
Τα περιεχόμενα του Ansible Playbook
Τα αρχεία Playbook που χρησιμοποιήσαμε σε αυτόν τον οδηγό φιλοξενούνται στο ansible-playbooks/setup_ubuntu1804 at master · do-community/ansible-playbooks · GitHub. Εάν επιθυμείτε να δείτε τα περιεχόμενα κάθε αρχείου για να τα χρησιμοποιήσετε ή να τα επεξεργαστείτε, κάντε κλικ στο κουμπί Raw στο επάνω μέρος κάθε σεναρίου.
Για γρήγορη αναφορά, θα μοιραστούμε τα πλήρη περιεχόμενα του Playbook μαζί με τα σχετικά αρχεία:
-
vars/default.yml
Αυτό το αρχείο περιέχει τις τιμές που θα χρησιμοποιηθούν από τις εργασίες του playbook. Αυτές περιλαμβάνουν τιμές όπως το όνομα του χρήστη, προνόμια, κλειδιά SSH, πακέτα προς εγκατάσταση ως μέρος της αρχικής ρύθμισης, και ούτω καθεξής:
|
1 2 3 4 |
--- create_user: my_user copy_local_key: "{{ lookup('file', lookup('env','HOME') + '/.ssh/id_rsa.pub') }}" sys_packages: [ 'curl', 'vim', 'git', 'ufw'] |
-
playbook.yml
Το playbook.yml αρχείο περιέχει τις εργασίες που πρόκειται να εκτελεστούν. Πρώτον, το αρχείο παραθέτει όλους τους κεντρικούς υπολογιστές (hosts) που πρόκειται να στοχοποιηθούν. Εάν θέλετε να καθορίσετε όλους τους διακομιστές, ορίστε την τιμή αυτού του κλειδιού σε all. Στη συνέχεια, εάν θέλετε να καθορίσετε τις εργασίες που θα εκτελεστούν χρησιμοποιώντας προνόμια sudo, ορίζετε την τιμή της μεταβλητής become: true. Τέλος, αυτό το αρχείο πρέπει να περιλαμβάνει τα περιεχόμενα του παραπάνω vars/default.yml αρχείου. Τα συμπεριλαμβάνουμε στη συνέχεια για να φορτώσουμε τις ρυθμίσεις από αυτό το αρχείο:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
--- - hosts: all become: true vars_files: - vars/default.yml tasks: - name: Εγκατάσταση Προαπαιτούμενων apt: name=aptitude update_cache=yes state=latest force_apt_get=yes # Ρύθμιση Ομάδας Sudo - name: Βεβαιωθείτε ότι έχουμε μια a 'wheel' ομάδα group: name: wheel state: present - name: Να επιτρέπεται 'wheel' στην ομάδα να έχει sudo χωρίς κωδικό πρόσβασης lineinfile: path: /etc/sudoers state: present regexp: '^%wheel' line: '%wheel ALL=(ALL) NOPASSWD: ALL' validate: '/usr/sbin/visudo -cf %s' # Ρύθμιση Χρήστη + Κλειδιού - name: Δημιουργία ενός νέου απλού χρήστη με προνόμια sudo user: name: "{{ create_user }}" state: present groups: wheel append: true create_home: true shell: /bin/bash - name: Ορισμός εξουσιοδοτημένου κλειδιού για απομακρυσμένο χρήστη authorized_key: user: "{{ create_user }}" state: present key: "{{ copy_local_key }}" - name: Απενεργοποίηση ταυτοποίησης με κωδικό πρόσβασης για τον root lineinfile: path: /etc/ssh/sshd_config state: present regexp: '^#?PermitRootLogin' line: 'PermitRootLogin prohibit-password' # Εγκατάσταση Πακέτων - name: Ενημέρωση apt apt: update_cache=yes - name: Εγκατάσταση απαιτούμενων πακέτων συστήματος apt: name={{ sys_packages }} state=latest # Ρύθμιση UFW - name: UFW - - Να επιτρέπονται οι συνδέσεις SSH ufw: rule: allow name: OpenSSH - name: UFW - - Να απορρίπτεται όλη η άλλη εισερχόμενη κίνηση από προεπιλογή ufw: state: enabled policy: deny direction: incoming |
Συμπέρασμα
Η αυτοματοποίηση είναι βασική στην πληροφορική (IT), διασφαλίζοντας ότι όλες οι διαδικασίες είναι απαλλαγμένες από σφάλματα και ακολουθούν πρότυπες πρακτικές και διαδικασίες. Δεδομένου ότι το περισσότερο λογισμικό σήμερα παρέχεται μέσω του διαδικτύου έχοντας κατανεμημένο χαρακτήρα, η δημιουργία νέων διακομιστών έχει γίνει μια καθημερινή εργασία, π.χ. για διαφορετικά περιβάλλοντα όπως staging ή παραγωγής, ή ακόμα και περιβάλλοντα επίδειξης (demo).
Σε αυτόν τον οδηγό, δείξαμε πώς να επιτύχετε την αυτοματοποίηση των διακομιστών χρησιμοποιώντας το Ansible, ένα ισχυρό και εύχρηστο εργαλείο που μπορεί να σας εξοικονομήσει πολύ χρόνο.
Καλή συνέχεια!
Σχόλια
Δεν υπάρχουν σχόλια ακόμα. Γράψτε το πρώτο.