1INCLUDE 2016
Informatique scientifique à Besançon
docker / ansible : convergence avec ansible-container
Retour d’expérience sur la dockérisation d’une application naguère déployée avec Ansible.
Auteurs :
Ernest CHIARELLO, IR
Sophie MOLLARD, IE-CDD
2Contexte scientifique :
mise en place d’une IDS
Donnée spatiale :- toute donnée pouvant être localisée : routes, bâtiments, relief, image satellitaire, etc.
- utilisée dans des disciplines de recherche variées
- nombreux chercheurs producteurs de données spatiales
Infrastructure de données spatiales (IDS) :- ensemble de services informatiques pour la gestion et la diffusion des données cartographiques
- regroupement des acteurs (producteurs, utilisateurs) autour du projet
- peut être définie à l’échelle régionale comme supranationale
- souvent basée sur la technologie web
Services classiques d’une IDS : Donnéesspatiales
Visualisation
Extraction
Recherche
Diffusion(moissonnage)
3L’IDS geOrchestra
Infrastructure de données spatiales (IDS) : - assemblage de logiciels écrits en Java - interopérable - modulaire
Brique logicielle Type Fonction
Serveur d’applications GeoServer Diffusion de données vecteur et raster de manière standardisée
Géocatalogue GeoNetworkStockage des métadonnées et gestion de leur cycle de vie
Visualiseur MapfishApp Affichage, édition et requêtage des données spatiales
Extracteur ExtractorApp Extraction et récupération des données spatiales
Gestionnaires des rôles LdapAdmin Gestion des utilisateurs et des
groupes
4
Utilisateurs NuageInfrastructure dedonnées spatiales
Les données sont déposées/partagées dans Owncloud, puis publiées sur l’IDS geOrchestra
Alimentation par ge@sync
5GeOrchestra est un portail web
SecurityProxy
CAS
Othermodules
GeoServer
GeoNetwork
http
OwnCloud
Rôle de ge@sync dans geOrchestra
6Outil de déploiement : Ansible
est un outil open-source de gestion de configuration écrit en python
Un système déclaratif : syntaxe YAML facilement lisible
Génération dynamique de fichiers de configuration
Le langage de template par défaut est Jinja2
Quasiment rien à installer :
- Ansible sur votre machine hôte
- accès root via SSH sur vos serveurs cibles
Ansible sert à déployer votre infrastructure
Ansible permet de vérifier : - que les services sont actifs
- que les fichiers de configuration sont bien à jour.
7Conteneurs docker versus
machines virtuelles
Meilleure utilisation des ressources matériellesDéploiement simplifié des applicationsUn standard qui change le paysage du DevOps
8Quelle automatisation choisir ?
Ansible est efficace pour configurer des VM.
La philosophie docker impose une approche différente.
Nos partenaires livrent aujourd’hui des conteneurs docker.
Comment les personnaliser pour les adapter à nos besoins ?
- comment dockériser une application ?
- est-il possible de réutiliser nos playbooks Ansible ?
9Architecture de geOrchestra
Architecture détaillée
10Les ressources docker sur le hub
https://hub.docker.com/ Tous les conteneurs dont on peut avoir besoin :
PostgresLdapGeoNetwork, GeoServer, ...Tomcat, Jetty, ...ApacheSsh...
Basées sur :- des distributions minimales- avec les outils de base
more but not less !
11Dockerisation de geOrchestra
GeoWebCache
GeoNetwork
GeoData
Header
Analytics
CatalogApp
ExtractorAPP
MapFishApp
LdapAdmin
CAS
GeoServer
SMTP
Database
Proxy
LdapDownloadForm
16 conteneurs- sur le réseau 172.17.0.0/16- communiquant entre eux par des liens
Le proxy est le point d’entrée de la majorité
des conteneurs
12Lancement de geOrchestra
$ docker psgeorchestra/securityproxy:latest 0.0.0.0:8080>8080/tcp georchestra_proxy_1georchestra/ldapadmin:latest 8080/tcp georchestra_ldapadmin_1georchestra/cas:latest 8080/tcp georchestra_cas_1georchestra/geonetwork:3latest 8080/tcp georchestra_geonetwork_1georchestra/geoserver:latest 8080/tcp georchestra_geoserver_1georchestra/extractorapp:latest 8080/tcp georchestra_extractorapp_1georchestra/analytics:latest 8080/tcp georchestra_analytics_1georchestra/ssh_data 0.0.0.0:2222>22/tcp georchestra_geodata_1georchestra/mapfishapp:latest 8080/tcp georchestra_mapfishapp_1georchestra/catalogapp:latest 8080/tcp georchestra_catalogapp_1camptocamp/smtpsink 25/tcp georchestra_smtp_1georchestra/ldap 389/tcp georchestra_ldap_1georchestra/downloadform:latest 8080/tcp georchestra_downloadform_1georchestra/database 5432/tcp georchestra_database_1georchestra/header:latest 8080/tcp georchestra_header_1georchestra/geowebcache:latest 8080/tcp georchestra_geowebcache_1
L’orchestration des conteneurs est gérée dans un fichier nommé docker-compose.yml
$ dockercompose upTélécharge les images, lance les conteneurs, exécute l’orchestration....
13docker-compose.yml
proxy: image: georchestra/securityproxy:latest ports: "8080:8080" volumes: /etc/georchestra:/etc/georchestra links: database ldap cas mapfishapp extractorapp ldapadmin geonetwork header geoserver analytics catalogapp downloadform environment: XMS=512M XMX=1G
docker-compose.yml décrit les ports ouverts, les volumes, les liaisons, ...
Extrait concernant le conteneur proxy :
Le port 8080 de l’hôte correspond au port 8080 du conteneur
Le répertoire /etc/georchestra est partagé entre l’hôte et le conteneur
Nom de l’image téléchargée depuis docker-hub
14Liens vers database
GeoWebCache
GeoNetwork
GeoData
Header
Analytics
CatalogApp
ExtractorAPP
MapFishApp
LdapAdmin
CAS
GeoServer
SMTP
Database
172.17.0.2/165432/tcp open postgresql
Proxy
Ldap
DownloadForm
La base de données est utilisée par 8 conteneurs
15
database: image: georchestra/database environment: POSTGRES_USER=georchestra POSTGRES_PASSWORD=georchestra volumes: postgresql_data:/var/lib/postgresql/data
Les données sont dans des volumes
# ls /var/lib/docker/volumes/postgresql_data/_data/base pg_hba.conf pg_notify pg_stat pg_twophase postgresql.confglobal pg_ident.conf pg_replslot pg_stat_tmp PG_VERSION postmaster.optspg_clog pg_logical pg_serial pg_subtrans pg_xlog postmaster.pidpg_dynshmem pg_multixact pg_snapshots pg_tblspc postgresql.auto.conf
Le volume postgresql_data
garantit la pérennité des données.
Il est partagé entre l’hôte et le conteneur.
$ docker exec it georchestra_database_1 bashroot@a1d8e60f250c:/# ls /var/lib/postgresql/data/ base pg_hba.conf pg_notify pg_stat pg_twophase postgresql.confglobal pg_ident.conf pg_replslot pg_stat_tmp PG_VERSION postmaster.optspg_clog pg_logical pg_serial pg_subtrans pg_xlog postmaster.pidpg_dynshmem pg_multixact pg_snapshots pg_tblspc postgresql.auto.conf
dockercompose.yml
16
FROM postgres:9.4
ENV DEBIAN_FRONTEND noninteractive
RUN aptget update && \ aptget install y postgresql9.4postgis2.1
ADD *.sql /dockerentrypointinitdb.d/ADD license.txt /dockerentrypointinitdb.d/ADD logo.png /dockerentrypointinitdb.d/
Se connecter sur le hub de docker pour en savoir plus sur l’image postgres:9.4
$ ls database00createuser.sql 05ldapadmindata.sql01createextension.sql 06ogcserverstatistics.sql02mapfishapp.sql 07atlas.sql03downloadform.sql 07ogcserverstatisticsdata.sql04ldapadmin.sql 08geofence.sqlDockerfile fixowner.sqllogo.png license.txt
Un conteneur est décrit par son Dockerfile
Dockerfile
17
for f in /dockerentrypointinitdb.d/*; do
case "$f" in
*.sh) echo "$0: running $f"; . "$f" ;;
*.sql) echo "$0: running $f"; "${psql[@]}" < "$f"; echo ;;
*) echo "$0: ignoring $f" ;;
esac
done
Extrait de docker-entrypoint.sh
Le point d’entrée de postgres:9.4
18Créer son propre Dockerfile
FROM georchestra/database
ENV DEBIAN_FRONTEND noninterativeENV TERM linux
RUN echo Europe/Paris | tee /etc/timezoneRUN dpkgreconfigure frontend noninteractive tzdata
ADD 09geosync.sql /dockerentrypointinitdb.d/ADD pg_hba.conf /dockerentrypointinitdb.d/ADD start.sh /dockerentrypointinitdb.d/
CMD ["postgres"]
echo "setting pg_hba.conf"cp /dockerentrypointinitdb.d/pg_hba.conf /var/lib/postgresql/data/.
CREATE USER geosync WITH PASSWORD 'secret';
CREATE DATABASE geosync_data_open with owner geosync;CREATE EXTENSION postgis;
09geosync.sql
start.sh
Image du projet
Ajout de 3 fichiers
Timezone à Paris
Dockerfile
19
$ ansiblecontainer init
$ tree L 2.
├── 09geosync.sql.j2 ├── ansible
│ ├── ansible.cfg │ ├── container.yml │ ├── main.yml │ ├── requirements.txt │ └── requirements.yml ├── pg_hba.conf └── start.sh
services:
database: image: georchestra/database entrypoint: /dockerentrypoint.sh command: postgres
hosts: database gather_facts: no
vars: geosync: { db: { name: geosync_data, user: geosync, pass: secret, } }
Utiliser ansible-container
main.yml
container.ymlAnsible-container permet de créer des conteneurs docker, en utilisant les technologies Ansible.
.../...
20
tasks: name: setting timezone raw: echo Europe/Paris | tee /etc/timezone name: setting timezone raw: dpkgreconfigure frontend noninteractive tzdata name: copy start.sh copy: src=../start.sh dest=/dockerentrypointinitdb.d/start.sh owner=root group=root mode=0775 name: copy pg_hba.conf copy: src=../pg_hba.conf dest=/dockerentrypointinitdb.d/pg_hba.conf owner=root group=root mode=0775 name: template 09geosync.sql template: src=../09geosync.sql.j2 dest=/dockerentrypointinitdb.d/09geosync.sql owner=root group=root mode=0664
CREATE USER geosync WITH PASSWORD '{{geosync.db.pass}}';
CREATE DATABASE {{geosync.db.name}} with owner {{geosync.db.user}};\connect {{geosync.db.name}}CREATE EXTENSION postgis;
09geosync.sql.j2
main.yml
Ansible-container et sa syntaxe
21Exemple plus complexe : ldap
FROM dinkel/openldap
RUN aptget update && \ aptget install y ldaputils
USER openldapADD groupofmembers.ldif /etc/ldap.dist/modules/ADD docker/memberof.ldif /tmp/ADD georchestra.ldif /tmp/
USER rootRUN mkdir /dockerentrypoint.dADD dockerentrypoint.d/* /dockerentrypoint.d/ADD dockerentrypoint.sh /RUN chmod +x /dockerentrypoint.d/*
ENTRYPOINT [ "/dockerentrypoint.sh" ]
CMD [ "slapd", "d", "32768", "u", "openldap", "g", "openldap" ]
Le point d’entrée
La commande au démarrage
Installation de paquets spécifiques
Ajout de fichiers pour alimenter l’annuaire
Préparation du point d’entrée
Dockerfile permettant de créer georchestra/ldap
Dockerfile
22
FROM georchestra/ldap
ENV SLAPD_DOMAIN georchestra.univfcomte.fr
RUN aptget install y pythonldap cron sasl2bin
ADD 01ldap_sasl /dockerentrypoint.d/01ldap_saslADD *.ldif /tmp/ADD saslauthd.conf /etc/saslauthd.confADD slapd.conf /tmp/slapd.confADD root_crontab /var/spool/cron/crontabs/root
ADD start.sh /root/
ENTRYPOINT [ "/dockerentrypoint.sh" ]
CMD ["/root/start.sh"]
/etc/init.d/cron start/etc/init.d/saslauthd startslapd d 32768 u openldap g openldap
start.sh
Dockerfile
Personnalisation du conteneur ldap
Objectif : utiliser les mots de passe de l’AD de Théma.
Ajout de :- saslauthd- cron
3 processes au démarrage du conteneur
23
$ docker PSgeorchestra/securityproxy:latest 0.0.0.0:8080>8080/tcp georchestra_proxy_1georchestra/ldapadmin:latest 8080/tcp georchestra_ldapadmin_1georchestra/extractorapp:latest 8080/tcp georchestra_extractorapp_1geosync_geoserver 8080/tcp georchestra_geoserver_1georchestra/geonetwork:3latest 8080/tcp georchestra_geonetwork_1georchestra/mapfishapp:latest 8080/tcp georchestra_mapfishapp_1georchestra/analytics:latest 8080/tcp georchestra_analytics_1geosync_ssh_data 0.0.0.0:2222>22/tcp georchestra_geodata_1georchestra/cas:latest 8080/tcp georchestra_cas_1georchestra/downloadform:latest 8080/tcp georchestra_downloadform_1geosync_ldap 389/tcp georchestra_ldap_1geosync_database 0.0.0.0:5432>5432/tcp georchestra_database_1georchestra/geowebcache:latest 8080/tcp georchestra_geowebcache_1camptocamp/smtpsink 25/tcp georchestra_smtp_1georchestra/catalogapp:latest 8080/tcp georchestra_catalogapp_1georchestra/header:latest 8080/tcp georchestra_header_1
Bilan de nos modifications
4/16 conteneurs ont été adaptés à nos besoins.
georchestra/geoserver:latest a été remplacé par geosync_geoservergeorchestra/ssh_data a été remplacé par geosync_ssh_datageorchestra/ldap a été remplacé par geosync_ldapgeorchestra/database a été remplacé par geosync_database
Il suffit de modifier docker-compose.yml pour obtenir notre geOrchestra !
24
UID PID PPID CMDroot 1 0 /bin/bash /root/start.shroot 31 1 /usr/sbin/cronroot 52 1 /usr/sbin/saslauthd a ldap r c m /var/run/saslauthd n 5root 53 52 /usr/sbin/saslauthd a ldap r c m /var/run/saslauthd n 5root 54 52 /usr/sbin/saslauthd a ldap r c m /var/run/saslauthd n 5root 55 52 /usr/sbin/saslauthd a ldap r c m /var/run/saslauthd n 5root 56 52 /usr/sbin/saslauthd a ldap r c m /var/run/saslauthd n 5openldap 57 1 slapd d 32768 u openldap g openldap
UID PID PPID CMDpostgres 1 0 postgrespostgres 18 1 postgres: checkpointer process postgres 19 1 postgres: writer process postgres 20 1 postgres: wal writer process postgres 21 1 postgres: autovacuum launcher process postgres 22 1 postgres: stats collector process postgres 31 1 postgres: ldapadmin georchestra 172.17.0.14postgres 65 1 postgres: geonetwork georchestra 172.17.0.13
UID PID PPID CMDroot 1 0 /bin/sh c /root/start.shroot 7 1 /usr/sbin/sshd D
Liste des processes par conteneur
database
ldap
ssh_data
25Conclusion
Docker est une technologie séduisante et efficace.
La courbe d’apprentissage est longue, mais le jeu en vaut la chandelle.
On pensait oublier bash et consorts… mais le contraire s’impose.
Ansible-container est un concept intéressant, mais il ne masque pas la complexité de Docker.
Il reste à configurer un serveur proxy à notre geOrchestra (Nginx?)
Travail à venir : la répartition des volumes entre différents hôtes.=> stockage distribué avec GlusterFS
Exit à terme les architectures habituelles de virtualisation.
26
Merci de votre attention...
Avez-vous des questions ?