Πώς να διαβάσεις αυτή τη σελίδα. Δέκα βήματα, μία εντολή τη φορά. Για καθένα: η εντολή που πληκτρολογείς, η ακριβής έξοδος του μηχανήματος του μαθήματος (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" | κάτι να διαχειριστείς, περιγραμμένο σε ένα αρχείο .tf | resource "local_file" "bonjour" |
| τύπος πόρου | τι είναι, παρεχόμενο από έναν provider | local_file (ένα αρχείο στον δίσκο) |
| τοπικό όνομα | πώς το ονομάζεις στον κώδικά σου | bonjour |
| διεύθυνση | τύπος . όνομα, για να μιλάς για αυτό αλλού | local_file.bonjour |
| όρισμα | μια τιμή που γράφεις στο μπλοκ | filename, content |
| ιδιότητα | μια τιμή που υπολογίζει ο provider | id, content_md5 |
| plan | η προσφορά: τι λείπει ανάμεσα στον κώδικα και στην πραγματικότητα | Plan: 1 to add, 0 to change, 0 to destroy. |
| state | η καταγραφή: τι έχει κατασκευάσει το Terraform | terraform.tfstate, διαβάζεται με state list και state show |
Ένα τερματικό (PowerShell σε Windows· bash ή zsh σε Linux, macOS, WSL 2 ή Git Bash), ανοιχτό στη ρίζα του κιτ lab-terraform, αυτή που περιέχει τα labo.ps1 και labo.sh. Και το VS Code για να γράψεις το αρχείο. Οι εντολές terraform … γράφονται με τον ίδιο ακριβώς τρόπο παντού· μόνο οι εντολές για δημιουργία, ανάγνωση ή λίστα αρχείου αλλάζουν, και δίνονται και στις δύο εκδόσεις κάθε φορά.
Windows (PowerShell):
.\labo.ps1 nouveau atelier-1
cd travail\atelier-1Linux, macOS, WSL 2, Git Bash:
./labo.sh nouveau atelier-1
cd travail/atelier-1Dossier 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, που θα το κάνουν έτσι.
Στο VS Code (code . από τον φάκελο), δημιούργησε ένα αρχείο main.tf και πληκτρολόγησε ακριβώς:
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):
Get-ChildItem
Get-Content .\main.tfLinux, macOS, WSL 2, Git 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. Δεν αλλάζει τίποτα στη σημασία.terraform planError: 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. Είναι το σφάλμα που κάθε αρχάριος συναντά μία φορά· τώρα ξέρεις να το διαβάζεις.
terraform initInitializing 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):
Get-ChildItem -ForceLinux, macOS, WSL 2, Git 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.v2.9.1· σε έξι μήνες, v3.0.0 με διαφορετική συμπεριφορά. Το μπλοκ required_providers του έργου 01 (version = "~> 2.5") αποφεύγει την έκπληξη. Για ένα εργαστήριο εικοσάλεπτου, το προσπερνάμε.terraform planTerraform 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 δεν υπάρχει ακόμη στον φάκελο.
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 που αναθεωρήθηκε, πιο μπροστά στο μάθημα.terraform applyTerraform 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.
Windows (PowerShell):
Get-Content .\bonjour.txt
Get-ChildItem -ForceLinux, macOS, WSL 2, Git Bash:
cat bonjour.txt
ls -laBonjour Terraformtotal 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 δημιούργησε και τα δύο, ταυτόχρονα: το αρχείο στον δίσκο, και τη σημείωση «το δημιούργησα» στην καταγραφή.
terraform state listlocal_file.bonjourΤι ζητά η εντολή: «Απαρίθμησε όλα όσα διαχειρίζεσαι σε αυτόν τον φάκελο.»
Τι να προσέξεις: μία γραμμή, ένας πόρος, δηλωμένος με τη διεύθυνσή του local_file.bonjour, η ίδια όπως στο plan. Είναι η απόδειξη ότι το Terraform συνέδεσε το μπλοκ σου με το πραγματικό αρχείο. Πριν από το βήμα 6, η ίδια εντολή θα απαντούσε No state file was found!: δεν υπήρχε ακόμη καταγραφή.
terraform state show local_file.bonjour# 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. Αυτή είναι η παραδοτέα σου απάντηση: κράτησέ την.
terraform.tfstate, μέσα στον φάκελό σου. Άνοιξέ το στο VS Code για να το διαβάσεις: μια λίστα "resources" με ένα στοιχείο, και μέσα ακριβώς τις τιμές που εμφανίζει το state show. Μην το τροποποιείς ποτέ με το χέρι: ένα κόμμα που μετακινήθηκε και το Terraform δεν αναγνωρίζει πλέον τι έχει κατασκευάσει.terraform.tfstate, το bonjour.txt παραμένει στον δίσκο, αλλά το Terraform δεν ξέρει πλέον ότι είναι δικό του: στο επόμενο plan, θα προτείνει να το δημιουργήσει ξανά. Το state είναι η μοναδική μνήμη του Terraform.terraform planlocal_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):
cd ..\..
.\labo.ps1 etatLinux, macOS, WSL 2, Git Bash:
cd ../..
./labo.sh etattravail 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, και τίποτα άλλο.+ 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 type … does not support resource type "local_fichier" → Ο τύπος είναι local_file, στα αγγλικά, με κάτω παύλα.Error: Unsupported argument … Did 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).