Aller au contenu
Conteneurs & Orchestration medium

Gérer Incus avec Terraform (provider lxc/incus)

8 min de lecture

logo incus

Cliquer dans la CLI pour créer une instance, c'est bien pour apprendre ; le décrire en Infrastructure as Code, c'est ce qui rend une infra reproductible. Le provider lxc/incus (officiel du projet LXC) permet de gérer instances, profils, réseaux et pools Incus avec Terraform ou OpenTofu. Ce guide écrit un premier main.tf, applique la configuration sur un serveur Incus, cible ensuite un serveur distant par token, et liste les ressources disponibles. Testé sur Incus 7.0 avec OpenTofu 1.12 et le provider 1.1.

  • Déclarer le provider lxc/incus (local ou distant).
  • Créer une instance et un profil en incus_instance / incus_profile.
  • Cibler un serveur distant par token de confiance.
  • Les ressources disponibles et les pièges courants.
  • Terraform ou OpenTofu installé (les commandes ci-dessous utilisent tofu, terraform est identique).
  • Un serveur Incus accessible : soit en local (socket Unix), soit distant avec l'API exposée (core.https_address).
  • Les bases d'Incus : voir Premiers pas avec Incus.

Le provider s'appelle lxc/incus sur les registres Terraform et OpenTofu. Sur un serveur local, il se connecte au socket Unix d'Incus ; aucun token n'est nécessaire.

terraform {
required_providers {
incus = {
source = "lxc/incus"
version = "~> 1.1"
}
}
}
provider "incus" {
remote {
name = "local"
address = "unix://"
}
default_remote = "local"
}

Le bloc remote déclare un serveur Incus. unix:// cible le démon local ; on verra plus bas la variante distante par token.

On décrit un profil (configuration réutilisable) et une instance qui l'applique. Le champ image suit le format remote:alias : ici images:debian/13 tire depuis le serveur d'images communautaire.

resource "incus_profile" "web" {
name = "tf-web-profile"
config = {
"limits.memory" = "512MiB"
}
}
resource "incus_instance" "web" {
name = "tf-web"
image = "images:debian/13"
type = "container"
profiles = ["default", incus_profile.web.name]
config = {
"boot.autostart" = "true"
"limits.cpu" = "1"
}
}
  1. Initialiser le répertoire : tofu init télécharge le provider.

    - Installing lxc/incus v1.1.1...
    - Installed lxc/incus v1.1.1 (signed, key ID C638974D64792D67)
    OpenTofu has been successfully initialized!
  2. Appliquer : tofu apply -auto-approve crée le profil puis l'instance.

    incus_profile.web: Creation complete after 0s [name=tf-web-profile]
    incus_instance.web: Creation complete after 5s [name=tf-web]
    Apply complete! Resources: 2 added, 0 changed, 0 destroyed.
  3. Vérifier côté Incus : l'instance tourne, avec les deux profils appliqués.

    +--------+---------+-----------+----------+
    | NAME | STATE | TYPE | LOCATION |
    +--------+---------+-----------+----------+
    | tf-web | RUNNING | CONTAINER | node1 |
    +--------+---------+-----------+----------+

Sur un cluster, l'instance est placée automatiquement (ici node1) sauf si vous fixez target = "node2" dans la ressource. La colonne profiles de incus config show tf-web confirme bien default puis tf-web-profile.

Pour piloter un serveur Incus distant, on déclare son adresse et un token de confiance à usage unique, généré côté serveur avec incus config trust add.

provider "incus" {
generate_client_certificates = true
accept_remote_certificate = true
default_remote = "cluster"
remote {
name = "cluster"
address = "https://192.168.10.184:8443"
token = "eyJjbGllbnRfbmFtZSI6..."
}
}

Le provider couvre l'essentiel de l'objet Incus. Chaque ressource accepte un champ remote pour cibler un serveur précis parmi ceux déclarés.

RessourceRôle
incus_instanceConteneur ou VM (type = "virtual-machine")
incus_profileProfil de configuration réutilisable
incus_networkRéseau (bridge, OVN)
incus_storage_poolPool de stockage (dir, ZFS, LVM)
incus_storage_volumeVolume personnalisé
incus_projectProjet (cloisonnement)
incus_imageImage gérée/copiée dans le pool

Trois comportements par défaut surprennent souvent, à garder en tête pour éviter des apply inattendus.

  • type vaut container par défaut : pour une machine virtuelle, il faut expliciter type = "virtual-machine".
  • La liste profiles remplace le défaut : si vous passez une liste explicite, le profil default n'est pas ajouté automatiquement ; incluez-le si vous en avez besoin (comme ci-dessus).
  • L'image doit être accessible depuis le remote : image = "images:debian/13" suppose que le remote images existe côté serveur (c'est le cas par défaut).

Comme toute infra Terraform, la configuration est réversible : tofu destroy supprime l'instance et le profil créés. C'est l'intérêt de l'IaC face au clic manuel : l'état est décrit, versionné et jetable.

Fenêtre de terminal
tofu destroy -auto-approve
  • Le provider lxc/incus gère Incus en IaC avec Terraform ou OpenTofu.
  • En local, il utilise le socket Unix (address = "unix://") sans token.
  • À distance : un token de confiance à usage unique, puis un certificat client mémorisé.
  • Piège : type vaut container par défaut ; profiles explicite n'ajoute pas default.
  • Ressources : incus_instance, incus_profile, incus_network, incus_storage_pool, incus_project.

FAQ : questions fréquentes sur Terraform et Incus

Section intitulée « FAQ : questions fréquentes sur Terraform et Incus »

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn