Public Cloud OVHcloud - Terraform : feedback provider OVH
BMPCreated with Sketch.BMPZIPCreated with Sketch.ZIPXLSCreated with Sketch.XLSTXTCreated with Sketch.TXTPPTCreated with Sketch.PPTPNGCreated with Sketch.PNGPDFCreated with Sketch.PDFJPGCreated with Sketch.JPGGIFCreated with Sketch.GIFDOCCreated with Sketch.DOC Error Created with Sketch.
Frage

Terraform : feedback provider OVH

Von
ThibaultC13
Erstellungsdatum 2021-11-08 12:38:01 (edited on 2024-09-04 13:51:18) in Public Cloud OVHcloud

Le provider OVH pour terrafom sert à déployer une infrastructure réseau avec Terraform: création de vlan et rattachement des serveurs à ce vlan, rattachement d'un tenant à un vrack...

Au 8/11 celui-ci est en version 0.16, je suppose donc qu'il n'est pas considéré comme une version définitive par OVH?

En l'utilisant je suis tombé sur ce qui me semble être des bugs. J'ai pu contourner ceux ci non sans effort de recherche de ma part. Je n'ai pas noté tous les messages d'erreur que j'ai obtenu je me contenterais donc parfois de dire "j'obtiens une erreur"

#1 : support des alias
Le provider ovh ne semble pas supporter la définition d'alias contrairement à ce qui est indiqué dans la documentation.

Par exemple, je définis mon provider de la façon suivante:
> provider "ovh" {
> endpoint = "ovh-eu" # Point d'entrée du fournisseur
> alias = "ovh" # Alias du fournisseur
> }

Puis je tente de créer un réseau privé. L'alias est réutilisé au niveau du champ provider:
> # Création d'un réseau privé
> resource "ovh_cloud_project_network_private" "network" {
> service_name = "OS_TENANT_ID" # Remplacez OS_TENANT_ID par votre Tenant ID de projet
> name = "private_network" # Nom du réseau
> regions = ["OS_REGION_NAME"] # Remplacez OS_REGION_NAME par la variable d'environnement OS_REGION_NAME
> provider = ovh.ovh # Nom du fournisseur
> vlan_id = 168 # Identifiant du vlan pour le vRrack
> depends_on = [ovh_vrack_cloudproject.vcp] # Dépend de l'association du vrack au projet cloud
> }

J'obtiens alors une erreur. Lors que j'écris le code suivant (c'est à dire sans alias) tout fonctionne bien:
> provider "ovh" {
> endpoint = "ovh-eu" # Point d'entrée du fournisseur
> }
> # Création d'un réseau privé
> resource "ovh_cloud_project_network_private" "network" {
> service_name = "OS_TENANT_ID" # Remplacez OS_TENANT_ID par votre Tenant ID de projet
> name = "private_network" # Nom du réseau
> regions = ["OS_REGION_NAME"] # Remplacez OS_REGION_NAME par la variable d'environnement OS_REGION_NAME
> provider = ovh # Nom du fournisseur
> vlan_id = 168 # Identifiant du vlan pour le vRrack
> depends_on = [ovh_vrack_cloudproject.vcp] # Dépend de l'association du vrack au projet cloud
> }

#2 : support des variables d'environnement
L'emploi du provider ovh nécessite 3 variables d'environnement:
> export OVH_APPLICATION_KEY=Votre_cle_dapplication_OVH(ou_AK)
> export OVH_APPLICATION_SECRET=Votre_cle_dapplication_secrete_OVH(ou_AS)
> export OVH_CONSUMER_KEY=Votre_token(ou_CK)

Hors, pour que cela fonctionne, je dois indiquer ces paramètres sensibles au niveau de la définition de mon provider:
> provider "ovh" {
> #alias = "ovh" # Un alias
> endpoint = "ovh-eu"
> application_key = "Xu..."
> application_secret = "xz.."
> consumer_key = "Sb..."
> }

#3: connexion aux serveurs n'ayant qu'une ip privée
Je créé deux serveurs front ayant à la fois un IP publique et une IP privée. Je créé également un serveur back n'ayant qu'une IP privée.

> resource "ovh_cloud_project_network_private" "private_network" {
> service_name = "c076ca2979904ef6bf93faff181dab18" # Remplacer OS_TENANT_ID par votre Tenant ID de projet
> name = "backend" # Nom du réseau
> regions = ["SBG5"] # Remplacez OS_REGION_NAME par la variable d'environnement OS_REGION_NAME
> provider = ovh.ovh # Nom du fournisseur
> vlan_id = 42 # Identifiant du vlan pour le vRrack
> depends_on = [ovh_vrack_cloudproject.vcp] # Depend de l'association du vRack au projet cloud
> }
> resource "ovh_cloud_project_network_private_subnet" "private_subnet" {
> # Identifiant de la ressource ovh_cloud_network_private nommée private_network
> network_id = ovh_cloud_project_network_private.private_network.id
> service_name = "c076ca2979904ef6bf93faff181dab18" # Remplacez OS_TENANT_ID par votre Tenant ID de projet
> region = "SBG5" # Remplacez OS_REGION_NAME par la variable d'environnement OS_REGION_NAME
> network = "192.168.42.0/24" # IP du sous réseau
> start = "192.168.42.2" # Première IP du sous réseau
> end = "192.168.42.200" # Dernière IP du sous réseau
> dhcp = false # Désactivation du DHCP
> provider = ovh.ovh # Nom du fournisseur
> no_gateway = true # Pas de gateway par defaut
> }
> data "openstack_images_image_v2" "archlinux" {
> name = "Archlinux" # Nom de l'image
> most_recent = true # Limite la recherche à la plus récente
> provider = openstack.ovh # Nom du fournisseur
> }
> variable "front_private_ip" {
> type = list(any)
> default = ["192.168.42.2", "192.168.42.3"]
> }
> resource "openstack_compute_instance_v2" "front" {
> count = length(var.front_private_ip) # Nombre d'instances à créer
> provider = openstack.ovh # Nom du fournisseur
> name = "front" # Nom de l'instance
> key_pair = openstack_compute_keypair_v2.test_keypair.name
> flavor_name = "s1-2" # Nom du type d'instance
> image_id = data.openstack_images_image_v2.archlinux.id # Identifiant de l'image de l'instance
> security_groups = ["default"] # Ajoute l'instance au groupe de sécurité
> network {
> name = "Ext-Net" # Nom de l'interface réseau publique
> }
> network {
> # Nom de l'interface réseau privé
> name = ovh_cloud_project_network_private.private_network.name
> # Adresse IP prise depuis la liste définie précédemment
> fixed_ip_v4 = element(var.front_private_ip, count.index)
> }
> depends_on = [ovh_cloud_project_network_private_subnet.private_subnet] # Dépend du réseau privé
> }
> resource "openstack_blockstorage_volume_v2" "backup" {
> name = "backup_disk" # Nom du périphérique de stockage
> size = 10 # Taille
> provider = openstack.ovh # Nom du fournisseur
> }
> resource "openstack_compute_instance_v2" "back" {
> provider = openstack.ovh # Nom du fournisseur
> name = "back" # Nom de l'instance
> key_pair = openstack_compute_keypair_v2.test_keypair.name
> flavor_name = "s1-2" # Nom du type d'instance
> image_id = data.openstack_images_image_v2.archlinux.id # Identifiant de l'image de l'instance
> security_groups = ["default"] # Ajoute l'instance au groupe de sécurité
> network {
> name = ovh_cloud_project_network_private.private_network.name # Nom du réseau privé
> fixed_ip_v4 = "192.168.42.150" # Addresse IP privée choisie arbitrairement
> }
> # Périphérique de stockage bootable contenant l'OS
> block_device {
> uuid = data.openstack_images_image_v2.archlinux.id # Identifiant de l'image de l'instance
> source_type = "image" # Type de source
> destination_type = "local" # Destination
> volume_size = 10 # Taille
> boot_index = 0 # Ordre de boot
> delete_on_termination = true # Le périphérique sera supprimé quand l'instance sera supprimée
> }
> # Périphérique de stockage
> block_device {
> source_type = "blank" # Type de source
> destination_type = "volume" # Destination
> volume_size = 20 # Taille
> boot_index = 1 # Ordre de boot
> delete_on_termination = true # Le périphérique sera supprimé quand l'instance sera supprimée
> }
> # Périphérique de stockage créé précédemment
> block_device {
> uuid = openstack_blockstorage_volume_v2.backup.id # Identifiant du périphérique de stockage
> source_type = "volume" # Type de source
> destination_type = "volume" # Destination
> boot_index = 2 # Ordre de boot
> delete_on_termination = true # Le périphérique sera supprimé quand l'instance sera supprimée
> }
> depends_on = [ovh_cloud_project_network_private_subnet.private_subnet] # Dépend du réseau privé
> }

Je me connecte en ssh à l'un des serveurs front. Je tente de pinger le serveur back. Il est impossible de pinger le serveur back.

A présent je détruis mon infrastructure. Je la recréé mais cette fois avec le serveur back ayant à la fois une IP privée et une publique.

J'utilise l'API nova pour détruire l'IP publique du serveur back:
`nova interface-detach `

Je me connecte en ssh à l'un des serveurs front. Je tente de pinger le serveur back. Et ça fonctionne :)