devops avec ansible et docker
TRANSCRIPT
○ Introduction à DevOps
○ Packaging avec Docker
○ Pourquoi Ansible ?
○ Déploiement et provisioning avec Ansible
Présentation
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.
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: [email protected]}
○ group_vars/webservers
○ host_vars/preprod.monservice.org
---
database_name: monservice database_user: monuser database_password: monpassword
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○ 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 / Templatetemplates/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 - DockerConstruire une image
Lancer un conteneur
emplacement des ressources
nom de l’image
nom de l’image + version
valorisation des points de montage
Plus d’informations sur blog.ebiznext.com et github.com/ebiznext