273 lines
7.5 KiB
Terraform
273 lines
7.5 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 Debian
|
|
############################################
|
|
|
|
variable "debian_image_url" {
|
|
description = "URL de l'image cloud Debian 12 (Centreon 25.10 ne supporte que Debian 12)."
|
|
type = string
|
|
default = "https://cloud.debian.org/images/cloud/bookworm/latest/debian-12-genericcloud-amd64.qcow2"
|
|
}
|
|
|
|
variable "debian_image_file_name" {
|
|
description = "Nom du fichier stocké sur le nœud. Le contenu import exige une extension .qcow2, .raw ou .vmdk."
|
|
type = string
|
|
default = "debian-12-genericcloud-amd64.qcow2"
|
|
}
|
|
|
|
variable "debian_image_checksum" {
|
|
description = "Empreinte de l'image (facultatif). Laisser à null pour ne pas vérifier."
|
|
type = string
|
|
default = null
|
|
sensitive = false
|
|
}
|
|
|
|
variable "debian_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 = "centreon"
|
|
}
|
|
|
|
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. Le rôle centreon refuse par
|
|
exemple une machine de moins de 4 Gio.
|
|
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. Debian 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 Debian 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. Centreon reprend ce réglage pour PHP à l'installation."
|
|
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_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
|
|
}
|