Initial commit

This commit is contained in:
2026-05-12 23:31:19 +02:00
commit c4f4566e25
8 changed files with 221 additions and 0 deletions

22
.gitignore vendored Normal file
View File

@@ -0,0 +1,22 @@
*.tfstate
*.tfstate.*
*.tfvars
*.tfvars.json
!*.tfvars.example
.terraform/
*.tfplan
*.out
crash.log
crash.*.log
override.tf
override.tf.json
*_override.tf
*_override.tf.json
.terraformrc
terraform.rc
.DS_Store
.idea/
.vscode/
*.swp
*.swo
*~

15
locals.tf Normal file
View File

@@ -0,0 +1,15 @@
locals {
letters = [
"a", "b", "c", "d", "e", "f", "g", "h", "i", "j",
"k", "l", "m", "n", "o", "p", "q", "r", "s", "t",
"u", "v", "w", "x", "y", "z"
]
vms = {
for i in range(var.vm_count) :
"9999aa${local.letters[floor(i / 26)]}${local.letters[i % 26]}" => {
vmid = 9010 + i
ip = cidrhost("10.1.90.0/24", 100 + i)
}
}
}

50
main.tf Normal file
View File

@@ -0,0 +1,50 @@
resource "proxmox_virtual_environment_vm" "lab" {
for_each = local.vms
name = each.key
node_name = var.node_name
vm_id = each.value.vmid
clone {
vm_id = var.template_id
full = true
}
agent {
enabled = true
}
cpu {
sockets = var.vm_cpu_sockets
cores = var.vm_cpu_cores
hotplugged = var.vm_cpu_hotplugged
}
memory {
dedicated = var.vm_memory
}
disk {
interface = "scsi0"
size = var.vm_disk_size
datastore_id = "local-lvm"
}
network_device {
bridge = var.bridge
vlan_id = var.vlan_id
}
initialization {
user_account {
username = var.ci_user
keys = [var.ssh_public_key]
}
ip_config {
ipv4 {
address = "${each.value.ip}/24"
gateway = var.gateway
}
}
}
}

17
outputs.tf Normal file
View File

@@ -0,0 +1,17 @@
output "vm_names" {
description = "Liste des noms de VMs creees"
value = [for k, v in proxmox_virtual_environment_vm.lab : v.name]
}
output "vm_ips" {
description = "Mapping nom de VM - IP"
value = { for name, vm in local.vms : name => vm.ip }
}
output "ssh_commands" {
description = "Commandes SSH pretes a copier pour chaque VM"
value = [
for name, vm in local.vms :
"ssh ${var.ci_user}@${vm.ip} # ${name}"
]
}

5
providers.tf Normal file
View File

@@ -0,0 +1,5 @@
provider "proxmox" {
endpoint = var.proxmox_endpoint
api_token = var.proxmox_api_token
insecure = var.proxmox_insecure
}

7
terraform.tfvars.example Normal file
View File

@@ -0,0 +1,7 @@
proxmox_endpoint = "https://<pve-adn>:8006"
proxmox_api_token = "root@pam!xxxxxxxxx=xxxxxxxxxxxxxxxxxxxxxxxxxxx"
proxmox_insecure = true
node_name = "<nom-du-node-pve>"
ssh_public_key = "ssh-ed25519 AAAA... user@host"

95
variables.tf Normal file
View File

@@ -0,0 +1,95 @@
variable "proxmox_endpoint" {
description = "URL HTTPS Proxmox"
type = string
}
variable "proxmox_api_token" {
description = "Token API Proxmox"
type = string
sensitive = true
}
variable "proxmox_insecure" {
description = "Skip TLS"
type = bool
}
variable "node_name" {
description = "Nom du node PVE"
type = string
}
variable "ssh_public_key" {
description = "Cle SSH publique cloudinit"
type = string
}
variable "vm_count" {
description = "Nombre de VMs a deployer (1 a 90)"
type = number
validation {
condition = var.vm_count >= 1 && var.vm_count <= 90
error_message = "vm_count doit etre entre 1 et 90 (limite vm_id 9010-9099)."
}
}
variable "template_id" {
description = "ID Proxmox du template a cloner"
type = number
default = 100
}
variable "vm_cpu_sockets" {
description = "Nombre de sockets alloues a la VM"
type = number
default = 1
}
variable "vm_cpu_cores" {
description = "Nombre de vCPU alloues a la VM"
type = number
default = 12
}
variable "vm_cpu_hotplugged" {
description = "Nombre de vCPUs actifs au boot"
type = number
default = 2
}
variable "vm_memory" {
description = "RAM dediee a la VM en MiB"
type = number
default = 1024
}
variable "vm_disk_size" {
description = "Taille du disque en GiB"
type = number
default = 10
}
variable "bridge" {
description = "Bridge Proxmox"
type = string
default = "vmbr0"
}
variable "vlan_id" {
description = "VLAN tag applique"
type = number
default = 90
}
variable "ci_user" {
description = "Compte cree par cloud-init"
type = string
default = "nidoradmin"
}
variable "gateway" {
description = "Gateway IPv4 du subnet"
type = string
default = "10.1.90.1"
}

10
versions.tf Normal file
View File

@@ -0,0 +1,10 @@
terraform {
required_version = ">= 1.8"
required_providers {
proxmox = {
source = "bpg/proxmox"
version = "~> 0.78"
}
}
}