first commit
This commit is contained in:
43
terraform/prod/.terraform.lock.hcl
generated
Normal file
43
terraform/prod/.terraform.lock.hcl
generated
Normal file
@@ -0,0 +1,43 @@
|
||||
# This file is maintained automatically by "terraform init".
|
||||
# Manual edits may be lost in future updates.
|
||||
|
||||
provider "registry.terraform.io/bpg/proxmox" {
|
||||
version = "0.43.0"
|
||||
constraints = "0.43.0"
|
||||
hashes = [
|
||||
"h1:T1KwNv9zR6q+UTTa7cXa6qAsV1IR4YEkrCpZkM5xAdo=",
|
||||
"zh:15be827515be0e5fee5128a82f294a9eba9b1dde22a203dc40f6d604832cf5e6",
|
||||
"zh:1afbe8d25ad1acff6e01f0746df204e43d9841603bc68c47efbd78acb94d09e6",
|
||||
"zh:1c3873fb2eee657c6acc035b52fd1fea1b8d8173651ae59d9dbd809d9586d5c7",
|
||||
"zh:2a6f20b2e12b583b9cc53e3e9304a542da8ddb2ac1ba0c4eaf7963702e6d127c",
|
||||
"zh:3c5fda4aac500ca49c9c33f5de08c9f5abe89106eb7e1546543678d83c189a8b",
|
||||
"zh:7fb4de0b5fb2cfd57071675c0e118268eff04b2fda73e7f48251b93e1810b83a",
|
||||
"zh:8fdec222b07106e011722163e1bd6b69bce866a63a1be55b724da8c271f62405",
|
||||
"zh:900b297a21bdb2bf55e247e2a69e55563cf31f8ff189c2134612c7a5aedea970",
|
||||
"zh:a24713eace6ba6ae0d19429c083b6bb2d88421d476819df62ccd9e0bb646410f",
|
||||
"zh:b3267ca029946881b367baa579d49751e0f04f42f5cca1bbab34d02dad844bcd",
|
||||
"zh:c5bf667aa91cd3fa17b3ef3f3020bd5984996eccc554c28990b5aba70bce4717",
|
||||
"zh:db3cfe28bd077012804c3cb255771b8c13ffe37e6ffe9c7730ee3192ad974c93",
|
||||
"zh:f11feed213e61cac4e00f568a6fdcee7eef9a4e3a28b605e7e0419ab36ccee49",
|
||||
"zh:ff79ccc3535cce0aa00e77f2c3979ef492b9aa611aee643aadb104cffd591c46",
|
||||
]
|
||||
}
|
||||
|
||||
provider "registry.terraform.io/hashicorp/local" {
|
||||
version = "2.5.3"
|
||||
hashes = [
|
||||
"h1:MCzg+hs1/ZQ32u56VzJMWP9ONRQPAAqAjuHuzbyshvI=",
|
||||
"zh:284d4b5b572eacd456e605e94372f740f6de27b71b4e1fd49b63745d8ecd4927",
|
||||
"zh:40d9dfc9c549e406b5aab73c023aa485633c1b6b730c933d7bcc2fa67fd1ae6e",
|
||||
"zh:6243509bb208656eb9dc17d3c525c89acdd27f08def427a0dce22d5db90a4c8b",
|
||||
"zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3",
|
||||
"zh:885d85869f927853b6fe330e235cd03c337ac3b933b0d9ae827ec32fa1fdcdbf",
|
||||
"zh:bab66af51039bdfcccf85b25fe562cbba2f54f6b3812202f4873ade834ec201d",
|
||||
"zh:c505ff1bf9442a889ac7dca3ac05a8ee6f852e0118dd9a61796a2f6ff4837f09",
|
||||
"zh:d36c0b5770841ddb6eaf0499ba3de48e5d4fc99f4829b6ab66b0fab59b1aaf4f",
|
||||
"zh:ddb6a407c7f3ec63efb4dad5f948b54f7f4434ee1a2607a49680d494b1776fe1",
|
||||
"zh:e0dafdd4500bec23d3ff221e3a9b60621c5273e5df867bc59ef6b7e41f5c91f6",
|
||||
"zh:ece8742fd2882a8fc9d6efd20e2590010d43db386b920b2a9c220cfecc18de47",
|
||||
"zh:f4c6b3eb8f39105004cf720e202f04f57e3578441cfb76ca27611139bc116a82",
|
||||
]
|
||||
}
|
||||
0
terraform/prod/01-infra-services.tf
Normal file
0
terraform/prod/01-infra-services.tf
Normal file
75
terraform/prod/02-monitoring-services.tf
Normal file
75
terraform/prod/02-monitoring-services.tf
Normal file
@@ -0,0 +1,75 @@
|
||||
# Fichier: terraform/environments/prod/02-monitoring-services.tf
|
||||
|
||||
# 1. On cherche TOUS les templates disponibles sur le noeud Proxmox
|
||||
data "proxmox_virtual_environment_vms" "all_templates" {
|
||||
node_name = var.target_node
|
||||
tags = ["template"] # On suppose que tous tes templates ont le tag "template"
|
||||
}
|
||||
|
||||
# 2. On transforme la liste de templates en une map pratique pour les retrouver par OS
|
||||
locals {
|
||||
# Liste des tags d'OS que nous utilisons
|
||||
known_os_tags = toset(["ubuntu", "alpine", "rocky", "debian"])
|
||||
|
||||
# Crée une map du type : { "ubuntu" = { vm_id = 101, name = "ubuntu-..." }, "alpine" = { ... } }
|
||||
template_map = {
|
||||
for t in data.proxmox_virtual_environment_vms.all_templates.vms :
|
||||
one(setintersection(local.known_os_tags, t.tags)) => t
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
# 3. On crée nos VMs en utilisant la syntaxe correcte
|
||||
resource "proxmox_virtual_environment_vm" "monitoring_vms" {
|
||||
for_each = var.monitoring_vms
|
||||
|
||||
name = "${each.key}.lab.home.arnodo.fr"
|
||||
node_name = var.target_node
|
||||
tags = ["terraform-managed", "monitoring", each.value.os]
|
||||
on_boot = true
|
||||
|
||||
agent {
|
||||
enabled = true
|
||||
}
|
||||
|
||||
cpu {
|
||||
cores = each.value.cores
|
||||
type = lookup(each.value, "cpu_type", "qemu64")
|
||||
}
|
||||
|
||||
memory {
|
||||
dedicated = each.value.memory
|
||||
}
|
||||
|
||||
disk {
|
||||
interface = "scsi0"
|
||||
datastore_id = "local-lvm"
|
||||
size = each.value.disk_gb
|
||||
}
|
||||
|
||||
network_device {
|
||||
bridge = "vmbr0"
|
||||
model = "virtio"
|
||||
}
|
||||
|
||||
# Bloc de clonage utilisant l'ID du template trouvé dynamiquement
|
||||
clone {
|
||||
vm_id = local.template_map[each.value.os].vm_id
|
||||
}
|
||||
|
||||
# Bloc d'initialisation (Cloud-Init) simplifié
|
||||
initialization {
|
||||
# Configuration réseau
|
||||
ip_config {
|
||||
ipv4 {
|
||||
address = "${each.value.ip}/24"
|
||||
gateway = each.value.gateway
|
||||
}
|
||||
}
|
||||
# Configuration de l'utilisateur
|
||||
user_account {
|
||||
username = "damien" # Ou un autre utilisateur par défaut
|
||||
keys = [file(var.admin_ssh_public_key_path)]
|
||||
}
|
||||
}
|
||||
}
|
||||
0
terraform/prod/03-kubernetes-cluster.tf
Normal file
0
terraform/prod/03-kubernetes-cluster.tf
Normal file
36
terraform/prod/inventory.tf
Normal file
36
terraform/prod/inventory.tf
Normal file
@@ -0,0 +1,36 @@
|
||||
# inventory.tf
|
||||
|
||||
# On fusionne toutes nos ressources VM en une seule map
|
||||
locals {
|
||||
all_lab_vms = merge(
|
||||
proxmox_virtual_environment_vm.monitoring_vms,
|
||||
)
|
||||
}
|
||||
|
||||
locals {
|
||||
# On boucle sur chaque VM créée par Terraform pour enrichir les données.
|
||||
vms_with_metadata = {
|
||||
for key, vm in local.all_lab_vms : key => {
|
||||
# On garde les informations de base
|
||||
name : vm.name
|
||||
ip_address : var.monitoring_vms[key].ip
|
||||
proxmox_node : vm.node_name
|
||||
|
||||
# On trouve le tag de l'OS de manière robuste
|
||||
# - setintersection compare les tags de la VM avec notre liste d'OS connus.
|
||||
# - Le résultat est une liste avec l'élément commun (ex: ["ubuntu"]).
|
||||
# - one() prend cet unique élément et échoue si on trouve 0 ou plus d'un OS, ce qui est une sécurité.
|
||||
os_distro : one(setintersection(local.known_os_tags, toset(vm.tags)))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Création du fichier d'inventaire pour Ansible
|
||||
resource "local_file" "ansible_inventory" {
|
||||
filename = "${path.module}/../../ansible/inventory/01_lab_hosts.yml"
|
||||
|
||||
# On envoie notre nouvelle map enrichie au template !
|
||||
content = templatefile("${path.module}/templates/inventory.yml.tftpl", {
|
||||
vms = local.vms_with_metadata # On utilise la nouvelle variable locale
|
||||
})
|
||||
}
|
||||
0
terraform/prod/outputs.tf
Normal file
0
terraform/prod/outputs.tf
Normal file
26
terraform/prod/providers.tf
Normal file
26
terraform/prod/providers.tf
Normal file
@@ -0,0 +1,26 @@
|
||||
# ================================================================
|
||||
# Déclaration des Providers Terraform
|
||||
#
|
||||
# Ce fichier indique à Terraform quels "plugins" il doit
|
||||
# télécharger pour interagir avec les API externes (Proxmox, etc.)
|
||||
# et comment les configurer.
|
||||
# ================================================================
|
||||
|
||||
terraform {
|
||||
required_providers {
|
||||
proxmox = {
|
||||
source = "bpg/proxmox"
|
||||
version = "0.43.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
provider "proxmox" {
|
||||
endpoint = var.proxmox_url
|
||||
api_token = var.proxmox_api_token
|
||||
insecure = true
|
||||
ssh {
|
||||
agent = true
|
||||
username = "root"
|
||||
}
|
||||
}
|
||||
13
terraform/prod/templates/inventory.yml.tftpl
Normal file
13
terraform/prod/templates/inventory.yml.tftpl
Normal file
@@ -0,0 +1,13 @@
|
||||
# Ansible Inventory - Généré par Terraform le ${timestamp()}
|
||||
# Ne pas modifier ce fichier manuellement, il sera écrasé.
|
||||
|
||||
all:
|
||||
children:
|
||||
lab:
|
||||
hosts:
|
||||
%{ for key, vm_data in vms }
|
||||
${vm_data.name}:
|
||||
ansible_host: ${vm_data.ip_address}
|
||||
os_distro: "${vm_data.os_distro}"
|
||||
proxmox_node: "${vm_data.proxmox_node}"
|
||||
%{ endfor }
|
||||
47
terraform/prod/terraform.tfvars.example
Normal file
47
terraform/prod/terraform.tfvars.example
Normal file
@@ -0,0 +1,47 @@
|
||||
# Fichier: terraform/prod/terraform.tfvars.example
|
||||
#
|
||||
# Copiez ce fichier vers terraform.tfvars et remplissez les valeurs appropriées.
|
||||
# Le fichier terraform.tfvars est ignoré par Git (voir .gitignore) pour protéger les informations sensibles.
|
||||
|
||||
# Le nom du noeud Proxmox sur lequel déployer les VMs.
|
||||
# Par défaut : "pve01"
|
||||
# target_node = "pve01"
|
||||
|
||||
# URL du noeud Proxmox sur lequel déployer les VMs. (Requis)
|
||||
# Exemple : "https://votre-proxmox-ip-ou-hostname:8006"
|
||||
proxmox_url = "https://proxmox.example.com:8006"
|
||||
|
||||
# Token pour accéder à l'API Proxmox. (Requis et sensible)
|
||||
# Créez un token dans Proxmox (Datacenter -> Permissions -> API Tokens)
|
||||
# Exemple : "utilisateur@pve!nom_token=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
|
||||
proxmox_api_token = "terraform@pve!terraform_token=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
|
||||
|
||||
# Chemin vers le fichier de la clé SSH publique à autoriser pour l'utilisateur admin sur les VMs.
|
||||
# Par défaut : "~/.ssh/keys/id_rsa.pub"
|
||||
# admin_ssh_public_key_path = "~/.ssh/id_rsa.pub"
|
||||
|
||||
# Une map décrivant les VMs pour la supervision.
|
||||
# Vous pouvez laisser cette map vide si vous ne souhaitez pas déployer de VMs de supervision
|
||||
# ou la remplir comme dans l'exemple ci-dessous.
|
||||
#
|
||||
# monitoring_vms = {
|
||||
# "prometheus" = {
|
||||
# os = "ubuntu" # Nom du template ou de l'image ISO
|
||||
# cores = 2
|
||||
# cpu_type = "host" # Type de CPU (kvm64, host, etc.)
|
||||
# memory = 2048 # En Mo
|
||||
# disk_gb = 20 # En Go
|
||||
# ip = "192.168.1.50/24" # IP statique avec le masque CIDR
|
||||
# gateway = "192.168.1.1" # Passerelle
|
||||
# },
|
||||
# "grafana" = {
|
||||
# os = "debian"
|
||||
# cores = 1
|
||||
# cpu_type = "kvm64"
|
||||
# memory = 1024
|
||||
# disk_gb = 10
|
||||
# ip = "192.168.1.51/24"
|
||||
# gateway = "192.168.1.1"
|
||||
# }
|
||||
# }
|
||||
monitoring_vms = {}
|
||||
37
terraform/prod/variables.tf
Normal file
37
terraform/prod/variables.tf
Normal file
@@ -0,0 +1,37 @@
|
||||
# Fichier: terraform/environments/prod/variables.tf
|
||||
|
||||
variable "target_node" {
|
||||
description = "Le nom du noeud Proxmox sur lequel déployer les VMs."
|
||||
type = string
|
||||
default = "pve01"
|
||||
}
|
||||
|
||||
variable "proxmox_url" {
|
||||
description = "URL du noeud Proxmox sur lequel déployer les VMs."
|
||||
type = string
|
||||
}
|
||||
|
||||
variable "proxmox_api_token" {
|
||||
description = "Token pour accéder à l'API Proxmox"
|
||||
type = string
|
||||
}
|
||||
|
||||
variable "admin_ssh_public_key_path" {
|
||||
description = "Chemin vers le fichier de la clé SSH publique à autoriser."
|
||||
type = string
|
||||
default = "~/.ssh/keys/id_rsa.pub"
|
||||
}
|
||||
|
||||
variable "monitoring_vms" {
|
||||
description = "Une map décrivant les VMs pour la supervision."
|
||||
type = map(object({
|
||||
os = string
|
||||
cores = number
|
||||
cpu_type = string
|
||||
memory = number
|
||||
disk_gb = number
|
||||
ip = string
|
||||
gateway = string
|
||||
}))
|
||||
default = {}
|
||||
}
|
||||
Reference in New Issue
Block a user