title: Poste de dev avec docker et ansible
url: http://agileek.github.io/docker/2015/04/13/docker-ansible/
hash_url: 1f566c364ea0d8e96da00f38ecb08651

<p><img src="http://agileek.github.io/images/posts/docker-ansible/meme_post_fait_pour_vous.jpg" alt="meme"/>
Vous avez un projet où il faut 3 jours d’installation acharnée en suivant un wiki obsolète pour réussir à faire un premier commit ?</p>

<p>Vous n’osez plus mettre à jour votre poste depuis 2006 de peur de ne plus pouvoir travailler ?</p>

<p>Vous en avez marre d’oublier de mettre à jour le wiki chaque fois qu’il faut installer quelque chose de nouveau pour votre projet ?</p>

<p>Ce post est fait pour vous !</p>

<h2 id="ide-originale">Idée originale</h2>

<p>A mes débuts chez Orange Business Services (en fait, c’était CVF, puis MBS, puis OBS et maintenant OAB…), je suis tombé dans une super équipe avec laquelle j’ai appris énormément de choses. Je travaillais sur une partie écrite en Erlang et j’avais été impressionné car en quelques minutes, j’avais un environnement de travail de base prêt à l’emploi, léger et entièrement customisable.</p>

<p>C’était à base de <a href="http://fr.wikipedia.org/wiki/Chroot">chroot</a> (Ils ont écrit 2 articles à ce sujet, le premier sur la <a href="http://www.barreverte.fr/creer-un-chroot-part-1-un-linux-de-base/">création d’une chroot</a> et le deuxième sur la <a href="http://www.barreverte.fr/creer-un-chroot-part-2-se-connecter/">connexion à cette chroot</a>), ça fonctionnait très bien, je m’en suis servi sur bon nombre de projets, en le faisant évoluer.</p>

<p>Au début nous packagions la chroot en tgz pour la partager mais chaque fois qu’il y avait une modification il fallait tout repackager/redistribuer. On a changé d’approche en construisant une chroot minimale très stable, customisée directement sur le poste du developpeur avec puppet.</p>

<p>Puis l’approche de puppet n’étant pas satisfaisante<sup id="fnref:1"><a href="#fn:1" class="footnote">1</a></sup>, nous sommes passés à Ansible.</p>

<p>Puis la chroot nous a posé pas mal de soucis, notamment sur les changements de version d’Ubuntu (ok, on pourrait utiliser debian), donc on est passé sur docker (il faut dire aussi que, comme docker c’est plus hype, chez mon client les développeurs étaient plus intéressés pour tester docker).</p>

<p>Comme vous pouvez le voir, ça a pas mal évolué, jusqu’à arriver à ce que je vais vous présenter maintenant.</p>

<h2 id="le-principe-de-docker-ansible">Le principe de docker-ansible</h2>

<ul>
  <li>Utilise ansible pour construire une image docker custom
    <ul>
      <li>On joue avec les uid/gid d’un user pour permettre le lancement d’applis graphiques dans docker</li>
      <li>On monte ‘/usr/bin/docker’ et ‘/var/run/docker.sock’ pour accéder à docker depuis le container</li>
    </ul>
  </li>
  <li>Une fois l’image buildée, on la lance avec ansible
    <ul>
      <li>On monte par défaut tout <code>/home/developer</code> (c’est l’utilisateur dans le docker), ce qui permet de tout persister sur son poste et de pouvoir réinitialiser docker sans perdre de données</li>
    </ul>
  </li>
  <li>Pour finir, on customise cette instance avec ansible</li>
</ul>

<h3 id="utilisation">Utilisation</h3>

<ol>
  <li>Forker <a href="https://github.com/agileek/docker-ansible">github.com/agileek/docker-ansible</a></li>
  <li>Copier vars_example.yml vers vars.yml
    <ul>
      <li>Customiser vars.yml (vous pouvez même surcharger les variables dans <code>ansible/default_*.yml</code> à cet endroit)</li>
    </ul>
  </li>
  <li>lancer <code>./launch.sh path_to_save_docker_home_folder</code></li>
  <li>lancer <code>./enter.sh</code> pour rentrer dans le docker</li>
</ol>

<p>Résultat attendu :</p>

<p>Vous êtes dans le container, dans le home de l’utilisateur developer, qui est sudoer et ne possède pas de mot de passe. Vous avez accès à votre docker parent (donc vous pouvez tuer votre propre docker, attention ;)). Tout ce que vous écrivez dans /home/developer se retrouve dans path_to_save_docker_home_folder avec les mêmes droits que votre utilisateur linux.</p>

<h3 id="mise--jour-de-limage-docker">Mise à jour de l’image docker</h3>

<ol>
  <li>Modifier <code>ansible/customize_docker_container.yml</code>
    <ul>
      <li>Par exemple, vous pouvez rajouter <code>meld</code> pour tester qu’une application graphique fonctionne bien</li>
    </ul>
  </li>
  <li>Relancer <code>./launch.sh path_to_save_docker_home_folder</code></li>
  <li>Vérifier que ce que vous avez fait est effectif dans le container docker.</li>
</ol>

<h3 id="cycle-de-vie">Cycle de vie</h3>

<p>Nous, nous avons, par projet, un repo git docker-ansible, qui contient tout un tas d’utilitaires (bash, git-prompt, serveur mysql avec bases et droits, serveur neo4j, l’IDE, des alias pour se connecter aux machines, alias git …) que chacun est libre de faire évoluer par un simple commit git. Il suffit pour récupérer les modifications de faire un git pull, puis de relancer le launch.sh (ça ne tue pas l’instance docker, donc c’est peu risqué, on peut continuer à travailler).</p>

<h3 id="tips">Tips</h3>

<p>La bonne approche, pour moi, est de ne pas figer le poste de développement à travers des process lourds, ou une sur-automatisation du poste. Par exemple dans le .bashrc il y a une partie qui essaie de sourcer <code>~/.bash_perso</code> et ce <code>bash_perso</code> n’est pas managé par ansible, ce qui permet à tout un chacun de personnaliser son poste. C’est quelque chose qu’il faut garder à l’esprit si on ne veut pas se retrouver avec quelque chose de très lourd à maintenir.</p>

<p>Chez mon client actuel, au début nous clonions tous les projets git avec ansible, c’était très pratique mais très lourd, maintenant nous avons convenu d’un certain nombre de projets de bases, les autres sont clonés ‘à la mano’. Ça permet de ne pas se retrouver perdu quand on va binomer sur le poste du collègue. Après, testez, refactorez, expérimentez, allez-y, c’est vraiment fait pour ça et je pense que c’est vraiment pour ça que ça plait. Au final on est quand même capable de REFACTORER son poste de dev !</p>

<h3 id="futur">Futur</h3>

<p>Je voulais à la base mettre tous mes dotfiles directement dans ce projet, mais je me rends compte qu’il est plus intéressant de faire une version minimale et de laisser les membres de l’équipe apporter au fur et à mesure les outils qui leur font gagner du temps, permettant ainsi d’arriver à un poste de travail vraiment commun.</p>
