Plus loin dans l’automatisation avec le DNS

Dans le monde élastique du Cloud et plus précisément en ce qui concerne l’IaaS, nous nous heurtons souvent au problème : “quelle est l’adresse de telle machine, quel est son mode d’accès…”. A ces questions peuvent s’ajouter la problématique du tout automatique via un Capistrano par exemple. Vous me direz qu’il existe une console Web et des API. Oui mais la console n’est pas réellement exploitable pour l’automatisation et les API ont besoin de crédentials que l’on ne préfère pas disséminer partout sur les serveurs.

Le but de cet article est de montrer comment avoir un référentiel des instances disponibles sur un compte Amazon (ou autre) avec toutes les informations qui vont bien sans devoir utiliser la console web Amazon. Cette solution permet de pousser l’automatisation un cran plus loin en proposant une liste exhaustive que l’on peut automatiser et la possibilité d’avoir une liste des serveurs disponibles en une ligne de commande pour n’importe quel Devops allergique aux opérations sur navigateur web.

Dans le but de rester élastique dans la démarche, nous allons utiliser deux fonctionnalités DNS des plus intéressantes qui sont :

  • les requêtes nsupdate
  • les requêtes AXFR
  • Nous allons aussi nous aider des API Amazon et tout ça dans un environnement Linux. Notre DNS va donc servir de base de données pour référencer les machines via leurs IP privées.

    Liste des pré-requis

    Un serveur T1-Micro sur Amazon servant de DNS est largement suffisant. Le package BIND9 doit être installé. Sachant que sur une infrastructure nous préférons utiliser des noms à la place des IP, l’utilisation d’un DNS est fortement conseillée. De plus, la configuration des différents éléments techniques d’une plate-forme est nettement plus souple en utilisant des noms.

    Configuration

    Pour effectuer des requêtes nsupdate sur un DNS il faut autoriser les IP des machines qui ont le droit d’émettre ces requêtes vers notre DNS (nsupdate et axfr). Ensuite il faut placer les bases du DNS (fichiers db.xxx) dans un endroit ou le process bind a le droit d’écrire. Pour des raisons de sécurité, il est hors de question que ce process puisse avoir un accès en écriture dans le répertoire /etc/ nous allons donc déplacer ces fichiers dans /var/cache/bind/.

    Elements de Configuration DNS

    Dans le fichier named.conf.local dans la section de la zone que nous voulons contrôler il faut ajouter l’ip de la machine autorisée à faire les requêtes nsupdate :

    allow-update { xxx.xxx.xxx.xxx; };

    Les requêtes AXFR sont autorisées dans ce même fichier de configuration en ajoutant l’ip des serveurs autorisés dans la sections “allow-transfer” de la zone.
    Dans cette même section nous allons déplacer le fichier de la zone en modifiant son chemin :

    file « /var/cache/bind/db.xxxx.yyyy »;

    Démarche

    Une fois cette opération réalisée nous pouvons utiliser les API Amazon pour récupérer les informations qui concernent une instance (par exemple, nous utiliserons ec2-describe-instances dont la documentation est à l’adresse suivante :  DOC API).
    Les informations que nous allons récupérer (security groupes, Key, EBS ID…..), vont être réorganisées pour ensuite être injectées dans le DNS sous la forme d’enregistrements TXT en plus de l’enregistrement A utilisé pour référencer une adresse.
    Pour réaliser une mise à jour automatique du DNS il est préférable d’exécuter une instruction de “delete” avant l’ajout d’un enregistrement. Vu que nous sommes sur un DNS qui sera utilisé pour les zones de notre infrastructure nous allons prendre en compte les trois enregistrements suivants :

  • le forward record, qui fait correspondre un nom à une ip.
  • le reverse record, qui fait correspondre une ip à un nom.
  • le text record, qui va nous permettre d’enregistrer les informations sur l’instance.
  • Pour enlever les enregistrements précédents (dans le cas ou le serveur est déjà référencé ou pour enlever le serveur).

    nsupdate
    > server monserverdns.domain.com
    > zone domain.net
    > update delete monserver.domain.net A
    > update delete monserver.domain.net TXT
    > update delete zzz.yyy.xxx.www.in-addr.arpa. PTR
    > send

    Ensuite on enregistre le serveur.

    nsupdate
    > server monserverdns.domain.com
    > zone domain.net
    > update add monserver.domain.net 86400 IN A www.xxx.yyy.zzz
    > update add monserver.domain.net 86400 IN TXT informations sur le serveur
    > update add zzz.yyy.xxx.www.in-addr.arpa 86400 IN PTR monserver.domain.net.
    > send

    Nous partons du principe que le DNS est bien déclaré au niveau du fichier /etc/resolv.conf.

    Une fois tous les enregistrements en place il suffit de passer la commande suivante pour que la liste apparaisse :

    dig @ip_du_dns axfr domain.net

    sh-3.2# dig @10.211.55.5 axfr test.net
    ; <<>> DiG 9.7.3-P3 <<>> @10.211.55.5 axfr test.net;
    (1 server found)
    ;; global options: +cmd
    test.net. 604800 IN SOA dns. root.test.net. 4 604800 86400 2419200 604800
    test.net. 604800 IN NS dns.
    test.net. 604800 IN A 10.211.55.5
    test.net. 604800 IN AAAA ::1
    s1.test.net. 86400 IN A 1.2.3.4
    s1.test.net. 86400 IN TXT « tout » « ce » « que » « l » « on » « peut » « dire » « sur » « un » « serveur »
    test.net. 604800 IN SOA dns. root.test.net. 4 604800 86400 2419200 604800
    ;; Query time: 19 msec
    ;; SERVER: 10.211.55.5#53(10.211.55.5)
    ;; WHEN: Mon Jan  9 16:03:56 2012
    ;; XFR size: 7 records (messages 1, bytes 237)

    Nous touchons au but. Il suffit maintenant d’exécuter la même commande avec un grep sur “TXT” pour récupérer la liste qui nous intéresse.

    Avec la commande suivante nous allons enlever l’enregistrement TXT du DNS :

    nsupdate
    > server monserverdns.test.com
    > zone test.net
    > update delete monserver.test.net TXT
    > send

    sh-3.2# dig @10.211.55.5 axfr test.net
    ; <<>> DiG 9.7.3-P3 <<>>
    @10.211.55.5 axfr test.net;
    (1 server found);;
    global options: +cmd
    test.net. 604800 IN SOA dns. root.test.net. 5 604800 86400 2419200 604800
    test.net. 604800 IN NS dns.
    test.net. 604800 IN A 10.211.55.5
    test.net. 604800 IN AAAA ::1
    s1.test.net. 86400 IN A 1.2.3.4
    test.net. 604800 IN SOA dns. root.test.net. 5 604800 86400 2419200 604800
    ;; Query time: 2 msec
    ;; SERVER: 10.211.55.5#53(10.211.55.5)
    ;; WHEN: Mon Jan  9 16:15:30 2012
    ;; XFR size: 6 records (messages 1, bytes 183)

    Nous avons donc une base de données (le serveur DNS) qui va nous servir de référence pour y placer toutes les informations des instances tirées des API Amazon.
    Cet article n’aborde pas le côté sécurité de bind et ne fait donc pas référence à la gestion de clé pour les requêtes nsupdate.

    Laurent ROUX

    Répondre

     

     

     

    Vous pouvez utiliser ces balises HTML

    <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>