Puppet: Διαχειριστείτε εύκολα όλους τους υπολογιστές στο δίκτυό σας!

dimitris | Τετ, 07/25/2018 - 20:32 | 26'

Ποιος είπε ότι η διαχείριση του οικιακού σας δικτύου δεν είναι απλό πράγμα; Δείτε πως μπορείτε να κάνετε τα πάντα σε οποιονδήποτε υπολογιστή με πολύ απλά βήματα, χάρις στο Puppet, χωρίς καν να σηκώνεστε από την καρέκλα...

Του Κωνσταντίνου Λιβιεράτου

Οι περισσότεροι χρήστες χρησιμοποιούν τον προσωπικό τους υπολογιστή προκειμένου να εξυπηρετηθούν και να κάνουν τις δουλειές τους. Άλλοι όμως, πιο «ψαγμένοι» χρήστες, με τον καιρό διαμορφώνουν ένα δίκτυο υπολογιστών για ποικίλους λόγους. Το πιο σύνηθες , πια, είναι ένα οικιακό δίκτυο που περιλαμβάνει 1 ή 2 προσωπικούς υπολογιστές, ένα «κατεβαστήρι», ένα HomeTheaterPC, ίσως κι έναν file server. Κάθε δίκτυο διαμορφώνεται ανάλογα με τις ανάγκες του καθενός, ενώ άλλοι μπορεί λόγω της δουλειάς τους να έχουν αρκετούς servers ανά τον κόσμο, και ουσιαστικά δημιουργούν ένα δίκτυο για να τους διαχειρίζονται κεντρικά/συνολικά. Ο κάθε κόμβος (node) σε ένα δίκτυο, τρέχει κάποια διανομή και ανάλογα με την χρήση η διανομή διαφέρει από κόμβο σε κόμβο, στον κόσμο του Linux.

Η διαχείριση λοιπόν ενός δικτύου, που μπορεί να αφορά από την απλή αντιγραφή αρχείων μέχρι updates στο OS του κάθε κόμβου γίνεται κουραστική αν ο διαχειριστής είναι υποχρεωμένος να ασχοληθεί ξεχωριστά με τον κάθε κόμβο και να εκτελέσει τις λειτουργίες που θέλει. Αντίθετα θα μπορούσε να είναι πολύ πιο εύκολη η διαχείριση του οικιακού του δικτύου χρησιμοποιώντας το Puppet, ένα εργαλείο που επιτρέπει την κεντρική διαχείριση ενός δικτύου υπολογιστών, παρέχοντας έτσι την δυνατότητα εξοικονόμησης χρόνου αλλά και κόπου.

Αναλυτικότερα, το Puppet είναι ένα ανοικτού κώδικα εργαλείο που διευκολύνει την διαχείριση ρυθμίσεων μεταξύ πολλών κόμβων (nodes) και είναι γραμμένο στην γλώσσα προγραμματισμού Ruby. Επιτρέπει εντολές για system administrating και μπορείτε συνεπώς να κάνετε αλλαγές στο δίκτυο σας, το cluster σας αλλά και να διαχειριστείτε το λογισμικό που τρέχει σε καθένα από τα μηχανήματα σας. Πολλοί admins το χρησιμοποιούν για να αυτοματοποιήσουν τις εργασίες στο δίκτυο των server τους. Δηλαδή, είναι ένα εργαλείο αυτοματοποιημένων αλλαγών-ρυθμίσεων που επιτρέπει και διευκολύνει την κεντρική διαχείριση των *nix συστημάτων σε ένα δίκτυο. Πιο συγκεκριμένα, με το Puppet μπορείτε «κεντρικά» να διαχειριστείτε ποικίλους τομείς των συστημάτων όπως: αρχεία, πακέτα, χρήστες, services, cron, mounts, και αλλά. Στο συγκεκριμένο άρθρο, θα αναφερθούμε στην διαχείριση ενός LAN με το Puppet.

Ο σκοπός του Puppet, με άλλα λόγια, είναι να μειώσει την πολυπλοκότητα και την μη-μεταφερσιμότητα του shell scripting στην διαχείριση συστημάτων Unix / Linux. Για παράδειγμα αν ο διαχειριστής του δικτύου θέλει να εγκαταστήσει την PostgreSQL, αυτή η διαδικασία θα γίνει σχεδόν εξολοκλήρου αυτοματοποιημένα, χωρίς να έχει σημασία το αν οι διανομές που τρέχουν στα συστήματα του είναι Fedora ή Ubuntu ή Arch.

Αυτό το εργαλείο αποτελείται από δυο διαφορετικά κομμάτια: τον puppermaster (ο server component του puppet από τον οποίο ο admin διαχειρίζεται τους υπόλοιπους κόμβους) και τα puppet clients (οι «puppetd» υπολογιστές, οι κόμβοι που διαχειρίζονται και ρυθμίζονται από τον puppermaster).
Αφού αναφερθήκαμε στα πιο σημαντικά στοιχειά γενικά για το Puppet, ας δούμε πως μπορούμε στην πράξη να το εγκαταστήσουμε και να το χρησιμοποιήσουμε στο δικό μας LAN.

Προκειμένου να λειτουργήσει σε κάθε συσκευή του LAN, ώστε να μπορούμε να την διαχειριστούμε, το Puppet πρέπει να συνδεθεί με την κάθε συσκευή (με SSH ή telnet), να γίνει authentication, να ελέγξει την δεδομένη κατάσταση της συσκευής και να κάνει τις απαραίτητες αλλαγές προκειμένου να την φέρει στην επιθυμητή κατάσταση , αφού εκτελέσει τις απαραίτητες λειτουργίες. Το Puppet πρέπει να κάνει τις προαναφερθείσες λειτουργίες , έτσι ώστε να υπάρξει μια εφαρμογή που ονομάζεται "puppet device", με το οποίο ο administrator μπορεί να διαχειριστεί εύκολα κάθε συσκευή στο δίκτυο του. Αυτή η εφαρμογή θα πρέπει να τρέχει σε κάθε node, και δρα ως ένας «smart proxy» μεταξύ του puppetmaster και των διαχειριζομένων συσκευών. Προκειμένου να επιτευχθεί αυτό, κάθε puppet device θα συνδέεται διαδοχικά με τον puppetmaster και θα κάνει ένα request για έναν κατάλογο, ο όποιος θα περιέχει μόνο network device resources. Κάθε puppet device τότε θα δημιουργεί ένα report back στον puppetmaster για κάθε αλλαγή ή σφάλμα στον κόμβο.

1 Μια γενική απεικόνιση του τρόπου λειτουργίας του Puppet

Αυτά όσον αφορά θεωρητικά τον τρόπο λειτουργίας του Puppet στο δίκτυο μας. Στην πράξη τώρα!

Πρώτα απ’ ολα, θα πρέπει να εγκαταστήσουμε και να ρυθμίσουμε τον puppetmaster, δηλαδή τον server μας από τον οποίο θα γίνεται η συνολική διαχείριση του δικτύου. Αυτό μπορούμε να το κάνουμε πληκτρολογώντας την ακόλουθη εντολή στο τερματικό μας:

$ sudo apt-get install puppetmaster

Το service αρχικά δεν μπορεί να εκκινήσει, λόγω του ότι δεν υπάρχουν ακόμη διαθέσιμα puppet manifests για την διαχείριση του δικτύου. Η puppet device ακόμα δεν τρέχει ως «δαίμονας» (daemon), οπότε ο καλύτερος τρόπος για να το τρέξουμε είναι να το προσθέσουμε μέσω cron στο schedule.

Η κάθε puppet device «γνωρίζει» τις συσκευές που θα διαχειρίζεται διαβάζοντας ένα απλό αρχείο ρυθμίσεων,το /etc/puppet/device.conf. Το συγκεκριμένο αρχείο περιλαμβάνει τη λίστα των συσκευών που θα διαχειριζόμαστε από το δεδομένο puppet device, και έχει την εξής μορφή:

[device1 certname] <--το certname της συσκευής
type cisco <--ο τύπος της συσκευής
url ssh://puppetuser:[email protected]/ <--το URL της συσκευής

Το πιο σημαντικό πράγμα είναι να ρυθμιστεί σωστά το device URL, που περιέχει τα στοιχεία για την μέθοδο πρόσβασης στη συσκευή (πχ: SSH, telnet), τον χρήστη και το password για να συνδεθεί, το hostname της προαναφερθείσας συσκευής στο δίκτυο, κάθε ενδεχόμενη TCP port και να «ενεργοποιεί» την διαδικασία απαίτησης κωδικού για τους unprivileged χρήστες.

Όταν έρθει η στιγμή να χρησιμοποιήσουμε τον server (puppetmaster) στην πράξη θα θέλουμε να είναι σε θέση να «σερβίρει» αρχεία τα οποία ενδεχομένως να αντιγράφονται στους διαχειριζόμενους κόμβους του δικτύου, αλλά και να έχουμε μια λίστα «εντολών» (actions) που θα εφαρμόζονται στους hosts.

Από προεπιλογή, το file-serving είναι απενεργοποιημένο, επομένως θα πρέπει να το ενεργοποιήσουμε, κάτι το οποίο επιτυγχάνεται τροποποιώντας το αρχείο /etc/puppet/fileserver.conf. Στην περίπτωση της δοκιμαστικής εγκατάστασης μας, θέλουμε να σερβίρουμε ένα αρχείο στο δίκτυο 192.168.2.x , οπότε οι αλλαγές που θα γίνουν στο αρχείο αυτό είναι οι εξής:

[files]
path /etc/puppet/files
allow 192.168.2.0/24

Αυτό σημαίνει ότι κάθε host στο range διευθύνσεων 192.168.2.0/24, μπορεί να «τραβήξει» αρχεία από τον φάκελο /etc/puppet/files.

Το επόμενο πράγμα που πρέπει να κάνουμε είναι να δημιουργήσουμε ένα αρχείο manifest (manifest file), το οποίο θα περιέχει μέσα τα resources για τις απαραίτητες αλλαγές:

$ sudo mkdir -p /etc/puppet/manifests/

Το ακόλουθο manifest file το ονομάζουμε τώρα site.pp και προσθέτουμε σε αυτό τα εξής:

class class1 {
 file { "/tmp/file1":
  ensure => present,
  mode => 644,
  owner => root,
  group => root
  }
}
node client2 { //γράφουμε σε ποιον κόμβο να τρέξει την κλάση class1 
 include class1
}

Ας εξηγήσουμε πιο αναλυτικά το περιεχόμενο αυτού του αρχείου: στην πρώτη γραμμή, γίνεται ο ορισμός του ονόματος της κλάσης, που θα εισάγεται αργότερα και θα εκτελείται στους κόμβους του δικτύου. Ιδιαίτερη προσοχή θα πρέπει να δοθεί στο file. Αρχικά, ο ορισμός file είναι ένας από τους «τύπους ορισμών» που γίνονται κατανοητοί από το Puppet. Πιο συγκεκριμένα, επιτρέπει εντολές σχετικά με την αντιγραφή αρχείων από τον puppet server και την διόρθωση/ανανέωση (και ορισμό) του ownership ή/και των δικαιωμάτων (permissions) ήδη υπαρχόντων αρχείων. Άλλοι συνηθισμένοι τύποι ορισμών που αναγνωρίζονται εδώ είναι οι augeas, cron, checksum, exec και filebucket (ιδιαίτερα χρήσιμο για την δημιουργία backup repositories στο δίκτυο) στους οποίους δεν θα αναφερθούμε αυτή τη φορά.

Τώρα μπορούμε να εκκινήσουμε τον server:

sudo /etc/init.d/puppetmaster restart

Ρύθμιση puppet clients

Αφού ρυθμίσουμε τον puppetmaster μας, το επόμενο βήμα που πρέπει να κάνουμε είναι να εγκαταστήσουμε και να ρυθμίσουμε τον puppet client σε κάθε έναν κόμβο του δίκτυο μας, τον οποίο θέλουμε να ελέγχουμε από το Puppet. Αρχικά, εγκαθιστούμε τον puppet client με την εξής εντολή στο τερματικό του κόμβου:

$ sudo apt-get install puppet

Αφού ολοκληρωθεί η εγκατάσταση θα ρυθμίσουμε σωστά τον client. Από προεπιλογή, και πάλι, ο client θα προσπαθήσει να ανιχνεύσει το όνομα puppet στο δίκτυο, και να συνδεθεί σε αυτό. Με τον editor της προτίμησης σας, ενημερώστε το αρχείο /etc/puppet/puppetd.conf έτσι ώστε να είναι όμοιο με το παρακάτω:

[puppetd]
server = puppetmaster
logdir = /var/log/puppet
vardir = /var/lib/puppet
rundir = /var/run

Όταν ολοκληρωθεί αυτή η διαδικασία, κάνουμε ένα restart στον client, έτσι ώστε να τεθούν σε ισχύ οι αλλαγές:

$ sudo service puppet restart

Στην παρούσα φάση, έχουμε έναν (σωστά) ρυθμισμένο server που είναι έτοιμος να συνδεθεί με κάποιον κόμβο, και έναν (εξίσου σωστά) ρυθμισμένο client, ο οποίος έχει την «εξυπνάδα» για να ξέρει που θα πρέπει να συνδεθεί προκειμένου να πάρει εντολές για να τις εκτελέσει. Παρόλα αυτά, ο client δεν μπορεί να συνδεθεί στον server, καθώς ακόμα δεν είναι εξουσιοδοτημένος (unauthorized) για κάτι τέτοιο! Προκειμένου να διορθωθεί αυτό, στο τερματικό του server πληκτρολογούμε:

# puppetca --list

Οπότε και μας δείχνει μια λίστα με τα client nodes. Προκειμένου να «πιστοποιηθεί» το κάθε node ξεχωριστά, πληκτρολογούμε στο τερματικό για τον κάθε ένα κόμβο:

# puppetca --sign certname

Τώρα, κανονικά πρέπει να είναι όλα έτοιμα να λειτουργήσουν. Ο server είναι σε θέση να αποδεχτεί συνδέσεις από τους puppetd κόμβους και αυτοί, εν συνεχεία, θα εκτελέσουν το περιεχόμενο του site.pp manifest file. Αν κατά την διάρκεια της σύνδεσης τους με τον server αυτό το αρχείο αλλάξει, οι κόμβοι του δικτύου επικοινωνούν κι ενημερώνονται απο τον server ανά τακτά χρονικά διαστήματα (περίπου κάθε 30 λεπτά), επομένως γίνεται αυτόματα ο οποίος συντονισμός στα καινούρια δεδομένα.

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

# ls -l /tmp/file1

Η ίδια μέθοδος μπορεί να ακολουθηθεί για κάθε κόμβο στο LAN προκειμένου να συνδεθεί και να ρυθμιστεί κατάλληλα.

Αφού γίνουν όλες οι απαραίτητες προσθήκες και αλλαγές, πρέπει να γίνει restart στο puppet service, έτσι ώστε να τεθούν σε ισχύ οι αλλαγές, όπως και πιο πριν έγινε στον server μας. Οπότε στο τερματικό μας πληκτρολογούμε:

$ sudo service puppet start

Έτσι ολοκληρώνεται η διαδικασία της εγκατάστασης και ρύθμισης του puppet client και του puppet server ώστε να επικοινωνούν μεταξύ τους.

Αφού αναφερθήκαμε γενικά στο πως μπορούμε να δημιουργήσουμε ένα puppet network και είδαμε πως μπορούμε να δημιουργήσουμε απλά manifest files, καιρός να εμβαθύνουμε λίγο στην δημιουργία των τελευταίων, έτσι ώστε να μπορούμε να καλύψουμε όλες τις ανάγκες μας. Τα manifests, αφού τα δημιουργήσει ο χρήστης, όπως προαναφέραμε, συγχρονίζονται αυτόματα από το Puppet. Αυτό όμως δεν σημαίνει οτι εκτελούνται αυτόματα από την στιγμή που συγχρονίζονται. Τα manifests πριν εφαρμοστούν γίνονται compile σε έναν «κατάλογο» που αναπαριστά τα resources στην σειρά που πρέπει να γίνουν sync. Αξίζει επίσης να σημειώσουμε ότι το Puppet φροντίζει από μόνο του ώστε ο χρηστης να μην χρησιμοποιήσει το ίδιο όνομα για δύο resources που δημιουργεί στα manifests.

Τι μπορούμε να κάνουμε με το Puppet;

Ποιες είναι όμως πρακτικά οι λειτουργίες που μπορούμε να εκτελέσουμε με το puppet; Ο διαχειριστής του δικτύου, χρησιμοποιεί το Puppet έτσι ώστε να κάνει διαχείριση, συντήρηση και έλεγχο των συστημάτων με ευκολία και ταχύτητα. Δηλαδή μπορεί να βοηθήσει πρακτικά στην εγκατάσταση, ενημέρωση ή απεγκατάσταση πακέτων, στην εφαρμογή συνολικών (global) ρυθμίσεων στο δίκτυο ευθύνης του είτε στην οργάνωση, αντιγραφή και διαγραφή των αρχείων που βρίσκονται στα συστήματα. Υπάρχουν επίσης φορές που ο διαχειριστής του δικτύου θέλει να εκτελέσει κάποια εντολή στα συστήματα μέσω του puppet. Δεν τον ενδιαφέρει πώς και τί θα κάνει, αρκει να το κάνει γρήγορα και αποτελεσματικά. Αυτό είναι ιδιαίτερα χρήσιμο σε πολλές περιπτώσεις. Η puppet-«εντολή» exec κάνει ακριβώς αυτό το πράγμα, εκτελώντας εύκολα σε κάθε μηχάνημα μια εντολή του χρήστη-διαχειριστή. Ακολουθεί ένα παράδειγμα puppet manifest:

exec { "refresh_cache":
 command => "refresh_cache 8600",
 path => "/usr/local/bin/:/bin/",
 # path => [ "/usr/local/bin/", "/bin/" ], # alternative syntax
}

το οποίο ανανεώνει την cache του μηχανηματος.


2 Η διαδικασία δημιουργίας ενός manifest.

Άλλες φορές,για λόγους βιασύνης κυρίως, ο διαχειριστής ενδέχεται να θελει να εκτελέσει μια εντολή στο Puppet άμεσα, χωρίς να περιορίζεται χρονικά από την διαδικασία κατασκευής και εκτέλεσης ενός manifest ή κάτι παρόμοιο. Αυτό επιτυγχάνεται με χρήση της εντολής apply και της παραμέτρου --execute. Για παράδειγμα, στο τερματικό του ο διαχειριστής μπορεί να εκτελέσει :

$ puppet apply –execute entolh_puppet.

Παρ’ όλα αυτά, αν ο διαχειριστής θέλει να εκτελέσει μια συγκεκριμένη λειτουργία μέσα από την δημιουργία ενός puppet manifest, αφού ολοκληρώσει την «συγγραφή» του, προκειμένου να το εφαρμόσει εισάγει στο τερματικό του:

$ puppet apply /path/to/manifests_folder/manifest_name.pp

Βασική λειτουργία που συναντάται συχνά σε κάθε είδος δικτύου είναι η αντιγραφή αρχείων, από τον puppet master προς τους puppetd υπολογιστές. Αυτό μπορεί να γίνει με το file manifest type. Μάλιστα αυτό είναι τόσο απλό, που το μόνο που χρειάζεται να γίνει από την μερια του χρήστη είναι να προστεθεί η πηγή του αρχείου (file source) στο manifest file που δημιουργείται για αυτό το σκοπό. Υποθέτοντας λοιπόν ότι ο διαχειριστής θέλει να δημιουργήσει ένα αντίγραφο κάποιου αρχείου σε κάθε σύστημα στο LAN, προσθέτει το ακόλουθο τμήμα στο αρχείο /etc/puppet/manifests/site.pp:

class class2 {
 file { " path/to/files/desired-file ":
  owner => root,
  group => root,
  mode => 440, 
  source => "puppet://puppetmaster_address/path/to/files/desired-file"
  }
 }
node default {
 include class2
}


3 Διάγραμμα του πως γίνονται compile τα αρχεία manifest

Σχετικά με τις κλάσεις στο Puppet

Ο διαχειριστής μπορεί να εκτελέσει κάθε είδους αλλαγή στο δίκτυο του, τροποποιώντας κατάλληλα το αρχείο /etc/puppet/manifests/site.pp. Αυτό μπορεί να είναι ιδιαίτερα βολικό για την διαχείριση μικρών δικτυων ή δικτύων στα οποία δεν εκτελούνται πολλές εντολές και διεργασίες, όμως για ένα μεγαλύτερο δίκτυο μπορεί να αποτελεί πραγματικά πρόβλημα. Για αυτό το λόγο υπάρχει η δυνατότητα να «σπάει» αυτό το αρχείο σε μικρότερα, δημιουργώντας κλάσεις οι οποίες με την σειρά τους καλούνται στο αντίστοιχο αρχείο. Οπότε σε αυτή την περίπτωση το site.pp αρχείο θα ήταν της μορφής:

import "classes/*.pp"
node default {
 include test1
 include test2
 include testν
}

Έτσι, ο διαχειριστής δημιουργεί τα αρχεία /etc/puppet/manifests/classes/test1, /etc/puppet/manifests/classes/test2 κοκ, στα οποία προσθέτει το κατάλληλο περιεχόμενο έτσι ώστε να εκτελούνται οι λειτουργίες που επιθυμεί.

Μέχρι τώρα έχουμε χρησιμοποιήσει το “node default” προκειμένου να ορίσουμε διάφορες διεργασίες σε κάθε κόμβο του δικτύου, χωρις να έχουμε αναφερθεί καθόλου στην περίπτωση που θέλουμε σε διαφορετικούς, μεταξύ τους, κόμβους να εκτελεστούν διαφορετικές διεργασίες.Ας δούμε πως μπορούμε να απευθυνθούμε σε διαφορετικούς κόμβους μεσω manifests. Στο ακόλουθο παραδειγμα, γίνεται η αντιγραφη του desired-file-v στον αντίστοιχο κόμβο κάθε φορά, δηλαδη στον κόμβο που καλείται να εκτελεστεί η κάθε κλάση:

class class1 {
 file { " path/to/files/desired-file ":
  owner => root,
  group => root,
  mode => 440,
  source => "puppet://puppetmaster_address/path/to/files/desired-file-1"
 }
}

class class2 {
 file { " path/to/files/desired-file ":
  owner => root,
  group => root,
  mode => 440,
  source => "puppet://puppetmaster_address/path/to/files/desired-file-2"
 }
}

class class3 {
 file { " path/to/files/desired-file ":
  owner => root,
  group => root, 
  mode => 440,
  source => "puppet://puppetmaster_address/path/to/files/desired-file-3"
 }
}

node default {
 # Ολοι οι puppet nodes εφαρμοζουν αυτές τις κλασεις
 include class1
}

node client1 inherits default { 
 #ο client1 εκτελει τις κλασεις class1 και class2 και όχι την class3
 include class1
 include class2
}
node client2 inherits default {
 #ο client2 εκτελεί τις κλάσεις class2 και class3 και όχι την class1
 include class2
 include class3
}

Τέλος, για όσους επιθυμούν να έχουν οπτική διαχείριση και έλεγχο στο δίκτυό τους, μπορούν να χρησιμοποιήσουν το Puppet Dashboard (εικόνα 4), ένα web interface και reporting εργαλειο για το puppet. Εκτός του ότι προσφέρει την δυνατότητα να γίνουν πλείστες ρυθμίσεις χωρίς την χρήση τερματικού, μελλοντικά μπορεί να ενσωματώσει και άλλα administrating εργαλεία για την διαχείριση του δικτύου.

4 Ο πίνακας διαχείρισης του Puppet dashboard.

 

Συμβουλή
Το Puppet προκειμένου να παρουσιάσει μια πληθώρα επιλογών στον διαχειριστή του δικτύου, του δίνει την δυνατότητα να δημιουργεί τα δικά του «αρχεία διαχείρισης», που ταιριάζουν στο δίκτυο του, τα λεγόμενα puppet manifest files. Ουσιαστικά, είναι αυτά που καθιστούν το Puppet ως μια «έξυπνη μηχανή» που διαχειρίζεται και ελέγχει την κατάσταση του δικτύου.

Δώσε αστέρια!

MO: 4.5 (ψήφοι: 9)