Εργαστήριο Θεμελίωσης 1 — Terraform: ένα μπλοκ, ένα σχέδιο, ένα state

Καθοδηγούμενη πρακτική16 λεπτά

pratique: true

Εργαστήριο Θεμελίωσης 1 — Terraform: ένα μπλοκ, ένα σχέδιο, ένα state

Διάρκεια
20 λεπτά
Ενότητα
1/7
Προαπαιτούμενα
εγκατεστημένο Terraform (το terraform version απαντά) και το κιτ κλωνοποιημένο στο lab-terraform (έργο 01, παράρτημα A.1 έως A.4 ή B.1 έως B.4)
Θα κατασκευάσεις
ένα έργο Terraform ανηγμένο στο ελάχιστο, ένα μοναδικό μπλοκ τριών γραμμών, ένα αρχείο bonjour.txt που δημιουργείται από το Terraform, και ένα state που θα διαβάσεις
Παραδοτέο
η έξοδος του terraform state show local_file.bonjour του βήματος 9

Πώς να διαβάσεις αυτή τη σελίδα. Δέκα βήματα, μία εντολή τη φορά. Για καθένα: η εντολή που πληκτρολογείς, η ακριβής έξοδος του μηχανήματος του μαθήματος (Terraform 1.12.2), και τι πρέπει να προσέξεις μέσα. Πληκτρολόγησε ο ίδιος κάθε εντολή (όχι αντιγραφή-επικόλληση): γράφοντας init, plan, apply, state είναι που οι λέξεις εμπεδώνονται. Τα μπλοκ «Για να καταλάβεις καλύτερα» είναι προαιρετικά· άνοιξέ τα αν ένα βήμα σου αφήνει αμφιβολία. Οι εντολές terraform … είναι ταυτόσημες σε Windows, Linux και macOS· όταν μια εντολή εξαρτάται από το σύστημα (δημιουργία, ανάγνωση, λίστα αρχείου), δίνονται και οι δύο εκδόσεις, η μία κάτω από την άλλη. Αν το Terraform δεν είναι εγκατεστημένο ή το κιτ δεν είναι κλωνοποιημένο, γύρνα στο έργο 01, ενότητα Εν συντομία (κιτ: https://github.com/hrhouma2/aiopsatlas-terraform-labo-fr).

Στόχος

Το έργο 01 σε έκανε να ξεδιπλώσεις δεκατρείς εντολές πάνω σε ένα main.tf δεκαπέντε γραμμών, με ένα μπλοκ terraform, ένα μπλοκ provider και ένα μπλοκ resource. Είδες τις φράσεις να περνάνε, αλλά δεκαπέντε γραμμές είναι ήδη πολύ για να ξέρεις τι είναι απαραίτητο. Εδώ, ξεκινάς από την αρχή με τρεις χρήσιμες γραμμές: ένα μόνο μπλοκ resource, χωρίς τίποτα γύρω του. Θα δεις το Terraform να αρνείται να δουλέψει χωρίς init, μετά θα το κάνεις να γράψει την προσφορά του, να την εκτελέσει, και θα διαβάσεις τι σημείωσε στην καταγραφή του. Στο τέλος, ξέρεις τι είναι ένα μπλοκ, ένα plan και ένα state επειδή τα κατασκεύασες μόνος σου, το ένα μετά το άλλο.

Το λεξιλόγιο σε μια εικόνα

Ξαναπιάστε τον αρχιτέκτονα του μαθήματος 01. Ένα μπλοκ resource είναι μια γραμμή του σχεδίου του αρχιτέκτονα: «εδώ, ένα αρχείο, με αυτό το όνομα και αυτό το περιεχόμενο». Το plan (η εντολή) είναι η προσφορά: τι θα έκανε το Terraform ώστε το πραγματικό να ομοιάζει με το σχέδιο. Το state είναι η καταγραφή: τι έχει πράγματι κατασκευάσει το Terraform, με ποιο αναγνωριστικό, με ποιες τιμές. Τρία αντικείμενα, τρεις εντολές για να τα δεις: το μπλοκ διαβάζεται στο main.tf, η προσφορά με το terraform plan, η καταγραφή με το terraform state show.

TerraformΤι είναιΣε αυτό το εργαστήριο
μπλοκ resource "type" "nom"κάτι να διαχειριστείς, περιγραμμένο σε ένα αρχείο .tfresource "local_file" "bonjour"
τύπος πόρουτι είναι, παρεχόμενο από έναν providerlocal_file (ένα αρχείο στον δίσκο)
τοπικό όνομαπώς το ονομάζεις στον κώδικά σουbonjour
διεύθυνσητύπος . όνομα, για να μιλάς για αυτό αλλούlocal_file.bonjour
όρισμαμια τιμή που γράφεις στο μπλοκfilename, content
ιδιότηταμια τιμή που υπολογίζει ο providerid, content_md5
planη προσφορά: τι λείπει ανάμεσα στον κώδικα και στην πραγματικότηταPlan: 1 to add, 0 to change, 0 to destroy.
stateη καταγραφή: τι έχει κατασκευάσει το Terraformterraform.tfstate, διαβάζεται με state list και state show

Πού να πληκτρολογήσεις

Ένα τερματικό (PowerShell σε Windows· bash ή zsh σε Linux, macOS, WSL 2 ή Git Bash), ανοιχτό στη ρίζα του κιτ lab-terraform, αυτή που περιέχει τα labo.ps1 και labo.sh. Και το VS Code για να γράψεις το αρχείο. Οι εντολές terraform … γράφονται με τον ίδιο ακριβώς τρόπο παντού· μόνο οι εντολές για δημιουργία, ανάγνωση ή λίστα αρχείου αλλάζουν, και δίνονται και στις δύο εκδόσεις κάθε φορά.

Βήμα 1 — Δημιουργία ενός άδειου φακέλου

Windows (PowerShell):

powershell
.\labo.ps1 nouveau atelier-1
cd travail\atelier-1

Linux, macOS, WSL 2, Git Bash:

bash
./labo.sh nouveau atelier-1
cd travail/atelier-1
text
Dossier travail/atelier-1 créé (ignoré par Git). Tapez :
  cd travail/atelier-1

Τι ζητά η εντολή: δημιούργησέ μου έναν άδειο φάκελο εργασίας, travail/atelier-1, που το Git θα αγνοήσει (σε Windows το script γράφει travail\atelier-1, με ανάστροφη κάθετο).

Τι να προσέξεις: ο φάκελος είναι άδειος. Τίποτα δεν είναι ακόμη έργο Terraform: είναι το main.tf, μετά το init, που θα το κάνουν έτσι.

Βήμα 2 — Γραφή ενός μπλοκ, τρεις γραμμές

Στο VS Code (code . από τον φάκελο), δημιούργησε ένα αρχείο main.tf και πληκτρολόγησε ακριβώς:

hcl
resource "local_file" "bonjour" {
  filename = "${path.module}/bonjour.txt"
  content  = "Bonjour Terraform"
}

Τι ζητά το αρχείο: «Terraform, διαχειρίσου για μένα ένα αρχείο στον δίσκο (local_file), που ονομάζω bonjour· ονομάζεται bonjour.txt, σε αυτόν τον φάκελο, και περιέχει Bonjour Terraform

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

Windows (PowerShell):

powershell
Get-ChildItem
Get-Content .\main.tf

Linux, macOS, WSL 2, Git Bash:

bash
ls -la
cat main.tf

Μία μόνο καταχώρηση, main.tf, και οι τέσσερις γραμμές του αρχείου. Αν βλέπεις main.tf.txt, μετονόμασέ το.

Για να καταλάβεις καλύτερα
  • Το "local_file" μετά το "bonjour": ο τύπος, μετά το όνομα. Ο τύπος επιβάλλεται από τον provider (local_file υπάρχει· local_fichier δεν υπάρχει, θα είχες Error: Invalid resource type). Το όνομα είναι δικό σου: bonjour, message, mon_fichier. Μαζί, σχηματίζουν τη διεύθυνση local_file.bonjour που θα ξαναβρίσκεις στο plan και στο state.
  • Τα filename και content είναι ορίσματα: τιμές που εσύ δίνεις. Για το local_file, το content είναι υποχρεωτικό (χωρίς αυτό: Error: Invalid Attribute Combination), και το filename επίσης.
  • Το ${path.module} σημαίνει «ο φάκελος όπου βρίσκεται αυτό το αρχείο .tf»· το Terraform θα το εμφανίσει ως ./bonjour.txt. Χωρίς αυτό, το filename = "bonjour.txt" θα λειτουργούσε επίσης εδώ· το έργο 01 εξηγεί γιατί συνηθίζουμε να το γράφουμε.
  • Τα κενά πριν από το = είναι ευθυγραμμισμένα (filename =, content =): είναι το στιλ του terraform fmt. Δεν αλλάζει τίποτα στη σημασία.

Βήμα 3 — Ζητώντας ένα plan πολύ πρόωρα

text
terraform plan
text
Error: Inconsistent dependency lock file

The following dependency selections recorded in the lock file are
inconsistent with the current configuration:
  - provider registry.terraform.io/hashicorp/local: required by this configuration but no version is selected

To make the initial dependency selections that will initialize the dependency
lock file, run:
  terraform init

Τι ζητά η εντολή: «Πες μου τι θα έκανες ώστε η πραγματικότητα να ομοιάζει με τον κώδικά μου.»

Τι να προσέξεις: το Terraform αρνείται, και εξηγεί. Διάβασε το local_file, συνήγαγε ότι χρειάζεται τον provider registry.terraform.io/hashicorp/local, και διαπιστώνει ότι δεν τον έχει (no version is selected). Η τελευταία γραμμή είναι η λύση: terraform init. Είναι το σφάλμα που κάθε αρχάριος συναντά μία φορά· τώρα ξέρεις να το διαβάζεις.

Βήμα 4 — Άνοιγμα του εργοταξίου

text
terraform init
text
Initializing the backend...
Initializing provider plugins...
- Finding latest version of hashicorp/local...
- Installing hashicorp/local v2.9.1...
- Installed hashicorp/local v2.9.1 (signed by HashiCorp)
Terraform has created a lock file .terraform.lock.hcl to record the provider
selections it made above. Include this file in your version control repository
so that Terraform can guarantee to make the same selections by default when
you run "terraform init" in the future.

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

Τι ζητά η εντολή: «Κατέβασε τους providers που απαιτεί ο κώδικάς μου και προετοίμασε αυτόν τον φάκελο.»

Τι να προσέξεις: Finding latest version of hashicorp/local...: χωρίς μπλοκ required_providers, το Terraform παίρνει την πιο πρόσφατη έκδοση (v2.9.1 στο μηχάνημα του μαθήματος· στο δικό σου, ίσως πιο πρόσφατη). Στο έργο 01, η ίδια γραμμή έλεγε Finding hashicorp/local versions matching "~> 2.5"... επειδή ο κώδικας καθόριζε έναν περιορισμό. Μετά η φράση που πρέπει να περιμένεις: Terraform has been successfully initialized!

Απαρίθμησε τον φάκελο, με τα κρυφά αρχεία:

Windows (PowerShell):

powershell
Get-ChildItem -Force

Linux, macOS, WSL 2, Git Bash:

bash
ls -la

Τρεις καταχωρήσεις: .terraform (ένας φάκελος, ο κατεβασμένος provider), .terraform.lock.hcl (η επιλεγμένη έκδοση, σημειωμένη) και το main.tf σου. Ακόμα χωρίς bonjour.txt, ακόμα χωρίς terraform.tfstate: το init δεν κατασκεύασε τίποτα.

Για να καταλάβεις καλύτερα
  • Το init δεν αγγίζει ποτέ τους πόρους σου. Μπορείς να το ξανατρέξεις όσες φορές θέλεις. Μόνο προετοιμάζει τον φάκελο.
  • Το .terraform/ είναι βαρύ και ξανακατεβαίνει (περίπου 18 MB εδώ): δεν μπαίνει ποτέ στο Git. Το .terraform.lock.hcl είναι ελαφρύ και πολύτιμο: μπαίνει στο Git, ώστε ο συνάδελφός σου να πάρει την ίδια έκδοση του provider.
  • Γιατί το «latest» είναι παγίδα σε ομάδα. Σήμερα v2.9.1· σε έξι μήνες, v3.0.0 με διαφορετική συμπεριφορά. Το μπλοκ required_providers του έργου 01 (version = "~> 2.5") αποφεύγει την έκπληξη. Για ένα εργαστήριο εικοσάλεπτου, το προσπερνάμε.

Βήμα 5 — Ανάγνωση της προσφοράς

text
terraform plan
text
Terraform used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # local_file.bonjour will be created
  + resource "local_file" "bonjour" {
      + content              = "Bonjour Terraform"
      + content_base64sha256 = (known after apply)
      + content_base64sha512 = (known after apply)
      + content_md5          = (known after apply)
      + content_sha1         = (known after apply)
      + content_sha256       = (known after apply)
      + content_sha512       = (known after apply)
      + directory_permission = "0777"
      + file_permission      = "0777"
      + filename             = "./bonjour.txt"
      + id                   = (known after apply)
    }

Plan: 1 to add, 0 to change, 0 to destroy.

─────────────────────────────────────────────────────────────────────────────

Note: You didn't use the -out option to save this plan, so Terraform can't
guarantee to take exactly these actions if you run "terraform apply" now.

Τι ζητά η εντολή: το ίδιο όπως στο βήμα 3. Αυτή τη φορά το Terraform έχει τον provider του, και απαντά.

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

ΓραμμήΤι λέει
+ createΗ λεζάντα της προσφοράς: ένα μόνο σύμβολο χρησιμοποιείται, +, δημιουργία.
# local_file.bonjour will be createdΗ διεύθυνση του πόρου σου και η τύχη του. Δεν έχει γίνει ακόμη: will be.
+ resource "local_file" "bonjour" {Το μπλοκ σου, αναγραμμένο με ένα + μπροστά: όλα είναι νέα.
+ content = "Bonjour Terraform"Ένα όρισμα που έγραψες. Το Terraform γνωρίζει την τιμή του.
+ content_md5 = (known after apply)Μια ιδιότητα που δεν έγραψες και που ο provider θα υπολογίσει μετά τη δημιουργία του αρχείου: το αποτύπωμά του. Το Terraform δεν μπορεί να το γνωρίζει πριν.
+ directory_permission = "0777"Μια ιδιότητα που δεν έγραψες και για την οποία ο provider έχει προεπιλεγμένη τιμή.
+ filename = "./bonjour.txt"Το δικό σου ${path.module}/bonjour.txt, επιλυμένο: το . είναι ο τρέχων φάκελος.
+ id = (known after apply)Το αναγνωριστικό του πόρου, γνωστό μόνο μετά τη δημιουργία.
Plan: 1 to add, 0 to change, 0 to destroy.Η γραμμή που διαβάζεται πρώτη. Ένα πράγμα να προστεθεί, τίποτα να αλλάξει, τίποτα να καταστραφεί.

Τίποτα δεν δημιουργήθηκε. Επαλήθευσε: το bonjour.txt δεν υπάρχει ακόμη στον φάκελο.

Για να καταλάβεις καλύτερα
  • Δύο γραμμές που έγραψες, εννέα που δεν έγραψες. Το plan δείχνει όλα όσα ξέρει ο provider για ένα local_file, όχι μόνο ό,τι του έδωσες. Μάθε να εντοπίζεις τα δικά σου ορίσματα και να διαβάζεις γρήγορα τις ιδιότητες, εκτός από τη γραμμή Plan:.
  • Το (known after apply) είναι η πιο σημαντική φράση για να καταλάβεις για τη συνέχεια: όταν ένας πόρος B χρησιμοποιεί το id ενός πόρου A που δεν έχει δημιουργηθεί ακόμη, ο B εμφανίζει (known after apply) για αυτή την τιμή, και το Terraform ξέρει ότι πρέπει να δημιουργήσει πρώτα το A. Είναι το γράφημα εξαρτήσεων του μαθήματος 02, όπως φαίνεται από το plan.
  • Το Note: You didn't use the -out option: αυτή η προσφορά δεν αποθηκεύεται σε αρχείο· το apply θα υπολογίσει ξανά μία ταυτόσημη. Το -out χρησιμεύει όταν ένα pipeline πρέπει να εφαρμόσει ακριβώς το plan που αναθεωρήθηκε, πιο μπροστά στο μάθημα.

Βήμα 6 — Εκτέλεση της προσφοράς

text
terraform apply
text
Terraform used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # local_file.bonjour will be created
  + resource "local_file" "bonjour" {
      + content              = "Bonjour Terraform"

      + filename             = "./bonjour.txt"
      + id                   = (known after apply)
    }

Plan: 1 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

local_file.bonjour: Creating...
local_file.bonjour: Creation complete after 0s [id=fd9aee5556589b4d797e6d49f8ec894e29e57713]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

Τι ζητά η εντολή: «Υπολόγισε ξανά την προσφορά, δείξε τη μου, περίμενε τη συμφωνία μου, και μετά κάν' το.»

Τι να προσέξεις: το ίδιο plan όπως στο βήμα 5, μετά η ερώτηση. Πληκτρολόγησε yes, ολόκληρο, μετά Enter. Έπειτα Creating..., Creation complete after 0s [id=fd9aee55…]: το id που ήταν (known after apply) είναι τώρα γνωστό. Και η φράση που πρέπει να περιμένεις: Apply complete! Resources: 1 added, 0 changed, 0 destroyed. Οι τρεις αριθμοί είναι αυτοί του plan.

Αν πληκτρολογήσεις y αντί για yes, το Terraform απαντά Apply cancelled. και δεν κάνει τίποτα. Δοκίμασέ το μία φορά, για να το έχεις δει· μετά ξανατρέξε με yes.

Βήμα 7 — Ανάγνωση του αρχείου, λίστα του φακέλου

Windows (PowerShell):

powershell
Get-Content .\bonjour.txt
Get-ChildItem -Force

Linux, macOS, WSL 2, Git Bash:

bash
cat bonjour.txt
ls -la
text
Bonjour Terraform
text
total 14
drwxr-xr-x 1 rehou 197609    0 sept. 15 14:55 .
drwxr-xr-x 1 rehou 197609    0 sept. 15 14:55 ..
drwxr-xr-x 1 rehou 197609    0 sept. 15 14:55 .terraform
-rw-r--r-- 1 rehou 197609 1228 sept. 15 14:55 .terraform.lock.hcl
-rw-r--r-- 1 rehou 197609   17 sept. 15 14:55 bonjour.txt
-rw-r--r-- 1 rehou 197609  111 sept. 15 14:55 main.tf
-rw-r--r-- 1 rehou 197609 1634 sept. 15 14:55 terraform.tfstate

(Καταγραφή ls -la του μηχανήματος του μαθήματος· το Get-ChildItem -Force εμφανίζει τα ίδια πέντε ονόματα, με άλλες στήλες.)

Τι ζητούν οι εντολές: «Δείξε μου το περιεχόμενο του bonjour.txt, μετά όλα όσα υπάρχουν στον φάκελο, μαζί με τα κρυφά αρχεία.»

Τι να προσέξεις: Bonjour Terraform, 17 byte, ακριβώς το content σου, χωρίς τελική αλλαγή γραμμής (σε bash, η προτροπή σου μπορεί να εμφανιστεί κολλημένη στο κείμενο: είναι φυσιολογικό). Και δύο καινοτομίες στον φάκελο από το βήμα 4: το bonjour.txt, ο πόρος, και το terraform.tfstate, το state. Το apply δημιούργησε και τα δύο, ταυτόχρονα: το αρχείο στον δίσκο, και τη σημείωση «το δημιούργησα» στην καταγραφή.

Βήμα 8 — Ανάγνωση της καταγραφής: η λίστα

text
terraform state list
text
local_file.bonjour

Τι ζητά η εντολή: «Απαρίθμησε όλα όσα διαχειρίζεσαι σε αυτόν τον φάκελο.»

Τι να προσέξεις: μία γραμμή, ένας πόρος, δηλωμένος με τη διεύθυνσή του local_file.bonjour, η ίδια όπως στο plan. Είναι η απόδειξη ότι το Terraform συνέδεσε το μπλοκ σου με το πραγματικό αρχείο. Πριν από το βήμα 6, η ίδια εντολή θα απαντούσε No state file was found!: δεν υπήρχε ακόμη καταγραφή.

Βήμα 9 — Ανάγνωση της καταγραφής: η λεπτομέρεια

text
terraform state show local_file.bonjour
text
# local_file.bonjour:
resource "local_file" "bonjour" {
    content              = "Bonjour Terraform"
    content_base64sha256 = "SvXkP5Iqo1rJKHgTVJnjanxfsNVGhb+r52mzUqZJYyg="
    content_base64sha512 = "r3+PevYNJRFsHMz4H4U1DK+lg89nhO9SLJZMAqqtzPKiIv3ilrmbx5sYh2JCW9o5EF0NXanYmuxMvI2QN4Z1Ag=="
    content_md5          = "ff3a967c227a58691a3d34a931d3eeb5"
    content_sha1         = "fd9aee5556589b4d797e6d49f8ec894e29e57713"
    content_sha256       = "4af5e43f922aa35ac92878135499e36a7c5fb0d54685bfabe769b352a6496328"
    content_sha512       = "af7f8f7af60d25116c1cccf81f85350cafa583cf6784ef522c964c02aaadccf2a222fde296b99bc79b188762425bda39105d0d5da9d89aec4cbc8d9037867502"
    directory_permission = "0777"
    file_permission      = "0777"
    filename             = "./bonjour.txt"
    id                   = "fd9aee5556589b4d797e6d49f8ec894e29e57713"
}

Τι ζητά η εντολή: «Δείξε μου όλα όσα ξέρεις για το local_file.bonjour

Τι να προσέξεις: η ίδια μορφή με το plan του βήματος 5, αλλά χωρίς κανένα + και χωρίς κανένα (known after apply): όλα είναι γνωστά, όλα είναι σημειωμένα. Το id είναι το αποτύπωμα SHA-1 του περιεχομένου (fd9aee55…), ταυτόσημο με το content_sha1 και με το [id=…] που εμφάνισε το apply. Τα δύο σου ορίσματα (filename, content) είναι εκεί, με τις εννέα ιδιότητες που υπολόγισε ο provider. Αυτή είναι η παραδοτέα σου απάντηση: κράτησέ την.

Για να καταλάβεις καλύτερα
  • Το state είναι ένα αρχείο JSON, το terraform.tfstate, μέσα στον φάκελό σου. Άνοιξέ το στο VS Code για να το διαβάσεις: μια λίστα "resources" με ένα στοιχείο, και μέσα ακριβώς τις τιμές που εμφανίζει το state show. Μην το τροποποιείς ποτέ με το χέρι: ένα κόμμα που μετακινήθηκε και το Terraform δεν αναγνωρίζει πλέον τι έχει κατασκευάσει.
  • Γιατί το Terraform χρειάζεται αυτή την καταγραφή. Αν διαγράψεις το terraform.tfstate, το bonjour.txt παραμένει στον δίσκο, αλλά το Terraform δεν ξέρει πλέον ότι είναι δικό του: στο επόμενο plan, θα προτείνει να το δημιουργήσει ξανά. Το state είναι η μοναδική μνήμη του Terraform.
  • Το state μπορεί να περιέχει μυστικά. Εδώ, το κείμενο ενός αρχείου. Αλλού, έναν κωδικό πρόσβασης βάσης δεδομένων περασμένο ως όρισμα. Δεν μπαίνει στο Git, δεν μοιράζεται με μήνυμα.

Βήμα 10 — Ξαναζητώντας ένα plan: τίποτα να κάνεις

text
terraform plan
text
local_file.bonjour: Refreshing state... [id=fd9aee5556589b4d797e6d49f8ec894e29e57713]

No changes. Your infrastructure matches the configuration.

Terraform has compared your real infrastructure against your configuration
and found no differences, so no changes are needed.

Τι ζητά η εντολή: το ίδιο όπως στα βήματα 3 και 5.

Τι να προσέξεις: δύο καινοτομίες σε σχέση με το βήμα 5. Refreshing state... [id=…]: πριν συγκρίνει, το Terraform πήγε να ξαναδιαβάσει το πραγματικό αρχείο για να επιβεβαιώσει ότι εξακολουθεί να ταιριάζει με την καταγραφή. Μετά No changes. Your infrastructure matches the configuration.: ο κώδικας, η καταγραφή και η πραγματικότητα λένε το ίδιο πράγμα, η προσφορά είναι άδεια. Είναι η ιδεμποτεντικότητα του μαθήματος 01, στο τερματικό: η επανεκτέλεση δεν κάνει τίποτα περισσότερο.

Μην καταστρέψεις τίποτα. Το εργαστήριο θεμελίωσης 2 ξεκινά ακριβώς από αυτόν τον φάκελο, με αυτό το αρχείο και αυτό το state. Αν δεν το συνεχίσεις αμέσως, άφησε τον φάκελο όπως είναι: τίποτα δεν χρεώνεται, τίποτα δεν κινείται. (Αν θέλεις πράγματι να σβήσεις τα πάντα τώρα: terraform destroy, yes, και θα ξανακάνεις το εργαστήριο 1 πριν το 2.)

Τελική επαλήθευση

Ανέβα στη ρίζα του κιτ και τρέξε τον μετρητή:

Windows (PowerShell):

powershell
cd ..\..
.\labo.ps1 etat

Linux, macOS, WSL 2, Git Bash:

bash
cd ../..
./labo.sh etat
text
travail atelier-1 : 1 ressource dans le state
Ressources encore gérées : 1 (0 attendu à la fin d'une séance).

Αναμενόμενη απάντηση: 1 ressource dans le state. Το (0 attendu à la fin d'une séance) είναι η υπενθύμιση του κιτ· εδώ είναι φυσιολογικό να είσαι στο 1, αφού το εργαστήριο 2 θα καταστρέψει αυτόν τον πόρο.

  • Έγραψες ένα main.tf με ένα μόνο μπλοκ, χωρίς terraform {} ούτε provider {}, και αυτό αρκούσε.
  • Είδες Error: Inconsistent dependency lock file και ξέρεις ότι η λύση βρίσκεται στην τελευταία γραμμή.
  • Το init δημιούργησε το .terraform/ και το .terraform.lock.hcl, και τίποτα άλλο.
  • Ξέρεις να διαβάζεις ένα plan: + create, will be created, (known after apply), Plan: 1 to add, 0 to change, 0 to destroy.
  • Το apply ζήτησε yes, δημιούργησε το bonjour.txt και το terraform.tfstate.
  • Το state list δίνει local_file.bonjour· το state show δίνει το πλήρες μπλοκ με ένα id σαράντα χαρακτήρων.
  • Ένα δεύτερο plan δίνει No changes.
  • Κράτησες την έξοδο του terraform state show local_file.bonjour (βήμα 9) ως παραδοτέο.

Αν κάτι κολλάει

Εμφάνιση των συχνών περιπτώσεων
  • terraform : Le terme «terraform» n'est pas reconnu… ή bash: terraform: command not found → Το Terraform δεν είναι εγκατεστημένο ή δεν είναι στο PATH. Έργο 01, παράρτημα A.1 ή B.1.
  • Το .\labo.ps1 ή το ./labo.sh: αρχείο δεν βρέθηκε → Δεν είσαι στη ρίζα του κιτ. cd προς τον φάκελο lab-terraform (αυτόν που περιέχει τα labo.ps1, labo.sh, projets).
  • Le dossier travail\atelier-1 existe déjà. Tapez : → Έχεις ήδη τρέξει το nouveau atelier-1. Κάνε το cd που υποδεικνύεται· αν ο φάκελος περιέχει μια παλιά προσπάθεια, διαγράψτε τον και ξανατρέξε το nouveau.
  • Error: Invalid resource typedoes not support resource type "local_fichier" → Ο τύπος είναι local_file, στα αγγλικά, με κάτω παύλα.
  • Error: Unsupported argumentDid you mean "content"? → Ορθογραφικό λάθος σε ένα όνομα ορίσματος· το Terraform προτείνει το σωστό.
  • Error: Unclosed configuration block → Λείπει το κλείνον άγκιστρο } της τελευταίας γραμμής.
  • Error: Unterminated template string → Λείπει ένα εισαγωγικό " στο τέλος μιας τιμής.
  • Το terraform plan απαντά Error: No configuration files → Το αρχείο δεν ονομάζεται main.tf (συχνά main.tf.txt), ή δεν είσαι στο travail/atelier-1. Έλεγξε με Get-ChildItem ή ls -la.
  • Apply cancelled. → Πληκτρολόγησες κάτι άλλο από yes. Ξανατρέξε, πληκτρολόγησε yes ολόκληρο.
  • Το terraform state list απαντά No state file was found! → Κανένα apply δεν πέτυχε σε αυτόν τον φάκελο. Ξαναπιάστε από το βήμα 6.
  • Το terraform state show απαντά No instance found for the given address! → Η διεύθυνση είναι λάθος γραμμένη· το terraform state list σου δίνει τη σωστή (local_file.bonjour).