Terraform : gérer ses zones DNS Gandi

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.