Τι είναι οι ενότητες Terraform και πώς λειτουργούν;

Παραδόξως, πολλοί αρχάριοι παραλείπουν τις ενότητες Terraform για λόγους απλότητας, ή έτσι πιστεύουν.

Αργότερα, βρέθηκαν εκατοντάδες γραμμές κώδικα διαμόρφωσης.

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

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

Ενότητες Terraform

Γράφετε ήδη ενότητες

Ακόμα και όταν δεν δημιουργείτε σκόπιμα μια ενότητα, εάν χρησιμοποιείτε το Terraform, γράφετε ήδη μια ενότητα - μια λεγόμενη μονάδα " root ".

Οποιοδήποτε αρχείο διαμόρφωσης Terraform ( .tf) σε έναν κατάλογο, ακόμη και ένα, σχηματίζει μια ενότητα.

Τι κάνει μια ενότητα;

Μια μονάδα Terraform σάς επιτρέπει να δημιουργήσετε λογική αφαίρεση στην κορυφή κάποιου συνόλου πόρων. Με άλλα λόγια, μια ενότητα σάς επιτρέπει να ομαδοποιείτε πόρους και να επαναχρησιμοποιείτε αυτήν την ομάδα αργότερα, πιθανώς πολλές φορές.

Ας υποθέσουμε ότι έχουμε έναν εικονικό διακομιστή με ορισμένες λειτουργίες που φιλοξενούνται στο cloud. Τι σύνολο πόρων μπορεί να περιγράψει αυτόν τον διακομιστή; Για παράδειγμα:

  • η ίδια η εικονική μηχανή, που δημιουργήθηκε από κάποια εικόνα
  • μια συνδεδεμένη συσκευή μπλοκ καθορισμένου μεγέθους για επιπλέον χώρο αποθήκευσης
  • μια στατική δημόσια IP που αντιστοιχίζεται στην εικονική διεπαφή δικτύου του διακομιστή
  • ένα σύνολο κανόνων τείχους προστασίας που πρέπει να επισυνάπτονται στον διακομιστή
  • άλλα πράγματα όπως μια άλλη συσκευή μπλοκ, πρόσθετη διασύνδεση δικτύου και ούτω καθεξής

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

Ακολουθεί ένα παράδειγμα που δείχνει πώς μπορεί να κληθεί η ενότητα "διακομιστής".

" Για να καλέσετε μια ενότητα " σημαίνει να το χρησιμοποιήσετε στο αρχείο διαμόρφωσης.

Εδώ δημιουργούμε 5 παρουσίες του "διακομιστή" χρησιμοποιώντας ένα μόνο σύνολο διαμορφώσεων (στην ενότητα):

module "server" { count = 5 source = "./module_server" some_variable = some_value }

Οργάνωση ενότητας: παιδί και ρίζα

Φυσικά, ίσως θέλετε να δημιουργήσετε περισσότερες από μία ενότητες. Ακολουθούν ορισμένα κοινά παραδείγματα:

  • ένα δίκτυο όπως ένα εικονικό ιδιωτικό σύννεφο (VPC)
  • φιλοξενία στατικού περιεχομένου (π.χ. κάδοι)
  • έναν εξισορροπητή φορτίου και τους σχετικούς πόρους
  • μια διαμόρφωση καταγραφής
  • ή οτιδήποτε άλλο θεωρείτε ένα ξεχωριστό λογικό στοιχείο της υποδομής

Ας υποθέσουμε ότι έχουμε δύο διαφορετικές ενότητες: μια ενότητα "διακομιστής" και μια ενότητα "δικτύου". Η ενότητα που ονομάζεται "δίκτυο" είναι όπου ορίζουμε και διαμορφώνουμε το εικονικό μας δίκτυο και τοποθετούμε διακομιστές σε αυτό:

module "server" { source = "./module_server" some_variable = some_value } module "network" { source = "./module_network" some_other_variable = some_other_value }

Μόλις έχουμε κάποιες προσαρμοσμένες ενότητες, μπορούμε να τις αναφέρουμε ως "θυγατρικές" ενότητες. Και το αρχείο διαμόρφωσης όπου καλούμε θυγατρικές ενότητες σχετίζεται με τη ριζική μονάδα.

Μια θυγατρική ενότητα μπορεί να προέρχεται από διάφορα μέρη:

  • τοπικά μονοπάτια
  • το επίσημο Terraform Registry - εάν είστε εξοικειωμένοι με άλλα μητρώα όπως το Docker Registry, τότε έχετε ήδη καταλάβει την ιδέα
  • ένα αποθετήριο Git (ένα προσαρμοσμένο ή GitHub / BitBucket)
  • μια διεύθυνση URL HTTP σε ένα αρχείο .zip με τη λειτουργική μονάδα

Αλλά πώς μπορείτε να περάσετε λεπτομέρειες πόρων μεταξύ των ενοτήτων;

Στο παράδειγμά μας, οι διακομιστές πρέπει να δημιουργηθούν σε ένα δίκτυο. Πώς μπορούμε λοιπόν να πούμε στη μονάδα "διακομιστής" να δημιουργήσει VM σε ένα δίκτυο που δημιουργήθηκε σε μια λειτουργική μονάδα που ονομάζεται "δίκτυο";

Εδώ μπαίνει η ενθυλάκωση .

Ενσωμάτωση ενότητας

Το Encapsulation στο Terraform αποτελείται από δύο βασικές έννοιες: το πεδίο εφαρμογής και τη ρητή έκθεση πόρων.

Πεδίο ενότητας

Όλες οι παρουσίες πόρων, τα ονόματα και, επομένως, η ορατότητα πόρων, είναι απομονωμένες στο πεδίο εφαρμογής της ενότητας. Για παράδειγμα, η ενότητα "A" δεν μπορεί να δει και δεν γνωρίζει πόρους στην ενότητα "B" από προεπιλογή.

Η ορατότητα των πόρων, μερικές φορές ονομάζεται απομόνωση πόρων, διασφαλίζει ότι οι πόροι θα έχουν μοναδικά ονόματα στο χώρο ονομάτων μιας μονάδας. Για παράδειγμα, με τις 5 παρουσίες της ενότητας "διακομιστής":

module.server[0].resource_type.resource_name module.server[1].resource_type.resource_name module.server[2].resource_type.resource_name ...

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

module "server-alpha" { source = "./module_server" some_variable = some_value } module "server-beta" { source = "./module_server" some_variable = some_value }

Σε αυτήν την περίπτωση, η ονομασία ή η διεύθυνση των πόρων θα έχει ως εξής:

module.server-alpha.resource_type.resource_name module.server-beta.resource_type.resource_name

Άμεση έκθεση πόρων

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

Από προεπιλογή, η ενότητα "διακομιστής" δεν γνωρίζει για το δίκτυο που δημιουργήθηκε στη λειτουργική μονάδα "δικτύου".

Επομένως, πρέπει να δηλώσουμε μια outputτιμή στη λειτουργική μονάδα "δικτύου" για να εξάγουμε τον πόρο της, ή ένα χαρακτηριστικό ενός πόρου, σε άλλες ενότητες.

Η ενότητα "διακομιστής" πρέπει να δηλώσει variableότι θα χρησιμοποιηθεί αργότερα ως είσοδος:

Αυτή η ρητή δήλωση της εξόδου είναι ο τρόπος για να εκθέσετε κάποιο πόρο (ή πληροφορίες σχετικά με αυτό) έξω - στο πεδίο εφαρμογής της «ρίζας» ενότητας, ως εκ τούτου να το καταστήσετε διαθέσιμο για άλλες ενότητες.

Στη συνέχεια, όταν καλούμε την θυγατρική μονάδα "διακομιστής" στη ριζική μονάδα, πρέπει να αντιστοιχίσουμε την έξοδο από τη μονάδα "δικτύου" στη μεταβλητή της ενότητας "διακομιστής":

network_id = module.network.network_id

Δείτε πώς θα είναι ο τελικός κωδικός για την κλήση των θυγατρικών ενοτήτων μας:

module "server" { count = 5 source = "./module_server" some_variable = some_value network_id = module.network.network_id } module "network" { source = "./module_network" some_other_variable = some_other_value }

Αυτό το παράδειγμα διαμόρφωσης θα δημιουργούσε 5 παρουσίες του ίδιου διακομιστή, με όλους τους απαραίτητους πόρους, στο δίκτυο με το οποίο δημιουργήσαμε ως ξεχωριστή ενότητα.

Τυλίγοντας

Τώρα πρέπει να καταλάβετε τι είναι οι ενότητες και τι κάνουν.

Εάν είστε στην αρχή του ταξιδιού σας Terraform, ακολουθούν μερικές προτάσεις για τα επόμενα βήματα.

Σας ενθαρρύνω να ακολουθήσετε αυτό το σύντομο σεμινάριο από τον HashiCorp, τους δημιουργούς του Terraform, σχετικά με τις ενότητες: "Organize Configuration".

Επίσης, υπάρχει ένας μεγάλος ολοκληρωμένος οδηγός μελέτης που καλύπτει τα πάντα, από αρχάριους έως προχωρημένους έννοιες σχετικά με το Terraform: "Οδηγός μελέτης - Πιστοποίηση συνεργατών Terraform".

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

Αν σας άρεσε το άρθρο, ακολουθήστε με στο Twitter (@vasylenko) όπου μοιράζομαι περιστασιακά τα ευρήματα και τις συμβουλές μου σχετικά με τις τεχνολογίες Terraform, AWS, Ansible και άλλες τεχνολογίες που σχετίζονται με το DevOps.