DevOps	
  avec	
  Ansible	
  et	
  Docker	
  
le	
  20/03/2015	
  
Stéphane	
  Manciot

○ Introduction	
  à	
  DevOps	
  
○ Packaging	
  avec	
  Docker	
  
○ Pourquoi	
  Ansible	
  ?	
  
○ Déploiement	
  et	
  provisioning	
  avec	
  Ansible
Présentation
DevOps
DevOps - Bénéfices attendus (1/5)
Des	
  cycles	
  de	
  déploiement	
  plus	
  courts	
  
Les	
  devOps	
  jouent	
  un	
  rôle	
  clé	
  dans	
  la	
  réduc@on	
  du	
  temps	
  du	
  cycle	
  de	
  
déploiement	
  des	
  logiciels,	
  passant	
  de	
  quelques	
  semaines	
  à	
  seulement	
  quelques	
  
heures,	
  permeDant	
  une	
  plus	
  grande	
  flexibilité	
  quant	
  aux	
  nouvelles	
  
fonc@onnalités	
  et	
  changements	
  à	
  apporter	
  au	
  produit	
  ini@al.	
  
DevOps - Bénéfices attendus (2/5)
Mise	
  à	
  disposiBon	
  de	
  nouveaux	
  services	
  plus	
  rapidement	
  
Des	
  déploiements	
  fréquents	
  associés	
  à	
  des	
  délais	
  de	
  livraison	
  plus	
  rapides	
  
permeDent	
  	
  une	
  agilité	
  opéraBonnelle.	
  
DevOps - Bénéfices attendus (3/5)
Une	
  saBsfacBon	
  client	
  améliorée	
  	
  
Grâce	
  à	
  des	
  applica@ons	
  ciblées	
  et	
  de	
  qualité,	
  conformes	
  aux	
  retours	
  clients	
  end	
  
to	
  end.	
  
DevOps - Bénéfices attendus (4/5)
Des	
  coûts	
  réduits	
  
L’automa@sa@on	
  permet	
  aux	
  équipes	
  de	
  réaffecter	
  des	
  ressources	
  précieuses	
  à	
  
des	
  tâches	
  à	
  plus	
  haute	
  valeur.
DevOps - Bénéfices attendus (5/5)
Conformité	
  et	
  Gouvernance	
  
Automa@sa@on	
  du	
  tracking	
  et	
  repor@ng	
  end-­‐to-­‐end	
  sur	
  les	
  phases	
  de	
  livraison	
  /	
  
déploiement	
  con@nu.	
  
DevOps - Démarche agile
DevOps - Intégration continue
DevOps - Livraison continue
DevOps - Déploiement continu
(Nexus)(
DevOps - Déploiement Zero Downtime (1/2)
○ Pattern	
  Blue/Green
DevOps - Déploiement Zero Downtime (2/2)
○ Pattern	
  Canary
DevOps - Problématique
Docker - le conteneur intermodal
Docker - DevOps
○ Construction rapide, idempotent et automatique d’images
pouvant être partagées (Dockerfile, docker-registry …)
○ Séparation des rôles
○ Développeur : à la main sur le conteneur
○ Opérationnel : à la main sur le reste
○ gestion des logs
○ gestion des accès distants
○ configuration réseau
○ monitoring
○ …
Docker - PaaS
○ Portabilité
○ Provisioning rapide (Another Union File System)
○ Performance : les avantages d’une VM (isolation des
processus, interface réseau, …) sans les inconvénients
(processus exécutés au sein de l’hôte, pas d’émulation
de périphérique)
Docker - Dockerfile (Exemple)
image de base
variables d’environnement
copie de fichiers
exécution de commandes
points de montage
port(s) d’écoute
commande par défaut
Docker - Gestion des images
○ rechercher une image : sudo docker search debian
○ lister les images : sudo docker images
○ récupérer une image : sudo docker pull debian
○ exécuter un conteneur : sudo docker run [OPTIONS]
IMAGE[:TAG] [COMMAND] [ARGS…]
○ lister tous les conteneurs : sudo docker ps -a
○ récupérer l’id du conteneur lancé en dernier : sudo
docker ps -l
○ commit maj conteneur : sudo docker commit ID
[IMAGE[:TAG]]
○ inspecter un conteneur : sudo docker inspect ID
○ pousser une image : sudo docker push IMAGE
Ansible
○ Orchestration et automatisation des tâches
d’administration système
○ provisioning
○ déploiement d’application
Ansible - Pourquoi ?
○ Simplicité d’exécution : pas besoin de maître ni d’agent
sur les systèmes à administrer (ssh)
○ Mode Push
○ Simplicité d’apprentissage (YAML)
○ Performant : exécution des scripts en parallèle sur les
machines cible
○ Extensible : python
○ DRY : rôles
○ Idempotent : chaque tâche est exécutée en garantissant
que le système cible sur lequel elle s’applique se trouvera
dans l’état désiré post exécution
○ Sécurisé : ansible-vault
Ansible - Inventory
Inventory
ansible webservers -m ping
[webservers]
preprod.mon-service.org
[dbservers]
preprod.mon-service.org
[dockers:children]
webservers
dbservers
hosts/preprod :
[webservers]
prod.mon-service.org
[dbservers]
prod.mon-service.org
[dockers:children]
webservers
dbservers
hosts/prod :
Ansible - Variables
---
vhost: {servername: "{{servername}}", documentroot: "/www/{{servername}}", serveradmin:
stephane.manciot@ebiznext.com}
○ group_vars/webservers
○ host_vars/preprod.monservice.org
---
database_name: monservice
database_user: monuser
database_password: monpassword
Ansible - Module
Module
ansible webservers -m ping
Ansible - Playbook
○ Exécution de tâches spécifiques sur un ou plusieurs
groupes de machines
hosts/prod
[webservers]
prod.mon-service.org
site.yml
- hosts: webservers
vars:
packages: [p1, p2, p3, p4]
tasks:
- name: install packages
apt: pkg={{ item }} state=present
with_items: packages
groupe de
machines
documentation
module
tâches
ansible-playbook -i hosts/prod site.yml
Ansible - Playbook / Tâche
- name: install nginx
apt: pkg=nginx state=present
documentation
module arguments
Ansible - Playbook / Rôle
variables par défaut
tâches
template
tâches
partagées
rôle
Ansible - Playbook / Rôle
○ Exécution de rôles sur un groupe de machines
hosts/prod
[webservers]
prod.mon-service.org
site.yml
- hosts: webservers
vars_files:
- vars/dockers.yml
roles:
- nginx
- {role: docker, when: "'dockers' in group_names”}
groupe de
machines
rôles
condition d’exécution
Ansible - Playbook / Rôle / Handler
○ Exécution de tâche répétitive
handlers/main.yml
---
- name: restart nginx
service: name={{nginx_daemon}} state=restarted
tasks/vhost-debian.yml
- file:
src: /etc/nginx/sites-available/{{ vhost.servername }}
dest: /etc/nginx/sites-enabled/{{ vhost.servername }}
owner: root
group: root
state: link
notify:
- restart nginx
appel au handler
tâche
nom du handler
Ansible - Playbook / Rôle / Template
templates/vhosts.conf.j2
server {
listen 80;
server_name {{ vhost.servername }};
access_log on;
access_log /var/log/nginx/ccmu.ebiznext.com.access.log;
location /jahia/ {
proxy_pass http://{{jahia_host}}:{{hostvars[jahia_host].jahia_http_port}}/jahia/;
}
…
tasks/vhost-debian.yml
- name: Create a VirtualHost file
template:
src=vhosts.conf.j2
dest=/etc/nginx/sites-available/{{ vhost.servername }}
owner=root
group=root
mode=0644
notify:
- restart nginx
variable
module de templating
Ansible - Docker
Construire une image
Lancer un conteneur
emplacement des ressources
nom de l’image
nom de l’image + version
valorisation des points
de montage
Dev
Ops
Continuous delivery
platform
VCS
1
2
3
dev uat
prod
4
5
docker registry
6
Ansible - Vagrant
box
vm network
vm provider
provisioning
vagrant inventoryplaybook
Ansible - Vagrant
Questions ?
Plus d’informations sur blog.ebiznext.com et
github.com/ebiznext

DevOps avec Ansible et Docker

  • 1.
    DevOps  avec  Ansible  et  Docker   le  20/03/2015   Stéphane  Manciot

  • 2.
    ○ Introduction  à  DevOps   ○ Packaging  avec  Docker   ○ Pourquoi  Ansible  ?   ○ Déploiement  et  provisioning  avec  Ansible Présentation
  • 3.
  • 4.
    DevOps - Bénéficesattendus (1/5) Des  cycles  de  déploiement  plus  courts   Les  devOps  jouent  un  rôle  clé  dans  la  réduc@on  du  temps  du  cycle  de   déploiement  des  logiciels,  passant  de  quelques  semaines  à  seulement  quelques   heures,  permeDant  une  plus  grande  flexibilité  quant  aux  nouvelles   fonc@onnalités  et  changements  à  apporter  au  produit  ini@al.  
  • 5.
    DevOps - Bénéficesattendus (2/5) Mise  à  disposiBon  de  nouveaux  services  plus  rapidement   Des  déploiements  fréquents  associés  à  des  délais  de  livraison  plus  rapides   permeDent    une  agilité  opéraBonnelle.  
  • 6.
    DevOps - Bénéficesattendus (3/5) Une  saBsfacBon  client  améliorée     Grâce  à  des  applica@ons  ciblées  et  de  qualité,  conformes  aux  retours  clients  end   to  end.  
  • 7.
    DevOps - Bénéficesattendus (4/5) Des  coûts  réduits   L’automa@sa@on  permet  aux  équipes  de  réaffecter  des  ressources  précieuses  à   des  tâches  à  plus  haute  valeur.
  • 8.
    DevOps - Bénéficesattendus (5/5) Conformité  et  Gouvernance   Automa@sa@on  du  tracking  et  repor@ng  end-­‐to-­‐end  sur  les  phases  de  livraison  /   déploiement  con@nu.  
  • 9.
  • 10.
  • 11.
  • 12.
    DevOps - Déploiementcontinu (Nexus)(
  • 13.
    DevOps - DéploiementZero Downtime (1/2) ○ Pattern  Blue/Green
  • 14.
    DevOps - DéploiementZero Downtime (2/2) ○ Pattern  Canary
  • 15.
  • 16.
    Docker - leconteneur intermodal
  • 17.
    Docker - DevOps ○Construction rapide, idempotent et automatique d’images pouvant être partagées (Dockerfile, docker-registry …) ○ Séparation des rôles ○ Développeur : à la main sur le conteneur ○ Opérationnel : à la main sur le reste ○ gestion des logs ○ gestion des accès distants ○ configuration réseau ○ monitoring ○ …
  • 18.
    Docker - PaaS ○Portabilité ○ Provisioning rapide (Another Union File System) ○ Performance : les avantages d’une VM (isolation des processus, interface réseau, …) sans les inconvénients (processus exécutés au sein de l’hôte, pas d’émulation de périphérique)
  • 19.
    Docker - Dockerfile(Exemple) image de base variables d’environnement copie de fichiers exécution de commandes points de montage port(s) d’écoute commande par défaut
  • 20.
    Docker - Gestiondes images ○ rechercher une image : sudo docker search debian ○ lister les images : sudo docker images ○ récupérer une image : sudo docker pull debian ○ exécuter un conteneur : sudo docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARGS…] ○ lister tous les conteneurs : sudo docker ps -a ○ récupérer l’id du conteneur lancé en dernier : sudo docker ps -l ○ commit maj conteneur : sudo docker commit ID [IMAGE[:TAG]] ○ inspecter un conteneur : sudo docker inspect ID ○ pousser une image : sudo docker push IMAGE
  • 21.
    Ansible ○ Orchestration etautomatisation des tâches d’administration système ○ provisioning ○ déploiement d’application
  • 22.
    Ansible - Pourquoi? ○ Simplicité d’exécution : pas besoin de maître ni d’agent sur les systèmes à administrer (ssh) ○ Mode Push ○ Simplicité d’apprentissage (YAML) ○ Performant : exécution des scripts en parallèle sur les machines cible ○ Extensible : python ○ DRY : rôles ○ Idempotent : chaque tâche est exécutée en garantissant que le système cible sur lequel elle s’applique se trouvera dans l’état désiré post exécution ○ Sécurisé : ansible-vault
  • 23.
    Ansible - Inventory Inventory ansiblewebservers -m ping [webservers] preprod.mon-service.org [dbservers] preprod.mon-service.org [dockers:children] webservers dbservers hosts/preprod : [webservers] prod.mon-service.org [dbservers] prod.mon-service.org [dockers:children] webservers dbservers hosts/prod :
  • 24.
    Ansible - Variables --- vhost:{servername: "{{servername}}", documentroot: "/www/{{servername}}", serveradmin: stephane.manciot@ebiznext.com} ○ group_vars/webservers ○ host_vars/preprod.monservice.org --- database_name: monservice database_user: monuser database_password: monpassword
  • 25.
  • 26.
    Ansible - Playbook ○Exécution de tâches spécifiques sur un ou plusieurs groupes de machines hosts/prod [webservers] prod.mon-service.org site.yml - hosts: webservers vars: packages: [p1, p2, p3, p4] tasks: - name: install packages apt: pkg={{ item }} state=present with_items: packages groupe de machines documentation module tâches ansible-playbook -i hosts/prod site.yml
  • 27.
    Ansible - Playbook/ Tâche - name: install nginx apt: pkg=nginx state=present documentation module arguments
  • 28.
    Ansible - Playbook/ Rôle variables par défaut tâches template tâches partagées rôle
  • 29.
    Ansible - Playbook/ Rôle ○ Exécution de rôles sur un groupe de machines hosts/prod [webservers] prod.mon-service.org site.yml - hosts: webservers vars_files: - vars/dockers.yml roles: - nginx - {role: docker, when: "'dockers' in group_names”} groupe de machines rôles condition d’exécution
  • 30.
    Ansible - Playbook/ Rôle / Handler ○ Exécution de tâche répétitive handlers/main.yml --- - name: restart nginx service: name={{nginx_daemon}} state=restarted tasks/vhost-debian.yml - file: src: /etc/nginx/sites-available/{{ vhost.servername }} dest: /etc/nginx/sites-enabled/{{ vhost.servername }} owner: root group: root state: link notify: - restart nginx appel au handler tâche nom du handler
  • 31.
    Ansible - Playbook/ Rôle / Template templates/vhosts.conf.j2 server { listen 80; server_name {{ vhost.servername }}; access_log on; access_log /var/log/nginx/ccmu.ebiznext.com.access.log; location /jahia/ { proxy_pass http://{{jahia_host}}:{{hostvars[jahia_host].jahia_http_port}}/jahia/; } … tasks/vhost-debian.yml - name: Create a VirtualHost file template: src=vhosts.conf.j2 dest=/etc/nginx/sites-available/{{ vhost.servername }} owner=root group=root mode=0644 notify: - restart nginx variable module de templating
  • 32.
    Ansible - Docker Construireune image Lancer un conteneur emplacement des ressources nom de l’image nom de l’image + version valorisation des points de montage
  • 33.
  • 34.
    Ansible - Vagrant box vmnetwork vm provider provisioning vagrant inventoryplaybook
  • 35.
  • 36.
  • 37.
    Plus d’informations surblog.ebiznext.com et github.com/ebiznext