Terraform : gérer ses zones DNS Gandi

Boris HUISGEN
Boris HUISGEN
|

Un provider DNS Gandi pour Terraform existe pour vous permettre de gérer vos zones et domaines.

Je pars du principe que votre zone DNS est déjà existante, ce qui implique l’importation de l’ensemble des ressources dans Terraform. Ce n’est pas strictement obligatoire, mais l’importation garantit une correspondance exacte du code à l’existant.

Installation du provider

$ go get github.com/tiramiseb/terraform-provider-gandi
$ cd $GOPATH/go/src/github.com/tiramiseb/terraform-provider-gandi
$ go build -o terraform-provider-gandi

Comme précisé par l’auteur du provider, cela ne marche qu’avec la nouvelle infrastructure LiveDNS de Gandi ; il convient donc de migrer vos zones préalablement et de créer également votre clé API.

Projet Terraform

Débutons par la création du projet Terraform :

$ mkdir ~/Projects/dns
$ cd ~/Projects/dns
$ touch main.tf providers.tf variables.tf outputs.tf terraform.tfvars

Fichier provider.tf :

1provider "gandi" {
2  key = "${var.gandi_key}"
3}

Fichier variable.tf :

1variable "gandi_key" {}

Fichier main.tf :

 1resource "gandi_zone" "hbis_fr" {
 2  name = "hbis.fr"
 3}
 4
 5resource "gandi_domainattachment" "hbis_fr" {
 6  domain = "hbis.fr"
 7  zone = "${gandi_zone.hbis_fr.id}"
 8}
 9
10resource "gandi_zonerecord" "root" {
11  zone = "${gandi_zone.hbis_fr.id}"
12  name = "@"
13  type = "A"
14  ttl = 3600
15  values = [
16    "51.15.171.130"
17  ]
18}
19
20resource "gandi_zonerecord" "www" {
21  zone = "${gandi_zone.hbis_fr.id}"
22  name = "www"
23  type = "A"
24  ttl = 3600
25  values = [
26    "51.15.171.130"
27  ]
28}

Je ne m’étends pas sur le code des ressources, seule une variable Terraform sera utilisée en CLI pour fournir la clé API.

Importation de la zone DNS

Le projet est à initialiser :

$ terraform init

Avant de débuter l’importation de la zone DNS, l’étape essentielle est de récupérer son identifiant. Pour ce faire :

$ curl -s -H "Content-Type: application/json" -H "X-Api-Key: ******" https://dns.api.gandi.net/api/v5/zones|jq -r
[
  {
    "retry": 3600,
    "uuid": "72e4069e-eeef-11e7-8db5-00163e6dc886",
    "zone_href": "https://dns.api.gandi.net/api/v5/zones/72e4069e-eeef-11e7-8db5-00163e6dc886",
    "minimum": 10800,
    "domains_href": "https://dns.api.gandi.net/api/v5/zones/72e4069e-eeef-11e7-8db5-00163e6dc886/domains",
    "refresh": 10800,
    "zone_records_href": "https://dns.api.gandi.net/api/v5/zones/72e4069e-eeef-11e7-8db5-00163e6dc886/records",
    "expire": 604800,
    "sharing_id": "4aace8e0-b393-11e7-bcf1-00163ec388ae",
    "serial": 1514825087,
    "email": "hostmaster.gandi.net.",
    "primary_ns": "ns1.gandi.net",
    "name": "hbis.fr"
  }
]

La valeur UUID est l’identifiant à récupérer. Lancez l’importation :

$ terraform import -var 'gandi_key=******' gandi_zone.hbis_fr 72e4069e-eeef-11e7-8db5-00163e6dc886

Terraform devrait confirmer l’importation de la ressource dans son fichier d’état. Vérification :

$ terraform show
gandi_zone.hbis_fr:
id = 72e4069e-eeef-11e7-8db5-00163e6dc886
name = hbis.fr

La ressource d’association zone DNS au domaine est également à importer:

$ terraform import -var 'gandi_key=******' gandi_domainattachment.hbis_fr hbis.fr

La zone est à présent reconnue et la création de nouveau records par Terraform est possible. Reste donc à importer les records existants :

$ terraform import -var 'gandi_key=******' gandi_zonerecord.root 72e4069e-eeef-11e7-8db5-00163e6dc886/@/A
$ terraform import -var 'gandi_key=******' gandi_zonerecord.blog 72e4069e-eeef-11e7-8db5-00163e6dc886/www/A

La commande import nécessite le nom de la ressource et son identifiant interne. Dans le cas des records, le format est : <UUID>/<NAME>/<TYPE>

Execution du plan

Le fichier d’état étant peuplé de toutes les ressources nécessaires, vérifiez que le plan Terraform ne requiert aucune modification :

$ terraform plan -var 'gandi_key=******' -out plan.out

Vous pouvez à présent utiliser Terraform pour gérer votre zone DNS.

Boris HUISGEN
Boris HUISGEN
Blog owner
  • #dns
  • #gandi
  • #terraform