Tutoriel pour apprendre l'installation de Designate, un composant de OpenStack pour le service de DNSaaS (DNS en tant que service)

Pascal Edouard

Comme nous l'avons vu dans notre dernier article sur Openstack, plusieurs modules ont été développés afin d'enrichir cette plate-forme IaaS. L'utilisation d'Openstack a suscité un grand intérêt de la part de ses utilisateurs afin d'intégrer un service de DNS, notamment pour les développeurs. Cela leur permet d'avoir à disposition un moyen plus simple et sécurisé d'utiliser un nom de domaine lors de leur développement afin de référencer leurs serveurs d'application plutôt que d'utiliser une adresse IP.

C'est ainsi que le projet de mettre en place un service de DNS fut introduit pour Openstack.

Le projet s'appelait au départ Moniker, mais fut rapidement rebaptisé Designate.

Un espace de discussion vous est proposé sur le forum pour partager votre avis. Commentez

- Titre : Tutoriel pour apprendre l'installation de Designate, un composant de OpenStack pour le service de DNSaaS (DNS en tant que service)

- Auteur : Pascal Edouard

- Parution : 27 septembre 2017

- Public visé :

- Licence : Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2017 Pascal Edouard. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Voir également :

- Tutoriel pour apprendre les bases de OpenStack et construire son cloud privé

Sommaire

- I. Designate : DNS as a Service

- II. Installation

- II-A. Préparation de l'environnement

- II-B. Configuration de designate

- III. Conclusion

- Note de la rédaction Developpez.com▲

I - Designate : DNS as a Service

Le module Designate permet d'interagir avec un serveur DNS préalablement installé afin de créer, mettre à jour ou effacer une entrée DNS en utilisant son API.

L'architecture de Designate a été basée sur les mêmes concepts que les autres modules Openstack. Pour résumer, les briques principales offrent les fonctionnalités suivantes :

- un REST API pour les utilisateurs afin d'interagir avec le back-end DNS ;

- le DNS Central qui gère les requêtes RPC via un bus de messagerie (RabbitMQ) ;

- intercepter les requêtes DNS (NOTIFY et AXFR) et les envoyer aux back-end enregistrés ;

- Déléguer l'authentification à Keystone.

Openstack Designate architecture se présente comme suit :

(cliquez ici pour aggrandir l'image)

II - Installation

Je détaillerai dans cet article les étapes à réaliser pour la mise en place du module Designate sur une VM. Quelques détails sur la configuration :

OS : Ubuntu 14.04 ; RAM : 2 GB ; Disk : 10 GB ; Openstack : Liberty ; Réseau Management : 10.0.0.0/24.

II-A - Préparation de l'environnement

On active le repository d'Openstack Liberty sur le système :

1. $ sudo apt-get update

2. $ sudo apt-get install software-properties-common

3. $ sudo add-apt-repository cloud-archive:liberty

Mise à jour du système :

1. $ sudo apt-get update

2. $ sudo apt-get dist-upgrade

Installation du la base de données MariaDB :

1. $ sudo apt-get install mariadb-server python-pymysql

Installation et configuration du bus de messagerie RabbitMQ. On ajoute un utilisateur avec son mot de passe et attribue ainsi les permissions nécessaires :

1. $ sudo apt-get install rabbitmq-server

2. $ sudo rabbitmqctl add_user openstack-designate DESIG-RABBIT-PASSWORD

3. $ sudo rabbitmqctl set_permissions openstack-designate ".*" ".*" ".*"

Installation du serveur DNS

Designate supporte actuellement plusieurs back-end, tels que PowerDNS, Bind, NSD, DynECT. Pour ce tutoriel, nous utiliserons Bind9.

1. $ sudo apt-get install bind9

Commençons par configurer Bind afin de permettre la création de plusieurs zones, ce qui permettra pour chaque tenant d'avoir une zone dédiée au nom de domaine de ses VM. On édite alors le fichier /etc/bind/named.conf.options, en ajoutant à la fin, les trois lignes suivantes :

1. $ sudo vi /etc/bind/named.conf.options >

2. [...]

3. allow-new-zones yes;

4. request-ixfr no;

5. recursion no;

6. };

On redémarre ensuite le service :

1. $ sudo service bind9 restart

Installation de Designate

On lance maintenant l'installation de Designate. Des demandes de configuration sont proposées pendant le lancement :

1. $ sudo apt-get install designate >

2. Set up a database for Designate ? - Yes

3. IP adresse of your RabbitMQ host : - localhost

4. Username for connection to the RabbitMQ server: - openstack-designate

5. Password for connection to the RabbitMQ server: - DESIG-RABBIT-PASSWORD

6. Authentication server hostname (keystone) : - 127.0.0.1

7. Authentication server password : - DESIG-KEYSTONE-PASSWORD

8. Register Designate in the Keystone endpoint catalog ? - No

9. Configure database for designate-common with dbconfig-common - Yes

10. Database type to b used by designate-common: - mysql

11. Password of the database's administrative user : - DESIG-DATABASE-PASSWORD

12. MySQL application password for designate-common: - DESIG-COMMON-DATABASE-PASSWORD

On enregistre les informations nécessaires à la plate-forme Openstack afin qu'elles soient reconnues par les autres services, notamment Keystone et le client Openstack. Cela permettra alors d'authentifier les requêtes à l'aide des tokens utilisés vers l'API de Designate.

Création de l'utilisateur Designate dans Keystone :

1. $ openstack user create --password-prompt designate

2. User Password: DESIGNATE-KEYSTONE-PASSWORD

Associer le rôle admin sur le tenant Service à l'utilisateur Designate :

1. $ openstack role add --project service --user designate admin

Création service dns et des endpoints  :

1. $ openstack service create --name designate --description "Openstack DNS service" dns

2. $ openstack endpoint create --region RegionOne dns \

3. --publicurl http://10.0.0.10:9001 \

4. --internalurl http://10.0.0.10:9001 \

5. --adminurl http://10.0.0.10:9001

II-B - Configuration de designate

Éditez le fichier de configuration de Designate /etc/designate/designate.conf afin de changer les paramètres suivants :

- dans la section [service:api] pour la stratégie d'authentification et accès api :

1. [service:api]

2. api_host = 10.0.0.10

3. api_port = 9001

4. auth_strategy = keystone

5. enable_api_v1 = False

6. enable_api_v2 = True

7. enabled_extensions_v2 = quotas, reports

8. api_base_uri = 'http://10.0.0.10:9001/'

Comme il est conseillé de ne plus utiliser la v1, on spécifie ici l'utilisation de l'API V2 uniquement ;

- section [keystone_authtoken] pour l'authentification avec keystone :

1. [keystone_authtoken]

2. auth_host = 10.0.0.10

3. auth_port = 35357

4. auth_protocol = http

5. admin_tenant_name = service

6. admin_user = designate

7. admin_password = DESIG-KEYSTONE-PASSWORD

- section [storage:sqlalchemy] et [pool_manager_cache:sqlalchemy] pour la connexion à la BDD MySQL :

1. [storage:sqlalchemy]

2. connection = mysql+pymysql://designate-common:DESIG-DATABASE-PASSWORD@localhost/designatedb

4. [pool_manager_cache:sqlalchemy]

5. connection = mysql+pymysql://designate-common:DESIG-DATABASE-PASSWORD@localhost/designate_pool_manager

À ce stade, il faut redémarrer les services API et central afin qu'ils se connectent bien au bus de messagerie sans erreurs. Continuons ensuite avec la création de la base de données dédiée au pool_manager.

1. $ sudo service restart designate-api

2. $ sudo service restart designate-central

3. $ mysql -u root -p > CREATE DATABASE `designate_pool_manager` CHARACTER SET utf8 COLLATE utf8_general_ci; > GRANT ALL PRIVILEGES ON designate_pool_manager.* TO 'designate-common'@'localhost' IDENTIFIED BY 'DESIG-DATABASE-PASSWORD';

Il faut ensuite installer les derniers paquets de la suite Designate et initialiser de leur base de données :

1. $ sudo apt-get install designate-pool-manager designate-mdns

2. $ sudo su -s /bin/sh -c "designate-manage pool-manager-cache sync" designate

Même si les bases ont été créées, aucun nameserver n'est enregistré. Ce nameserver, qui correspond au serveur DNS, est reconnu par un identifiant se trouvant à la fois sur la base de données et dans le fichier de configuration.

La création du nameserver peut se faire directement via l'API de Designate.

Au moment de mes tests, aucun client, que ce soit Designate-client ou Openstack-client, ne possédait de méthodes pour envoyer les requêtes pour la configuration du pool.

J'ai donc eu recours à un script qui définit le payload nécessaire pour la création du nameserver via l'API du pool manager. (scripts disponibles sur github )

1. # create-ns.py

2. # Python script to create NameServer for designate api v2

3. # Author : Pascal

4. # Date : July 2016

5. import os

6. import json

7. import urllib2

8. import requests

10. keystone_url = "http://10.0.4.15:5000/v2.0"

11. designate_url = "http://10.20.0.3:9001/v2"

12. payload_auth = '{ "auth": { \ "tenantName": "admin", \ "passwordCredentials": { \ "username": "admin", \ "password": "nova" \ }}}' payload_ns = '{ "name": "DevStack-OS Example Pool", \ "ns_records": [{ \ "hostname": "ns1.wescaleblog.fr.", \ "priority": 1 }]}'

13. headers = { 'content-type' : 'application/json', 'accept' : 'application/json' }

15. def getToken():

16. token = requests.post(keystone_url + "/tokens",  data=payload_auth, headers=headers)

17. print token.status_code

18. #print token.text

19. return json.loads(token.text)

21. data = getToken()

22. print "New token :"

23. print data["access"]["token"]["id"]

24. headers = { 'content-type' : 'application/json', 'accept' : 'application/json', 'x-Auth-Token' : data["access"]["token"]["id"] }

25. response = requests.post(designate_url + "/pools", data=payload_ns, headers=headers)

26. print "New pool ID : " + json.loads(response.text)["id"]

Au lancement, le script récupère l'identifiant du nameserver qui fut créé en base afin de le renseigner dans les configurations de Designate.

1. $ python create-ns.py >

2. [...]

3. New pool ID : 271482b4-5d0c-4d88-9e89-c02861980596

5. $ vi /etc/designate/designate.conf >

6. [service:central]

7. Default_pool_id = '271482b4-5d0c-4d88-9e89-c02861980596'

9. [service:pool_manager]

10. pool_id = '271482b4-5d0c-4d88-9e89-c02861980596'

12. [pool:271482b4-5d0c-4d88-9e89-c02861980596]

13. nameservers = 0f66b842-96c2-4189-93fc-1dc95a08b012

14. targets = f26e0b32-736f-4f0a-831b-039a415c481e

16. [pool_nameserver:0f66b842-96c2-4189-93fc-1dc95a08b012]

17. port = 53

18. host = 10.0.0.10

20. [pool_target:f26e0b32-736f-4f0a-831b-039a415c481e]

21. options = port: 53, host: 10.0.0.10

22. masters = 10.0.0.10:5354

23. type = bind9

On redémarre ensuite tous les services Designate pour enfin commencer la création des zones et des noms de domaine sur notre tenant. En cadeau, un petit script plutôt pratique pour l'opération :

1. #!/bin/bash

2. # designate.sh

3. echo "$1 Designate services "

4. for DESIG_SERVICE in `ls /etc/init.d/designate-* | awk -F '/' ' { print $4;}'`; do

5. if [ $DESIG_SERVICE != "designate-agent" ]; then

6. service $DESIG_SERVICE $1

7. fi

8. done

$ sudo chmod +x designate.sh
$ sudo ./designate.sh restart >
restart Designate services designate-api stop/waiting designate-api start/running, process 22082 designate-central stop/waiting designate-central start/running, process 22112 designate-mdns stop/waiting designate-mdns start/running, process 22135 designate-pool-manager stop/waiting designate-pool-manager start/running, process 22154

On peut maintenant créer nos zones et associer l'adresse IP flottante d'une de nos VM à un nom de domaine :

1. $ openstack zone create --email pascal.edouard@wescale.fr --description "New zone" newtenant.wescaleblog.fr.

La zone se crée en état PENDING, le temps que Designate communique avec le serveur afin de créer l'entrée DNS nécessaire.

1. $ openstack zone list | grep 'newtenant.wescaleblog.fr'|awk '{print $2}' > 9222d823-1f55-447c-92a4-be1fd1cf0450

2. $ openstack recordset create 9222d823-1f55-447c-92a4-be1fd1cf0450 --records 172.24.4.3 --ttl 3600 --type A --description "My Web app" mywebapp.newtenant.wescaleblog.fr.

On réalise alors un test afin de vérifier que la machine qui se trouve à l'adresse 172.24.4.3 est bien accessible par son nouveau nom de domaine :

1. $ ping mywebapp.newtenant.wescaleblog.fr >

2. PING mywebapp.newtenant.wescaleblog.fr (172.24.4.3) 56(84) bytes of data.

3. 64 bytes from 172.24.4.3: icmp_seq=1 ttl=63 time=1.77 ms

4. 64 bytes from 172.24.4.3: icmp_seq=2 ttl=63 time=0.480 ms

5. 64 bytes from 172.24.4.3: icmp_seq=3 ttl=63 time=0.485 ms

III - Conclusion

Le DNS a toujours été un service essentiel dans la gestion d'une architecture réseau et d'autant plus lorsqu'il s'agit du cloud. L'arrivée du DNS as a Service sur l'infrastructure Openstack est donc un point important et bien reçu par la communauté. Cependant, il reste encore des améliorations à apporter et simplifications d'installation à certains niveaux. Designate fonctionne bien une fois installé et répond correctement au besoin des administrateurs et des développeurs, surtout au niveau de l'automatisation d'enregistrement des noms de domaine pour leurs applications.

J'espère que cet article vous a aidé dans l'installation de Designate, n'hésitez pas à laisser un commentaire si vous avez des remarques ou des questions supplémentaires.

Note de la rédaction Developpez.com▲

Tous nos remerciements à Wescale pour l'autorisation de publication de ce tutoriel.

Nos remerciements également à Winjerome pour la mise au gabarit Developpez.com et Claude Leloup pour la relecture orthographique.

Retour à l'article