Sommaire de l'article
ToggleContexte
Dans cet article, je vais vous montrer comment j’ai automatisé la gestion des ressources sur Proxmox en utilisant Terraform et Ansible. Notre objectif est de simplifier le déploiement et la configuration initiale des machines virtuelles mais surtout des conteneurs Linux sur Proxmox.
Nous commencerons par utiliser Terraform pour créer des instances de conteneurs Linux (LXC) sur Proxmox. Ensuite, nous utiliserons Ansible via AWX pour automatiser la configuration initiale de ces instances.
Avec Ansible, nous pourrons créer des utilisateurs, effectuer des mises à jour et des upgrades du système d’exploitation, installer des outils de base et même afficher un message de bienvenue personnalisé en ligne de commande.
Automatisation de ressource avec Terraform
Mon objectif était de simplifier et d’accélérer le processus de déploiement des machines virtuelles et des conteneurs Linux sur Proxmox. Pour ce faire, j’ai créé des fichiers de configuration Terraform (.tf) décrivant les ressources à déployer, telles que des instances de conteneurs Linux (LXC) sur Proxmox. Ces fichiers Terraform définissent les paramètres des ressources, comme le nombre d’instances à créer, les spécifications matérielles, les réseaux, etc.
J’ai crée un LXC sur proxmox et j’ai installé terrafom dessus. Il faut juste suivre les instructions que nous pouvons trouver sur la page officiel de terraform.
https://developer.hashicorp.com/terraform/install
Installation pour Ubuntu/Debian:
wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg –dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
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
sudo apt update && sudo apt install terraform
Création du dossier et des fichiers de confs:
$ cd /mnt/nfs/terraform && mkdir homelab
$ cd /homelab && touch main.tf provider.tf variables.tfvars
Fichiers disponible sur gitlab:
Pour remplir le fichier provider.tf, il est nécessaire de créer un token qui permettra à Terraform de s’authentifier avec Proxmox.
Connectez-vous à l’interface Web de Proxmox : Ouvrez votre navigateur Web et accédez à l’URL de l’interface Web de Proxmox. Connectez-vous avec vos identifiants d’administrateur.
Accédez à la section “Access Control” : Une fois connecté, cliquez sur l’onglet “Access Control” dans la barre de navigation en haut.
Créez un rôle (Role) : Dans la section “Access Control”, sélectionnez l’option “Roles” dans le menu de gauche. Cliquez sur le bouton “Create” pour créer un nouveau rôle. Définissez les autorisations appropriées pour le rôle en fonction des actions que vous souhaitez autoriser avec le token API.
Créez un utilisateur (User) : Après avoir créé le rôle, sélectionnez l’option “Users” dans le menu de gauche. Cliquez sur le bouton “Add” pour ajouter un nouvel utilisateur. Entrez les informations de l’utilisateur, telles que le nom d’utilisateur et le mot de passe.
Associez le rôle à l’utilisateur : Lors de la création de l’utilisateur, vous aurez l’option de sélectionner le rôle que vous avez précédemment créé. Associez le rôle approprié à l’utilisateur pour lui accorder les autorisations définies dans le rôle.
Générez le token API : Une fois l’utilisateur créé et associé au rôle, sélectionnez l’utilisateur dans la liste des utilisateurs. Sous l’onglet “API Tokens”, cliquez sur le bouton “Add” pour ajouter un nouveau token API. Entrez un nom descriptif pour le token et cliquez sur “Generate” pour générer le token.
Copiez le token API : Une fois généré, copiez le token API affiché à l’écran. Assurez-vous de conserver ce token en lieu sûr, car il servira d’authentification pour accéder à l’API de Proxmox.

Pour initialiser le dossier que nous avons crée, il suffit de lancer la commande terraform init dans le bon dossier:
user@LXC-6:~/homelab$ terraform init
Le fichier main.tf que j’ai utilisé est sur mon Gitlab (lien au dessus).
Il y a deux options intéressantes qui vont nous servir pour l’exécution de notre playbook ansible après et pour nous faciliter les connexions de notre machines vers les nouveaux LXC.
C’est l’option
ssh_public_keys = <<-EOT
ssh-rsa rsa A[à remplir]
EOT
Il suffit de générer une clés RSA avec PuTTYgen et copier la clés publique dans le fichier main.tf. vous pouvez même ajouter plusieurs clés à la fois respectant l’indentation.
Personnellement, j’ai ajouté les clés de mon pc personnelle, mon rebond windows (qui me sert a me connecter depuis l’extérieur du réseau) et la clé du contrôleur ansible. Je n’ai pas spécifié la swap car 512 c’est assez. Non plus le DNS car il prend par défaut les confs de l’hôte et cela me convient.
Voici d’autres arguments intéressants:
Cela m’a été utile pour activer l’option NFS, laquelle permettra de monter un volume sur un LXC. Mais il faut générer un token avec root@pam!root.
features {
fuse = true
nesting = true
mount = “nfs;cifs”
}
Si besoin d’autres arguments voici le lien vers la doc terraform https://registry.terraform.io/providers/Telmate/proxmox/latest/docs/resources/lxc
Voici un exemple de fichier main.tf pour construire 3 LXC.
resource “proxmox_lxc” “lxc-exemple” {
target_node = “proxmox”
count = 3
vmid = 126 + count.index
hostname = “LXC-1${count.index}”
tags = “debian_11”
ostemplate = “local:vztmpl/debian-11-standard_11.7-1_amd64.tar.zst”
password = “exemple”
unprivileged = false
memory = 4000
ssh_public_keys = <<-EOT
// Copier la clés publique ici
EOT
rootfs {
storage = “local-lvm”
size = “10G”
}
network {
name = “eth0”
bridge = “vmbr0”
ip = “192.168.11.${114+count.index}/24”
gw = “192.168.11.1”
}
}
Nous pouvons faire un Terraform plan pour analyser les fichiers de configuration, comparer l’état actuel de l’infrastructure avec la configuration souhaitée, et génèrer un plan décrivant les actions pour atteindre un état désiré.
$ terraform plan
Apply pour appliquer les changements
$ terraform apply
Faire attention à cette ligne tou particulièrement car nous pouvons détruire des ressources sans le vouloir.
Plan: 3 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only ‘yes’ will be accepted to approve.
Enter a value: yes
Voici la sortie de la commande apply:
proxmox_lxc.lxc-key[1]: Creating…
proxmox_lxc.lxc-key[0]: Creating…
proxmox_lxc.lxc-key[2]: Creating…
proxmox_lxc.lxc-key[1]: Still creating… [10s elapsed]
proxmox_lxc.lxc-key[2]: Still creating… [10s elapsed]
proxmox_lxc.lxc-key[0]: Still creating… [10s elapsed]
proxmox_lxc.lxc-key[1]: Creation complete after 11s [id=proxmox/lxc/127]
proxmox_lxc.lxc-key[2]: Creation complete after 17s [id=proxmox/lxc/128]
proxmox_lxc.lxc-key[0]: Creation complete after 17s [id=proxmox/lxc/126]
Apply complete! Resources: 3 added, 0 changed, 0 destroyed.


Automatisation des configurations initiales avec Ansible et AWX
J’ai préféré créer plusieurs modèles correspondant à chaque tâche de configuration afin de pouvoir lancer des jobs séparément. Toutefois, j’ai quand même créé un workflow qui me permet de rassembler tous ces modèles pour les exécuter sur un nouveau LXC ou une nouvelle VM.
Les fichier utilisés pour chaque template sont disponibles sur mon gitlab, voici le lien ci-dessous:

Alors j’ai défini des varibales qui sont dans les playbooks.
Par exemple:
-Créer un utilisateur appeler zeus.
- La variable source défini le partage NFS de mon NAS.
- La variable pm défini le point de montage du partage NFS.
- Et la dernière variable défini la le message de bienvenu sur le terminal figlet


En conclusion, une fois notre conteneur LXC créé avec Terraform et configuré avec AWX/Ansible, nous disposons désormais d’un environnement prêt à déployer nos applications. Ce processus nous offre une solution efficace et automatisée pour gérer les ressource sur Proxmox.
