[68] Squelette-terraform #150
Labels
No labels
Compat/Breaking
EC01
EC02
EC03
EC04
EC05
EC06
Kind/BDD
Kind/Back
Kind/Bug
Kind/CICD
Kind/Cloud
Kind/Contenu
Kind/Data
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Front
Kind/IA
Kind/Infra
Kind/Monitoring
Kind/Security
Kind/Testing
Portée/Post-jury
Priority
Critical
Priority
High
Priority
Low
Priority
Medium
Reviewed
Confirmed
Reviewed
Duplicate
Reviewed
Invalid
Reviewed
Won't Fix
Status
Abandoned
Status
Blocked
Status
Need More Info
ops/alerte
No milestone
No project
No assignees
3 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
g2/enervision!150
Loading…
Reference in a new issue
No description provided.
Delete branch "florian/68-squelette-terraform"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Ce que ça change
Le squelette Terraform est en place et branché sur le conteneur d'état créé par
le #67. L'état distant n'est plus une intention :
terraform planaffiche« No changes » contre le backend
azurerm.Closes #68
Preuve
Relecture
Ce qui suit le code
docs/runbooks/mis à jour, un geste d'exploitation a changédocs/adr/complété — l'ADR 0007 tranchait déjà, cette MR l'appliqueOù regarder en priorité
main.tfne crée rien, et n'est pourtant pas vide. Un fichier sans contenuafficherait « No changes » sans jamais joindre Azure : la preuve ci-dessus ne
vaudrait rien, et un défaut d'authentification n'apparaîtrait qu'au premier
applydu #43. La lecture du groupe de ressources fait travailler lefournisseur à chaque
plan. Elle sert aussi à reprendre l'étiquetteuserqu'exige la politique de l'abonnement, plutôt qu'à la coder en dur.
resource_provider_registrations = "none"dansproviders.tf. Par défautazurerm 4 enregistre ses espaces de noms au démarrage, ce qui demande une
autorisation que le rôle
Devops-cours-projet-eadln'accorde pas. Sans cetteligne, chaque commande échoue sur un droit dont on n'a pas besoin : l'abonnement
école a déjà tout enregistré.
L'homonymie de
resource_group_name. Celui debackend.tfhéberge lecompte de stockage de l'état, partagé par tout le groupe ; celui de
variables.tfest l'endroit où chaque membre créera ses propres ressources. Ilscoïncident sur le poste où le compte d'état a été créé, pas ailleurs. C'est
commenté sur place, mais c'est le point le plus facile à mal lire.
.gitignore gagne tfplan. Un plan enregistré porte les valeurs de l'état, secrets compris, et rien ne l'écartait du dépôt (ENF-12). La négation !*.tfvars.example passe aussi après *.tfvars — non pour la rendre utile, *.tfvars ne matchant pas terraform.tfvars.example : elle est sans effet dans les deux ordres — mais pour aligner le bloc sur la convention *.env du fichier. Correction d'une motivation inexacte dans la première version de cette description, relevée en relecture.
Non couvert ici, et assumé :
tflintet le contrôle de format en chaîned'intégration, c'est le #72 ; ce qui sera réellement créé et le plafond de
dépense, c'est le #43.
Relecture du squelette (fmt / validate / init -backend=false rejoués). Cohérent avec l'ADR 0007 et le #67, commentaires très clairs,
resource_provider_registrations = "none"et gel dekeysont les bons choix. Un point à corriger avant fusion, le reste peut suivre.1. À corriger avant fusion —
.terraform.lock.hclmono-plateformeLe lock ne contient les hashes
h1:que pour une seule plateforme. En rejouantterraform initsur une autre (constaté ici), Terraform réécrit le fichier :Conséquences : churn du lock et conflits de fusion dès qu'un coéquipier sur un autre OS lance
init(les commentaires mentionnent les postes Windows du groupe), et surtoutterraform init -lockfile=readonlyéchouera en chaîne d'intégration — ce que prépare le #72.Correctif, à committer :
2. À traiter ou assumer
subscription_idettenant_idtraités différemment alors que les deux sont constants.subscription_idest une variable requise sans défaut : chaque membre doit maintenir unterraform.tfvarsavec une valeur identique pour tous (l'exemple le dit lui-même).tenant_idest en dur. Donner undefaultàsubscription_idréduiraitterraform.tfvarsà la seule ligne qui varie vraiment,resource_group_name.main.tf—data.azurerm_resource_group.projet.tags["user"]indexe une clé sans filet. Si le groupe visé n'a pas l'étiquetteuser,plancasse sur un « Invalid index » opaque. La politique d'abonnement etbootstrap.shla garantissent en pratique, mais unepreconditionsur ledata(oulookup(..., "user", null)) rendrait l'échec lisible.3. Détails
variables.tf: la validation^[0-9a-f-]{36}$accepte 36 tirets.bootstrap.shutilise déjà le bon motif^[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}$— aligner.outputs.tf:regionrenvoievar.location, pasdata.azurerm_resource_group.projet.location. Pour un output censé se vérifier d'un coup d'œil en relecture, exposer la région réelle du groupe (ou les deux) est plus utile.bootstrap.shliste les lignes à reporter dansbackend.tfmais omettenant_idetsubscription_id, quebackend.tfporte pourtant. Un membre qui suit la sortie du script produit unbackend.tfdifférent du committé..gitignore:*.tfvarsne matche pasterraform.tfvars.example(vérifié), donc!*.tfvars.exampleest un no-op dans les deux ordres — le changement est sain (il calque la convention*.env), seule la motivation écrite dans le corps de PR est inexacte. L'ajout detfplan/*.tfplanest justifié et correct.À ne pas changer
Le tenant verrouillé,
use_azuread_auth, le gel dekeyavec sa doc de récupération, ledataplutôt qu'unmain.tfvide, l'épinglage~> 4.0motivé, lejqdu runbook qui exclutno-opetread.florian/68-squelette-terraformto [68]squelette-terraform[68]squelette-terraformto [68] Squelette-terraformRelecture des corrections (commits
bb73e4a+7d1d29e)Tous les points de ma relecture précédente sont traités.
h1:(linux_amd64, darwin_arm64, darwin_amd64, windows_amd64)subscription_idsans défautdefaultdansvariables.tf,terraform.tfvars.exampleréduit àresource_group_nametags["user"]indexé sans filetpostcondition { condition = can(self.tags["user"]) }, message qui nomme le groupe + commandeaz group update. Choixpostconditionvspreconditioncorrect (self-référence). Se déclenche avantlocal.etiquettes_communes→ message lisible dans tous les cas.^[0-9a-f-]{36}$bootstrap.shoutput "region"= intentionregion_du_groupe(lu sur Azure) etregion_des_ressources(var.location). Aucun doc/script ne référençait l'ancien nom.bootstrap.shajoutetenant_id/subscription_id,backend.tfréindenté pour coïnciderEn plus :
7d1d29erétablit la section terraform duPULL_REQUEST_TEMPLATE.mdretirée par mégarde en5dd4be7— diff propre, bon emplacement, c'est un critère d'acceptation du #68.Reste un nit, non bloquant
Le corps de cette MR dit toujours « La négation sur
*.tfvars.examplepasse désormais après*.tfvars, faute de quoi elle ne servait à rien ». Or*.tfvarsne matche pasterraform.tfvars.example: c'est un no-op dans les deux ordres. Le changement de.gitignorereste sain (il calque la convention*.env, + ajouttfplan/*.tfplanjustifié), seule la motivation écrite est inexacte. À corriger dans la description, pas dans le code.Petit détail
Le heredoc de
bootstrap.shgarde une ligne blanche aprèssubscription_idavant la prose — cosmétique.Fusionnable une fois la description corrigée (ou le point assumé).
good pour moi je merge après passage pipeline