Python, Salt, Mercurial et Docker pour de la gestion d'infrastructure agile

Introduction

  • Elsass Meetup
  • Arthur Lutz (Logilab) @arthurlutz
  • Juillet 2015

Vue d'ensemble

  • Introduction à Salt
  • Initialiser des conteneurs Docker à partir de configurations Salt
  • Articulation entre Docker et un outil de gestion configuration et orchestration
  • Retour d'experience de certains usages

Administrer plusieurs machines

me@laptop:~$ ssh root@server1
root@server1:~# cp /etc/config.conf /etc/config.conf.bak
root@server1:~# vim /etc/config.conf
root@server1:~# service critical-daemon restart
me@laptop:~$ ssh root@server2
root@server2:~# cp /etc/config.conf /etc/config.conf.bak
root@server2:~# vim /etc/config.conf
root@server2:~# service critical-daemon restart
me@laptop:~$ ssh root@server3
[...]

Avec Salt

.
root@salt:~# vim /srv/salt/service/config.conf
root@salt:~# salt 'server*' state.highstate test=True
root@salt:~# salt 'server*' state.highstate
root@salt:~# hg commit

image

Avec Salt

salt '*' pkg.refresh_db
salt '*' pkg.list_upgrades
salt '*' pkg.upgrade_available

Pitch de Salt

Fast, scalable and flexible software for data center automation, from infrastructure and any cloud, to the entire application stack.

Logiciel rapide, adaptable, qui monte en charge et flexible pour l'automatisation des data centers, depuis l'infrastructure matérielle ou n'importe quel cloud, jusqu'à l'ensemble de la pile applicative.

Salt - c'est quoi ?

  • exécution distante asynchrone
  • gestion de configuration centralisée
  • déploiement d'infrastructure à la demande
  • gestion de machines virtuelles
  • supervision et monitoring
  • gestion de cluster HPC (High Performance Computing)
  • une boîte à outils pour la gestion d'infrastructure !

Salt - pourquoi ce choix ?

  • Gestion de configuration centralisé - mais pas seulement!
  • Framework recent (première version en mars 2011)
  • Logiciel libre
  • Python
  • ZMQ pour la communication
  • bien packagé pour Debian
  • communité très active
  • très flexible et extensible

Execution à distance avec salt

root@master:~# salt '*' pkg.install vim
root@master:~# salt '*' pkg.install libssl1.0.0 refresh=True
root@master:~# salt '*' cmd.run 'checkrestart'
root@master:~# salt '*' service.restart sshd
root@master:~# salt '*' service.restart apache2

Exemple de déclaration

make sure ntp is running:
  pkg.installed:
    - name: ntp
  service.running:
    - name: ntpd
    - watch:
       - file: /etc/ntp.conf

deploy ntp configuration:
  file.managed:
    - name: /etc/ntp.conf
    - source: salt://ntp/ntp.conf
    - require:
  - pkg: ntp

image

Docker + Salt + Mercurial

  • Salt pour créer des images Docker
  • Salt pour déployer des conteneurs
  • Salt pour gérer des conteneurs (CMD salt-minion)
  • Mercurial pour conserver ses configurations Salt

Pourquoi faire ses Docker avec Salt ?

  • abstraction du provider de conteneur
  • gestion de configuration centralisée
  • factorisation, partage et mise au point collaborative
  • difficulté de reconstruire le contenu d'une image docker (suivre les FROM)
  • on veut pas toujours du microservice
  • on ne veut pas toujours déployer dans des conteneurs en production

Créer un conteneur isolé avec Salt

  • salt-minion (masterless) est utilisé pour installer et configurer le conteneur
  • Dockerfile minimaliste pour bootstraper salt:
FROM debian:jessie
RUN apt-get update
RUN apt-get -y install salt-minion

Installer un microservice dovecot

A partir de https://github.com/saltstack-formulas/dovecot-formula

FROM logilab/salt-minion:jessie
# push formula
ADD dovecot /srv/salt/dovecot
ADD pillar.example /srv/pillar/example.sls
RUN echo "file_client: local" > /etc/salt/minion.d/local.conf
RUN echo "base:" > /srv/pillar/top.sls
RUN echo " '*':" >> /srv/pillar/top.sls
RUN echo " - example" >> /srv/pillar/top.sls
RUN salt-call --local state.sls dovecot | tee log.txt && grep "Failed: 0" log.txt
CMD /usr/bin/dovecot

Déployer un conteneur avec Salt

  • description du service :
my_service:
  docker.running:
    - container: myappcontaineur
    - ports:
  "5000/tcp":
    HostPort: "5000"
  • déploiement :
david@salt:~/ salt dockerhost.logilab.fr state.sls my_service

Scale

{% for port in range(5000, 5100) %}
my_service {{ port }}:
  docker.running:
    - container: myappcontaineur
    - ports:
  "{{ port }}/tcp" :
    HostPort: "{{ port }}"
{% endfor %}

Gérer ses conteneurs avec Salt

  • approche VM légère
  • on utilise salt-minion comme CMD
  • permet de piloter des conteneurs à partir du salt-master
FROM debian:jessie
RUN apt-get update
RUN apt-get -y install salt-minion
CMD /usr/bin/salt-minion

image

Bénéfices de Docker & Salt & Mercurial

  • Versionnement
  • Revue de code
  • Déploiement en environment mixte (docker, lxc, vms, baremetal)
  • Approche devops, developpeurs soumettent des patches sur l'infrastucture
  • Test Driven Infrastructure (pendant de Test Driven Development)

Fin

  • Merci !
  • Arthur Lutz @arthurlutz
  • Logilab @logilab
  • liste de discussion : , #salt-fr sur freenode