|
| 1 | +--- |
| 2 | +title: "OPCP - Comment utiliser Terraform avec OPCP" |
| 3 | +excerpt: "Découvrez comment générer une Application Credential depuis Horizon et automatiser le déploiement de vos ressources OPCP avec Terraform" |
| 4 | +updated: 2026-04-29 |
| 5 | +--- |
| 6 | + |
| 7 | +## Objectif |
| 8 | + |
| 9 | +[Terraform](https://www.terraform.io/) est un outil open source d'**Infrastructure as Code (IaC)** développé par [HashiCorp](https://www.hashicorp.com/). Il permet de décrire et de provisionner votre infrastructure de manière déclarative à partir de fichiers de configuration, écrits en *HashiCorp Configuration Language* (HCL). |
| 10 | + |
| 11 | +L'offre **OPCP** reposant sur **OpenStack**, vous pouvez utiliser le **provider Terraform OpenStack** afin d'automatiser le déploiement de vos ressources : instances, réseaux, volumes, paires de clés, etc. |
| 12 | + |
| 13 | +**Ce guide détaille les étapes nécessaires pour générer une *Application Credential* depuis Horizon, configurer Terraform et déployer un premier serveur sur votre infrastructure OPCP.** |
| 14 | + |
| 15 | +## Prérequis |
| 16 | + |
| 17 | +- Disposer d'un service [OPCP](/links/hosted-private-cloud/onprem-cloud-platform) actif. |
| 18 | +- Posséder un **compte utilisateur** avec les droits suffisants pour se connecter à Horizon sur l'offre OPCP. |
| 19 | +- Avoir [installé Terraform](https://developer.hashicorp.com/terraform/install) (version >= 1.0) sur votre poste de travail. |
| 20 | +- Disposer d'une **paire de clés SSH** sur votre poste local pour accéder à votre instance. |
| 21 | +- Avoir préalablement créé un **réseau privé** dans votre projet OPCP (voir le guide [Comment installer une instance depuis l'interface Horizon](/pages/hosted_private_cloud/opcp/opcp-setup-instance)). |
| 22 | + |
| 23 | +## En pratique |
| 24 | + |
| 25 | +### 1. Création d'une Application Credential depuis Horizon |
| 26 | + |
| 27 | +Pour permettre à Terraform de communiquer avec votre infrastructure OPCP, il est nécessaire de générer un couple **Application Credential** (`id` / `secret`) depuis l'interface Horizon. Ce mécanisme évite l'utilisation directe de vos identifiants Keycloak et fournit une authentification dédiée à vos automatisations, avec un périmètre de droits limité au projet courant. |
| 28 | + |
| 29 | +#### Connexion à Horizon |
| 30 | + |
| 31 | +Connectez-vous à l'interface **Horizon** de votre environnement OPCP, puis sélectionnez le **projet** dans lequel vous souhaitez déployer vos ressources via Terraform. Pour plus d'informations, consultez le guide [Mise en route de votre OPCP](/pages/hosted_private_cloud/opcp/opcp-getting-started). |
| 32 | + |
| 33 | +#### Création de l'Application Credential |
| 34 | + |
| 35 | +Dans le menu de gauche, cliquez sur `Identity`{.action}, puis sur `Application Credentials`{.action}.<br><br> |
| 36 | +{.thumbnail} |
| 37 | + |
| 38 | +Cliquez sur `+ Create Application Credential`{.action}.<br><br> |
| 39 | +{.thumbnail} |
| 40 | + |
| 41 | +Renseignez les champs suivants : |
| 42 | + |
| 43 | +| Champ | Description | |
| 44 | +|--------|--------------| |
| 45 | +| **Name** | Saisissez un nom pour votre Application Credential (ex. : *terraform-cred*). | |
| 46 | +| **Description** | Optionnel. Ajoutez une description si nécessaire. | |
| 47 | +| **Secret** | Optionnel. Si non renseigné, un secret sera généré automatiquement. | |
| 48 | +| **Expiration Date / Expiration Time** | Optionnel. Définissez une date d'expiration. | |
| 49 | +| **Roles** | Sélectionnez les rôles à associer à la credential (ex. : *member*). | |
| 50 | +| **Access Rules** | Optionnel. Permet de restreindre les actions autorisées. | |
| 51 | +| **Unrestricted** | Laissez décoché pour limiter les actions possibles. | |
| 52 | + |
| 53 | +Cliquez sur `Create Application Credential`{.action}. |
| 54 | + |
| 55 | +> [!warning] |
| 56 | +> Une fois la fenêtre fermée, le **secret ne sera plus accessible**. Téléchargez le fichier `clouds.yaml` ou `openrc` proposé par Horizon, ou copiez les valeurs `id` et `secret` dans un emplacement sécurisé. |
| 57 | +
|
| 58 | +{.thumbnail} |
| 59 | + |
| 60 | +> [!primary] |
| 61 | +> Pour la suite de ce tutoriel, **téléchargez le fichier `openrc`** : il sera utilisé à l'étape suivante pour authentifier Terraform auprès de votre infrastructure OPCP. |
| 62 | +
|
| 63 | +### 2. Préparation de l'environnement Terraform |
| 64 | + |
| 65 | +#### Création du dossier de travail |
| 66 | + |
| 67 | +Créez un répertoire dédié à votre projet Terraform : |
| 68 | + |
| 69 | +```bash |
| 70 | +mkdir terraform-opcp && cd terraform-opcp |
| 71 | +``` |
| 72 | + |
| 73 | +#### Définition du provider OpenStack |
| 74 | + |
| 75 | +Dans un fichier nommé `provider.tf`, ajoutez les lignes suivantes : |
| 76 | + |
| 77 | +```hcl |
| 78 | +terraform { |
| 79 | + required_version = ">= 1.0" |
| 80 | + required_providers { |
| 81 | + openstack = { |
| 82 | + source = "terraform-provider-openstack/openstack" |
| 83 | + version = ">= 3.0.0" |
| 84 | + } |
| 85 | + } |
| 86 | +} |
| 87 | +
|
| 88 | +provider "openstack" {} |
| 89 | +``` |
| 90 | + |
| 91 | +Aucun paramètre n'est nécessaire dans le bloc `provider`{.action} : le provider OpenStack récupère automatiquement les informations d'authentification depuis les variables d'environnement `OS_*`. |
| 92 | + |
| 93 | +#### Chargement des variables d'environnement OpenStack |
| 94 | + |
| 95 | +Lors de la création de votre Application Credential, Horizon vous a proposé le téléchargement d'un fichier `clouds.yaml` ou `openrc`. Le plus simple est de charger ce fichier `openrc.sh` dans votre shell avant d'exécuter Terraform : |
| 96 | + |
| 97 | +```bash |
| 98 | +source openrc.sh |
| 99 | +``` |
| 100 | + |
| 101 | +> [!primary] |
| 102 | +> Le fichier `openrc.sh` exporte notamment `OS_AUTH_URL`, `OS_REGION_NAME`, `OS_APPLICATION_CREDENTIAL_ID` et `OS_APPLICATION_CREDENTIAL_SECRET`. Ces variables seront automatiquement utilisées par le provider OpenStack de Terraform. |
| 103 | +
|
| 104 | +#### Initialisation |
| 105 | + |
| 106 | +Téléchargez les plugins du provider OpenStack : |
| 107 | + |
| 108 | +```bash |
| 109 | +terraform init |
| 110 | +``` |
| 111 | + |
| 112 | +### 3. Création d'un serveur |
| 113 | + |
| 114 | +Dans un fichier `main.tf`, déclarez les ressources nécessaires pour créer une instance attachée à un réseau privé existant : |
| 115 | + |
| 116 | +```hcl |
| 117 | +# Variables liées à l'instance |
| 118 | +variable "instance_name" { |
| 119 | + description = "Nom de l'instance qui sera créée dans OPCP" |
| 120 | + type = string |
| 121 | + default = "instance-terraform-name" |
| 122 | +} |
| 123 | +
|
| 124 | +variable "image_name" { |
| 125 | + description = "Nom de l'image à utiliser pour l'instance (ex: Debian 12 OPCP)" |
| 126 | + type = string |
| 127 | + default = "Debian 12 OPCP" |
| 128 | +} |
| 129 | +
|
| 130 | +variable "flavor_name" { |
| 131 | + description = "Flavor baremetal définissant les ressources matérielles de l'instance (ex: scale-1, scale-2, etc.)" |
| 132 | + type = string |
| 133 | + default = "scale-1" |
| 134 | +} |
| 135 | +
|
| 136 | +variable "network_name" { |
| 137 | + description = "Nom du réseau existant auquel l'instance sera rattachée" |
| 138 | + type = string |
| 139 | + default = "<your-network-name>" |
| 140 | +} |
| 141 | +
|
| 142 | +variable "key_name" { |
| 143 | + description = "Nom de la paire de clés SSH à associer à l'instance" |
| 144 | + type = string |
| 145 | + default = "terraform-key" |
| 146 | +} |
| 147 | +
|
| 148 | +# Création d'une instance |
| 149 | +resource "openstack_compute_instance_v2" "terraform_instance" { |
| 150 | + name = var.instance_name |
| 151 | + image_name = var.image_name |
| 152 | + flavor_name = var.flavor_name |
| 153 | + key_pair = var.key_name |
| 154 | +
|
| 155 | + network { |
| 156 | + name = var.network_name |
| 157 | + } |
| 158 | +
|
| 159 | + lifecycle { |
| 160 | + # Évite que Terraform détecte une dérive lorsque l'image de base est mise à jour |
| 161 | + ignore_changes = [ |
| 162 | + image_name |
| 163 | + ] |
| 164 | + } |
| 165 | +
|
| 166 | + # Métadonnées utiles |
| 167 | + metadata = { |
| 168 | + environment = "production" |
| 169 | + managed_by = "terraform" |
| 170 | + } |
| 171 | +
|
| 172 | + # Timeouts plus longs (le provisioning baremetal est lent) |
| 173 | + timeouts { |
| 174 | + create = "60m" |
| 175 | + delete = "30m" |
| 176 | + } |
| 177 | +} |
| 178 | +
|
| 179 | +# Sorties utiles après création |
| 180 | +output "instance_id" { |
| 181 | + value = openstack_compute_instance_v2.terraform_instance.id |
| 182 | +} |
| 183 | +
|
| 184 | +output "instance_ip" { |
| 185 | + value = openstack_compute_instance_v2.terraform_instance.access_ip_v4 |
| 186 | +} |
| 187 | +``` |
| 188 | + |
| 189 | +> [!primary] |
| 190 | +> Les noms d'images, de flavors et de réseaux disponibles peuvent être listés depuis Horizon ou avec la CLI OpenStack (`openstack image list`, `openstack flavor list`, `openstack network list`). Pour configurer la CLI, consultez le guide [Comment utiliser les API et obtenir les informations d'identification](/pages/hosted_private_cloud/opcp/opcp-use-api-get-credentials). |
| 191 | +
|
| 192 | +#### Vérification du plan |
| 193 | + |
| 194 | +Avant tout déploiement, prévisualisez les actions qui seront effectuées : |
| 195 | + |
| 196 | +```bash |
| 197 | +terraform plan |
| 198 | +``` |
| 199 | + |
| 200 | +#### Application de la configuration |
| 201 | + |
| 202 | +Déployez l'instance avec la commande suivante : |
| 203 | + |
| 204 | +```bash |
| 205 | +terraform apply |
| 206 | +``` |
| 207 | + |
| 208 | +Confirmez avec `yes` lorsque Terraform vous le demande. Une fois la création terminée, l'instance est visible dans l'interface Horizon, dans la section `Compute`{.action} > `Instances`{.action}. |
| 209 | + |
| 210 | +### 4. Suppression de l'infrastructure |
| 211 | + |
| 212 | +Pour supprimer l'ensemble des ressources créées via Terraform : |
| 213 | + |
| 214 | +```bash |
| 215 | +terraform destroy |
| 216 | +``` |
| 217 | + |
| 218 | +### 5. Dépannage (Troubleshooting) |
| 219 | + |
| 220 | +| Problème | Cause possible | Solution | |
| 221 | +|-----------|----------------|-----------| |
| 222 | +| `Authentication failed` | Mauvais `application_credential_id` ou `secret` | Vérifiez les identifiants dans Horizon (`Identity`{.action} > `Application Credentials`{.action}). | |
| 223 | +| `Could not find image` | Le nom de l'image ne correspond pas | Listez les images disponibles via `openstack image list` ou depuis Horizon. | |
| 224 | +| `No suitable endpoint could be found` | Mauvaise URL `auth_url` ou région inexistante | Vérifiez l'URL Keystone et la région dans `Project`{.action} > `API Access`{.action}. | |
| 225 | +| `Network not found` | Réseau privé absent dans le projet | Créez un réseau privé au préalable depuis Horizon (`Network`{.action} > `Networks`{.action}). | |
| 226 | + |
| 227 | +### 6. Références |
| 228 | + |
| 229 | +- [Documentation officielle Terraform](https://developer.hashicorp.com/terraform) |
| 230 | +- [Provider Terraform OpenStack](https://registry.terraform.io/providers/terraform-provider-openstack/openstack/latest/docs) |
| 231 | +- [Ressource openstack_compute_instance_v2](https://registry.terraform.io/providers/terraform-provider-openstack/openstack/latest/docs/resources/compute_instance_v2) |
| 232 | +- [OpenStack Application Credentials](https://docs.openstack.org/keystone/latest/user/application_credentials.html) |
| 233 | + |
| 234 | +## Aller plus loin |
| 235 | + |
| 236 | +Si vous avez besoin d'une formation ou d'une assistance technique pour la mise en œuvre de nos solutions, contactez votre commercial ou cliquez sur [ce lien](/links/professional-services) pour obtenir un devis et demander une analyse personnalisée de votre projet à nos experts de l'équipe Professional Services. |
| 237 | + |
| 238 | +Échangez avec notre [communauté d'utilisateurs](/links/community). |
0 commit comments