Voici la marche à suivre pour gérer vos zones DNS Gandi avec Terraform. Je pars du principe que votre zone est existante, ce qui implique l’importation de l’ensemble des ressources dans Terraform. Ce n’est pas strictement obligatoire, mais seule l’importation garantit la correspondance exacte de votre code à l’existant.

Installation du provider Gandi

# 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 et également créer votre clé API.

Projet Terraform

Débutons par la création d’un project Terraform basique :

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

Fichier provider.tf :

provider "gandi" {
    key = "${var.gandi_key}"
}

Fichier variable.tf :

variable "gandi_key" {}

Fichier main.tf :

resource "gandi_zone" "hbis_fr" {
  name = "hbis.fr"
}

resource "gandi_domainattachment" "hbis_fr" {
    domain = "hbis.fr"
    zone = "${gandi_zone.hbis_fr.id}"
}

resource "gandi_zonerecord" "root" {
    zone = "${gandi_zone.hbis_fr.id}"
    name = "@"
    type = "A"
    ttl = 3600
    values = [
        "51.15.171.130"
    ]
}
resource "gandi_zonerecord" "www" {
    zone = "${gandi_zone.hbis_fr.id}"
    name = "www"
    type = "A"
    ttl = 3600
    values = [
        "51.15.171.130"
    ]
}

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

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>.

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 créer et gérer votre zone DNS.