Terraformer - Infrastructure To Code

Terraformer - Infrastructure To Code
Θα ήθελα να σας πω για το νέο εργαλείο CLI που έγραψα για να λύσω ένα παλιό πρόβλημα.

πρόβλημα

Το Terraform είναι εδώ και πολύ καιρό ένα πρότυπο στην κοινότητα Devops/Cloud/IT. Το πράγμα είναι πολύ βολικό και χρήσιμο για την αντιμετώπιση της υποδομής ως κώδικα. Υπάρχουν πολλές απολαύσεις στο Terraform καθώς και πολλά πιρούνια, κοφτερά μαχαίρια και τσουγκράνες.
Με το Terraform είναι πολύ βολικό να δημιουργείτε νέα πράγματα και στη συνέχεια να τα διαχειρίζεστε, να τα αλλάζετε ή να τα διαγράφετε. Τι πρέπει να κάνουν όσοι έχουν τεράστια υποδομή στο cloud και δεν δημιουργήθηκε μέσω Terraform; Η επανεγγραφή και η εκ νέου δημιουργία ολόκληρου του cloud είναι κατά κάποιο τρόπο δαπανηρή και ανασφαλής.
Αντιμετώπισα αυτό το πρόβλημα σε 2 εργασίες, το πιο απλό παράδειγμα είναι όταν θέλετε τα πάντα να είναι στο Git με τη μορφή αρχείων terraform, αλλά έχετε 250+ κουβάδες και είναι πολύ να τα γράψετε σε terraform με το χέρι.
Υπάρχει ζήτημα από το 2014 στο terrafom που έκλεισε το 2016 με την ελπίδα να υπάρξει εισαγωγή.

Γενικά, όλα είναι όπως στην εικόνα μόνο από δεξιά προς τα αριστερά

Προειδοποιήσεις: Ο συγγραφέας δεν ζει στη Ρωσία για τη μισή του ζωή και γράφει ελάχιστα στα ρωσικά. Προσοχή στα ορθογραφικά λάθη.

Λύσεις

1. Υπάρχουν έτοιμες και παλιές λύσεις για το AWS εδαφοποίηση. Όταν προσπάθησα να περάσω τους 250+ κουβάδες μου, συνειδητοποίησα ότι όλα ήταν άσχημα εκεί. Η AWS έχει εδώ και καιρό εισάγει πολλές νέες επιλογές, αλλά το terraforming δεν τις γνωρίζει και γενικά είναι ρουμπίνι το πρότυπο φαίνεται αραιό. Μετά τις 2 το βράδυ έστειλα Αίτημα έλξης να προσθέσει περισσότερες δυνατότητες εκεί και συνειδητοποίησε ότι μια τέτοια λύση δεν είναι καθόλου κατάλληλη.
Πώς λειτουργεί το terraforming: παίρνει δεδομένα από το AWS SDK και δημιουργεί tf και tfstate μέσω ενός προτύπου.
Υπάρχουν 3 προβλήματα εδώ:
1. Πάντα θα υπάρχει καθυστέρηση στις ενημερώσεις
2. Τα αρχεία tf μερικές φορές βγαίνουν σπασμένα
3. Το tfstate συλλέγεται χωριστά από το tf και δεν συγκλίνει πάντα
Γενικά, είναι δύσκολο να βγει ένα αποτέλεσμα στο οποίο το «terraform plan» λέει ότι δεν υπάρχουν αλλαγές

2. Το «terraform import» είναι μια ενσωματωμένη εντολή στο terraform. Πώς λειτουργεί;
Γράφετε ένα κενό αρχείο TF με το όνομα και τον τύπο του πόρου, μετά εκτελείτε το "terraform import" και μεταβιβάζετε το αναγνωριστικό πόρου. Η terraform επικοινωνεί με τον πάροχο, λαμβάνει τα δεδομένα και δημιουργεί ένα αρχείο tfstate.
Υπάρχουν 3 προβλήματα εδώ:
1. Λαμβάνουμε μόνο ένα αρχείο tfstate και το tf είναι κενό, πρέπει να το γράψετε με μη αυτόματο τρόπο ή να το μετατρέψετε από το tfstate
2. Μπορεί να λειτουργήσει μόνο με έναν πόρο τη φορά και δεν υποστηρίζει όλους τους πόρους. Και τι να κάνω πάλι με 250+ κουβάδες;
3. Πρέπει να γνωρίζετε το αναγνωριστικό των πόρων - δηλαδή, πρέπει να το τυλίξετε σε κώδικα που λαμβάνει τη λίστα των πόρων
Γενικά, το αποτέλεσμα είναι μερικό και δεν κλιμακώνεται καλά

Η απόφασή μου

απαιτήσεις:
1. Δυνατότητα δημιουργίας αρχείων tf και tfstate για πόρους. Για παράδειγμα, κατεβάστε όλα τα buckets/security group/load balancer και το `terraform plan` επέστρεψε ότι δεν υπάρχουν αλλαγές
2. Χρειάζεστε 2 σύννεφα GCP + AWS
3. Παγκόσμια λύση που ενημερώνεται εύκολα κάθε φορά και δεν χάνει χρόνο σε κάθε πόρο για 3 ημέρες εργασίας
4. Κάντε το Open Source - όλοι έχουν το ίδιο πρόβλημα

Η γλώσσα Go είναι ο λόγος που τη λατρεύω και έχει μια βιβλιοθήκη για τη δημιουργία αρχείων HCL που χρησιμοποιείται σε terraform + πολύ κώδικα σε terraform που μπορεί να είναι χρήσιμος

Μονοπάτι

Προσπαθήστε πρώτα
Ξεκίνησα με μια απλή έκδοση. Επικοινωνία με το cloud μέσω του SDK για τον απαιτούμενο πόρο και μετατροπή του σε πεδία για terraform. Η προσπάθεια πέθανε αμέσως στην ομάδα ασφαλείας επειδή δεν μου άρεσε η 1.5 ημέρα για να μετατρέψω μόνο την ομάδα ασφαλείας (και υπάρχουν πολλοί πόροι). Για μεγάλο χρονικό διάστημα και μετά μπορούν να αλλάξουν/προστεθούν πεδία

Δεύτερη προσπάθεια
Με βάση την ιδέα που περιγράφηκε εδώ. Απλώς πάρτε και μετατρέψτε το tfstate σε tf. Όλα τα δεδομένα υπάρχουν και τα πεδία είναι ίδια. Πώς να αποκτήσετε πλήρες tfstate για πολλούς πόρους; Εδώ βοήθησε η εντολή «terraform refresh». Το terraform παίρνει όλους τους πόρους στο tfstate και, με αναγνωριστικό, βγάζει δεδομένα σε αυτούς και γράφει τα πάντα στο tfstate. Δηλαδή, δημιουργήστε ένα κενό tfstate με μόνο ονόματα και αναγνωριστικά, εκτελέστε το `terraform refresh` και μετά λαμβάνουμε πλήρεις tfstates. Ζήτω!
Τώρα ας κάνουμε την αναδρομική πορνογραφία της εγγραφής ενός μετατροπέα για tfstate σε tf. Για όσους δεν έχουν διαβάσει ποτέ tfstate, είναι JSON, αλλά ιδιαίτερο.
Εδώ είναι τα σημαντικά χαρακτηριστικά του

 "attributes": {
                            "id": "default/backend-logging-load-deployment",
                            "metadata.#": "1",
                            "metadata.0.annotations.%": "0",
                            "metadata.0.generate_name": "",
                            "metadata.0.generation": "24",
                            "metadata.0.labels.%": "1",
                            "metadata.0.labels.app": "backend-logging",
                            "metadata.0.name": "backend-logging-load-deployment",
                            "metadata.0.namespace": "default",
                            "metadata.0.resource_version": "109317427",
                            "metadata.0.self_link": "/apis/apps/v1/namespaces/default/deployments/backend-logging-load-deployment",
                            "metadata.0.uid": "300ecda1-4138-11e9-9d5d-42010a8400b5",
                            "spec.#": "1",
                            "spec.0.min_ready_seconds": "0",
                            "spec.0.paused": "false",
                            "spec.0.progress_deadline_seconds": "600",
                            "spec.0.replicas": "1",
                            "spec.0.revision_history_limit": "10",
                            "spec.0.selector.#": "1",

Υπάρχει:
1. id - συμβολοσειρά
2. μεταδεδομένα - ένας πίνακας μεγέθους 1 και σε αυτόν ένα αντικείμενο με πεδία που περιγράφεται παρακάτω
3. spec - κατακερματισμός μεγέθους 1 και κλειδιού, τιμή σε αυτό
Εν ολίγοις, μια διασκεδαστική μορφή, τα πάντα μπορεί να είναι βαθιά σε πολλά επίπεδα

                   "spec.#": "1",
                            "spec.0.min_ready_seconds": "0",
                            "spec.0.paused": "false",
                            "spec.0.progress_deadline_seconds": "600",
                            "spec.0.replicas": "1",
                            "spec.0.revision_history_limit": "10",
                            "spec.0.selector.#": "1",
                            "spec.0.selector.0.match_expressions.#": "0",
                            "spec.0.selector.0.match_labels.%": "1",
                            "spec.0.selector.0.match_labels.app": "backend-logging-load",
                            "spec.0.strategy.#": "0",
                            "spec.0.template.#": "1",
                            "spec.0.template.0.metadata.#": "1",
                            "spec.0.template.0.metadata.0.annotations.%": "0",
                            "spec.0.template.0.metadata.0.generate_name": "",
                            "spec.0.template.0.metadata.0.generation": "0",
                            "spec.0.template.0.metadata.0.labels.%": "1",
                            "spec.0.template.0.metadata.0.labels.app": "backend-logging-load",
                            "spec.0.template.0.metadata.0.name": "",
                            "spec.0.template.0.metadata.0.namespace": "",
                            "spec.0.template.0.metadata.0.resource_version": "",
                            "spec.0.template.0.metadata.0.self_link": "",
                            "spec.0.template.0.metadata.0.uid": "",
                            "spec.0.template.0.spec.#": "1",
                            "spec.0.template.0.spec.0.active_deadline_seconds": "0",
                            "spec.0.template.0.spec.0.container.#": "1",
                            "spec.0.template.0.spec.0.container.0.args.#": "3",

Γενικά, αν κάποιος θέλει ένα πρόβλημα προγραμματισμού για μια συνέντευξη, απλώς ζητήστε του να γράψει έναν αναλυτή για αυτήν την εργασία :)
Μετά από πολλές προσπάθειες να γράψω έναν αναλυτή χωρίς σφάλματα, βρήκα μέρος του στον κώδικα terraform, και το πιο σημαντικό μέρος. Και όλα έδειχναν να λειτουργούν καλά

Τρίτη προσπάθεια
Οι πάροχοι terraform είναι δυαδικά που περιέχουν κώδικα με όλους τους πόρους και τη λογική για την εργασία με το API του cloud. Κάθε σύννεφο έχει τον δικό του πάροχο και το ίδιο το terraform τα καλεί μόνο μέσω του πρωτοκόλλου RPC μεταξύ δύο διεργασιών.
Τώρα αποφάσισα να επικοινωνήσω απευθείας με τους παρόχους terraform μέσω κλήσεων RPC. Αποδείχθηκε όμορφα και κατέστησε δυνατή την αλλαγή των παρόχων terraform σε νεότερους και τη λήψη νέων δυνατοτήτων χωρίς αλλαγή του κώδικα. Αποδεικνύεται επίσης ότι δεν πρέπει όλα τα πεδία στο tfstate να είναι σε tf, αλλά πώς μπορείτε να το μάθετε; Απλώς ρωτήστε τον πάροχο σας για αυτό. Στη συνέχεια ξεκίνησε μια άλλη αναδρομική πορνογραφία συναρμολόγησης κανονικών εκφράσεων, αναζητώντας πεδία μέσα στο tfstate σε όλα τα επίπεδα σε βάθος.

Στο τέλος, έχουμε ένα χρήσιμο εργαλείο CLI που έχει μια κοινή υποδομή για όλους τους παρόχους εδαφών και μπορείτε εύκολα να προσθέσετε ένα νέο. Επίσης, η προσθήκη πόρων απαιτεί λίγο κώδικα. Επιπλέον, κάθε είδους καλούδια, όπως συνδέσεις μεταξύ πόρων. Φυσικά, υπήρχαν πολλά διαφορετικά προβλήματα που δεν μπορούν να περιγραφούν όλα.
Ονόμασα το ζώο Terrafomer.

Φινάλε

Χρησιμοποιώντας το Terrafomer, δημιουργήσαμε 500-700 χιλιάδες γραμμές κώδικα tf + tfstate από δύο σύννεφα. Μπορέσαμε να πάρουμε κληρονομιά πράγματα και να αρχίσουμε να τα αγγίζουμε μόνο μέσω του terraform, όπως στην καλύτερη υποδομή ως ιδέες κώδικα. Είναι απλά μαγικό όταν παίρνετε ένα τεράστιο σύννεφο και το λαμβάνετε μέσω μιας ομάδας με τη μορφή τεράμορφων αρχείων εργαζομένων. Και μετά grep/replace/git και ούτω καθεξής.

Το χτένισα και το έβαλα σε τάξη, πήρα άδεια. Κυκλοφόρησε στο GitHub για όλους την Πέμπτη (02.05.19/XNUMX/XNUMX). github.com/GoogleCloudPlatform/terraformer
Έχετε ήδη λάβει 600 αστέρια, 2 αιτήματα έλξης για προσθήκη υποστήριξης για openstack και kubernetes. Καλή ανατροφοδότηση. Γενικά, το έργο είναι χρήσιμο για τους ανθρώπους
Συμβουλεύω όλους όσους θέλουν να αρχίσουν να εργάζονται με την Terraform και να μην ξαναγράψουν τα πάντα για αυτό.
Θα χαρώ να τραβήξω αιτήματα, θέματα, αστέρια.

Демо
Terraformer - Infrastructure To Code

Πηγή: www.habr.com

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