Πώς να διαβάσεις αυτή τη σελίδα. Δέκα βήματα, μία εντολή τη φορά. Για καθένα: η εντολή, η ακριβής έξοδος του μηχανήματος του μαθήματος (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 … είναι ταυτόσημες παντού· οι εντολές για διαγραφή, ανάγνωση ή λίστα αρχείου δίνονται και στις δύο εκδόσεις.
Windows (PowerShell), από τη ρίζα του κιτ:
cd travail\atelier-1Linux, macOS, WSL 2, Git Bash:
cd travail/atelier-1Μετά:
terraform state listlocal_file.bonjourΤι ζητά η εντολή: «Τι διαχειρίζεσαι σε αυτόν τον φάκελο;»
Τι να προσέξεις: μία γραμμή, local_file.bonjour. Είναι η κατάσταση όπου σε άφησε το εργαστήριο 1. Αν διαβάζεις No state file was found! ή τίποτα απολύτως, ο φάκελος δεν είναι ο σωστός ή ο πόρος καταστράφηκε: ξανακάνε το εργαστήριο 1 πριν συνεχίσεις.
Windows (PowerShell):
Remove-Item .\bonjour.txt
Get-ChildItemLinux, macOS, WSL 2, Git Bash:
rm bonjour.txt
lsΤι ζητούν οι εντολές: «Διάγραψε το bonjour.txt, μετά δείξε μου τον φάκελο.»
Τι να προσέξεις: το bonjour.txt δεν είναι πλέον εκεί· τα main.tf και terraform.tfstate είναι ακόμα εκεί. Μόλις έκανες αυτό που κάνει ένας συνάδελφος στην κονσόλα AWS όταν διαγράφει ένα bucket «που δεν χρησίμευε σε τίποτα»: η πραγματικότητα άλλαξε, αλλά ούτε ο κώδικας ούτε η καταγραφή το ξέρουν ακόμη.
terraform planlocal_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, όχι πριν.
Refreshing state... του plan (και του apply) που ξαναδιαβάζει την πραγματικότητα. Ένα αρχείο που διαγράφηκε πριν τρεις μέρες ανακαλύπτεται μόνο στο επόμενο plan.+ και όχι -/+; Το αντικείμενο δεν υπάρχει πλέον καθόλου: δεν υπάρχει τίποτα να καταστραφεί, μόνο να δημιουργηθεί. Το -/+ (βήμα 5) είναι για ένα αντικείμενο που υπάρχει ακόμα αλλά πρέπει να ξαναγίνει.plan προτείνει να τον ξαναβάλει όπως λέει ο κώδικας. Το plan σου το δείχνει· σε εσένα ανήκει να αποφασίσεις αν ο κώδικας ή η κονσόλα είχε δίκιο.terraform applylocal_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 το ήξερε επειδή έχει μια καταγραφή και έναν κώδικα να συγκρίνει.
Στο VS Code, τροποποίησε τη γραμμή content του main.tf για να πάρεις:
resource "local_file" "bonjour" {
filename = "${path.module}/bonjour.txt"
content = "Bonjour Terraform, deuxième version"
}Αποθήκευσε, μετά:
terraform planlocal_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 αποφασίζει, ιδιότητα προς ιδιότητα· ο providerlocalαποφάσισε ότι τοcontentυποχρεώνει σε αντικατάσταση. Εσύ διαβάζεις τις τρεις ενδείξεις (must be replaced,# forces replacement,1 to destroy) πριν πληκτρολογήσειςyes.
local αντικαθιστά αντί να τροποποιεί; Επειδή δεν ξέρει να «διορθώσει» ένα υπάρχον αρχείο: ξέρει να το γράψει ή να το διαγράψει. Το id ενός local_file είναι εξάλλου το αποτύπωμα SHA-1 του περιεχομένου του· η αλλαγή του περιεχομένου αλλάζει το αναγνωριστικό, και ένα αντικείμενο του οποίου το αναγνωριστικό αλλάζει είναι, για το Terraform, ένα άλλο αντικείμενο. Στο μηχάνημα του μαθήματος, το file_permission υποχρεώνει επίσης σε αντικατάσταση. Άλλοι providers κάνουν διαφορετικά: η αλλαγή μιας ετικέτας (tag) σε έναν πόρο AWS είναι ~, η αλλαγή του ονόματός του είναι συχνά -/+.apply σε παραγωγή, αυτό είναι που θα διαβάσουμε.terraform apply -replace=local_file.bonjour αντικαθιστά τον πόρο ακόμη και χωρίς αλλαγή κώδικα. Χρήσιμο όταν ένα αντικείμενο είναι κατεστραμμένο. Θα το δεις στο έργο 08.terraform applylocal_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: τίποτα δεν τροποποιήθηκε, ένα αντικείμενο καταστράφηκε και ένα άλλο δημιουργήθηκε.
Windows (PowerShell):
Get-Content .\bonjour.txtLinux, macOS, WSL 2, Git Bash:
cat bonjour.txtBonjour Terraform, deuxième versionΜετά:
terraform state show local_file.bonjour# 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.
terraform destroylocal_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. Το αρχείο εξαφανίστηκε από τον φάκελο.
terraform state listΜετά, για να δεις τι απαντά το Terraform όταν του ζητάς έναν πόρο που δεν διαχειρίζεται πλέον:
terraform state show local_file.bonjourNo 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.
Windows (PowerShell):
Get-ChildItem -ForceLinux, macOS, WSL 2, Git Bash:
ls -latotal 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):
{
"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):
cd ..\..
.\labo.ps1 etatLinux, macOS, WSL 2, Git Bash:
cd ../..
./labo.sh etattravail 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.state list απαντά No state file was found! → Δεν είσαι στο travail/atelier-1, ή το εργαστήριο 1 δεν έγινε μέχρι το apply. Έλεγξε τον φάκελο (Get-ChildItem -Force ή ls -la πρέπει να δείχνει terraform.tfstate), αλλιώς ξανακάνε το εργαστήριο 1.state list δεν απαντά τίποτα → Ο πόρος έχει ήδη καταστραφεί (ένα destroy στο τέλος του εργαστηρίου 1). Ξανατρέξε το terraform apply, yes, μετά ξαναπιάστε από το βήμα 2.No changes. → Το αρχείο δεν διαγράφηκε (ορθογραφικό λάθος στο Remove-Item ή rm, ή λάθος φάκελος). Έλεγξε με Get-ChildItem ή ls, διάγραψέ το, ξανατρέξε το plan.No changes. → Το main.tf δεν αποθηκεύτηκε μετά την τροποποίηση (VS Code: λευκή κουκκίδα στην καρτέλα). Ctrl+S μετά ξανατρέξε.Error: Unterminated template string → Το κλείνον εισαγωγικό της νέας τιμής content χάθηκε κατά την επεξεργασία. Ξαναβάλ' το.# forces replacement δεν είναι η content → Τροποποίησες ένα άλλο όρισμα ταυτόχρονα (για παράδειγμα file_permission = "0644"). Για ένα local_file, και αυτό υποχρεώνει σε αντικατάσταση (επιβεβαιωμένο: ~ file_permission = "0777" -> "0644" # forces replacement). Ξαναβάλε το αρχείο όπως στο βήμα 5, μόνο η γραμμή content πρέπει να αλλάξει.Apply cancelled. → Πληκτρολογήθηκε κάτι άλλο από yes. Ξανατρέξε, πληκτρολόγησε yes ολόκληρο.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.