Εργαστήριο Θεμελίωσης 2 — Terraform: τροποποίηση, αντικατάσταση, καταστροφή

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

pratique: true

Εργαστήριο Θεμελίωσης 2 — Terraform: τροποποίηση, αντικατάσταση, καταστροφή

Διάρκεια
20 λεπτά
Ενότητα
1/7
Προαπαιτούμενα
το εργαστήριο θεμελίωσης 1 τελειωμένο, χωρίς destroy: ο φάκελος travail/atelier-1 περιέχει τα main.tf, bonjour.txt και terraform.tfstate, και το terraform state list απαντά εκεί local_file.bonjour
Θα κατασκευάσεις
τίποτα νέο· θα κάνεις να ζήσει αυτό που δημιούργησες: θα το σπάσεις με το χέρι, θα το δεις να επιδιορθώνεται, θα αλλάξεις το περιεχόμενό του, θα το δεις να αντικαθίσταται, και μετά θα καταστρέψεις τα πάντα μέχρι ένα άδειο state
Παραδοτέο
η έξοδος του terraform plan του βήματος 5 (αυτή που περιέχει must be replaced) και αυτή του terraform state list του βήματος 9 (άδεια)

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

Στόχος

Το εργαστήριο 1 σε έκανε να δημιουργήσεις έναν πόρο και να διαβάσεις το state. Όμως μια υποδομή δεν δημιουργείται μία φορά για πάντα: τροποποιείται, κάποιος τη σπάει κατά λάθος, και μια μέρα την αποσυναρμολογούμε. Αυτές είναι οι τρεις κινήσεις αυτού του εργαστηρίου. Θα διαγράψεις πρώτα το bonjour.txt με το χέρι, όπως ένας συνάδελφος που «καθαρίζει» έναν φάκελο, και θα δεις το Terraform να το προσέχει και μετά να το ξανακατασκευάζει: είναι η απόκλιση του μαθήματος 01. Θα αλλάξεις μετά μια γραμμή του main.tf και θα ανακαλύψεις ότι, για τον provider local, η αλλαγή του περιεχομένου ενός αρχείου δεν το τροποποιεί: το αντικαθιστά, με ένα σύμβολο που πρέπει να ξέρεις να αναγνωρίζεις πριν πεις yes. Τέλος θα καταστρέψεις τα πάντα, και θα επαληθεύσεις ότι η καταγραφή είναι άδεια και ότι το κιτ μετράει μηδέν.

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

Πάντα ο αρχιτέκτονας. Μια απόκλιση (drift), είναι ένας εργάτης που μετακίνησε έναν τοίχο χωρίς να το πει: το κτίριο δεν ταιριάζει πλέον με την καταγραφή· ο αρχιτέκτονας το αντιλαμβάνεται όταν πηγαίνει να δει επί τόπου (Refreshing state...). Τροποποίηση επί τόπου (~), είναι το να ξαναβάψεις έναν τοίχο: ο τοίχος παραμένει ο ίδιος. Αντικατάσταση (-/+), είναι το να γκρεμίσεις τον τοίχο και να ξανακατασκευάσεις έναν στο ίδιο σημείο: έχει νέο αριθμό στην καταγραφή. Καταστροφή (-), είναι το να γκρεμίσεις χωρίς να ξανακατασκευάσεις. Η προσφορά λέει πάντα ποιο από τα τρία προβλέπει· εσύ το διαβάζεις πριν υπογράψεις.

Σύμβολο στο planΦράση στο planΤι κάνει το TerraformΣε αυτό το εργαστήριο
+will be createdδημιουργεί ένα νέο αντικείμενοβήμα 3: το αρχείο που διαγράφηκε με το χέρι
~will be updated in-placeαλλάζει μια ιδιότητα, το αντικείμενο παραμένειποτέ για το content ενός local_file
-/+must be replacedκαταστρέφει το αντικείμενο, μετά δημιουργεί άλλοβήμα 5: το content αλλάζει
-will be destroyedαφαιρεί το αντικείμενοβήμα 8: destroy

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

Το ίδιο τερματικό όπως για το εργαστήριο 1, μέσα στον φάκελο travail/atelier-1 του κιτ lab-terraform. Και το VS Code για να τροποποιήσεις το main.tf. Οι εντολές terraform … είναι ταυτόσημες παντού· οι εντολές για διαγραφή, ανάγνωση ή λίστα αρχείου δίνονται και στις δύο εκδόσεις.

Βήμα 1 — Επαναφορά στο σημείο εκκίνησης

Windows (PowerShell), από τη ρίζα του κιτ:

powershell
cd travail\atelier-1

Linux, macOS, WSL 2, Git Bash:

bash
cd travail/atelier-1

Μετά:

text
terraform state list
text
local_file.bonjour

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

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

Βήμα 2 — Σπάσιμο με το χέρι

Windows (PowerShell):

powershell
Remove-Item .\bonjour.txt
Get-ChildItem

Linux, macOS, WSL 2, Git Bash:

bash
rm bonjour.txt
ls

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

Τι να προσέξεις: το bonjour.txt δεν είναι πλέον εκεί· τα main.tf και terraform.tfstate είναι ακόμα εκεί. Μόλις έκανες αυτό που κάνει ένας συνάδελφος στην κονσόλα AWS όταν διαγράφει ένα bucket «που δεν χρησίμευε σε τίποτα»: η πραγματικότητα άλλαξε, αλλά ούτε ο κώδικας ούτε η καταγραφή το ξέρουν ακόμη.

Βήμα 3 — Παρατήρηση της απόκλισης

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

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)

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

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

Τι ζητά η εντολή: «Σύγκρινε τον κώδικα, την καταγραφή και την πραγματικότητα, και πες μου τι λείπει.»

Τι να προσέξεις: Refreshing state... [id=fd9aee55…]: το Terraform πήγε να δει το αρχείο που αναφέρει η καταγραφή του, και δεν το βρήκε. Αποτέλεσμα: το αφαιρεί από την καταγραφή του και η προσφορά λέει will be created, Plan: 1 to add. Το ίδιο plan όπως στο εργαστήριο 1, βήμα 5, ενώ δεν άγγιξες τον κώδικα. Αυτό είναι μια απόκλιση: η πραγματικότητα κινήθηκε χωρίς να περάσει από το Terraform, και το Terraform την εντόπισε τη στιγμή του plan, όχι πριν.

Για να καταλάβεις καλύτερα
  • Το Terraform δεν παρακολουθεί τίποτα συνεχώς. Ανάμεσα σε δύο εντολές, δεν ξέρει τι συμβαίνει. Είναι το Refreshing state... του plan (και του apply) που ξαναδιαβάζει την πραγματικότητα. Ένα αρχείο που διαγράφηκε πριν τρεις μέρες ανακαλύπτεται μόνο στο επόμενο plan.
  • Γιατί + και όχι -/+; Το αντικείμενο δεν υπάρχει πλέον καθόλου: δεν υπάρχει τίποτα να καταστραφεί, μόνο να δημιουργηθεί. Το -/+ (βήμα 5) είναι για ένα αντικείμενο που υπάρχει ακόμα αλλά πρέπει να ξαναγίνει.
  • Στο cloud, είναι η πιο συχνή κατάσταση: κάποιος τροποποίησε έναν κανόνα τείχους προστασίας στην κονσόλα, και το επόμενο plan προτείνει να τον ξαναβάλει όπως λέει ο κώδικας. Το plan σου το δείχνει· σε εσένα ανήκει να αποφασίσεις αν ο κώδικας ή η κονσόλα είχε δίκιο.

Βήμα 4 — Επιδιόρθωση

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



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.

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

Τι να προσέξεις: το bonjour.txt επέστρεψε, και το id του είναι το ίδιο όπως πριν (fd9aee55…): το αναγνωριστικό ενός local_file είναι το αποτύπωμα του περιεχομένου του, και το περιεχόμενο δεν άλλαξε. Επαλήθευσε με Get-Content .\bonjour.txt ή cat bonjour.txt: Bonjour Terraform. Ένα script δεν θα ήξερε ότι έπρεπε να επιδιορθώσει· το Terraform το ήξερε επειδή έχει μια καταγραφή και έναν κώδικα να συγκρίνει.

Βήμα 5 — Αλλαγή του περιεχομένου, ανάγνωση της προσφοράς αντικατάστασης

Στο VS Code, τροποποίησε τη γραμμή content του main.tf για να πάρεις:

hcl
resource "local_file" "bonjour" {
  filename = "${path.module}/bonjour.txt"
  content  = "Bonjour Terraform, deuxième version"
}

Αποθήκευσε, μετά:

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

Terraform used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
-/+ destroy and then create replacement

Terraform will perform the following actions:

  # local_file.bonjour must be replaced
-/+ resource "local_file" "bonjour" {
      ~ content              = "Bonjour Terraform" -> "Bonjour Terraform, deuxième version" # forces replacement
      ~ content_base64sha256 = "SvXkP5Iqo1rJKHgTVJnjanxfsNVGhb+r52mzUqZJYyg=" -> (known after apply)
      ~ content_base64sha512 = "r3+PevYNJRFsHMz4H4U1DK+lg89nhO9SLJZMAqqtzPKiIv3ilrmbx5sYh2JCW9o5EF0NXanYmuxMvI2QN4Z1Ag==" -> (known after apply)
      ~ content_md5          = "ff3a967c227a58691a3d34a931d3eeb5" -> (known after apply)
      ~ content_sha1         = "fd9aee5556589b4d797e6d49f8ec894e29e57713" -> (known after apply)
      ~ content_sha256       = "4af5e43f922aa35ac92878135499e36a7c5fb0d54685bfabe769b352a6496328" -> (known after apply)
      ~ content_sha512       = "af7f8f7af60d25116c1cccf81f85350cafa583cf6784ef522c964c02aaadccf2a222fde296b99bc79b188762425bda39105d0d5da9d89aec4cbc8d9037867502" -> (known after apply)
      ~ id                   = "fd9aee5556589b4d797e6d49f8ec894e29e57713" -> (known after apply)
        # (3 unchanged attributes hidden)
    }

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

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

Τι να προσέξεις, γραμμή προς γραμμή. Είναι το πιο σημαντικό plan της ενότητας:

ΓραμμήΤι λέει
-/+ destroy and then create replacementΗ λεζάντα: το σύμβολο που χρησιμοποιείται είναι -/+, «καταστροφή και μετά δημιουργία αντικαταστάτη».
# local_file.bonjour must be replacedΌχι will be updated in-place: ο πόρος πρέπει να αντικατασταθεί.
-/+ resource "local_file" "bonjour" {Ολόκληρο το μπλοκ φέρει το -/+.
~ content = "Bonjour Terraform" -> "Bonjour Terraform, deuxième version" # forces replacementΤο ~ λέει ότι η τιμή αλλάζει, από την παλιά (->) στη νέα. Το σχόλιο # forces replacement λέει ότι αυτή η ιδιότητα υποχρεώνει σε αντικατάσταση.
~ content_md5 = "ff3a967c…" -> (known after apply)Τα αποτυπώματα θα αλλάξουν· το Terraform δεν γνωρίζει ακόμη τα νέα.
~ id = "fd9aee55…" -> (known after apply)Το αναγνωριστικό θα αλλάξει. Θα είναι ένα άλλο αντικείμενο.
# (3 unchanged attributes hidden)Τα filename, directory_permission, file_permission δεν κινούνται· το Terraform τα κρύβει για την αναγνωσιμότητα.
Plan: 1 to add, 0 to change, 1 to destroy.Μία καταστροφή και μία δημιουργία, καμία τροποποίηση.

Αυτή είναι η πρώτη σου παραδοτέα απάντηση: κράτησε αυτή την έξοδο.

Η ουσιαστική διαφορά ανάμεσα στο ~ και το -/+. Το ~ μπροστά από το content λέει τι αλλάζει. Το -/+ μπροστά από το resource λέει πώς θα το χειριστεί το Terraform: γκρέμισμα, μετά ανακατασκευή. Για ένα αρχείο κειμένου, δεν θα δεις τη διαφορά. Για μια βάση δεδομένων, το -/+ σημαίνει ότι τα δεδομένα εξαφανίζονται με το παλιό αντικείμενο. Ο provider αποφασίζει, ιδιότητα προς ιδιότητα· ο provider local αποφάσισε ότι το content υποχρεώνει σε αντικατάσταση. Εσύ διαβάζεις τις τρεις ενδείξεις (must be replaced, # forces replacement, 1 to destroy) πριν πληκτρολογήσεις yes.

Για να καταλάβεις καλύτερα
  • Γιατί ο provider local αντικαθιστά αντί να τροποποιεί; Επειδή δεν ξέρει να «διορθώσει» ένα υπάρχον αρχείο: ξέρει να το γράψει ή να το διαγράψει. Το id ενός local_file είναι εξάλλου το αποτύπωμα SHA-1 του περιεχομένου του· η αλλαγή του περιεχομένου αλλάζει το αναγνωριστικό, και ένα αντικείμενο του οποίου το αναγνωριστικό αλλάζει είναι, για το Terraform, ένα άλλο αντικείμενο. Στο μηχάνημα του μαθήματος, το file_permission υποχρεώνει επίσης σε αντικατάσταση. Άλλοι providers κάνουν διαφορετικά: η αλλαγή μιας ετικέτας (tag) σε έναν πόρο AWS είναι ~, η αλλαγή του ονόματός του είναι συχνά -/+.
  • Πού είναι γραμμένο αυτό; Στην τεκμηρίωση κάθε πόρου στο Registry, ορισμένα ορίσματα επισημαίνονται ως forces new resourceForceNew). Πριν από ένα apply σε παραγωγή, αυτό είναι που θα διαβάσουμε.
  • Μπορούμε να επιβάλουμε μια αντικατάσταση εθελοντικά; Ναι: το terraform apply -replace=local_file.bonjour αντικαθιστά τον πόρο ακόμη και χωρίς αλλαγή κώδικα. Χρήσιμο όταν ένα αντικείμενο είναι κατεστραμμένο. Θα το δεις στο έργο 08.

Βήμα 6 — Εφαρμογή της αντικατάστασης

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



Plan: 1 to add, 0 to change, 1 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: Destroying... [id=fd9aee5556589b4d797e6d49f8ec894e29e57713]
local_file.bonjour: Destruction complete after 0s
local_file.bonjour: Creating...
local_file.bonjour: Creation complete after 0s [id=bd2b5f8ccbb2cbc2b9bea872211549635a76b092]

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

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

Τι να προσέξεις: τέσσερις γραμμές ενέργειας αντί για δύο, με τη σειρά του συμβόλου -/+: Destroying... μετά Destruction complete (το παλιό, fd9aee55…), μετά Creating... μετά Creation complete (το νέο, bd2b5f8c…). Και η τελευταία γραμμή: Apply complete! Resources: 1 added, 0 changed, 1 destroyed. Όχι 1 changed: τίποτα δεν τροποποιήθηκε, ένα αντικείμενο καταστράφηκε και ένα άλλο δημιουργήθηκε.

Βήμα 7 — Επαλήθευση του αρχείου και του νέου αναγνωριστικού

Windows (PowerShell):

powershell
Get-Content .\bonjour.txt

Linux, macOS, WSL 2, Git Bash:

bash
cat bonjour.txt
text
Bonjour Terraform, deuxième version

Μετά:

text
terraform state show local_file.bonjour
text
# local_file.bonjour:
resource "local_file" "bonjour" {
    content              = "Bonjour Terraform, deuxième version"
    content_base64sha256 = "hg9L75JxH+5SDk+ZOADZinGONkirydetS0TFjN3uZ3o="
    content_base64sha512 = "EjT8mRVQU2JQ+Em/rnbRKYfe7E2UqIWw8yQMMtaatimH5XCKg4ZomW4PI5yO5jhujdSrU04vX17HE2kaqEVSkQ=="
    content_md5          = "9a1a1355b48e28ad727200e450b851e1"
    content_sha1         = "bd2b5f8ccbb2cbc2b9bea872211549635a76b092"
    content_sha256       = "860f4bef92711fee520e4f993800d98a718e3648abc9d7ad4b44c58cddee677a"
    content_sha512       = "1234fc991550536250f849bfae76d12987deec4d94a885b0f3240c32d69ab62987e5708a838668996e0f239c8ee6386e8dd4ab534e2f5f5ec713691aa8455291"
    directory_permission = "0777"
    file_permission      = "0777"
    filename             = "./bonjour.txt"
    id                   = "bd2b5f8ccbb2cbc2b9bea872211549635a76b092"
}

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

Τι να προσέξεις: το αρχείο περιέχει τη δεύτερη έκδοση. Στην καταγραφή, το content είναι η νέα τιμή, όλα τα αποτυπώματα έχουν αλλάξει, και το id είναι bd2b5f8c…, αυτό που εμφάνισε το Creation complete στο βήμα 6. Σύγκρινε με το state show του εργαστηρίου 1, βήμα 9: ίδια διεύθυνση local_file.bonjour, αλλά άλλο αντικείμενο. Ο κώδικας, η καταγραφή και η πραγματικότητα συμφωνούν ξανά: ένα terraform plan τώρα θα έλεγε No changes.

Βήμα 8 — Καταστροφή όλων

text
terraform destroy
text
local_file.bonjour: Refreshing state... [id=bd2b5f8ccbb2cbc2b9bea872211549635a76b092]

Terraform used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
  - destroy

Terraform will perform the following actions:

  # local_file.bonjour will be destroyed
  - resource "local_file" "bonjour" {
      - content              = "Bonjour Terraform, deuxième version" -> null
      - content_base64sha256 = "hg9L75JxH+5SDk+ZOADZinGONkirydetS0TFjN3uZ3o=" -> null

      - filename             = "./bonjour.txt" -> null
      - id                   = "bd2b5f8ccbb2cbc2b9bea872211549635a76b092" -> null
    }

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

Do you really want to destroy all resources?
  Terraform will destroy all your managed infrastructure, as shown above.
  There is no undo. Only 'yes' will be accepted to confirm.

  Enter a value: yes

local_file.bonjour: Destroying... [id=bd2b5f8ccbb2cbc2b9bea872211549635a76b092]
local_file.bonjour: Destruction complete after 0s

Destroy complete! Resources: 1 destroyed.

Τι ζητά η εντολή: «Καταστρέψε όλα όσα διαχειρίζεσαι εδώ· δείξε μου την προσφορά και περίμενε το yes μου.»

Τι να προσέξεις: το τρίτο σύμβολο, μόνο -, και κάθε ιδιότητα που περνά σε -> null («τίποτα πλέον»). Η ερώτηση είναι πιο σοβαρή από στο apply: Do you really want to destroy all resources? και There is no undo. Πληκτρολόγησε yes. Η φράση που πρέπει να περιμένεις: Destroy complete! Resources: 1 destroyed. Το αρχείο εξαφανίστηκε από τον φάκελο.

Βήμα 9 — Ανάγνωση μιας άδειας καταγραφής

text
terraform state list
text

Μετά, για να δεις τι απαντά το Terraform όταν του ζητάς έναν πόρο που δεν διαχειρίζεται πλέον:

text
terraform state show local_file.bonjour
text
No instance found for the given address!

This command requires that the address references one specific instance.
To view the available instances, use "terraform state list". Please modify
the address to reference a specific instance.

Τι ζητούν οι εντολές: «Απαρίθμησε τι διαχειρίζεσαι», μετά «δείξε μου το local_file.bonjour».

Τι να προσέξεις: το state list δεν απαντά τίποτα: καμία γραμμή, κανένα σφάλμα, μια άδεια καταγραφή. Είναι διαφορετικό από το No state file was found! του εργαστηρίου 1 πριν το apply: εδώ το αρχείο terraform.tfstate υπάρχει, αλλά η λίστα πόρων του είναι άδεια. Και το state show απαντά No instance found for the given address!: η διεύθυνση είναι σωστή, αλλά τίποτα δεν αντιστοιχεί πλέον σε αυτή, και το Terraform σε παραπέμπει στο state list. Αυτή είναι η δεύτερη σου παραδοτέα απάντηση: η άδεια έξοδος του terraform state list.

Βήμα 10 — Λίστα του φακέλου μετά

Windows (PowerShell):

powershell
Get-ChildItem -Force

Linux, macOS, WSL 2, Git Bash:

bash
ls -la
text
total 17
drwxr-xr-x 1 rehou 197609    0 Sep 15 14:57 .
drwxr-xr-x 1 rehou 197609    0 Sep 15 14:57 ..
drwxr-xr-x 1 rehou 197609    0 Sep 15 14:57 .terraform
-rw-r--r-- 1 rehou 197609 1228 Sep 15 14:57 .terraform.lock.hcl
-rw-r--r-- 1 rehou 197609  130 Sep 15 14:57 main.tf
-rw-r--r-- 1 rehou 197609  181 Sep 15 14:57 terraform.tfstate
-rw-r--r-- 1 rehou 197609 1653 Sep 15 14:57 terraform.tfstate.backup

(Καταγραφή ls -la του μηχανήματος του μαθήματος· το Get-ChildItem -Force εμφανίζει τα ίδια πέντε ονόματα: .terraform, .terraform.lock.hcl, main.tf, terraform.tfstate, terraform.tfstate.backup.)

Τι ζητά η εντολή: «Δείξε μου όλον τον φάκελο, μαζί με τα κρυφά αρχεία.»

Τι να προσέξεις: το bonjour.txt δεν είναι πλέον εκεί. Το main.tf είναι ανέπαφο: η καταστροφή των πόρων δεν αγγίζει ποτέ τον κώδικα. Το terraform.tfstate είναι ακόμα εκεί αλλά μικροσκοπικό (181 byte), και ένα terraform.tfstate.backup εμφανίστηκε: η αντιγραφή της καταγραφής πριν το destroy, που το Terraform κρατά από προσοχή. Τα .terraform/ και .terraform.lock.hcl παραμένουν επίσης: αν ξανατρέξεις το apply, δεν χρειάζεται να ξανακάνεις το init.

Άνοιξε το state για να το δεις άδειο, χωρίς να το τροποποιήσεις (Get-Content .\terraform.tfstate ή cat terraform.tfstate):

json
{
  "version": 4,
  "terraform_version": "1.12.2",
  "serial": 6,
  "lineage": "69fb219e-a88c-a97f-5aed-a33e7c34ff69",
  "outputs": {},
  "resources": [],
  "check_results": null
}

"resources": []: τίποτα. Το "serial" μετράει τις εγγραφές στο state (έξι εδώ: δύο apply στο εργαστήριο 1, μετά επιδιόρθωση, αντικατάσταση και καταστροφή)· το "lineage" είναι το αναγνωριστικό αυτού του state, διαφορετικό στο δικό σου.

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

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

Windows (PowerShell):

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

Linux, macOS, WSL 2, Git Bash:

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

Αναμενόμενη απάντηση: aucune ressource και Ressources encore gérées : 0. Είναι το καθαρό τέλος συνεδρίας που θα απαιτεί κάθε έργο του μαθήματος, όταν οι πόροι θα κοστίζουν χρήματα.

  • Διάγραψες το bonjour.txt με το χέρι και είδες το plan να προτείνει will be created χωρίς να έχει αλλάξει ο κώδικας: μια απόκλιση, που εντοπίστηκε στο Refreshing state....
  • Το apply ξανακατασκεύασε το αρχείο με το ίδιο id.
  • Άλλαξες το content και διάβασες τις τρεις ενδείξεις της αντικατάστασης: must be replaced, # forces replacement, Plan: 1 to add, 0 to change, 1 to destroy.
  • Το apply εμφάνισε Destroying... μετά Creating..., και Resources: 1 added, 0 changed, 1 destroyed.· το id άλλαξε.
  • Το destroy ζήτησε yes με There is no undo. και απάντησε Destroy complete! Resources: 1 destroyed.
  • Το state list δεν δίνει τίποτα· το state show δίνει No instance found for the given address!· το terraform.tfstate περιέχει "resources": [].
  • Το etat δίνει Ressources encore gérées : 0.
  • Κράτησες το plan του βήματος 5 και την άδεια έξοδο του βήματος 9 ως παραδοτέα.

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

Εμφάνιση των συχνών περιπτώσεων
  • Στο βήμα 1, το state list απαντά No state file was found! → Δεν είσαι στο travail/atelier-1, ή το εργαστήριο 1 δεν έγινε μέχρι το apply. Έλεγξε τον φάκελο (Get-ChildItem -Force ή ls -la πρέπει να δείχνει terraform.tfstate), αλλιώς ξανακάνε το εργαστήριο 1.
  • Στο βήμα 1, το state list δεν απαντά τίποτα → Ο πόρος έχει ήδη καταστραφεί (ένα destroy στο τέλος του εργαστηρίου 1). Ξανατρέξε το terraform apply, yes, μετά ξαναπιάστε από το βήμα 2.
  • Στο βήμα 3, το plan λέει No changes. → Το αρχείο δεν διαγράφηκε (ορθογραφικό λάθος στο Remove-Item ή rm, ή λάθος φάκελος). Έλεγξε με Get-ChildItem ή ls, διάγραψέ το, ξανατρέξε το plan.
  • Στο βήμα 5, το plan λέει No changes. → Το main.tf δεν αποθηκεύτηκε μετά την τροποποίηση (VS Code: λευκή κουκκίδα στην καρτέλα). Ctrl+S μετά ξανατρέξε.
  • Στο βήμα 5, Error: Unterminated template string → Το κλείνον εισαγωγικό της νέας τιμής content χάθηκε κατά την επεξεργασία. Ξαναβάλ' το.
  • Στο βήμα 5, η γραμμή με σήμανση # forces replacement δεν είναι η content → Τροποποίησες ένα άλλο όρισμα ταυτόχρονα (για παράδειγμα file_permission = "0644"). Για ένα local_file, και αυτό υποχρεώνει σε αντικατάσταση (επιβεβαιωμένο: ~ file_permission = "0777" -> "0644" # forces replacement). Ξαναβάλε το αρχείο όπως στο βήμα 5, μόνο η γραμμή content πρέπει να αλλάξει.
  • Apply cancelled. → Πληκτρολογήθηκε κάτι άλλο από yes. Ξανατρέξε, πληκτρολόγησε yes ολόκληρο.
  • Στο βήμα 8, το destroy λέει No changes. No objects need to be destroyed. και μετά Destroy complete! Resources: 0 destroyed. → Δεν υπάρχει πλέον τίποτα στο state (Either you have not created any objects yet or the existing objects were already deleted outside of Terraform.). Προχώρα στο βήμα 9.
  • Μετά το destroy, πιστεύεις ότι το state δεν καθαρίστηκε επειδή το terraform.tfstate υπάρχει ακόμα → Είναι φυσιολογικό. Άνοιξέ το: "resources": []. Το αρχείο παραμένει, άδειο, με ένα .backup δίπλα.
  • Το etat απαντά Ressources encore gérées : 1 → Το destroy ακυρώθηκε ή έγινε σε άλλον φάκελο. Γύρνα στο travail/atelier-1, terraform destroy, yes, ξανατρέξε το etat.