Article original Publié le : 1 septembre 2022 Mise à jour le : – |
Version de l’OS | Debian 11 |
Version de Terraform | 1.2.8 |
Version du Provider | 2.9.11 |
- Préparation de l’environnement système
- Installation de Terraform
- Création compte, rôle et permissions
- Préparation et configuration de l’environnement
- Init, plan & apply
- Modification de vm
- Destroy
Cet article est basé sur le billet de https://blog.levassb.ovh/post/terraform/
J’en ai repris les grandes lignes, adapté et complété pour mes besoins de tests |
-
I. Préparation de l’environnement système
Mise à jour du système
1 |
$ sudo apt update |
1 |
$ sudo apt upgrade |
Installation de paquet utile
1 |
$ sudo apt install mlocate gnupg vim software-properties-common netcat |
-
2. Installation de Terraform
Pour la dernière release
https://www.terraform.io/cli/install/apt
1 |
$ wget -O- https://apt.releases.hashicorp.com/gpg | gpg --dearmor | sudo tee /usr/share/keyrings/hashicorp-archive-keyring.gpg |
1 |
$ gpg --no-default-keyring --keyring /usr/share/keyrings/hashicorp-archive-keyring.gpg --fingerprint |
1 |
$ echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list |
1 |
$ sudo apt update |
1 |
$ sudo apt install terraform |
-
3. Création compte, rôle et permissions
Créer un compte de service sur Proxmox qui sera dédié à Terraform
1 |
$ sudo pveum user add terraform@pve -password -comment "Compte de service Terraform" |
Créer le rôle et les permissions nécessaires pour les accès
1 |
$ sudo pveum role add Terraform -privs "VM.Allocate VM.Clone VM.Config.CDROM VM.Config.CPU VM.Config.Cloudinit VM.Config.Disk VM.Config.HWType VM.Config.Memory VM.Config.Network VM.Config.Options VM.Monitor VM.Audit VM.PowerMgmt Datastore.AllocateSpace Datastore.Audit" |
Associer l’user Terraform au rôle précédemment créé
1 |
$ sudo pveum aclmod / -user terraform@pve -role Terraform |
Enfin, créer le token qui servira à se connecter à l’API
1 |
$ sudo pveum user token add terraform@pve terraform -expire 0 -privsep 0 -comment "Token Terraform" |
1 2 3 4 5 6 7 8 9 |
┌──────────────┬──────────────────────────────────────────────────────────┐ │ key │ value │ ╞══════════════╪══════════════════════════════════════════════════════════╡ │ full-tokenid │ terraform@pve!terraform │ ├──────────────┼──────────────────────────────────────────────────────────┤ │ info │ {"comment":"Token Terraform","expire":"0","privsep":"0"} │ ├──────────────┼──────────────────────────────────────────────────────────┤ │ value │ f87c48a1-f366-4392-9b7f-xxxxx │ └──────────────┴──────────────────────────────────────────────────────────┘ |
Pour tester le bon fonctionnement du compte sur l’api, tester avec un curl
1 |
$ curl -X GET 'https://srv-proxmox.izero.fr:8006/api2/json/nodes' -H 'Authorization: PVEAPIToken=terraform@pve!terraform=f87c48a1-f366-4392-9b7f-xxxxx' |
1 |
{"data":[{"ssl_fingerprint":"31:C4:BA:B6:70:60:96:F1:6D:93:06:95:B3:61:3D:DF:6F:21:BB:CF:78:C8:FD:34:D5:0D:7D:A7:DA:95:3A:7B","id":"node/srv-proxmox","status":"online","type":"node","level":"","node":"srv-proxmox"}]}% |
-
4. Préparation et configuration de l’environnement
Un ou plusieurs fichiers .tf peuvent être créés, pour une meilleure visibilité, il convient de dissocier les fonctions
- fichier pour le provider
- fichier pour les variables
- fichier par vm
Cela devrait ressembler à ceci
1 2 3 4 5 6 |
terraform/ ├── provider.tf ├── vars.tf ├── vm01.tf ├── vm02.tf └── vm03.tf |
Créer un répertoire et tous les fichiers nécessaires
1 |
$ mkdir terraform && cd terraform |
Il n’y a pas de provider officiel pour Proxmox mais le plus abouti est celui de Telmate qui est actuellement en v2.9.11
1 |
$ vim provider.tf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
terraform { required_providers { proxmox = { source = "Telmate/proxmox" version = "2.9.11" } } } provider "proxmox" { pm_api_url = var.pm_api_url pm_api_token_id= var.pm_api_token_id pm_api_token_secret= var.pm_api_token_secret #pm_tls_insecure = true //for Proxmox self-signed certificate WUI } |
Le fichier de variable contient toutes les infos nécessaires à la connexion à l’api Proxmox et l’exécution du template associé à ce projet
On y retrouve le pm_api_token_id et le pm_api_token_secret précédemment crée
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
variable "pm_api_url" { default = "https://srv-proxmox.izero.fr:8006/api2/json" } variable "pm_api_token_id" { default = "terraform@pve!terraform" } variable "pm_api_token_secret" { default = "f87c48a1-f366-4392-9b7f-xxxxx" } variable "target_node" { default = "srv-proxmox" } variable "clone" { default = "Template-cloudinit-ubuntu-9000" } variable "ssh_key" { default = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCtZM9uePenM4..." |
Le fichier de vm, dans l’exemple la vm01, le minimum requis
1 |
$ vim vm01.tf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
resource "proxmox_vm_qemu" "vm01" { desc = "Déploiement test vm01" name = "vm01" target_node = var.target_node clone = var.clone os_type = "cloud-init" cores = 1 sockets = 1 cpu = "host" memory = 1024 scsihw = "virtio-scsi-pci" bootdisk = "scsi0" disk { slot = 0 size = "10G" type = "scsi" storage = "local" iothread = 1 } network { model = "virtio" bridge = "vmbr2" } ipconfig0 = "ip=192.168.50.131/24,gw=192.168.50.2" namaserver = "1.1.1.1" searchdomain = izero.fr } |
-
5. Init, plan & apply
La structure étant vérifié, il faut maintenant l’initialisé
1 |
$ terraform init |
Ensuite faire lire à Terraform le contenu des vms pour action
1 |
$ terraform plan |
Si pas d’erreur, on peut appliquer pour le clonage des vms
1 |
$ terraform apply |
Vérifier la présence et l’état coté Proxmox
-
6. Modification de vm
On peut ajouter de la mémoire ou du cpu sans que cela affecte les vms, on peut également seté d’autres options comme le firewall et l’agent qemu que j’ai oublié d’activer dans le template.
J’ai donc modifié la vm01 et lors du plan, il ne détecte pas de changement sur vm02 et vm03, donc il ne touche pas à son état lors de l’application
6. Destroy
Terraform garde un état de son déploiement initiale, ainsi on retrouve les fichiers terraform.tfstate et terraform.tfstate.backup
Si on modifie une option ou que l’on supprime une vms manuellement dans Proxmox et que l’on rejoue terraform, il remettra l’état écrit dans son terraform.tfstate
Pour supprimer des vms, il faut donc passer par la commande destroy
Mais attention le destroy ci-dessous supprimera les 3 vms sans distinction
1 |
$ terraform destroy |
Pour supprimer une vm en particulier, il faut avoir seté une ressource différente, ainsi avec un state list on va pouvoir supprimer une target défini
1 |
$ terraform state list |
1 2 3 |
proxmox_vm_qemu.vm01 proxmox_vm_qemu.vm02 proxmox_vm_qemu.vm03 |
1 |
$ terraform destroy -target=proxmox_vm_qemu.vm01 |