Présentation Consul

Comme Terraform, l'outil Consul est propulsé par Hashicorp. Il permet la découverte de service distribué mais c'est également un datastore de type key/value permettant ainsi le stockage d'élément de configuration (et quelques autres trucs sans grande importance ici). Je vous recommande de lire cette page pour savoir tout ce qu'il est capable de faire.

Consul s'installe sous la forme d'un agent qui est chargé d'enregistrer les services, de répondre aux requêtes et de collecter toutes les informations du cluster. Il se trouve sur chacun des nœuds et peut fonctionner en mode client ou serveur. Le cluster lui doit disposer d'au minimum 1 agent de type serveur. Si vous pensez utiliser Consul en production, il est recommandé d'avoir 3 à 5 agents en mode server par cluster pour éviter toute perte de données.


Installation Consul

Pour l'installation de Consul, c'est assez simple (et j'ai pas souhaité me prendre la tête) via un container Docker. Par contre je ne me suis pas basé sur l'image officielle mais sur progrium/consul pour plusieurs raisons. Pour lancer le container, la procédure est relativement simple et rapide :

[root@xorhak:~]# mkdir -p /datas/docker/consul/datas
[root@xorhak:~]# docker run -d -p 8400:8400 -p 8500:8500 -p 8600:8600/udp -h $HOSTNAME --name consul -v /datas/docker/consul/datas:/data:rw progrium/consul -server -bootstrap -ui-dir /ui

Lorsque le container est lancé, vous pouvez vous y connecter en HTTP sur le port 8500, il n'y a pas d'authentification par défaut dessus. Pour ma part, les ports 8400, 8500 et 8600 sont bloqués sur le firewall et j'ai mis en place un vhost en proxy_pass Nginx avec une authentification basic.

Dans le cas de cet article, nous n'allons utiliser que le datastore key/value. Peut-être que nous verrons les autres modes plus tard...


Arborescence Consul

La configuration de Consul (dans le mode key/value) ne dépend que de vous. Ici, j'ai fais une arborescence assez simple, l'idée est simplement de voir son fonctionnement avec Terraform :

  • scaleway/ami/name : Debian Jessie : le nom de l'AMI recherché
  • scaleway/server/type : VC1S : le type d'instance
  • scaleway/server/name : xorhak-instance : le nom de l'instance

Provider Terraform

La configuration du provider dans Terraform est un élément obligatoire puisqu'il est le point de connexion vers le service Consul. La configuration prendra alors cette forme :

provider "consul" {
  address    = "consul.djerfy.com"
  datacenter = "dc1"
}

PS : j'utilise ici un vhost nginx en front, si ce n'est pas le cas pour vous (ou pour faire dans le simple), vous pouvez rajouter :8500, ce qui donnera consul.djerfy.com:8500.


Récupération des keys/values

Maintenant qu'on a une configuration minimale sur le Consul, nous allons pouvoir configurer le fichier Terraform pour récupérer ces valeurs (sous forme de variable) :

data "consul_keys" "scw" {
    datacenter = "dc1"
    key {
        name    = "ami_name"
        path    = "scaleway/ami/name"
        default = "Debian Jessie"
    }
    key {
        name    = "server_name"
        path    = "scaleway/server/name"
        default = "xorhak-instance"
    }
    key {
        name    = "server_type"
        path    = "scaleway/server/type"
        default = "VC1S"
    }
}

Ces valeurs seront maintenant disponibles en tant que variables sous cette forme :

${data.consul_keys.scw.var.ami_name}

Ressource Terraform

Pour mieux comprendre en situation réelle, voici un exemple d'une ressource :

# Get ID for AMI
data "scaleway_image" "ami" {
    architecture = "x86_64"
    name         = "${data.consul_keys.scw.var.ami_name}"
}

# Create instance
resource "scaleway_server" "server" {
    image = "${data.scaleway_image.ami.id}"
    name  = "${data.consul_keys.scw.var.server_name}"
    type  = "${data.consul_keys.scw.var.server_type}"
    tags  = [ 
        "scaleway", 
        "test", 
        "labo", 
        "terraform"
    ]
}

Conclusion

Voilà, vous savez maintenant comment utiliser Consul pour le stockage de key/value et les récupérer via un provider sous Terraform. L'article est relativement basique et rapide, la documentation de Consul et de Terraform vous donneront toujours plus d'informations si vous le souhaitez. L'idée ici était d'en faire une première approche.

Enjoy!
XorHak