Files
hcornet ee0a1766f4
Terraform - plan / plan (push) Failing after 6s
first
2026-09-16 10:16:01 +02:00

283 lines
7.8 KiB
Terraform

############################################
# Accès au nœud Proxmox
############################################
variable "pve_endpoint" {
description = "URL de l'API Proxmox (ex. https://10.0.4.5:8006/)."
type = string
}
variable "pve_api_token" {
description = "Jeton d'API au format user@realm!tokenid=uuid. À fournir par TF_VAR_pve_api_token."
type = string
sensitive = true
}
variable "pve_insecure" {
description = "Ne pas vérifier le certificat TLS de l'API (nécessaire si l'endpoint est appelé par IP)."
type = bool
default = true
}
variable "pve_node" {
description = "Nom du nœud Proxmox cible."
type = string
default = "pve"
}
variable "pve_node_address" {
description = "Adresse IP du nœud, utilisée pour la connexion SSH de dépôt du snippet."
type = string
default = "10.0.4.5"
}
variable "pve_ssh_username" {
description = "Compte SSH sur le nœud Proxmox (doit pouvoir écrire dans le répertoire des snippets)."
type = string
default = "root"
}
variable "pve_ssh_password" {
description = "Mot de passe SSH du nœud. À fournir par TF_VAR_pve_ssh_password."
type = string
sensitive = true
}
############################################
# Image Ubuntu
############################################
variable "ubuntu_image_url" {
description = "URL de l'image cloud Ubuntu Server. L'image est un qcow2, malgré son extension .img."
type = string
default = "https://cloud-images.ubuntu.com/releases/24.04/release/ubuntu-24.04-server-cloudimg-amd64.img"
}
variable "ubuntu_image_file_name" {
description = <<-EOT
Nom du fichier stocké sur le nœud. Le contenu import de Proxmox n'accepte que
les extensions .qcow2, .raw et .vmdk : l'image Ubuntu, publiée en .img, est
donc renommée ici. Son format réel ne change pas, c'est bien un qcow2.
EOT
type = string
default = "ubuntu-24.04-server-cloudimg-amd64.qcow2"
}
variable "ubuntu_image_checksum" {
description = "Empreinte de l'image (facultatif). Laisser à null pour ne pas vérifier."
type = string
default = null
sensitive = false
}
variable "ubuntu_image_checksum_algorithm" {
description = "Algorithme de l'empreinte fournie (sha256, sha512...)."
type = string
default = "sha512"
}
variable "image_datastore_id" {
description = "Stockage recevant l'image téléchargée (doit accepter le contenu iso)."
type = string
default = "local"
}
variable "snippet_datastore_id" {
description = "Stockage recevant le snippet cloud-init (doit accepter le contenu snippets)."
type = string
default = "local"
}
############################################
# Définition de la VM
############################################
variable "vm_id" {
description = "VMID de la machine."
type = number
default = 120
}
variable "vm_hostname" {
description = "Nom court de la machine (nom de VM et hostname système)."
type = string
default = "ubuntu-01"
}
variable "vm_datastore_id" {
description = "Stockage du disque système et du disque cloud-init."
type = string
default = "local"
}
variable "vm_cores" {
description = <<-EOT
Nombre de cœurs. Les besoins applicatifs se vérifient côté Ansible, pas ici :
ce dépôt crée des VM pour n'importe quel usage.
EOT
type = number
default = 2
validation {
condition = var.vm_cores >= 1
error_message = "Il faut au moins un cœur."
}
}
variable "vm_memory" {
description = "Mémoire en Mio. Ubuntu démarre à partir de 512 Mio ; les besoins applicatifs se vérifient côté Ansible."
type = number
default = 4096
validation {
condition = var.vm_memory >= 512
error_message = "En dessous de 512 Mio, l'image cloud Ubuntu ne démarre pas correctement."
}
}
variable "vm_disk_size" {
description = "Taille du disque système en Gio."
type = number
default = 40
}
variable "vm_bridge" {
description = "Bridge de rattachement de la carte réseau."
type = string
default = "vmbr3"
}
############################################
# Réseau
############################################
variable "vm_ipv4_address" {
description = "Adresse IPv4 fixe de la VM."
type = string
default = "10.0.5.20"
}
variable "vm_ipv4_prefix" {
description = "Longueur du préfixe IPv4."
type = number
default = 24
}
variable "vm_ipv4_gateway" {
description = "Passerelle IPv4 (interface LAN d'OPNsense)."
type = string
default = "10.0.5.1"
}
variable "dns_servers" {
description = "Serveurs DNS poussés par cloud-init."
type = list(string)
default = ["10.0.5.1"]
}
variable "dns_domain" {
description = "Domaine de recherche et suffixe du FQDN."
type = string
default = "tips-of-mine.local"
}
############################################
# Système et accès
############################################
variable "timezone" {
description = "Fuseau horaire du système, appliqué par cloud-init."
type = string
default = "Europe/Paris"
}
variable "locale" {
description = "Locale générée sur le système."
type = string
default = "fr_FR.UTF-8"
}
variable "local_accounts" {
description = <<-EOT
Comptes unix créés par cloud-init. Aucun n'a de privilège : la commande sudo
est retirée du système. Pour administrer, on ouvre une session avec son
compte puis on bascule par « su - » avec le mot de passe root.
ssh_key_files référence des fichiers du répertoire key/, relatifs à la racine
du dépôt. Un compte sans aucun fichier de clé n'est pas créé : c'est le moyen
de déclarer un compte à l'avance sans l'activer.
EOT
type = list(object({
name = string
gecos = optional(string, "")
ssh_key_files = list(string)
}))
validation {
condition = length(var.local_accounts) > 0
error_message = "Au moins un compte est nécessaire pour accéder à la machine."
}
validation {
condition = !contains([for c in var.local_accounts : c.name], "root")
error_message = "Le compte root se configure par root_ssh_key_files, pas par local_accounts."
}
}
variable "root_ssh_key_files" {
description = <<-EOT
Fichiers de clés publiques autorisées à ouvrir une session SSH directement en
root, sudo n'existant pas sur la machine. C'est par là qu'Ansible obtient ses
droits, et c'est aussi la voie d'accès root d'un administrateur qui y dépose
sa clé.
EOT
type = list(string)
validation {
condition = length(var.root_ssh_key_files) > 0
error_message = "Sans clé root, aucune configuration ne serait possible sur la machine."
}
}
variable "ansible_group" {
description = "Groupe d'inventaire Ansible dans lequel ranger la machine."
type = string
default = "serveurs"
}
variable "ansible_remote_user" {
description = "Compte utilisé par Ansible dans l'inventaire généré."
type = string
default = "root"
}
variable "root_password_length" {
description = "Longueur du mot de passe root généré. Il sert à « su - » et à la console Proxmox."
type = number
default = 24
}
variable "ssh_allowed_cidrs" {
description = "Réseaux autorisés à joindre le port 22 (pare-feu local nftables)."
type = list(string)
default = ["10.0.4.0/24", "10.0.5.0/24"]
}
############################################
# Sortie pour Ansible
############################################
variable "ansible_inventory_path" {
description = <<-EOT
Chemin du fichier d'inventaire généré à la fin de l'apply. Laissé à null,
il vaut generated/<nom de la VM>-inventory.yml : chaque VM a le sien.
EOT
type = string
default = null
}