diff --git a/Pepiniere/Pepinière/ansible/.gitignore b/Pepiniere/Pepinière/ansible/.gitignore
new file mode 100644
index 0000000..2c851c8
--- /dev/null
+++ b/Pepiniere/Pepinière/ansible/.gitignore
@@ -0,0 +1,2 @@
+*.pdf
+*.zip
diff --git a/Pepiniere/Pepinière/ansible/.gitlab-ci.yml b/Pepiniere/Pepinière/ansible/.gitlab-ci.yml
new file mode 100644
index 0000000..4e0439a
--- /dev/null
+++ b/Pepiniere/Pepinière/ansible/.gitlab-ci.yml
@@ -0,0 +1,29 @@
+variables:
+ GIT_SUBMODULE_STRATEGY: recursive
+
+stages:
+ - build
+
+make-pdf:
+ stage: build
+ image:
+ name: astefanutti/decktape:2.11.0
+ entrypoint: [""]
+ tags:
+ - france
+ - sii
+ script:
+ #
+ # 1. We change the size with --size due to a strange rendering bug
+ # decribed here: https://github.com/astefanutti/decktape/issues/151
+ #
+ # 2. We also specify --chrome-arg=--disable-web-security to autorize
+ # Cross origin requests in chrome
+ #
+ - node /decktape/decktape.js --chrome-path chromium-browser --chrome-arg=--no-sandbox --chrome-arg=--disable-web-security --size='1576x1182' index.html ansible-formation.pdf
+ artifacts:
+ name: ansible.pdf
+ expire_in: 3 month
+ paths:
+ - ansible-formation.pdf
+
diff --git a/Pepiniere/Pepinière/ansible/.gitmodules b/Pepiniere/Pepinière/ansible/.gitmodules
new file mode 100644
index 0000000..57edee8
--- /dev/null
+++ b/Pepiniere/Pepinière/ansible/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "revealjs"]
+ path = revealjs
+ url = ../../template-revealjs-sii-theme.git
diff --git a/Pepiniere/Pepinière/ansible/0.Introduction-formation.md b/Pepiniere/Pepinière/ansible/0.Introduction-formation.md
new file mode 100644
index 0000000..5b0e091
--- /dev/null
+++ b/Pepiniere/Pepinière/ansible/0.Introduction-formation.md
@@ -0,0 +1,118 @@
+# Ansible
+__Formation__
+
+Christian Tritten • Stéfan Lebosq
+
+
+## Pré-requis
+
+* Virtualbox
+ 4 VMs téléchargées et importées
+
+* Putty
+ https://www.putty.org/
+
+* Café (!)
+
+
+## Formation à distance
+
+* Laisser votre caméra allumée afin de favoriser
+ les échanges
+
+* Vous pouvez intervenir quand vous voulez...
+ mais gardez votre micro coupé le reste du temps
+
+* Levez la main en cas de problème
+ (debug sur les TPs en aparté)
+
+* Double pause pour éviter la surchauffe !
+
+
+## Horaires jour
+
+|||
+|:-|-:|
+|démarrage|__9h30__|
+|pause|__~ 10h30 ~ 11h30__|
+|repas|__12h30__|
+|reprise|__14h00__|
+|pause|__~ 15h00 ~ 16h00__|
+|fin|__17h30__|
+
+
+## Badge
+
+Le port du badge SII de façon visible
+est obligatoire dans les locaux.
+
+
+## Tour de table
+
+* Qui êtes-vous ?
+
+* Connaissez-vous déjà Ansible ou des outils similaires ?
+
+* Qu'attendez-vous de la formation ?
+
+* Avez-vous des à priori sur le mode distanciel ?
+
+
+## Programme
+
+
+### 1. Introduction
+* DevOps et Infrastructure as Code
+* Présentation d'Ansible
+
+
+### 2. Installation et Mise en œuvre
+* Installation et configuration
+* Configuration SSH
+* Mise en place de l’inventaire
+
+
+### 3. Les commandes Ad-Hoc
+
+* CLI Ansible
+* Principaux modules Ad-Hoc
+
+
+### 4. Les Playbooks
+* Définition de tâches
+* Utilisation de variables
+* Handlers et Notify
+* Notion de rôles
+
+
+### 5. Les structures de contrôle
+* Les facts
+* Les boucles et conditions
+* Les inclusions
+
+
+### 6. Les Templates
+* Jinja2
+* Filtres
+* Tests
+
+
+### 7. Notions avancées
+* Ansible Vault
+* Tester ses Playbooks Ansible
+* Développer ses propres modules
+
+
+## C'est parti !!!
+
+[La formation](index.html)
+
+
+## Ressources internes
+
+
+1. Formation Ansible SII
+[https://gitlab.siinergy.net/sii-ouest/trainings/ansible](https://gitlab.siinergy.net/sii-ouest/trainings/ansible)
+
+2. Mattermost DevOps SII ouest
+[https://mattermost.siinergy.net/ouest/channels/topic-devops](https://mattermost.siinergy.net/ouest/channels/topic-devops)
diff --git a/Pepiniere/Pepinière/ansible/1.Introduction-ansible.md b/Pepiniere/Pepinière/ansible/1.Introduction-ansible.md
new file mode 100644
index 0000000..02e6548
--- /dev/null
+++ b/Pepiniere/Pepinière/ansible/1.Introduction-ansible.md
@@ -0,0 +1,206 @@
+
+# Ansible
+
+![Logo Ansible](images/logo-ansible.svg)
+
+Antoire Bouhier • Christian Tritten • Alban Berthout
+
+
+## DevOps
+## Infrastructure as Code
+
+
+## DevOps
+
+* Mouvement qui consiste à promouvoir le dialogue et la collaboration entre les équipes _Dev_ et _Ops_.
+
+* Ensemble de bonnes pratiques et de principes
+établis entre :
+
+ - les équipes DEV (de développement)
+
+ - les équipes OPS (d’exploitations)
+
+* L'objectif de DevOps est de _fluidifier le processus de déploiement_ d'une application.
+
+
+## Les principaux axes du DevOps
+
+1. Améliorer la communication
+ Organisation • Collaboration • Partage d'outils communs • Conférences • Réunions
+
+2. Accepter et banaliser les erreurs
+ Droit à l'erreur • Responsabilité partagée
+
+3. Mettre en prod le plus souvent possible
+ Robustesse • Confiance
+
+4. Automatiser tout ce qui peut l'être
+ Tests • Cloud • Déploiements • Configuration • Chaos monkey
+
+5. Récolter des métriques et indicateurs
+dans une optique d'amélioration continue
+
+
+## Le champ d'application du DevOps
+![devops](images/ci-vs-cd-devops-difference.jpg)
+
+
+## Automatisation
+
+Traiter de manière automatique les opérations
+
+* de contrôle,
+
+* de régulation,
+
+* d’administration,
+
+avec peu ou pas d’intervention humaine.
+
+
+## Intérêt de l'automatisation
+
+* Réduire la complexité
+
+* Réduire les possibilités d’erreurs humaine
+
+* Améliorer les performance d’un système
+
+* Augmenter la productivité et l’innovation
+
+* Améliorer la robustesse, l’agilité du déploiement
+
+* Réduire le TTM d’une application
+
+
+## Infrastructure As Code
+
+* L'infrastructure cible peut-être décrite dans des fichiers de description à l'aide d'une syntaxe spécifique.
+
+* Il devient alors possible de gérer et de versionner chaque modification apportée à l'infrastructure.
+
+* Construire, reconstruire, modifier ou dupliquer une infrastructure s'en trouve d'autant simplifié.
+
+* Outils : Terraform, Ansible, Puppet, Docker, Kubernetes...
+
+
+## Les outils de gestion de configuration
+
+* Permettent de contrôler l'ensemble des modifications apportées sur l’infrastructure d’une entreprise.
+
+* Assurent que cette infrastructure est configurée selon les bonnes spécifications.
+
+* Évitent l'apparition de trop grandes variations de configuration entre les serveurs.
+
+
+## Quelques outils
+
+- CFEngine (1993)
+
+- Puppet (2005)
+
+- Chef (2009)
+
+- Ansible (2012)
+
+
+## Ansible
+
+* Logiciel libre (GPL-3.0)
+
+* Initié en 2012
+
+ - Version 1.0 = 2013
+
+ - Version actuelle = 2.10 (2020), 2.9 pour Red Hat subscribers
+
+* Développé en Python
+[https://github.com/ansible/ansible](https://github.com/ansible/ansible)
+
+* Forte communauté d'utilisateurs
+
+
+* Ansible racheté par Red Hat en octobre 2015
+
+* Red Hat racheté par IBM en octobre 2018
+
+
+* Ansible est un moteur d'automatisation permettant :
+
+ - le provisionnement de logiciel,
+
+ - la gestion de la configuration.
+
+
+* Pas d'agent
+
+ - utilise _SSH_ sur __Linux/Unix__
+
+ - utilise _WinRM_ sur __Windows__
+
+* Mode _Push_
+ Peut aussi fonctionner en _Pull_ (sur cibles Linux uniquement)
+
+
+### Cibles Linux
+
+* La plupart des systèmes Linux sont supportés.
+
+* Connexion par SSH.
+
+* Pré-requis sur les machines cibles :
+
+ - SSH server
+
+ - Python 2.7 ou 3.5
+
+
+### Cibles Windows
+
+* Desktop :
+ Windows 7, 8.1, 10
+
+* Server :
+ Windows Server 2008, 2008 R2, 2012, 2012 R2, 2016, 2019
+
+* Connexion par WinRM.
+
+* Pré-requis sur les machines cibles :
+ - PowerShell 3.0 ou +
+ - .NET 4.0 ou +
+ - Un WinRM listener doit être créé et activé.
+
+
+### Documentation pour Windows
+
+https://docs.ansible.com/ansible/latest/user_guide/windows.html
+
+### Liste des modules pour Windows
+https://docs.ansible.com/ansible/2.9/modules/list_of_windows_modules.html
+https://docs.ansible.com/ansible/latest/collections/ansible/windows/index.html
+
+
+### Pourquoi utiliser Ansible ?
+
+* Maîtrise des actions exécutées sur les machines cibles.
+
+* Moins d'erreurs qu'avec des actions manuelles.
+
+* Simple à mettre en oeuvre.
+
+* Courbe d'apprentissage rapide.
+
+* Syntaxe déclarative (pas de scripting).
+
+* Libère les Ops des tâches répétitives.
+
+
+### Sans outil de gestion de Configuration
+
+![Schéma connexion sans Ansible](images/manual-deployment-without-ansible.png)
+
+
+### Avec Ansible
+
+![Schéma connexion avec Ansible](images/ansible-ad-hoc-deployment-workflow.png)
diff --git a/Pepiniere/Pepinière/ansible/10.bonnes-pratiques.md b/Pepiniere/Pepinière/ansible/10.bonnes-pratiques.md
new file mode 100644
index 0000000..728a1b9
--- /dev/null
+++ b/Pepiniere/Pepinière/ansible/10.bonnes-pratiques.md
@@ -0,0 +1,85 @@
+
+![Logo Ansible](images/logo-ansible.svg)
+# Bonnes pratiques
+
+
+## Rester simple !
+
+
+## Rester clair !
+
+- Apporter tout le soin nécessaire à la lisibilité du code Ansible.
+
+- Nommer toujours vos Plays et Tasks de manière précise et significative.
+
+- Privilégiez la syntaxe YAML native.
+(Pas de : `name=httpd state=started enabled=yes`)
+
+- Ainsi fait, le code Ansible peut devenir la documentation de référence de votre workflow.
+
+
+## Penser "déclaratif"
+
+- Ansible permet de décrire un _état désiré_.
+
+- Si vous essayez d'écrire du code dans vos playbooks et rôles, vous augmentez le risque d'échec.
+
+- Utilisez prioritairement les Modules Ansible chaque fois que c'est possible.
+
+
+## Utiliser les Roles
+
+- Utilisez les Roles !
+
+- Ils permettent un très bon découpage du code Ansible.
+
+- Ils permettent de gérer des variables par défaut pour les composants.
+
+
+## Attention aux variables !
+
+- Ansible permet de déclarer des variables dans une grande variété d'emplacements. Il devient facile de s'y perdre !
+
+- Évitez de trop disperser les déclarations de variables dans le code Ansible.
+
+- Limitez les déclarations de variables à deux ou trois emplacements clés :
+
+ 1. variables de groupes
+ 2. variables de rôles
+
+- Documenter précisément les variables que vous déclarez dans votre code Ansible.
+
+
+## Eviter autant que possible les Modules "Commands"
+
+- Les modules de commandes génériques tels que `shell` ou `command` peuvent conduire à certains dysfonctionnements. En effet les commandes Shell :
+
+ - ne sont pas toujours idempotentes.
+
+ - s'exécuteront toujours et retourneront l'état `changed` (à moins de spécifier `changed_when`).
+
+- Les modules plus spécifiques sont souvent prévus pour être agnostique du système d'exploitation, ce qui permet d'augmenter la ré-utilisabilité du code.
+
+
+## Eviter le module "lineinfile"
+
+- Utiliser les modules `copy` ou `template` plutôt que `lineinfile` ou `replace`
+
+ - Pas besoin de connaître la syntaxe `regex`.
+
+ - Permet de contrôler exactement le contenu du fichier final.
+
+
+## Créer des fichiers d’inventaires séparés
+
+- Si vous devez gérer plusieurs environnements, créez des fichiers d'inventaires séparés afin d'éviter les problèmes !
+
+
+## Les bonnes pratiques selon Ansible
+
+https://docs.ansible.com/ansible/latest/user_guide/playbooks_best_practices.html
+
+
+## Autres bonnes pratiques
+
+https://www.serverraumgeschichten.de/2018/04/ansible-best-practices/
diff --git a/Pepiniere/Pepinière/ansible/2.installation-inventaire.md b/Pepiniere/Pepinière/ansible/2.installation-inventaire.md
new file mode 100644
index 0000000..e0da5a0
--- /dev/null
+++ b/Pepiniere/Pepinière/ansible/2.installation-inventaire.md
@@ -0,0 +1,328 @@
+
+![Logo Ansible](images/logo-ansible.svg)
+# Installation
+
+
+## Installation d'Ansible
+Environnement : CentOS 7 / 1vCPU / 512m RAM / 10G Disk
+
+```none
+$ sudo yum -y install epel-release
+$ sudo yum -y update
+$ sudo yum -y install ansible
+$ ansible --version
+ansible 2.9.16
+ config file = /etc/ansible/ansible.cfg
+ configured module search path = [u'/home/ansible/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
+ ansible python module location = /usr/lib/python2.7/site-packages/ansible
+ executable location = /bin/ansible
+ python version = 2.7.5 (default, Nov 16 2020, 22:23:17) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
+```
+
+
+Environnement : CentOS 8 / 1vCPU / 768m RAM / 10G Disk
+
+```none
+$ sudo dnf -y install epel-release
+$ sudo dnf -y update
+$ sudo dnf -y install ansible
+$ ansible --version
+ansible 2.9.16
+ config file = /etc/ansible/ansible.cfg
+ configured module search path = ['/home/ansible/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
+ ansible python module location = /usr/lib/python3.6/site-packages/ansible
+ executable location = /usr/bin/ansible
+ python version = 3.6.8 (default, Aug 24 2020, 17:57:11) [GCC 8.3.1 20191121 (Red Hat 8.3.1-5)]
+```
+
+
+## Configuration SSH
+
+![Schéma connexion ssh](images/ansible-archi-ssh.png)
+
+
+
+1. Génération d'une paire de clés SSH
+
+```none
+ssh-keygen
+Generating public/private rsa key pair.
+Enter file in which to save the key (~/.ssh/id_rsa):
+Created directory '/home/formation/.ssh'.
+Enter passphrase (empty for no passphrase):
+Enter same passphrase again:
+Your identification has been saved in ~/.ssh/id_rsa.
+Your public key has been saved in ~/.ssh/id_rsa.pub.
+The key fingerprint is:
+08:d5:a7:66:ca:a0:0c:6c:2f:40:2b:0f:25:de:cf:4c root@centos7
+The key's randomart image is:
++--[ RSA 2048]----+
+| .o o.. |
+| o +Eo |
+| + . |
+| . + o |
+| S o = * o|
+| . o @.|
+| . = o|
+| . o |
+| o. |
++-----------------+
+```
+
+2. Copie de la clé publique sur les machines cibles
+
+```none
+ssh-copy-id -i formation@10.6.214.70
+ssh-copy-id -i formation@10.6.214.72
+ssh-copy-id -i formation@10.6.214.73
+ssh-copy-id -i formation@10.6.214.74
+```
+
+
+## Configuration
+
+
+Fichier | Description
+- | -
+`/etc/ansible/ansible.cfg` | Fichier de configuration global
+`~/.ansible.cfg` | Fichier de surcharge par utilisateur
+`/path/to/project/ansible.cfg` | Fichier de surcharge par projet
+
+
+`/path/to/project/ansible.cfg`
+```toml
+[defaults]
+log_path=./ansible.log
+roles_path = ./roles:/opt/othersite/roles
+retry_files_save_path=./retries/
+```
+
+Exemple de surcharge locale de la configuration d'Ansible.
+
+
+
+
+![Logo Ansible](images/logo-ansible.svg)
+# Inventaire
+
+Fichier de déclaration des machines cibles à adresser.
+
+
+## Objectifs de l'inventaire
+
+1. Déclarer la liste des machines à adresser.
+
+2. Déclarer et associer des variables à :
+
+ - une machine en particulier,
+
+ - un sous-ensemble des machines,
+
+ - l'ensemble des machines.
+
+
+![Inventaire](images/ansible-ad-hoc-multi-node-deployment.png)
+
+
+* L'inventaire par défaut est défini dans le fichier `/etc/ansible/hosts`.
+
+* Il faut être _root_ pour pouvoir le modifier.
+
+* Il est également possible de créer un fichier inventaire à l'emplacement de notre choix.
+
+
+* Il est aussi possible de gérer plusieurs inventaires correspondant à des plateformes différentes.
+Dans le homedir de l'utilisateur Ansible par exemple :
+
+
+```none
+~/inventories/
+├── dev
+│ └── hosts <----- inventaire de l'environnement de dev
+├── qualif
+│ └── hosts <----- inventaire de l'environnement de qualif
+└── prod
+ └── hosts <----- inventaire de l'environnement de production
+```
+
+
+## Déclaration de machines
+
+Adresse IP
+
+```none
+10.6.214.70
+10.6.214.72
+10.6.214.73
+10.6.214.74
+```
+
+Alias de la machine et adresse IP
+
+```none
+lb.formation.sii.fr ansible_host=10.6.214.70
+web1.formation.sii.fr ansible_host=10.6.214.72
+web2.formation.sii.fr ansible_host=10.6.214.73
+bdd.formation.sii.fr ansible_host=10.6.214.74
+```
+
+[https://docs.ansible.com/ansible/intro_inventory.html#hosts-and-groups](https://docs.ansible.com/ansible/intro_inventory.html#hosts-and-groups)
+
+
+Variables possibles pour les connexions :
+
+* `ansible_host`
+Le nom (si ce nom est différent de l'alias) ou l'adresse IP de la machine cible.
+
+* `ansible_port`
+Le port ssh (si différent de 22).
+
+* `ansible_user`
+L'utilisateur ssh à utiliser (si différent de l'utilisateur courant).
+
+
+* `ansible_ssh_pass`
+Le mot de passe ssh de l'utilisateur `ansible_user`.
+
+* `ansible_ssh_private_key_file`
+La clé privée utilisée par ssh. Utile en cas d'utilisation de plusieurs clés et si on ne veut pas utiliser SSH agent.
+
+
+## Déclaration de groupes de machines
+
+```toml
+lb.formation.sii.fr ansible_host=10.6.214.70
+web1.formation.sii.fr ansible_host=10.6.214.72
+web2.formation.sii.fr ansible_host=10.6.214.73
+bdd.formation.sii.fr ansible_host=10.6.214.74
+
+[lb] # groupe
+lb.formation.sii.fr
+
+[web]
+web[1:2].formation.sii.fr # exemple de raccourci
+ # d'écriture
+
+[db]
+bdd.formation.sii.fr
+
+[formation:children] # groupe de groupes
+lb
+web
+db
+```
+
+
+## Groupes par défaut
+
+* `all` : contient toutes les machines.
+
+* `ungrouped` : contient toutes les machines qui n'appartiennent pas à un groupe (en dehors de `all`)
+
+
+## Lancer une commande sur un groupe de machines spécifique
+
+```none
+$ ansible formation -m ping
+```
+```json
+10.6.214.70 | SUCCESS => {
+ "changed": false,
+ "ping": "pong"
+}
+10.6.214.74 | SUCCESS => {
+ "changed": false,
+ "ping": "pong"
+}
+10.6.214.72 | SUCCESS => {
+ "changed": false,
+ "ping": "pong"
+}
+10.6.214.73 | SUCCESS => {
+ "changed": false,
+ "ping": "pong"
+}
+```
+
+
+## Variables de groupes
+
+
+```ini
+...
+[web]
+web[1-2].formation.sii.fr
+
+[db]
+bdd.formation.sii.fr
+
+[formation:children]
+web
+db
+
+[formation:vars] # variables du groupe formation
+ansible_user: "formation"
+ansible_ssh_private_key_file: /home/formation/.ssh/id_rsa
+```
+
+
+## Vérifier les variables de l'inventaire
+
+
+```none
+$ ansible-inventory -i inventories/formation/hosts --list --yaml
+```
+```yaml
+all:
+ children:
+ web:
+ hosts:
+ web1.formation.sii.fr:
+ ansible_become: 'yes'
+ ansible_become_pass: ansible
+ ansible_host: 192.168.56.102
+ ansible_ssh_private_key_file: /home/ansible/.ssh/id_rsa
+ ansible_user: ansible
+ web2.formation.sii.fr:
+ ansible_become: 'yes'
+ ansible_become_pass: ansible
+ ansible_host: 192.168.56.103
+ ansible_ssh_private_key_file: /home/ansible/.ssh/id_rsa
+ ansible_user: ansible
+ db:
+ hosts:
+ bdd.formation.sii.fr:
+ ansible_become: 'yes'
+ ansible_become_pass: ansible
+ ansible_host: 192.168.56.104
+ ansible_ssh_private_key_file: /home/ansible/.ssh/id_rsa
+ ansible_user: ansible
+```
+
+
+## Externaliser les variables
+
+A utiliser pour séparer les variables de la liste des machines.
+
+
+```none
+~/inventories/
+ └── lab
+ ├── group_vars
+ │ ├── web <--- variables pour le groupe web
+ │ └── db <--- variables pour le groupe db
+ ├── host_vars
+ │ ├── web1.formation.sii.fr <--- variables pour la machine web1
+ │ └── web2.formation.sii.fr <--- variables pour la machine web2
+ └── hosts
+```
+
+Les dossiers `group_vars` et `host_vars` permettent l'organisation des fichiers de variables.
+
+
+
+## Travaux pratiques
+
+![Travaux pratiques](images/tp.gif)
+
+[TP Ansible : Inventaire](travaux-pratiques/tp-ansible-inventaire.html)
diff --git a/Pepiniere/Pepinière/ansible/3.commandes-ad-hoc.md b/Pepiniere/Pepinière/ansible/3.commandes-ad-hoc.md
new file mode 100644
index 0000000..3b085af
--- /dev/null
+++ b/Pepiniere/Pepinière/ansible/3.commandes-ad-hoc.md
@@ -0,0 +1,384 @@
+
+![Logo Ansible](images/logo-ansible.svg)
+# Commandes Ad-Hoc
+
+Exécuter des actions simples
+sur un ensemble de machines.
+
+
+## Les commandes Ad-Hoc ?
+
+* Commandes permettant l'exécution simple, rapide et ponctuelle de commandes unitaires.
+
+* Elles peuvent cibler
+
+ - une seule machine,
+
+ - un groupe de machines spécifique,
+
+ - l'ensemble des machines présentes dans l'inventaire.
+
+* Elles se reposent sur les Modules Ansible.
+
+
+## Les Modules Ansible
+
+* Unités de traitement réutilisables.
+
+* Permettent la réalisation d’une tâche précise.
+
+* Écrits en Python.
+
+* Code éprouvé.
+
+* Nombreux modules disponibles.
+
+* Possibilité d'écrire ses propres modules.
+
+
+## Des centaines de modules disponibles !
+
+
+Cloud Modules • Clustering Modules • Commands Modules • Crypto Modules •
+Database Modules • Files Modules • Identity Modules • Inventory Modules •
+Messaging Modules • Monitoring Modules • Network Modules • Notification
+Modules • Packaging Modules • Source Control Modules • Storage Modules •
+System Modules • Utilities Modules • Web Infrastructure Modules • Windows
+Modules • ...
+
+
+
+https://docs.ansible.com/ansible/2.9/modules/modules_by_category.html
+https://docs.ansible.com/ansible/latest/collections/index.html
+
+
+## Utilisation de modules
+
+`$ ansible -m [-a ]`
+
+* `` peut représenter :
+
+ - une machine
+
+ - toutes les machines (alias `all`)
+
+ - un groupe
+
+ - une expression
+
+
+```none
+$ ansible formation:\!web -m command -a "uname -r"
+bdd.formation.sii.fr | SUCCESS | rc=0 >>
+3.10.0-327.28.3.el7.x86_64
+
+lb.formation.sii.fr | SUCCESS | rc=0 >>
+3.10.0-327.28.3.el7.x86_64
+```
+
+
+## Module Command
+
+* À utiliser :
+
+ * pour des commandes simples
+ * Pour recueillir des informations
+
+* Exemples :
+
+ * Éteindre/redémarrer des serveurs
+ * Copier des fichiers
+ * Créer des users/groups
+ * Installer des packages
+
+
+### Exemple
+
+Création rapide d'un utilisateur
+sur un ensemble de machines
+```none
+$ ansible -m command -a "sudo useradd donald" 'formation'
+10.6.214.70 | SUCCESS | rc=0 >>
+10.6.214.73 | SUCCESS | rc=0 >>
+10.6.214.74 | SUCCESS | rc=0 >>
+10.6.214.72 | SUCCESS | rc=0 >>
+
+$ ansible -m command -a "useradd donald" 'formation' --become
+```
+
+`--become` permet de passer changer d'utilisateur
+pour jouer la commande.
+
+
+### Exemple
+
+Affichage des utilisateurs créés
+```none
+$ ansible -m command -a "grep donald /etc/passwd" 'formation'
+10.6.214.74 | SUCCESS | rc=0 >>
+donald:x:1009:1010::/home/donald:/bin/bash
+
+10.6.214.70 | SUCCESS | rc=0 >>
+donald:x:1009:1010::/home/donald:/bin/bash
+
+10.6.214.72 | SUCCESS | rc=0 >>
+donald:x:1009:1010::/home/donald:/bin/bash
+
+10.6.214.73 | SUCCESS | rc=0 >>
+donald:x:1009:1010::/home/donald:/bin/bash
+```
+
+
+## Documentation des modules
+
+* Recherche "ansible module nom-module" (Google)
+
+* `$ ansible-doc ` (CLI)
+
+
+
+## Travaux pratiques
+
+![Travaux pratiques](images/tp.gif)
+
+[TP Ansible : commandes ad-hoc bases](travaux-pratiques/tp-ansible-les-commandes-ad-hoc.html)
+
+
+## Modules de commandes
+
+
+Module (2.9) | Module (2.10) | Description
+- | - | -
+`command` | `ansible.builtin.command` | Executes a command on a remote node
+`expect` | `ansible.builtin.expect` | Executes a command and responds to prompts.
+`psexec` | `community.windows.psexec` | Runs commands on a remote Windows host based on the PsExec model
+`raw` | `ansible.builtin.raw` | Executes a low-down and dirty SSH command
+`script` | `ansible.builtin.script` | Runs a local script on a remote node after transferring it
+`shell` | `ansible.builtin.shell` | Execute commands in nodes.
+`telnet` | `ansible.netcommon.telnet` | Executes a low-down and dirty telnet command
+
+https://docs.ansible.com/ansible/2.9/modules/list_of_commands_modules.html
+
+
+## Modules de gestion de fichiers
+
+Module (2.9) | Module (2.10) | Description
+- | - | -
+`blockinfile` | `ansible.builtin.blockinfile` | Insert/update/remove a text block surrounded by marker lines
+`copy` | `ansible.builtin.copy` | Copies files to remote locations
+`fetch` | `ansible.builtin.fetch` | Fetches a file from remote nodes
+`file` | `ansible.builtin.file` | Sets attributes of files
+`lineinfile` | `ansible.builtin.lineinfile` | Manage lines in text files
+`replace` | `ansible.builtin.replace` | Replace all instances of a particular string in a file using a back-referenced regular expression.
+`stat` | `ansible.builtin.stat` | Retrieve file or file system status
+`template` | `ansible.builtin.template` | Templates a file out to a remote server
+... | ... | ...
+
+https://docs.ansible.com/ansible/2.9/modules/list_of_files_modules.html
+
+
+### Exemple
+
+Modifier les attributs d'un fichier sur les machines
+du groupe formation
+
+
+```none
+$ ansible -m file -a "dest=/etc/foo mode=0660 owner=root group=root" \
+ formation
+
+10.6.214.72 | SUCCESS => {
+ "changed": true,
+ "gid": 0,
+ "group": "root",
+ "mode": "0660",
+ "owner": "root",
+ "path": "/etc/foo",
+ "secontext": "system_u:object_r:net_conf_t:s0",
+ "size": 158,
+ "state": "file",
+ "uid": 0
+...
+}
+```
+
+
+## Modules de gestion de paquets
+
+https://docs.ansible.com/ansible/2.9/modules/list_of_packaging_modules.html
+
+
+### Paquets Debian / Ubuntu
+
+Module (2.9) | Module (2.10) | Description
+- | - | -
+`apt` | `ansible.builtin.apt` | Manages apt-packages
+`apt_key` | `ansible.builtin.apt_key` | Add or remove an apt key
+`apt_repository` | `ansible.builtin.apt_repository` | Add and remove APT repositories
+`dpkg_selections` | `ansible.builtin.dpkg_selections` | Dpkg package selection selections
+`package` | `ansible.builtin.package` | Generic OS package manager
+`package_facts` | `ansible.builtin.package_facts` | Package information as facts
+
+
+
+### Paquets RedHat / CentOS / Fedora
+Module (2.9) | Module (2.10) | Description
+- | - | -
+`dnf` | `ansible.builtin.dnf` | Manages packages with the dnf package manager
+`yum` | `ansible.builtin.yum` | Manages packages with the yum package manager
+`yum_repository` | `ansible.builtin.yum_repository` |Add or remove YUM repositories
+`redhat_subscription` | `community.general.redhat_subscription` | Manage registration and subscriptions to RHSM using subscription-manager
+`rhn_channel` | `community.general.rhn_channel` | Adds or removes Red Hat software channels
+`rhn_register` | `community.general.rhn_register` | Manage RHN registration using rhnreg_ks
+`rhsm_repository` | `community.general.rhsm_repository` | Manage RHSM repositories using subscription-manager
+`rpm_key` | `ansible.builtin.rpm_key` | Adds or removes a gpg key from the rpm db
+`package` | `ansible.builtin.package` | Generic OS package manager
+`package_facts` | `ansible.builtin.package_facts` | Package information as facts
+
+
+
+### Paquets Suse / OpenSuse
+Module (2.9) | Module (2.10) | Description
+- | - | -
+`zypper` | `community.general.zypper` | Manage packages on SUSE and openSUSE
+`zypper_repository` |`community.general.zypper_repository` | Add and remove Zypper repositories
+`package` | `ansible.builtin.package` | Generic OS package manager
+`package_facts` | `ansible.builtin.package_facts` | Package information as facts
+
+
+
+### Paquets relatifs à des langages de programmation
+Module (2.9) | Module (2.10) | Description
+- | - | -
+`cpanm` | `community.general.cpanm` | Manages Perl library dependencies.
+`gem` | `community.general.gem` | Manage Ruby gems
+`npm` | `community.general.npm` | Manage node.js packages with npm
+`pip` |`ansible.builtin.pip` | Manages Python library dependencies
+... | ... | ...
+
+
+### Exemple
+Vérification de la présence d'un paquet
+
+```none
+$ ansible -m yum -a "name=vim state=present" 'formation'
+10.6.214.70 | SUCCESS => {
+ "changed": true,
+ "rc": 0,
+ "results": [
+ ...
+ Installing :
+ 2:vim-filesystem-7.4.160-1.el7_3.1.x86_64
+ 2:vim-common-7.4.160-1.el7_3.1.x86_64
+ gpm-libs-1.20.7-5.el7.x86_64
+ 2:vim-enhanced-7.4.160-1.el7_3.1.x86_64
+
+ Installed:
+ vim-enhanced.x86_64 2:7.4.160-1.el7_3.1
+ Dependency Installed:
+ gpm-libs.x86_64 0:1.20.7-5.el7
+ vim-common.x86_64 2:7.4.160-1.el7_3.1
+ vim-filesystem.x86_64 2:7.4.160-1.el7_3.1
+
+ Complete!"
+ ]
+}
+```
+
+
+## Modules de gestion de code
+* git
+* subversion
+* hg
+
+Ces modules permettent de cloner des dépôts de code.
+
+https://docs.ansible.com/ansible/2.9/modules/list_of_source_control_modules.html
+
+
+
+## Modules de gestion du système
+
+https://docs.ansible.com/ansible/2.9/modules/list_of_system_modules.html
+
+
+
+### Utilisateurs et groupes
+Module (2.9) | Module (2.10) | Description
+- | - | -
+`user` | `ansible.builtin.user` | Manage user accounts
+`group` | `ansible.builtin.group` | Add or remove groups
+
+
+
+### Stockage
+Module (2.9) | Module (2.10) | Description
+- | - | -
+`parted` | `community.general.parted` | Configure block device partitions
+`lvg` | `community.general.lvg` | Configure LVM volume groups
+`lvol` | `community.general.lvol` | Configure LVM logical volumes
+`filesystem` | `community.general.filesystem` | Makes a filesystem
+
+
+
+### Services
+Module (2.9) | Module (2.10) | Description
+- | - | -
+`service` | `ansible.builtin.service` | Manage services
+`service_facts` | `ansible.builtin.service_facts` | Return service state information as fact data
+`systemd` | `ansible.builtin.systemd` | Manage services
+`sysvinit` | `ansible.builtin.sysvinit` | Manage SysV services
+
+
+
+### Réseau
+Module (2.9) | Module (2.10) | Description
+- | - | -
+`ping` | `ansible.builtin.ping` | Try to connect to host, verify a usable python and return pong on success
+`hostname` | `ansible.builtin.hostname` | Manage hostname
+`firewalld` | `ansible.posix.firewalld` | Manage arbitrary ports/services with firewalld
+`iptables` | `ansible.builtin.iptables` | Modify the systems iptables
+
+
+
+### Configuration SSH
+Module (2.9) | Module (2.10) | Description
+- | - | -
+`authorized_key` | `ansible.posix.authorized_key` | Adds or removes an SSH authorized key
+`known_hosts` | `ansible.builtin.known_hosts` | Add or remove a host from the known_hosts file
+
+
+### Divers
+
+Module (2.9) | Module (2.10) | Description
+- | - | -
+`cron` | `ansible.builtin.cron` | Manage cron.d and crontab entries
+`reboot` | `ansible.builtin.reboot` | Reboot a machine
+`setup` | `ansible.builtin.setup` | Gathers facts about remote hosts
+`timezone` | `community.general.timezone` | Configure timezone setting
+
+
+### Exemple
+
+Récupération des _facts_ de machines distantes
+```none
+$ ansible -m setup 'formation'
+10.6.214.70 | SUCCESS => {
+ "ansible_facts": {
+ "ansible_all_ipv4_addresses": [
+ "10.6.214.70"
+ ],
+ "ansible_all_ipv6_addresses": [
+ "fe80::250:56ff:fe9d:1ae5"
+ ],
+ "ansible_architecture": "x86_64",
+ "ansible_bios_date": "09/17/2015",
+ "ansible_bios_version": "6.00",
+ "ansible_cmdline": {
+ "BOOT_IMAGE": "/vmlinuz-3.10.0-327.28.3.el7.x86_64",
+ "LANG": "fr_FR.UTF-8",
+ "crashkernel": "auto",
+ "quiet": true,
+ "rd.lvm.lv": "rootvg/slashlv",
+ "rhgb": true,
+```
diff --git a/Pepiniere/Pepinière/ansible/4.playbooks.md b/Pepiniere/Pepinière/ansible/4.playbooks.md
new file mode 100644
index 0000000..6215943
--- /dev/null
+++ b/Pepiniere/Pepinière/ansible/4.playbooks.md
@@ -0,0 +1,578 @@
+
+![Logo Ansible](images/logo-ansible.svg)
+# Playbooks Ansible
+
+Jouer et rejouer facilement un jeu de commandes prédéfini sur un ensemble de machines.
+
+
+![Schéma archi globale](images/ansible-archi-playbooks.png)
+
+
+## Format du Playbook
+
+* Il se présente sous la forme d'un simple fichier texte au format `yaml`.
+
+* Il peut donc être facilement versionné dans un outil de gestion de version.
+
+
+### yaml
+
+* Format ouvert de représentation de données.
+
+* Acronyme récursif de _YAML Ain't Markup Language_.
+
+* Permet de représenter des données complexes tout en conservant une excellente lisibilité.
+
+* Utilisation en forte progression ces dernières années.
+ Ansible, GitLab, Docker Compose, Kubernetes manifests, etc...
+
+* Site officiel : https://yaml.org/
+
+
+### YAML basics
+
+https://fr.wikipedia.org/wiki/YAML
+
+* _attention_ ! l'indentation se fait avec un ou plusieurs espaces, jamais avec des tabulations !
+
+* Les commentaires sont signalés par le signe dièse `#` et se prolongent sur toute la ligne.
+
+* Les éléments de listes sont dénotés par le tiret `-`, suivi d'une espace, à raison d'un élément par ligne.
+
+* Les tableaux sont de la forme `clé: valeur`, à raison d'un couple par ligne.
+
+
+### YAML basics
+
+https://fr.wikipedia.org/wiki/YAML
+
+* Les chaînes de caractères peuvent être entourées de guillemets doubles `"`, ou simples `'`, sachant qu'un guillemet s'échappe avec un antislash `\`, alors qu'une apostrophe s'échappe avec une autre apostrophe.
+
+* Les chaînes de caractères peuvent de plus être représentées par un bloc indenté avec des modificateurs facultatifs pour conserver `|` ou éliminer `>` les retours à la ligne.
+
+* Plusieurs documents rassemblés dans un seul fichier sont séparés par trois traits d'union `---`.
+
+
+### YAML basics
+
+https://fr.wikipedia.org/wiki/YAML
+
+
+```
+---
+receipt: Oz-Ware Purchase Invoice
+date: 2012-08-06
+customer:
+ given: Dorothy
+ family: Gale
+
+items:
+ - part_no: A4786
+ descrip: Water Bucket (Filled)
+ price: 1.47
+ quantity: 4
+
+ - part_no: E1628
+ descrip: High Heeled "Ruby" Slippers
+ size: 8
+ price: 100.27
+ quantity: 1
+
+bill-to: &id001
+ street: |
+ 123 Tornado Alley
+ Suite 16
+ city: East Centerville
+ state: KS
+
+ship-to: *id001
+
+specialDelivery: >
+ Follow the Yellow Brick
+ Road to the Emerald City.
+ Pay no attention to the
+ man behind the curtain.
+...
+```
+
+
+### yaml - Définition d’une collection (-)
+
+
+```yaml
+# Une liste de fruits
+fruits:
+ - pomme
+ - orange
+ - framboise
+ - mangue
+```
+
+Forme abrégée :
+```yaml
+# Une liste de fruits
+fruits: ['pomme', 'orange', 'framboise', 'mangue']
+```
+
+
+### Définition d’un dictionnaire (key: value)
+
+
+```yaml
+# Un utilisateur
+martin:
+ name: Martin Dupond
+ job: developer
+ skill: python
+```
+
+Forme abrégée :
+```yaml
+# Un utilisateur
+martin: { name: Martin Dupond, job: developer, skill: python }
+```
+
+
+## Tasks
+
+* Les commandes d'un Playbook sont découpées en instructions unitaires appelées _tâches_ (tasks).
+
+* Chaque tâche exécute un module Ansible avec des paramètres spécifiques.
+
+* Format d'une tâche :
+
+```none
+- name: Description de la tâche
+ :
+ :
+ :
+ :
+```
+
+
+### Liste de tâches
+
+* Un playbook peut décrire une liste de plusieurs tâches.
+
+* Les tâches seront exécutées dans l'ordre d'apparition et de façon séquentielle sur chacune des machines cibles.
+
+```none
+tasks: <----------------------------- liste de tâche
+
+ - name: Ma tâche 1 <--------------- tâche 1
+ :
+ :
+ :
+ :
+
+ - name: Ma tâche 2 <--------------- tâche 2
+ :
+ :
+ :
+```
+
+
+### Exemple réel
+
+```yaml
+- hosts: web # exécution d'un 'Play' sur le groupe 'web'
+ tasks:
+ - name: Installation of Apache Package # tâche 1
+ yum:
+ name: httpd
+ state: present
+ update_cache: yes
+
+ - name: Ensure Apache is running (and enabled at boot) # tâche 2
+ service: name=httpd state=started enabled=yes
+```
+
+* Ici on mixe les deux types de syntaxes (normale et abrégée).
+* __Les bonnes pratiques préconisent l'utilisation de la syntaxe normale.__
+
+
+### Exemple réel
+avec syntaxe normale
+
+```yaml
+- hosts: web
+ tasks:
+ - name: Installation of Apache Package
+ yum:
+ name: httpd
+ state: present
+ update_cache: yes
+
+ - name: Ensure Apache is running (and enabled at boot)
+ service:
+ name: httpd
+ state: started
+ enabled: yes
+```
+
+
+### Notion de Play
+
+
+```yaml
+---
+- hosts: webservers # Play 1 sur le groupe webservers
+ tasks:
+ - name: My task
+ ...
+
+- hosts: databases # Play 2 sur le groupe databases
+ tasks:
+ - name: My task...
+ ...
+```
+
+* Chaque Play contient sa propre liste de tâches et cible un ensemble spécifique de machines.
+
+
+## Lancer un playbook
+
+`$ ansible-playbook -i `
+
+
+```none
+$ ansible-playbook playbook.yaml -i ./hosts
+
+PLAY [web] *******************************************************************
+
+TASK [setup] *****************************************************************
+ok: [web1.formation.sii.fr]
+ok: [web2.formation.sii.fr]
+
+TASK [Installation du package Apache] ****************************************
+changed: [web2.formation.sii.fr]
+changed: [web1.formation.sii.fr]
+
+TASK [Ensure Apache is running (and enable it at boot)] **********************
+changed: [web1.formation.sii.fr]
+changed: [web2.formation.sii.fr]
+
+PLAY RECAP *******************************************************************
+web1.formation.sii.fr : ok=3 changed=2 unreachable=0 failed=0
+web2.formation.sii.fr : ok=3 changed=2 unreachable=0 failed=0
+```
+
+* Notre Playbook comportait 2 tâches seulement, nous en voyons 3 !
+
+* Ansible a automatiquement ajouté à l'exécution une tâche nommée _setup_ dont l'objectif est de récupérer les _facts_ des machines cibles.
+
+
+
+## Récapitulatif du Playbook
+
+
+```none
+PLAY RECAP *******************************************************************
+web1.formation.sii.fr : ok=3 changed=2 unreachable=0 failed=0
+web2.formation.sii.fr : ok=3 changed=2 unreachable=0 failed=0
+```
+
+* Sur les 2 machines cibles :
+
+ - `ok` : 3 tâches ont été exécutées avec succès.
+ - `changed` : 2 tâches ont modifié l'état du système.
+ - `unreachable` : Toutes les machines étaient joignables.
+ - `failed` : Aucune tâche n'a échoué.
+
+
+## Relancer un playbook
+
+
+```none
+$ ansible-playbook playbook.yaml -i ./hosts --become
+
+PLAY [web] *******************************************************************
+
+TASK [setup] *****************************************************************
+ok: [web1.formation.sii.fr]
+ok: [web2.formation.sii.fr]
+
+TASK [Installation du package Apache] ****************************************
+ok: [web1.formation.sii.fr]
+ok: [web2.formation.sii.fr]
+
+TASK [Ensure Apache is running (and enable it at boot)] **********************
+ok: [web1.formation.sii.fr]
+ok: [web2.formation.sii.fr]
+
+PLAY RECAP *******************************************************************
+web1.formation.sii.fr : ok=3 changed=0 unreachable=0 failed=0
+web2.formation.sii.fr : ok=3 changed=0 unreachable=0 failed=0
+```
+
+
+## Première exécution
+
+
+```none
+PLAY RECAP *******************************************************************
+web1.formation.sii.fr : ok=3 changed=2 unreachable=0 failed=0
+web2.formation.sii.fr : ok=3 changed=2 unreachable=0 failed=0
+```
+
+## Seconde exécution
+
+```none
+PLAY RECAP *******************************************************************
+web1.formation.sii.fr : ok=3 changed=0 unreachable=0 failed=0
+web2.formation.sii.fr : ok=3 changed=0 unreachable=0 failed=0
+```
+
+
+## Ordre d'exécution
+
+* Il est possible de contrôler l'ordre dans lequel les machines cibles sont adressées.
+
+* L'ordre par défaut est l'ordre d'apparition dans l'inventaire.
+
+```yaml
+- hosts: all
+ order: sorted # l'ordre est défini ici
+ gather_facts: False
+ tasks:
+ - debug:
+ var: inventory_hostname
+```
+
+
+Ordre | Description
+- | -
+`inventory` | Ordre d'apparition dans l'inventaire. C'est le choix par défaut.
+`reverse_inventory` | Ordre inverse d'apparition dans l'inventaire.
+`sorted` | Ordre alphabétique des noms de machines.
+`reverse_sorted` | Ordre alphabétique inverse des noms de machines.
+`shuffle` | Ordre aléatoire.
+
+
+## Démarrer l'exécution à un endroit précis
+
+`$ ansible-playbook playbook.yaml --start-at-task="my task"`
+
+Cette commande démarre l'exécution du playbook à partir de la tâche nommée `my task`.
+
+https://docs.ansible.com/ansible/latest/user_guide/playbooks_startnstep.html
+
+
+## Ignorer le code de retour d'une commande
+
+* Les modules _command_ et _shell_ sont sensibles au code de retour des commandes.
+
+* Pour ignorer les erreurs sur une commande qui renvoie un code > 0 on peut utiliser `ignore_errors`.
+
+* Ou, utiliser `failed_when`.
+
+* De même, `changed_when` peut être utilisé.
+
+```yaml
+tasks:
+ - name: run this command and ignore the result
+ shell: /usr/bin/somecommand
+ ignore_errors: True
+```
+
+
+## Déclaration de variables
+
+```yaml
+- hosts: web
+ vars:
+ - app_directory: /var/www/html
+ - app_user: apache
+ - app_group: apache
+
+ tasks:
+ - name: Modify permission on {{ app_directory }}
+ file:
+ dest: '{{ app_directory }}'
+ mode: 0755
+ owner: '{{ app_user }}'
+ group: '{{ app_group }}'
+ recurse: yes
+```
+
+Les variables sont déclarées dans _vars_
+et résolues avec `{{ }}`.
+
+
+
+```none
+$ ansible-playbook playbook.yaml -i ./hosts
+
+PLAY [web] ****************************************************************
+
+TASK [setup] **************************************************************
+ok: [web1.formation.sii.fr]
+ok: [web2.formation.sii.fr]
+
+TASK [Modify permission of directory /var/www/html] ***********************
+changed: [web1.formation.sii.fr]
+changed: [web2.formation.sii.fr]
+
+PLAY RECAP ****************************************************************
+web1.formation.sii.fr : ok=2 changed=1 unreachable=0 failed=0
+web2.formation.sii.fr : ok=2 changed=1 unreachable=0 failed=0
+```
+
+
+## Les _handlers_ et les _notify_
+
+
+```yaml
+- hosts: web
+ vars:
+ - apache_listen_port: 8080
+
+ tasks:
+ - name: Modify Apache configuration
+ lineinfile:
+ dest: /etc/httpd/conf/httpd.conf
+ regexp: '^Listen '
+ line: 'Listen {{ apache_listen_port }}'
+ notify: Reload Apache # Signale que la configuration
+ # d'Apache doit être rechargée
+ handlers:
+ - name: Reload Apache # Recharge la configuration
+ service:
+ name: httpd
+ state: reloaded
+```
+
+
+
+```none
+$ ansible-playbook playbook.yaml -i ./hosts
+
+PLAY [web] *******************************************************************
+
+TASK [setup] *****************************************************************
+ok: [web1.formation.sii.fr]
+ok: [web2.formation.sii.fr]
+
+TASK [Modify Apache configuration] *******************************************
+changed: [web1.formation.sii.fr]
+changed: [web2.formation.sii.fr]
+
+RUNNING HANDLER [Reload Apache] *********************************************
+changed: [web1.formation.sii.fr]
+changed: [web2.formation.sii.fr]
+
+PLAY RECAP *******************************************************************
+web1.formation.sii.fr : ok=3 changed=2 unreachable=0 failed=0
+web2.formation.sii.fr : ok=3 changed=2 unreachable=0 failed=0
+```
+
+
+## Idempotence
+
+* L'idempotence signifie qu'une opération a le même effet qu'on l'applique une ou plusieurs fois.
+
+* Les commandes d'un Playbook doivent être écrites de manière à produire le même résultat quel que soit le nombre de fois où elles sont exécutées sur une même cible.
+
+
+
+## Travaux pratiques
+
+![Travaux pratiques](images/tp.gif)
+
+[TP Ansible : playbooks](travaux-pratiques/tp-ansible-playbooks.html)
+
+
+## Variables sur la ligne de commande
+
+Il est possible d'initialiser des variables directement sur la ligne de commande avec l'option `--extra-vars` (ou `-e`).
+
+
+* Ces variables peuvent être définies sous la forme :
+
+ - chaîne de caractères
+
+ `$ ansible-playbook playbook.yaml --extra-vars "my_var_1=foo my_var_2=bar"`
+
+ - json
+
+ `$ ansible-playbook playbook.yaml --extra-vars '{"my_var_1":"foo","my_var_2":"bar"}'`
+
+ `$ ansible-playbook playbook.yaml --extra-vars '{"my_var":"foo","my_list":["foo","bar"]}'`
+
+
+* Utilisez le fomat _json_ si vous voulez passer autre chose que des _strings_ :
+
+ - booleans
+ - integers
+ - floats
+ - lists
+ - ...
+
+
+## Découper un Playbook
+
+* Un Playbook peut se présenter sous la forme d'un fichier unique.
+
+* Toutefois il est possible de le découper en plusieurs fichiers séparés afin de mieux organiser et favoriser la ré-utilisation de certaines parties.
+
+* Il existe plusieurs manières de découper un Playbook :
+les _includes_, les _imports_, et les _roles_.
+
+https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse.html
+
+
+### Includes et Imports
+
+* Disponibles à partir de Ansible v2.4.
+
+* Permettent le découpage des tâches d'un gros Playbook en fichiers plus petits.
+
+* Ces fichiers peuvent ensuite être appelés :
+
+ - depuis un ou plusieurs Playbooks
+
+ - plusieurs fois dans un même Playbook.
+
+
+### Import dynamique vs statique
+
+* Les commandes `import` permettent
+un chargement statique.
+(import_playbook, import_tasks, etc.)
+
+* Les commandes `include` permettent
+un chargement dynamique.
+(include_tasks, include_role, etc.)
+
+
+### Statique vs Dynamique
+
+* _Statique_
+Ansible traite les imports statique au moment de l'analyse du Playbook (avant l'exécution).
+
+* _Dynamique_
+Ansible traite les imports dynamiques au fur et à mesure durant l'exécution du Playbook.
+
+* Les imports statiques et dynamiques peuvent être mixés, toutefois cela n'est pas recommandé car cela rend le debug des Playbooks plus complexe.
+
+
+### Import de Playbooks
+
+* Il est possible d'importer un ou plusieurs Playbooks à l'intérieur d'un Playbook maître, avec `import_playbook`.
+
+
+### Roles
+
+* Plus puissants que les _includes_ et les _imports_.
+
+* Permettent d'empaqueter un ensemble de tâches ainsi que les variables, handlers et autres autres éléments associés.
+
+* Les _roles_ peuvent être facilement ré-utilisés et partagés.
+
+
+
+## Travaux pratiques
+
+![Travaux pratiques](images/tp.gif)
+
+[TP Ansible : imports](travaux-pratiques/tp-ansible-imports.html)
diff --git a/Pepiniere/Pepinière/ansible/5.roles.md b/Pepiniere/Pepinière/ansible/5.roles.md
new file mode 100644
index 0000000..70fcf33
--- /dev/null
+++ b/Pepiniere/Pepinière/ansible/5.roles.md
@@ -0,0 +1,409 @@
+
+![Logo Ansible](images/logo-ansible.svg)
+# Roles Ansible
+
+Les Roles permettent d'organiser les instructions Ansible de manière à favoriser leur ré-utilisabilité.
+
+
+![Schéma archi globale](images/ansible-archi-roles.png)
+
+
+## Qu'est-ce qu'un Role ?
+
+* Un Role Ansible défini une action précise telle que :
+
+ - Installer et configurer un serveur Apache
+
+ - Installer et configurer un serveur Mariadb
+
+* Un Role Ansible peut être appelé dans un ou plusieurs Playbook.
+
+
+## Avantages des Roles
+
+* Organisation
+ - Découpage en plusieurs dossiers et fichiers
+ - Facilite la compréhension et la maintenance du code.
+
+* Ré-utilisabilité
+ - Les Roles peuvent facilement être ré-utilisés au sein de plusieurs Playbooks.
+
+* Partage
+ - Les Roles peuvent être partagés sous la forme de catalogues.
+
+
+## Organisation d'un Role
+
+```none
+roles/
+├── my-role
+│ ├── README.md
+│ ├── defaults <= Variables par défaut du Role
+│ │ └── main.yaml
+│ ├── files <= Fichiers pouvant être déployés par le Role
+│ │ └── my-file.yaml
+│ ├── handlers <= Handlers à exécuter
+│ │ └── main.yaml
+│ ├── meta <= Métadonnées sur le Role
+│ │ └── main.yaml
+│ ├── tasks <= Tâches à exécuter
+│ │ └── main.yaml
+│ └── templates <= Templates de fichiers
+│ │ └── my-template.j2
+│ └── vars <= Autres variables pour le Role
+│ └── main.yaml
+```
+
+
+* Un Role doit inclure au minimum un des dossiers suivants
+`defaults`, `files`, `handlers`, `tasks`, `templates`, `vars`.
+
+* Si un dossier est déclaré, il doit contenir au minimum un fichier nommé `main.yaml`.
+
+
+## Utiliser un Role
+
+La méthode classique est la suivante :
+
+`playbook.yaml`
+```yaml
+- hosts: my-group-of-servers
+ roles:
+ - my-role-1
+ - my-role-2
+```
+
+
+## Ordre d'exécution des tâches
+
+L'ordre d'exécution des tâches
+dans un Playbook est le suivant :
+
+1. Tâches définies dans `pre_tasks`
+
+2. Handlers déclenchés jusque là
+
+3. Tâches définies dans `roles`
+
+4. Tâches définies dans le playbook (`tasks`)
+
+5. Handlers déclenchés jusque là
+
+6. Tâches définies dans `post_tasks`
+
+7. Handlers déclenchés jusque là
+
+
+## pre_tasks, post_tasks
+* _tasks_
+Tâches définies dans la section `tasks`. Elles sont lancées après les Rôles et avant les tâches définies dans `post_tasks`.
+
+* _pre_tasks_
+Tâches lancées avant les Rôles.
+
+* _post_tasks_
+Tâches lancées après les tâches de la section `tasks`
+(et donc après les Rôles).
+
+
+## Exemple
+Définition de pre_tasks, roles, tasks et post_tasks.
+
+
+```yaml
+- hosts: ansible-1
+ pre_tasks:
+ - name: Pre tasks
+ debug:
+ msg: 'I am executed before the Roles.'
+ roles:
+ - my-role
+ tasks:
+ - name : Tasks
+ debug:
+ msg: 'I am executed right after the Roles and just before the Post Tasks.'
+ post_tasks:
+ - name: Post tasks
+ debug:
+ msg: 'I am executed after the main Tasks.'
+```
+
+L'ordre de déclaration n'a pas d'importance.
+
+
+## Ordre réel d'exécution
+
+```none
+$ ansible-playbook -v -i inventories/formation/hosts my-playbook.yaml
+
+PLAY [ansible-1] *******************************************************
+
+TASK [Pre tasks] ***************************************************************
+ok: [ansible-1] => {
+ "msg": "I am executed before the Roles."
+}
+
+TASK [my-role : Role] **********************************************************
+ok: [ansible-1] => {
+ "msg": "I am running after Pre Tasks and before Tasks."
+}
+
+TASK [Tasks] *******************************************************************
+ok: [ansible-1] => {
+ "msg": "I am executed right after the Roles and just before the Post Tasks."
+}
+
+TASK [Post tasks] **************************************************************
+ok: [ansible-1] => {
+ "msg": "I am executed after the main Tasks."
+}
+...
+```
+
+
+## Exemple de découpage en Roles
+
+`playbook.yaml`
+```yaml
+- hosts: web
+ roles:
+ - apache
+ - wordpress
+```
+
+Le Playbook exécute les Roles `apache` et `wordpress`.
+
+
+### Tâches du Role apache
+
+`roles/install-apache/tasks/install.yaml`
+```yaml
+- name: Installation of Apache Package
+ yum:
+ name: httpd
+ state: present
+ update_cache: yes
+
+- name: Ensure Apache is running (and enable it at boot)
+ service:
+ name: httpd
+ state: started
+ enabled: yes
+```
+
+
+### Tâches du Role apache (suite)
+
+`roles/configure-apache/tasks/configure.yaml`
+```yaml
+- name: Modify permission of directory {{ app_directory }}
+ file:
+ dest: '{{ app_directory }}'
+ mode: 0755
+ owner: '{{ app_user }}'
+ group: '{{ app_group }}'
+ recurse: yes
+
+- name: Modify Apache configuration
+ lineinfile:
+ dest: /etc/httpd/conf/httpd.conf
+ regexp: '^Listen '
+ line: 'Listen {{ apache_listen_port }}'
+ notify: Reload Apache
+```
+
+
+### Variables du Role apache
+
+`roles/configure-apache/vars/main.yaml`
+```yaml
+apache_listen_port: 8081
+app_directory: /var/www/html
+app_user: apache
+app_group: apache
+```
+
+
+### Handlers du Role apache
+
+`roles/configure-apache/handlers/main.yaml`
+```yaml
+- name: Reload Apache
+ service:
+ name: httpd
+ state: reloaded
+```
+
+
+### Exécution du playbook
+
+```none
+$ ansible-playbook -i ./hosts playbook.yaml
+
+PLAY [web] *********************************************************************
+
+TASK [setup] *******************************************************************
+ok: [web1.formation.sii.fr]
+ok: [web2.formation.sii.fr]
+
+TASK [apache : Installation of Apache Package] *********************************
+ok: [web2.formation.sii.fr]
+ok: [web1.formation.sii.fr]
+
+TASK [apache : Ensure Apache is running (and enable it at boot)] ***************
+ok: [web1.formation.sii.fr]
+ok: [web2.formation.sii.fr]
+
+TASK [apache : Modify permission of directory /var/www/html] *******************
+ok: [web1.formation.sii.fr]
+ok: [web2.formation.sii.fr]
+
+TASK [apache : Modify Apache configuration] ************************************
+changed: [web1.formation.sii.fr]
+changed: [web2.formation.sii.fr]
+
+RUNNING HANDLER [apache : Reload Apache] ***************************************
+changed: [web1.formation.sii.fr]
+changed: [web2.formation.sii.fr]
+
+PLAY RECAP *********************************************************************
+web1.formation.sii.fr : ok=6 changed=2 unreachable=0 failed=0
+web2.formation.sii.fr : ok=6 changed=2 unreachable=0 failed=0
+```
+
+Les Roles sont exécutés séquentiellement.
+
+
+## Importer des fichiers de tâches
+
+* Dans un Role le fichier `tasks/main.yaml` peut appeler d'autres fichiers contenant des tâches avec `import_tasks` ou `include_tasks`.
+
+* Exemple :
+
+`roles/my-role/tasks/main.yaml`
+```yaml
+tasks:
+- import_tasks: install.yaml
+- import_tasks: configure.yaml
+# ou
+- include_tasks: install.yaml
+- include_tasks: configure.yaml
+```
+
+
+## Gérer un import par type d'OS
+
+* L'import de tâches permet notamment de gérer les différences d'implémentations entre systèmes.
+
+* Exemple :
+
+`roles/my-role/tasks/main.yaml`
+```yaml
+- name: specific redhat/centos tasks
+ import_tasks: redhat.yaml
+ when: ansible_facts['os_family']|lower == 'redhat'
+
+- name: specific debian/ubuntu tasks
+ import_tasks: debian.yaml
+ when: ansible_facts['os_family']|lower == 'debian'
+```
+
+
+`roles/my-role/tasks/redhat.yaml`
+```yaml
+- yum:
+ name: "httpd"
+ state: present
+```
+
+`roles/my-role/tasks/debian.yaml`
+```yaml
+- apt:
+ name: "apache2"
+ state: present
+```
+
+
+Il est possible de passer des variables aux tâches importées :
+
+```yaml
+tasks:
+- import_tasks: wordpress.yaml
+ vars:
+ wp_user: bob
+```
+
+
+## Exécution partielle d'un Playbook
+
+
+* L'utilisation de _tags_ permet l'exécution ciblée d'un sous-ensemble de tâches.
+
+```yaml
+- hosts: web
+ roles:
+ - { role: install-apache, tags: install }
+ - { role: configure-apache, tags: [install, configure] }
+```
+
+
+* Lors du lancement du playbook, le ciblage s'effectue avec `--tags` ou `--skip-tags`.
+
+
+```none
+$ ansible-playbook playbook.yaml -i ./hosts --tags configure
+
+PLAY [web] *********************************************************************
+
+TASK [setup] *******************************************************************
+ok: [web1.formation.sii.fr]
+ok: [web2.formation.sii.fr]
+
+TASK [configure-apache : Modify permission of directory /var/www/html] *********
+changed: [web1.formation.sii.fr]
+changed: [web2.formation.sii.fr]
+
+TASK [configure-apache : Modify Apache configuration] **************************
+changed: [web1.formation.sii.fr]
+changed: [web2.formation.sii.fr]
+
+RUNNING HANDLER [configure-apache : Reload Apache] *****************************
+changed: [web1.formation.sii.fr]
+changed: [web2.formation.sii.fr]
+
+PLAY RECAP *********************************************************************
+web1.formation.sii.fr : ok=4 changed=3 unreachable=0 failed=0
+web2.formation.sii.fr : ok=4 changed=3 unreachable=0 failed=0
+```
+
+
+## Dépendances entre Roles
+
+* Un Role peut dépendre d'un ou plusieurs autres Roles.
+
+* Les dépendances d'un Role peuvent être indiquées dans le fichier : `roles/mon-role/meta/main.yaml`
+
+
+`roles/my-appli/meta/main.yaml`
+```yaml
+dependencies:
+ - role: common
+ - role: apache
+ vars:
+ apache_port: 80
+```
+
+* Ici les Roles `common` et `apache` seront exécutés
+avant le role `mon-appli`.
+
+* Attention : les Roles marqués en dépendances
+seront exécutés sur les mêmes machines cibles
+que le Role `mon-appli`.
+
+
+## Travaux pratiques
+
+
+![Travaux pratiques](images/tp.gif)
+
+[TP Ansible : roles](travaux-pratiques/tp-ansible-roles.html)
diff --git a/Pepiniere/Pepinière/ansible/6.structures-de-controle.md b/Pepiniere/Pepinière/ansible/6.structures-de-controle.md
new file mode 100644
index 0000000..2beb64a
--- /dev/null
+++ b/Pepiniere/Pepinière/ansible/6.structures-de-controle.md
@@ -0,0 +1,385 @@
+
+![Logo Ansible](images/logo-ansible.svg)
+# Structures de contrôle
+
+
+## _Facts_
+
+* Variables délivrées par le système distant :
+
+ - Adresses IP
+
+ - Système d'exploitation
+
+ - ...
+
+
+## Facts - module setup
+
+* Liste des informations disponibles : module _setup_
+
+
+```none
+$ ansible my-host -i ./hosts -m setup
+my-host | SUCCESS => {
+ "ansible_facts": {
+ "ansible_all_ipv4_addresses": [
+ "10.6.214.74"
+ ],
+ "ansible_all_ipv6_addresses": [
+ "fe80::250:56ff:fe9d:1aaa"
+ ],
+ "ansible_architecture": "x86_64",
+ ...
+```
+
+
+### Facts pour la gestion multi-os
+
+* `ansible_pkg_mgr` : Le gestionnaire de paquets
+
+* `ansible_os_family` : La famille d'OS
+
+* `ansible_distribution` : Information détaillées sur la distribution
+
+
+### Gestionnaire de paquets
+
+
+```none
+$ ansible my-host -i ./hosts -m setup | grep ansible_pkg_mgr
+ "ansible_pkg_mgr": "yum",
+```
+
+
+### Famille d'OS
+
+
+```none
+$ ansible my-host -i ./hosts -m setup | grep ansible_family
+ "ansible_os_family": "RedHat",
+```
+
+
+### Distribution
+
+
+```none
+$ ansible my-host -i ./hosts -m setup | grep ansible_distribution
+ "ansible_distribution": "CentOS",
+ "ansible_distribution_file_parsed": true,
+ "ansible_distribution_file_path": "/etc/redhat-release",
+ "ansible_distribution_file_variety": "RedHat",
+ "ansible_distribution_major_version": "7",
+ "ansible_distribution_release": "Core",
+ "ansible_distribution_version": "7.5.1804",
+```
+
+
+### Exemple d'aiguillage multi-OS
+
+
+Arborescence du rôle
+```none
+my-role
+├── README.md
+├── tasks
+│ ├── CentOS.yaml -> RedHat.yaml
+│ ├── Debian.yaml
+│ ├── main.yaml
+│ ├── RedHat.yaml
+│ └── Ubuntu.yaml -> Debian.yaml
+└── vars
+ ├── CentOS-6.yaml
+ ├── CentOS-7.yaml
+ ├── Debian-8.yaml
+ ├── Debian-9.yaml
+ ├── RedHat-6.yaml
+ ├── RedHat-7.yaml
+ └── Ubuntu-16.yaml
+```
+
+
+
+`my-role/tasks/main.yaml`
+```yaml
+- name: Add the OS specific variables
+ include_vars: '{{ ansible_distribution }}-{{ ansible_distribution_major_version }}.yaml'
+
+- include_tasks: '{{ansible_distribution}}.yaml'
+```
+
+
+## Utilisation des _conditionals_
+
+* Action déclenchée de manière conditionnelle
+(en fonction du résultat d’une variable).
+
+* Utilisation de _when_.
+
+https://docs.ansible.com/ansible/playbooks_conditionals.html
+
+
+### Exemple
+
+```yaml
+- hosts: web
+ tasks:
+ - name: Install Apache for CentOS system
+ yum:
+ name: httpd
+ state: present
+ update_cache: yes
+ when:
+ - ansible_os_family == "RedHat" # sera joué sur RedHat et Centos
+ - name: Install Apache for Ubuntu system
+ apt:
+ name: apache2
+ state: present
+ update_cache: yes
+ when:
+ - ansible_os_family == "Debian" # sera joué sur Debian et Ubuntu
+```
+Chaque tâche cible une famille
+de système d'exploitation précise.
+
+
+
+```none
+$ ansible-playbook playbook.yaml -i ./hosts
+
+PLAY [web] *******************************************************************
+
+TASK [setup] *****************************************************************
+ok: [centos-vm]
+ok: [ubuntu-vm]
+
+TASK [Install Apache for CentOS system] **************************************
+ok: [centos-vm]
+skipping: [ubuntu-vm]
+
+TASK [Install Apache for Ubuntu system] **************************************
+skipping: [centos-vm]
+ok: [ubuntu-vm]
+
+PLAY RECAP *******************************************************************
+centos-vm : ok=2 changed=0 unreachable=0 failed=0
+ubuntu-vm : ok=2 changed=0 unreachable=0 failed=0
+```
+
+Les tâches sont exécutées ou non en fonction
+de la famille du système d'exploitation.
+
+
+## Utilisation des _loops_
+
+* Boucles pour la réalisation d'actions répétitives.
+
+* Permet de faire plusieurs actions dans une seule tâche.
+
+* Création d'utilisateurs, installation de paquets, ...
+
+* Utilisation de ~~with-x~~ _loop_
+
+https://docs.ansible.com/ansible/playbooks_loops.html
+
+
+### with-x
+
+Paramètre | Type | Example d'utilisation
+- | - | -
+`with_items` | Array | To create a group of users, directories, or to install a list of packages
+`with_nested` | Nested loops | To create a list of MySQL users and grant them access to a group of databases
+`with_dict` | Hashes | To parse a dictionary of key-value pairs and create virtual hosts
+`with_fileglobs` |Files with pattern match | To parse a path and copy only those files that match a certain pattern
+`with_together` | S ets | To join two arrays as a set and to loop over it
+`with_subelements` | Hash sub element | To walk over the list of SSH keys and distribute them to a user
+`with_sequence` | Integer sequence | To loop a sequence of numbers
+`with_random_choice` | Random choice | To pick up items from the array in a random order
+`with_indexed_items` | Array with index | Array with an index and is useful when an index for items is required
+
+
+### Exemple avec with_items
+
+```yaml
+- hosts: my-host
+ tasks:
+ - name: Add some users
+ user:
+ name: "{{ item }}"
+ state: present
+ with_items:
+ - bob
+ - alice
+ - joe
+```
+
+Attention ! à partir d'Ansible 2.5 _with-x_ n'est plus la méthode recommandé pour effectué des boucles.
+
+
+
+```none
+$ ansible-playbook playbook.yaml -i ./hosts
+
+PLAY [my-host] ***************************************************************
+
+TASK [setup] *****************************************************************
+ok: [my-host]
+
+TASK [Add some users] ********************************************************
+changed: [my-host] => (item=bob)
+changed: [my-host] => (item=alice)
+changed: [my-host] => (item=joe)
+
+PLAY RECAP *******************************************************************
+my-host : ok=2 changed=1 unreachable=0 failed=0
+```
+
+La boucle a bien itéré sur les 3 utilisateurs.
+
+
+### Migration vers loop
+
+* A partir d'Ansible 2.5 _with-x_ n'est plus la méthode recommandée pour effectuer des boucles.
+
+* La documentation sur les boucles propose une section pour aider à la migration de _with-x_ vers _loop_.
+
+https://docs.ansible.com/ansible/latest/user_guide/playbooks_loops.html
+
+
+### Exemple avec loop
+```yaml
+- hosts: my-host
+ tasks:
+ - name: Add some users
+ user:
+ name: "{{ item }}"
+ state: present
+ loop:
+ - bob
+ - alice
+ - joe
+```
+
+On remplace simplement `with_items` par `loop`.
+
+
+
+```none
+$ ansible-playbook -i inventories/formation/hosts playbook.yaml
+
+PLAY [my-host] ***************************************************************
+
+TASK [Gathering Facts] *******************************************************
+ok: [my-host]
+
+TASK [Add some users] ********************************************************
+changed: [my-host] => (item=bob)
+changed: [my-host] => (item=alice)
+changed: [my-host] => (item=joe)
+
+PLAY RECAP *******************************************************************
+my-host : ok=2 changed=1 unreachable=0 failed=0
+```
+
+Le résultat final est strictement identique.
+
+
+```yaml
+- hosts: my-host
+ tasks:
+ - name: Add some users
+ user:
+ name: "{{ item.name }}"
+ state: present
+ groups: "{{ item.groups }}"
+ loop:
+ - { name: 'bob', groups: 'wheel' }
+ - { name: 'alice', groups: 'root' }
+ - { name: 'joe', groups: 'root' }
+```
+
+En plus des _strings_ , il est possible d'utiliser des _hashes_.
+
+
+### Itérer sur l'inventaire
+
+
+```yaml
+- hosts: centos7
+ tasks:
+ - name: Iterate on hosts in the group all in the inventory
+ debug:
+ msg: "{{ item }}"
+ loop: "{{ groups['all'] }}" # on itère sur les machines du groupe all
+```
+```none
+$ ansible-playbook -i ./hosts playbook.yaml
+
+PLAY [centos7] *****************************************************************
+
+TASK [Iterate on hosts in the group all in the inventory] **********************
+ok: [ansible-1] => (item=ansible-3) => {
+ "msg": "ansible-3"
+}
+ok: [ansible-1] => (item=ansible-1) => {
+ "msg": "ansible-1"
+}
+ok: [ansible-1] => (item=ansible-2) => {
+ "msg": "ansible-2"
+}
+ok: [ansible-2] => (item=ansible-3) => {
+ "msg": "ansible-3"
+}
+ok: [ansible-2] => (item=ansible-1) => {
+ "msg": "ansible-1"
+}
+ok: [ansible-2] => (item=ansible-2) => {
+ "msg": "ansible-2"
+}
+```
+
+Chaque machine du Play (_centos7_) itère sur le groupe _all_.
+
+
+### Itérer sur le Play
+
+
+```yaml
+- hosts: centos7
+ tasks:
+ - name: Iterate on all the hosts in the current play
+ debug:
+ msg: "{{ item }}"
+ loop: "{{ ansible_play_batch }}" # variable qui contient les machines du Play
+```
+```none
+$ ansible-playbook -i inventories/formation/hosts playbook.yaml
+
+PLAY [centos7] *****************************************************************
+
+TASK [Iterate on all the hosts in the current play] ****************************
+ok: [ansible-1] => (item=ansible-1) => {
+ "msg": "ansible-1"
+}
+ok: [ansible-1] => (item=ansible-2) => {
+ "msg": "ansible-2"
+}
+ok: [ansible-2] => (item=ansible-1) => {
+ "msg": "ansible-1"
+}
+ok: [ansible-2] => (item=ansible-2) => {
+ "msg": "ansible-2"
+}
+```
+
+Chaque machine du Play (_centos7_) itère
+sur les machines du Play (_centos7_).
+
+
+## Travaux pratiques
+
+
+![Travaux pratiques](images/tp.gif)
+
+[TP Ansible : structures de contrôle](travaux-pratiques/tp-ansible-structures-de-controle.html)
diff --git a/Pepiniere/Pepinière/ansible/7.templates.md b/Pepiniere/Pepinière/ansible/7.templates.md
new file mode 100644
index 0000000..733b820
--- /dev/null
+++ b/Pepiniere/Pepinière/ansible/7.templates.md
@@ -0,0 +1,516 @@
+
+![Logo Ansible](images/logo-ansible.svg)
+# Templates
+
+
+## Syntaxe jinja2
+
+* Documentation
+
+ - Jinja language :
+ http://jinja.pocoo.org/docs/
+ - Template formatting :
+ http://jinja.pocoo.org/docs/templates/
+
+
+## Principe
+
+* On créé les fichiers dans le dossier `templates` du Role.
+
+* On indique l'emplacement des zones variables à l'aide de la syntaxe `{{ ma_variable }}`.
+
+`templates/httpd.conf.j2`
+```none
+...
+Listen {{ apache_port }}
+DocumentRoot {{ apache_document_root }}
+ServerName {{ apache_server_name }}
+ServerAdmin {{ apache_server_admin }}
+...
+```
+
+
+On utilise le module _template_
+
+
+```yaml
+- hosts: web
+ vars:
+ apache_port: 80
+ apache_document_root: /var/www/html
+ apache_server_name: my-server
+ apache_server_admin: admin@localhost
+ tasks:
+ - name: Deploy Apache configuration
+ template:
+ src: templates/httpd.conf.j2
+ dest: /etc/http/httpd.conf
+ owner: apache
+ group: apache
+ mode: 0600
+```
+
+Les variables sont automatiquement injectées dans le fichier sur la cible.
+
+
+## Exemple pour une configuration du service NTP
+
+`./group_vars/all`
+```none
+ntp_servers:
+- 0.pool.ntp.org
+- 1.pool.ntp.org
+- 2.pool.ntp.org
+- 3.pool.ntp.org
+```
+
+`./roles/ntp/templates/ntp.conf.j2`
+```none
+...
+{% for server in ntp_servers %}
+server {{ server }}
+{% endfor %}
+...
+```
+
+
+`./roles/ntp/tasks/main.yaml`
+```yaml
+- name: Install NTP package
+ apt:
+ name: "ntp"
+
+- name: Configure NTP
+ template:
+ src: ntp.conf.j2
+ dest: "/etc/ntp.conf"
+ owner: "root"
+ group: "root"
+ mode: 0644
+ notify: Restart ntp service
+```
+
+
+## Contrôle conditionnel
+
+```none
+{% if condition %}
+ do_some_thing
+{% elif condition2 %}
+ do_another_thing
+{% else %}
+ do_something_else
+{% endif %}
+```
+
+
+## Filtres
+
+Les variables peuvent être modifiées par des filtres.
+
+https://docs.ansible.com/ansible/playbooks_filters.html
+
+
+### Filtres Jinja2
+
+* Les filtres Ansible reposent sur Jinja2.
+
+* Ils sont utilisés pour transformer des données.
+
+* Les filtres peuvent être chaînés.
+
+* Il est possible de créer des filtres personnalisés.
+
+
+### Fixer une valeur par défaut aux variables non-définies
+
+```none
+{{ variable | default(5) }}
+```
+
+
+### Formater des données
+
+```none
+{{ variable | to_json }}
+{{ variable | to_yaml }}
+```
+```none
+{{ variable | from_json }}
+{{ variable | from_yaml }}
+```
+
+
+### Filtres de listes
+
+Récupérer les valeurs minimales ou maximales
+```none
+{{ ma_liste | min }}
+{{ [3, 4, 2] | max }}
+```
+
+Eliminer les doublons
+
+```none
+{{ list1 | unique }}
+```
+
+Combiner deux listes
+
+```none
+{{ list1 | union(list2) }}
+```
+
+Obtenir la différence entre deux listes (éléments dans list1 qui n'existent pas dans list2)
+
+```none
+{{ list1 | difference(list2) }}
+```
+
+
+### Filtres de nombres aléatoires
+
+Obtenir un élément au hasard parmi une liste
+
+```none
+"{{ ['a','b','c'] | random }}"
+# => 'c'
+```
+
+Obtenir un nombre au hasard entre 0 et une valeur spécifiée
+
+```none
+"{{ 60 | random}} * * * * root /script/from/cron“
+# => '21 * * * * root /script/from/cron'
+```
+
+Obtenir un nombre au hasard entre 0 et 100 par pas de 10
+
+```none
+{{ 101 | random(step=10) }}
+# => 70
+```
+
+
+### Tester des adresses IP
+
+Tester si une chaîne est une adresse IP valide
+
+```none
+{{ myvar | ipaddr }}
+```
+
+Même chose en forçant la version du protocole IP
+
+```none
+{{ myvar | ipv4 }}
+{{ myvar | ipv6 }}
+```
+
+
+### Filtres sur la notation CIDR
+
+```none
+{{ '192.0.2.1/24' | ipaddr('address') }}
+'192.0.2.1/24'
+```
+```none
+{{ '192.0.2.1/24' | ipaddr('prefix') }}
+'24'
+```
+
+https://docs.ansible.com/ansible/playbooks_filters_ipaddr.html
+
+
+### Fonctions de hashage
+
+Obtenir l'empreinte sha1 ou md5 d'une chaîne
+
+```none
+{{ 'test1' | hash('sha1') }}
+'dba7673010f19a94af4345453005933fd511bea9'
+
+{{ 'test1' | hash('md5') }}
+'3e7705498e8be60520841409ebc69bc1'
+```
+https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html#hashing-filters
+
+
+
+Obtenir un hashage de mot de passe sha512
+
+```none
+{{ 'passwordsaresecret' | password_hash('sha512') }}
+```
+
+Obtenir un hashage de mot de passe sha256 avec salage
+
+```none
+{{ 'secretpassword' | password_hash('sha256', 'mysecretsalt') }}
+```
+
+Exemple d'utilisation dans un fichier de variables
+
+```none
+user_password: "{{ 'Mon super password' | password_hash('sha256') }}"
+```
+
+
+### Filtres de commentaires
+
+Il permettent de "décorer" un texte
+avec un style de commentaire.
+
+Exemple :
+
+```none
+{{ "Hello" | comment }}
+```
+
+produit :
+
+```none
+#
+# Hello
+#
+```
+
+
+Il est possible d'appliquer
+différents types de commentaires :
+
+```none
+{{ "C style" | comment('c') }}
+'// C style'
+```
+
+```none
+{{ "C block style" | comment('cblock') }}
+'/* C block style */'
+```
+
+```none
+{{ "XML style" | comment('xml') }}
+''
+```
+
+
+### Filtres d'URL
+
+
+Obtenir une sous-partie d'une URL.
+```none
+{{ "http://bob:1234@www.test.com:81/dir/index.html?query=term#fragment"
+| urlsplit('scheme') }}
+# => 'http'
+```
+
+Filtre | Résultat
+- | -
+urlsplit('scheme') | 'http'
+urlsplit('username') | 'bob'
+urlsplit('password') | '1234'
+urlsplit('hostname') | 'www.test.com'
+urlsplit('port') | '81'
+urlsplit('path') | '/dir/index.html'
+urlsplit('query') | 'query=term'
+urlsplit('fragment') | 'fragment'
+
+
+### Autres filtres utiles
+
+
+Ajouter des guillemets pour protéger des variables
+(usage shell)
+
+```none
+- shell: echo {{ string_value | quote }}
+```
+
+Retourner une valeur si un test est vrai
+et une autre si il est faux
+
+```none
+{{ (name == "John") | ternary('Mr','Mme') }}
+```
+
+
+Concatener une liste en chaîne
+
+```none
+{{ list | join(" ") }}
+```
+
+```none
+{{ list | join(",") }}
+```
+
+
+Obtenir le dernier élément d'un chemin
+
+```none
+{{ '/etc/foo/bar.txt' | basename }}
+'bar.txt'
+```
+
+Obtenir le début d'un chemin
+
+```none
+{{ '/etc/foo/bar.txt' | dirname }}
+'/etc/foo'
+```
+
+Obtenir le chemin réel d'un lien
+
+```none
+{{ path | realpath }}
+```
+
+
+Expanser un chemin contenant un tilde (~)
+
+```none
+{{ path | expanduser }}
+```
+
+Expanser un chemin contenant des variables d'environnement
+
+```none
+{{ path | expandvars }}
+```
+
+
+Découper un nom de fichier
+
+```none
+{{ path | splitext }}
+```
+
+Avec `path` == `nginx.conf` le retour sera `('nginx', '.conf')`
+
+
+## Tests
+
+`variable` is `test expression`
+
+https://docs.ansible.com/ansible/playbooks_tests.html
+
+
+### Tester des chaînes de caractères
+
+```yaml
+vars:
+ url: "http://example.com/users/foo/resources/bar"
+
+tasks:
+ - debug:
+ msg: "matched pattern 1"
+ when: url is match("http://example.com/users/.*/resources/.*")
+
+ - debug:
+ msg: "matched pattern 2"
+ when: url is search("/users/.*/resources/.*")
+
+ - debug:
+ msg: "matched pattern 3"
+ when: url is search("/groups/")
+```
+
+```none
+TASK [debug] *****************************************************************
+ok: [my-host] => { "msg": "matched pattern 1" }
+
+TASK [debug] *****************************************************************
+ok: [my-host] => { "msg": "matched pattern 2" }
+
+TASK [debug] *****************************************************************
+skipping: [my-host]
+```
+
+
+### Tester des numéros de version
+
+Si `ansible_facts['distribution_version']` est supérieur ou égal à 16.04, le test retourne `True`, sinon il retourne `False`.
+
+
+```none
+{{ ansible_facts['distribution_version'] is version('16.04', '>=') }}
+```
+
+Opérateurs acceptés :
+`<`, `lt`, `<=`, `le`, `>`, `gt`, `>=`, `ge`, `==`, `=`, `eq`, `!=`, `<>`, `ne`
+
+
+### Tester des chemins
+
+
+```yaml
+- debug:
+ msg: "path is a directory"
+ when: mypath is directory
+
+- debug:
+ msg: "path is a file"
+ when: mypath is file
+
+- debug:
+ msg: "path is a symlink"
+ when: mypath is link
+
+- debug:
+ msg: "path already exists"
+ when: mypath is exists
+```
+
+Chaque tâche est effectuée ou abandonnée
+en fonction du résultat du test.
+
+
+### Tester le résultat final d'une tâche
+
+```yaml
+- shell: /usr/bin/foo
+ register: result
+ ignore_errors: True
+
+- debug:
+ msg: "it failed"
+ when: result is failed
+
+- debug:
+ msg: "it succeeded"
+ when: result is succeeded
+```
+
+
+## Sortir prématurément en fonction de conditions
+
+* Le module _fail_ permet de stopper l'exécution d'un playbook si un condition n'est pas remplie.
+
+* Dans l'exemple suivant, l'exécution s'arrête car la variable `param2` n'est pas définie.
+
+
+
+```yaml
+---
+- hosts: ansible-1
+
+ vars:
+ - param1: "test"
+
+ tasks:
+ - name: 'exit if param1 or param2 are null or invalid'
+ fail: msg="Please enter correct Params"
+ when: param1 is not defined or param2 is not defined
+
+ - debug:
+ msg: "other tasks..."
+```
+
+
+## Travaux pratiques
+
+
+![Travaux pratiques](images/tp.gif)
+
+[TP Ansible : templates](travaux-pratiques/tp-ansible-templates.html)
diff --git a/Pepiniere/Pepinière/ansible/8.notions-avancees.md b/Pepiniere/Pepinière/ansible/8.notions-avancees.md
new file mode 100644
index 0000000..d8f8b95
--- /dev/null
+++ b/Pepiniere/Pepinière/ansible/8.notions-avancees.md
@@ -0,0 +1,306 @@
+
+![Logo Ansible](images/logo-ansible.svg)
+# ansible-vault
+
+Sécuriser les données sensibles.
+
+
+* La commande `ansible-vault` permet la création de conteneurs chiffrés pour les variables sensibles.
+
+```nohighlight
+$ ansible-vault create test.yaml
+Vault password:
+```
+
+* Le choix d'un un mot de passe est obligatoire lors de la création du fichier.
+
+
+
+Le contenu en clair :
+
+```nohighlight
+mon_super_mot_de_passe: 12345678
+```
+
+devient après chiffrement :
+
+```nohighlight
+$ cat test.yaml
+$ANSIBLE_VAULT;1.1;AES256
+62366463643661313763313135376434303535646637653237633233306663623635643761643161
+3834383236386535366533303733613838653836623661340a383263633435336234333335343539
+30333664666364613731666666636235373633346463353766356364623039656262363238363830
+3236656664353565620a303034643732636166376535386436616231653363386334663065326337
+3561
+```
+
+
+Le mot de passe sera demandé lors de chacune des exécutions du playbook :
+
+```nohighlight
+$ ansible-playbook mon-playbook.yaml –ask-vault-pass
+Vault password:
+```
+
+
+### Travaux pratiques
+
+
+![Travaux pratiques](images/tp.gif)
+
+[TP Ansible vault](travaux-pratiques/tp-ansible-vault.html)
+
+
+
+
+![Logo Ansible](images/logo-ansible.svg)
+# Notions avancées
+
+
+## Surcharge de variables
+
+* Ansible permet la déclaration de variables en de multiples endroits.
+
+* Ansible supporte la surcharge de variables, cette surcharge dépend de l’endroit où les variables sont déclarées.
+
+
+Ordre de priorité croissant lors de la surcharge :
+
+
+
+* role defaults
+* inventory file or script group vars
+* inventory group_vars/all
+* playbook group_vars/all
+* inventory group_vars/*
+* playbook group_vars/*
+* inventory file or script host vars
+* inventory host_vars/*
+* playbook host_vars/*
+* host facts / cached set_facts
+* play vars
+* play vars_files
+* role vars (defined in role/vars/main.yaml)
+* task vars (only for the task)
+* include_vars
+* set_facts / registered vars
+* role (and include_role) params
+* include params
+* extra vars (always win precedence)
+
+
+
+
+## register + debug + verbosity
+
+
+```yaml
+- shell: /usr/bin/uptime
+ register: result
+
+- name: Display uptime
+ debug:
+ var: result
+ verbosity: 2 # affiché à partir du niveau -vv
+
+- name: Display all variables/facts known for a host
+ debug:
+ var: hostvars[inventory_hostname]
+ verbosity: 4 # affiché à partir du niveau -vvvv
+```
+
+
+## Niveau de verbosité
+
+```nohighlight
+$ ansible-playbook -i ./hosts playbook.yaml
+```
+
+```nohighlight
+$ ansible-playbook -vv -i ./hosts playbook.yaml
+```
+
+```nohighlight
+$ ansible-playbook -vvvv -i ./hosts playbook.yaml
+```
+
+
+## Check mode (« Dry Run »)
+
+* Simulation de l'exécution d'un Playbook.
+
+* Aucun changement n'est effectué sur les hosts lors du check.
+
+* Utiliser l’option `--check`.
+
+* _Attention_ ! Certains modules sont incompatibles avec le Check mode.
+
+
+Forcer ou non une tâche en check : `check_mode: yes/no`
+
+
+```yaml
+tasks:
+ - name: this task will make changes to the system even in check mode
+ command: /something/to/run --even-in-check-mode
+ check_mode: no
+
+ - name: this task will always run under checkmode and not change the system
+ lineinfile:
+ line: "important config"
+ dest: /path/to/myconfig.conf
+ state: present
+ check_mode: yes
+```
+
+
+## Autres options de ansible-playbook
+
+Option | Description
+- | -
+`--list-hosts` | Affiche les machines concernées par le Play
+`--list-tags` | Affiche les tags disponibles
+`--list-tasks` | Affiche les tâches qui seront exécutées
+`--step` | Demande confirmation avant l'exécution de chaque tâche
+`--syntax-check` | Analyse syntaxique du Playbook (sans l'exécuter)
+
+
+## Tester du code Ansible
+
+
+![Logo Molecule](images/logo-molecule.png)
+
+* Permet de tester des Roles Ansible
+
+https://molecule.readthedocs.io/en/latest/
+
+
+![Logo TestInfra](images/logo-testinfra.svg)
+
+Création de tests unitaire en langage Python
+
+
+```python
+def test_passwd_file(host):
+ passwd = host.file("/etc/passwd")
+ assert passwd.contains("root")
+ assert passwd.user == "root"
+ assert passwd.group == "root"
+ assert passwd.mode == 0o644
+```
+
+Combiné avec GitLab-CI/Jenkins et Docker, il permet d'automatiser le test de code Ansible.
+
+https://testinfra.readthedocs.io/en/latest/
+
+
+## Ansible Lint
+
+* Permet de détecter les comportements et les pratiques qui peuvent être améliorés.
+
+https://ansible-lint.readthedocs.io/en/latest/
+
+
+## Ansible en mode Pull
+
+* Ansible fonctionne traditionnellement en mode `Push`.
+
+* Il est possible de passer en mode `Pull` à l'aide de la commande `ansible-pull`.
+
+* Intérêt du mode Pull
+
+ - Adresser un grand nombre de machines,
+
+ - Remediation des systèmes en continu.
+
+
+* Pré-requis du mode Pull
+
+ * Playbooks disponibles sur un dépôt git,
+
+ * Ansible installé sur chaque machine cible.
+
+https://docs.ansible.com/ansible/latest/cli/ansible-pull.html
+
+https://github.com/ansible/ansible-examples/blob/master/language_features/ansible_pull.yaml
+
+
+## Développer un module personnalisé
+
+`./library/mymodule.py`
+```python
+#!/usr/bin/python
+
+from ansible.module_utils.basic import *
+
+def main():
+ module = AnsibleModule(argument_spec={})
+ response = {"hello": "world"}
+ module.exit_json(changed=False, meta=response)
+if __name__ == '__main__':
+ main()
+```
+
+https://blog.toast38coza.me/custom-ansible-module-hello-world/
+
+https://docs.ansible.com/ansible/latest/dev_guide/developing_modules_general.html
+
+
+## Utiliser un module personnalisé
+
+
+`playbook-demo-mymodule.yaml`
+```yaml
+- hosts: web
+ tasks:
+ - name: Test that my module works
+ mymodule:
+ register: result
+ - debug: var=result
+```
+```nohighlight
+$ ansible-playbook -i ./hosts playbook-demo-mymodule.yaml
+...
+TASK [Test that my module works] ***********************************************
+ok: [web2.formation.sii.fr]
+ok: [web1.formation.sii.fr]
+
+TASK [debug] *******************************************************************
+ok: [web1.formation.sii.fr] => {
+ "result": { "changed": false, "meta": { "hello": "world" } }
+}
+ok: [web2.formation.sii.fr] => {
+ "result": { "changed": false, "meta": { "hello": "world" } }
+}
+...
+```
+
+
+## Ansible Tower
+
+* Interface Web propriétaire pour le lancement de playbooks.
+
+* Accès à l’historique des playbooks lancés et aux logs d'exécution.
+
+* Gestion des utilisateurs et de l'inventaire.
+
+* Pilotable via API.
+
+https://www.ansible.com/products/tower
+
+
+### Tableau de bord d'Ansible Tower
+![Tower dashboard](images/tower-dashboard.png)
+
+
+### AWX
+
+* Version opensource de Ansible Tower (sous licence Apache 2.0.)
+
+* AWX est à Ansible Tower ce que Fedora est à Red Hat Enterprise Linux.
+
+* Non recommandé pour les environnements de production.
+
+* Aucun support n'est fourni par Red Hat.
+
+https://www.ansible.com/products/awx-project
diff --git a/Pepiniere/Pepinière/ansible/9.Ansible-Galaxy.md b/Pepiniere/Pepinière/ansible/9.Ansible-Galaxy.md
new file mode 100644
index 0000000..28d2f44
--- /dev/null
+++ b/Pepiniere/Pepinière/ansible/9.Ansible-Galaxy.md
@@ -0,0 +1,246 @@
+
+![Logo Ansible](images/logo-ansible.svg)
+# Ansible Galaxy
+
+Créer et partager ses propres roles.
+
+
+## Ansible Galaxy
+
+* Communauté pour trouver, télécharger, partager des rôles.
+
+* Site : [https://galaxy.ansible.com/](https://galaxy.ansible.com/)
+
+* CLI : `ansible-galaxy`
+
+* Doc : [http://docs.ansible.com/ansible/galaxy.html](http://docs.ansible.com/ansible/galaxy.html)
+
+
+## Une communauté
+
+* Télécharger des roles depuis Galaxy est un bon moyen pour démarrer un projet.
+
+* On ne réinvente pas la roue.
+
+* Enormément de projets : environ 19'500 roles (jan. 2019).
+
+
+## Mais soyez vigilent
+
+* Tout le monde peut partager.
+
+* Beaucoup de duplications.
+
+* Vulnérabilités, malveillance, dangereux, mauvais fonctionnement...
+
+
+![](images/ansible-galaxy-site.png)
+
+
+## Rechercher des rôles
+
+
+```none
+$ ansible-galaxy search httpd
+
+Found 182 roles matching your search:
+
+ Name Description
+ ---- -----------
+ 2kloc.trellis-monit Install and configure Monit service in Trellis.
+ acropia.httpd IT Professional
+ ahuffman.sat6_create_hosts An Ansible role to create new virtual and ba...
+ AlbanAndrieu.ansible-workstation A role for installing workstation
+ AnatolyRugalev.ansistrano-deploy Ansible role to deploy scripting application...
+ ansiblebit.httpd Ansible role to setup the Apache HTTP server.
+ ansiblebit.mod_wsgi Ansible role to install and setup mod_wsgi.
+ ansible-ThoTeam.nexus3-oss Nexus Repository Manager 3.x (Sonatype)
+ ansistrano.deploy Ansible role to deploy scripting application...
+ ansistrano.rollback Ansible role to rollback scripting applicati...
+ Anthony25.squid Installs Squid
+ archf.packages Ansible role to install packages on a host
+ awasilyev.apache-container Ansible Container role that adds an apache s...
+ awasilyev.drupal-container Ansible Container role that adds an apache s...
+ awasilyev.tomcat-container Ansible Container role that adds an tomcat s...
+ axmac.axmac_apache Apache2
+ beardyjay.firewalld Base role for firewalld
+ ...
+```
+
+
+## Télécharger un rôle
+
+* https://galaxy.ansible.com/geerlingguy/apache
+
+
+```none
+$ ansible-galaxy install geerlingguy.apache
+- downloading role 'apache', owned by geerlingguy
+- downloading role from https://github.com/geerlingguy/ansible-role/.../3.0.3.tar.gz
+- extracting geerlingguy.apache to /home/ansible/.ansible/roles/geerlingguy.apache
+- geerlingguy.apache (3.0.3) was installed successfully
+```
+
+
+## Fichiers récupérés
+
+```none
+/home/ansible/.ansible
+└── roles
+ └── geerlingguy.apache
+ ├── defaults
+ │ └── main.yaml
+ ├── handlers
+ │ └── main.yaml
+ ├── LICENSE
+ ├── meta
+ │ └── main.yaml
+ ├── README.md
+ ├── tasks
+ │ ├── configure-Debian.yaml
+ │ ├── configure-RedHat.yaml
+ │ ├── configure-Suse.yaml
+ │ ├── main.yaml
+ │ ├── setup-Debian.yaml
+ │ ├── setup-RedHat.yaml
+ │ └── setup-Suse.yaml
+ ├── templates
+ │ └── vhosts.conf.j2
+ └── vars
+ ├── apache-22.yaml
+ ├── apache-24.yaml
+ ├── Debian.yaml
+ ├── RedHat.yaml
+ └── Suse.yaml
+```
+
+
+## Pourquoi utiliser Galaxy ?
+
+* Créer des roles Ansible réutilisables est une bonne pratique.
+
+* Partager des roles sur son propre SCM.
+
+* Apporter une notion de dépendances à la sauce Maven ou NPM.
+
+
+## Fonctionnement avancé
+
+* Installer plusieurs roles en une seule fois.
+
+* Récupérer des roles depuis plusieurs sources (Galaxy, Git, filer...).
+
+* Un seul fichier décrivant la liste des roles à installer : `requirements.yaml`
+
+```none
+$ ansible-galaxy install -r requirements.yaml
+```
+
+
+## Plusieurs sources possibles
+
+
+Depuis Galaxy
+
+
+```yaml
+- src: zaxos.tomcat-ansible-role
+- src: user.rolename
+...
+```
+
+Avec l'utilisation de Galaxy, l'attribut `src` représente simplement ``.``
+
+
+Depuis un serveur Git
+
+
+```yaml
+- src: git@gitlab.sii-ouest.fr:ouest/projects/ansible/tomcat.git
+ scm: git
+ version: develop
+```
+
+L'attribut `version` peut être un tag, un nom de branche ou un numéro de commit. La version par défaut est master.
+
+Depuis GitHub, pas besoin d'indiquer de SCM
+
+
+Depuis un serveur web
+
+
+```yaml
+- src: https://url.du.serveur.com/ansible/roles/tomcat.tar.gz
+ name: tomcat-role
+```
+
+L'attribut `name` sert à indiquer le nom du role lorsqu'il est téléchargé
+
+
+## Définir le chemin de téléchargement
+
+
+Par défaut, les roles sont téléchargés à l'endroit spécifié par la variable d'environnement `ANSIBLE_ROLE_PATH`.
+
+Il est possible de définir le chemin directement en ligne de commande.
+
+```none
+$ ansible-galaxy install -r requirements.yaml -p|-roles-path .
+```
+
+
+## Créer des roles Ansible
+
+
+Il est très facile de créer un role Ansible avec une structure de dossier pré-définit avec la commande `init`.
+
+```none
+$ ansible-galaxy init tomcat-custom
+```
+
+L'argument `-force` permet d'écraser un role existant portant le même nom.
+
+
+La création du role génère la structure ci-dessous :
+
+```none
+/tomcat-custom
+├── README.md
+├── .travis.yaml
+├── defaults/
+| └── main.yaml
+├── files/
+├── handlers/
+| └── main.yaml
+├── meta/
+| └── main.yaml
+├── templates/
+├── tests/
+| ├── inventory
+| └── test.yaml
+└── vars/
+ └──main.yaml
+```
+
+
+## Utiliser une structure personalisée
+
+```none
+$ ansible-galaxy init --role-skeleton=/chemin/squelette tomcat-custom
+```
+
+Quand une structure personalisée est utilisée, les points suivants sont respectés :
+
+* Copie tous les fichiers et dossiers vers le nouveau role.
+
+* Les dossiers `.git` et fichiers `.git_keep` ne sont pas recopiés.
+
+* Le fichier `meta/main.yaml` est obligatoire pour récupérer le role via Galaxy.
+
+
+### Travaux pratiques
+
+
+![Travaux pratiques](images/tp.gif)
+
+[TP Ansible Galaxy](travaux-pratiques/tp-ansible-galaxy.html)
diff --git a/Pepiniere/Pepinière/ansible/README.md b/Pepiniere/Pepinière/ansible/README.md
new file mode 100644
index 0000000..c1e99c9
--- /dev/null
+++ b/Pepiniere/Pepinière/ansible/README.md
@@ -0,0 +1,29 @@
+# Formation Ansible
+
+
+## Programme
+
+1. Introduction ansible
+2. Installation / Inventaire
+3. Commandes ad-hoc
+4. Playbooks
+5. Roles
+6. Structures de contrôle
+7. Templates
+8. Notions avancées
+
+## Slides
+
+Pour récupérer les slides :
+
+`git clone --recurse-submodules https://gitlab.siinergy.net/sii-ouest/trainings/ansible.git`
+
+Version [pdf](https://gitlab.siinergy.net/sii-ouest/trainings/ansible/-/jobs/artifacts/2019-03-06/raw/ansible.pdf?job=make-pdf)
+
+## Machines vituelles
+
+Voir [ansible-config-virtualbox-vms.md](ansible-config-virtualbox-vms.md).
+
+## Todo
+
+Les améliorations à apporter à la formation : [https://gitlab.siinergy.net/sii-ouest/trainings/ansible/boards](https://gitlab.siinergy.net/sii-ouest/trainings/ansible/boards)
diff --git a/Pepiniere/Pepinière/ansible/ansible-config-virtualbox-vms.md b/Pepiniere/Pepinière/ansible/ansible-config-virtualbox-vms.md
new file mode 100644
index 0000000..713a4ab
--- /dev/null
+++ b/Pepiniere/Pepinière/ansible/ansible-config-virtualbox-vms.md
@@ -0,0 +1,54 @@
+# Machines virtuelles VirtualBox pour la formation Ansible
+
+## Pré-requis de l'hôte
+
+- 8 Go de RAM au minimum
+- Processeur Intel Corei__X__
+
+
+## Machines virtuelles
+
+Un fichier _.ova_ contenant deux machines virtuelles prêtes à l'emploi est disponible sur le filer.
+
+Mot de passe de l'utilisateur `ansible` : `ansible`.
+
+Mot de passe de l'utilisateur `root` : `ansible`.
+
+VM | description
+- | -
+ansible-0 | Machine ansible maître avec OS Debian 9 et ansible 2.6 installé
+ansible-1 | Machine de test avec OS Centos 7
+ansible-2 | Machine de test avec OS Centos 7
+ansible-3 | Machine de test avec OS Debian 9
+
+### Configuration des ressources
+
+- 1024 Mo RAM par VM
+- 1 CPU par VM
+
+### Configuration réseau
+
+Chaque VM a 2 interfaces réseaux :
+
+- Interface 1 : __NAT__
+L’accès Internet de la machine hôte est alors partagé, on peut faire des mises à jour etc. La machine virtuelle voit Internet mais n’est pas vue du réseau local (elle est derrière un NAT qui est géré par VirtualBox).
+
+- Interface 2 : __Réseau privé hôte avec DHCP__
+La machine est visible et voit la machine hôte et réciproquement. Cette interface réseau sert pour se connecter en SSH depuis la machine hôte sur la machine virtuelle. Elle permet également aux différentes machines virtuelles positionnées sur ce réseau de communiquer entre elles.
+
+Le type des cartes est __Intel PRO/1000 MT Desktop (82540EM)__.
+
+
+Qui voit quoi ?
+
+- Via la carte en __NAT__
+ * la VM a accès à Internet pour les mises à jour derrière un NAT.
+ * La VM est invisible du réseau local et de la machine hôte (à moins de faire des redirections de port).
+
+- Via la carte __Réseau privé hôte__
+ * la VM a accès à la machine hôte et réciproquement.
+ * la VM est visible des autres machines virtuelles situées dans le même réseau privé hôte.
+
+En résumé, les deux machines virtuelles pourront donc communiquer entre elles via l'interface _Réseau privé hôte_ et accéder à internet via l'interface _NAT_.
+
+Si besoin que toutes les VMs des stagiaires se voient entre elles il est possible de remplacer la carte __NAT__ par une carte __Bridge__.
diff --git a/Pepiniere/Pepinière/ansible/images/ansible-ad-hoc-deployment-workflow.png b/Pepiniere/Pepinière/ansible/images/ansible-ad-hoc-deployment-workflow.png
new file mode 100644
index 0000000..a08bcf4
Binary files /dev/null and b/Pepiniere/Pepinière/ansible/images/ansible-ad-hoc-deployment-workflow.png differ
diff --git a/Pepiniere/Pepinière/ansible/images/ansible-ad-hoc-multi-node-deployment.png b/Pepiniere/Pepinière/ansible/images/ansible-ad-hoc-multi-node-deployment.png
new file mode 100644
index 0000000..39b2ea4
Binary files /dev/null and b/Pepiniere/Pepinière/ansible/images/ansible-ad-hoc-multi-node-deployment.png differ
diff --git a/Pepiniere/Pepinière/ansible/images/ansible-archi-playbooks.png b/Pepiniere/Pepinière/ansible/images/ansible-archi-playbooks.png
new file mode 100644
index 0000000..86a5a4c
Binary files /dev/null and b/Pepiniere/Pepinière/ansible/images/ansible-archi-playbooks.png differ
diff --git a/Pepiniere/Pepinière/ansible/images/ansible-archi-roles.png b/Pepiniere/Pepinière/ansible/images/ansible-archi-roles.png
new file mode 100644
index 0000000..341bbb4
Binary files /dev/null and b/Pepiniere/Pepinière/ansible/images/ansible-archi-roles.png differ
diff --git a/Pepiniere/Pepinière/ansible/images/ansible-archi-ssh.png b/Pepiniere/Pepinière/ansible/images/ansible-archi-ssh.png
new file mode 100644
index 0000000..8508e47
Binary files /dev/null and b/Pepiniere/Pepinière/ansible/images/ansible-archi-ssh.png differ
diff --git a/Pepiniere/Pepinière/ansible/images/ansible-galaxy-site.png b/Pepiniere/Pepinière/ansible/images/ansible-galaxy-site.png
new file mode 100644
index 0000000..2e1ddb8
Binary files /dev/null and b/Pepiniere/Pepinière/ansible/images/ansible-galaxy-site.png differ
diff --git a/Pepiniere/Pepinière/ansible/images/ansible-playbook-deployment-workflow.png b/Pepiniere/Pepinière/ansible/images/ansible-playbook-deployment-workflow.png
new file mode 100644
index 0000000..1d02c27
Binary files /dev/null and b/Pepiniere/Pepinière/ansible/images/ansible-playbook-deployment-workflow.png differ
diff --git a/Pepiniere/Pepinière/ansible/images/ansible-playbook-multi-node-deployment-workflow.png b/Pepiniere/Pepinière/ansible/images/ansible-playbook-multi-node-deployment-workflow.png
new file mode 100644
index 0000000..f95d628
Binary files /dev/null and b/Pepiniere/Pepinière/ansible/images/ansible-playbook-multi-node-deployment-workflow.png differ
diff --git a/Pepiniere/Pepinière/ansible/images/ci-vs-cd-devops-difference.jpg b/Pepiniere/Pepinière/ansible/images/ci-vs-cd-devops-difference.jpg
new file mode 100644
index 0000000..a0e9034
Binary files /dev/null and b/Pepiniere/Pepinière/ansible/images/ci-vs-cd-devops-difference.jpg differ
diff --git a/Pepiniere/Pepinière/ansible/images/logo-ansible.svg b/Pepiniere/Pepinière/ansible/images/logo-ansible.svg
new file mode 100644
index 0000000..d508e3a
--- /dev/null
+++ b/Pepiniere/Pepinière/ansible/images/logo-ansible.svg
@@ -0,0 +1,70 @@
+
+
diff --git a/Pepiniere/Pepinière/ansible/images/logo-molecule.png b/Pepiniere/Pepinière/ansible/images/logo-molecule.png
new file mode 100644
index 0000000..d2f1a07
Binary files /dev/null and b/Pepiniere/Pepinière/ansible/images/logo-molecule.png differ
diff --git a/Pepiniere/Pepinière/ansible/images/logo-testinfra.svg b/Pepiniere/Pepinière/ansible/images/logo-testinfra.svg
new file mode 100644
index 0000000..12afcf8
--- /dev/null
+++ b/Pepiniere/Pepinière/ansible/images/logo-testinfra.svg
@@ -0,0 +1,240 @@
+
+
+
+
diff --git a/Pepiniere/Pepinière/ansible/images/manual-deployment-without-ansible.png b/Pepiniere/Pepinière/ansible/images/manual-deployment-without-ansible.png
new file mode 100644
index 0000000..1573092
Binary files /dev/null and b/Pepiniere/Pepinière/ansible/images/manual-deployment-without-ansible.png differ
diff --git a/Pepiniere/Pepinière/ansible/images/tower-dashboard.png b/Pepiniere/Pepinière/ansible/images/tower-dashboard.png
new file mode 100644
index 0000000..c153d1b
Binary files /dev/null and b/Pepiniere/Pepinière/ansible/images/tower-dashboard.png differ
diff --git a/Pepiniere/Pepinière/ansible/images/tp.gif b/Pepiniere/Pepinière/ansible/images/tp.gif
new file mode 100644
index 0000000..101ea93
Binary files /dev/null and b/Pepiniere/Pepinière/ansible/images/tp.gif differ
diff --git a/Pepiniere/Pepinière/ansible/index.html b/Pepiniere/Pepinière/ansible/index.html
new file mode 100644
index 0000000..b5924fb
--- /dev/null
+++ b/Pepiniere/Pepinière/ansible/index.html
@@ -0,0 +1,150 @@
+
+
+
+
+
+
+ SII - Ansible
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Pepiniere/Pepinière/ansible/travaux-pratiques/tp-ansible-divers.md b/Pepiniere/Pepinière/ansible/travaux-pratiques/tp-ansible-divers.md
new file mode 100644
index 0000000..20744c9
--- /dev/null
+++ b/Pepiniere/Pepinière/ansible/travaux-pratiques/tp-ansible-divers.md
@@ -0,0 +1,15 @@
+## TP Complémentaires
+
+
+* Variabiliser le port d'écoute d'Apache.
+
+
+* Prévoir de pouvoir dérouler la partie web sur centos _ou_ debian.
+
+
+* Créer des roles pour installer Docker et Docker-Compose sur Debian
+ https://docs.docker.com/install/linux/docker-ce/debian/
+
+ Vérification :
+ * $ docker version
+ * $ docker-compose version
diff --git a/Pepiniere/Pepinière/ansible/travaux-pratiques/tp-ansible-galaxy.html b/Pepiniere/Pepinière/ansible/travaux-pratiques/tp-ansible-galaxy.html
new file mode 100644
index 0000000..c05453e
--- /dev/null
+++ b/Pepiniere/Pepinière/ansible/travaux-pratiques/tp-ansible-galaxy.html
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+ SII - TP Ansible Galaxy
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
SII • www.groupe-sii.com • janvier 2019
+
+
diff --git a/Pepiniere/Pepinière/ansible/travaux-pratiques/tp-ansible-galaxy.md b/Pepiniere/Pepinière/ansible/travaux-pratiques/tp-ansible-galaxy.md
new file mode 100644
index 0000000..ad90a6e
--- /dev/null
+++ b/Pepiniere/Pepinière/ansible/travaux-pratiques/tp-ansible-galaxy.md
@@ -0,0 +1,111 @@
+## TP Ansible Galaxy
+
+Créer et partager ses propres roles.
+
+
+## Télécharger des roles
+
+
+* Aller sur Galaxy https://galaxy.ansible.com et rechercher le role Apache de Geerlingguy.
+
+* Récupérer la CLI d'installation.
+
+![](images/ansible-galaxy-search-role.png)
+
+
+* Il est également possible de faire une recherche avec la commande `search`
+
+
+```none
+$ ansible-galaxy search --author geerlingguy apache
+
+Found 14 roles matching your search:
+
+ Name Description
+ ---- -----------
+ geerlingguy.adminer Installs Adminer for Database management.
+ geerlingguy.apache Apache 2.x for Linux.
+ geerlingguy.apache-php-fpm Apache 2.4+ PHP-FPM support for Linux.
+ geerlingguy.certbot Installs and configures Certbot (for Let's Encrypt).
+ geerlingguy.drupal Deploy or install Drupal on your servers.
+ geerlingguy.htpasswd htpasswd installation and helper role for Linux serv...
+ geerlingguy.munin Munin monitoring server for RedHat/CentOS or Debian/...
+ geerlingguy.php PHP for RedHat/CentOS/Fedora/Debian/Ubuntu.
+ geerlingguy.pimpmylog Pimp my Log installation for Linux
+ geerlingguy.solr Apache Solr for Linux.
+ geerlingguy.supervisor Supervisor (process state manager) for Linux.
+ geerlingguy.svn SVN web server for Linux
+ geerlingguy.tomcat6 Tomcat 6 for RHEL/CentOS and Debian/Ubuntu.
+ geerlingguy.varnish Varnish for Linux.
+```
+
+
+* Installer le role apache récupéré.
+
+
+```none
+$ ansible-galaxy install geerlingguy.apache
+
+- downloading role 'apache', owned by geerlingguy
+- downloading role from https://github.com/geerlingguy/ansible-role-apache/archive/3.0.3.tar.gz
+- extracting geerlingguy.apache to /home/formationback/.ansible/roles/geerlingguy.apache
+- geerlingguy.apache (3.0.3) was installed successfully
+```
+
+
+* Parcourons ensemble la structure des dossiers et notamment le dossier meta.
+
+
+```none
+$ cat /home/ansible/.ansible/roles/geerlingguy.apache/meta/main.yml
+```
+```yaml
+dependencies: []
+
+galaxy_info:
+ author: geerlingguy
+ description: Apache 2.x for Linux.
+ company: "Midwestern Mac, LLC"
+ license: "license (BSD, MIT)"
+ min_ansible_version: 2.4
+ platforms:
+ - name: EL
+ versions:
+ - all
+ - name: Fedora
+ versions:
+ - all
+ - name: Amazon
+ versions:
+ - all
+ - name: Debian
+ versions:
+ - all
+ - name: Ubuntu
+ versions:
+ - trusty
+ - xenial
+ - bionic
+ - name: Solaris
+ versions:
+ - 11.3
+ galaxy_tags:
+ - web
+ - apache
+ - webserver
+ - html
+ - httpd
+
+allow_duplicates: true
+```
+
+
+## Gérer les roles comme des dépendances externes
+
+
+* Pour ce TP, nous allons réutiliser les roles que vous venez de créer. Pour plus de facilité, les versions finales sont déjà présentes sur le GitLab `https://gitlab.com/a-berthout`.
+
+* Grâce à Ansible Galaxy, dans votre projet actuel, récupérer les roles suivants :
+ * Apache sur la branche master
+ * MariaDB sur la branche develop
+ * Wordpress sur le tag V1.0.0
diff --git a/Pepiniere/Pepinière/ansible/travaux-pratiques/tp-ansible-imports.html b/Pepiniere/Pepinière/ansible/travaux-pratiques/tp-ansible-imports.html
new file mode 100644
index 0000000..915bad7
--- /dev/null
+++ b/Pepiniere/Pepinière/ansible/travaux-pratiques/tp-ansible-imports.html
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+ SII - TP Ansible : les imports
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Pepiniere/Pepinière/ansible/travaux-pratiques/tp-ansible-vault.md b/Pepiniere/Pepinière/ansible/travaux-pratiques/tp-ansible-vault.md
new file mode 100644
index 0000000..f7333a7
--- /dev/null
+++ b/Pepiniere/Pepinière/ansible/travaux-pratiques/tp-ansible-vault.md
@@ -0,0 +1,283 @@
+## TP Ansible Vault
+
+Sécuriser les informations sensibles.
+
+
+* Créer un dossier nommé `all` dans `group_vars`.
+
+```none
+.
+└── inventories
+ └── formation
+ ├── group_vars
+ │ └── all <---- ici
+ └── hosts
+```
+
+
+* Créer avec la commande `ansible-vault create` :
+ - un fichier nommé `vault`
+ - dans `group_vars/all`.
+
+* Ajouter une variable dans le fichier.
+
+```none
+.
+└── inventories
+ └── formation
+ ├── group_vars
+ │ └── all
+ │ └── vault <---- ici
+ └── hosts
+```
+
+
+```none
+vault_robert_password: Mon super password !
+```
+
+* Vérifier le contenu du fichier vault
+
+ - avec la commande `cat`,
+
+ - avec la commande `ansible-vault view`.
+
+* Il est possible de modifier le contenu du fichier chiffré avec la commande `ansible-vault edit`.
+
+
+
+Avec `cat`
+```none
+$ cat inventories/formation/group_vars/all/vault
+$ANSIBLE_VAULT;1.1;AES256
+64373435616463653634613737613565626662326539376138393733333762343364303961306536
+6337336233323932346134313838666538363863376562360a326561356365626462373963636233
+63613139383437303262616366623538613761336361626665653631343061326535373363643039
+3633363965363237370a623063343839626634633435373834386332313933643661356266653265
+35333234643234376266343935303837373561333265653338323235656638316539646137313234
+3861623031393635646363343662366161343130653864336331
+```
+
+Avec `ansible-vault`
+```none
+$ ansible-vault view inventories/formation/group_vars/all/vault
+Vault password:
+vault_robert_password: Mon super password !
+```
+
+
+* Créer un playbook nommé `playbook-vault.yaml`.
+
+* Ajouter une tâche de debug qui affichera la variable stockée dans le fichier `vault`.
+
+* Lancer le playbook !
+
+* La structure du dossier de travail est :
+
+```none
+.
+├── inventories
+│ └── formation
+│ ├── group_vars
+│ │ └── all
+│ │ └── vault
+│ └── hosts
+└── playbook-vault.yaml
+```
+
+
+
+Créer `playbook-vault.yaml`
+```yaml
+- hosts: debian9
+ tasks:
+ - name: Display secured password
+ debug:
+ msg: "Robert's password is: {{ vault_robert_password }}"
+```
+
+
+
+Lancer le playbook
+```none
+$ ansible-playbook -i inventories/formation/hosts playbook-vault.yaml
+
+PLAY [debian9] *****************************************************
+ERROR! Attempting to decrypt but no vault secrets found
+```
+
+Il nous faut donc préciser le mot de passe de déchiffrement vault en utilisant au choix
+l'option `--ask-vault-pass` ou l'option `--vault-password-file`.
+
+
+
+Lancer le playbook avec `--ask-vault-pass`
+```none
+$ ansible-playbook -i inventories/formation/hosts playbook-vault.yaml --ask-vault-pass
+Vault password:
+
+PLAY [debian9] *****************************************************************
+
+TASK [Gathering Facts] *********************************************************
+ok: [ansible-3]
+
+TASK [Display secured password] ************************************************
+ok: [ansible-3] => {
+ "msg": "Robert's password is: Mon super password !"
+}
+
+PLAY RECAP *********************************************************************
+ansible-3 : ok=2 changed=0 unreachable=0 failed=0
+```
+
+
+* Afin d'éviter d'avoir à taper le mot de passe vault à chaque fois, mettons le dans un fichier !
+
+* Relancer le playbook en précisant l'option
+`--vault-password-file`.
+
+
+
+Créer un fichier contenant le mot de passe vault
+```none
+$ echo "12345678" > vault-password
+$ chmod 600 vault-password
+```
+
+`Attention` ! Dans un environnement Git attention à ne pas versionner le fichier contenant le mot de passe, en utilisant `.gitignore` par exemple.
+
+
+
+Relancer le playbook avec l'option
+`--vault-password-file`
+```none
+$ ansible-playbook -i inventories/formation/hosts playbook-vault.yaml \
+ --vault-password-file vault-password
+
+PLAY [debian9] *****************************************************************
+
+TASK [Gathering Facts] *********************************************************
+ok: [ansible-3]
+
+TASK [Display secured password] ************************************************
+ok: [ansible-3] => {
+ "msg": "Robert's password is: Mon super password !"
+}
+
+PLAY RECAP *********************************************************************
+ansible-3 : ok=2 changed=0 unreachable=0 failed=0
+```
+
+
+* Pour éviter d'avoir à préciser le fichier de mot de passe vault à chaque exécution du playbook, il est possible d'en préciser le nom une fois pour toutes dans le fichier de configuration `ansible.cfg` à la racine du projet local.
+
+
+* Créer le fichier `ansible.cfg` et ajouter le paramètre `vault_password_file` dans la section `[defaults]`.
+
+* La structure du dossier de travail devient :
+
+```none
+.
+├── ansible.cfg <----- c'est ici que ça se passe
+├── inventories
+│ └── formation
+│ ├── group_vars
+│ │ └── all
+│ │ ├── vars
+│ │ └── vault
+│ └── hosts
+├── playbook-vault.yaml
+└── vault-password
+```
+
+
+
+Référencer le fichier de mot de passe vault
+dans `ansible.cfg`
+```none
+[defaults]
+vault_password_file = vault-password
+```
+
+
+__Bonnes pratiques avec vault__
+
+* Lorsqu'on utilise vault, les variables et leurs valeurs sont offusquées, il n'est pas forcément évident d'assurer la maintenance sur ces fichiers de variables.
+
+* Les bonnes pratiques Ansible préconisent de passer par une couche d'indirection, c'est à dire d'ajouter un fichier non chiffré dont les variables référenceront les variables vault.
+
+
+* Créer un nouveau fichier nommé `vars` dans `group_vars/all`.
+
+* Ajouter la variable et la faire pointer vers la variable vault.
+
+* La structure du dossier de travail devient :
+
+```none
+.
+├── ansible.cfg
+├── inventories
+│ └── formation
+│ ├── group_vars
+│ │ └── all
+│ │ ├── vars <----- fichier d'indirection
+│ │ └── vault
+│ └── hosts
+├── playbook-vault.yaml
+└── vault-password
+```
+
+
+
+Créer `inventories/formation/group_vars/all/vars`
+```yaml
+robert_password: "{{ vault_robert_password }}"
+```
+
+La variable `robert_password` pointe sur
+la variable `vault_robert_password` stockée dans le fichier `vault`.
+
+
+* Modifier le fichier playbook pour utiliser la variable provenant du fichier `vars`.
+
+* Lancer le playbook.
+
+
+
+Modifier `playbook-vault.yaml`
+```yaml
+---
+- hosts: debian9
+ tasks:
+ - name: Display secured password
+ debug:
+ msg: "Robert's password is: {{ robert_password }}"
+```
+
+Lancer le playbook
+```none
+$ ansible-playbook -i inventories/formation/hosts playbook-vault.yaml \
+ --vault-password-file vault-password
+
+PLAY [debian9] *****************************************************************
+
+TASK [Gathering Facts] *********************************************************
+ok: [ansible-3]
+
+TASK [Display secured password] ************************************************
+ok: [ansible-3] => {
+ "msg": "Robert's password is: Mon super password !"
+}
+
+PLAY RECAP *********************************************************************
+ansible-3 : ok=2 changed=0 unreachable=0 failed=0
+```
+
+
+__Pour aller plus loin__
+
+Il est possible d'aller encore plus loin
+avec les `vault-id` :
+
+* https://docs.ansible.com/ansible/latest/user_guide/vault.html#vault-ids-and-multiple-vault-passwords
+* https://dev.iachieved.it/iachievedit/ansible-vault-ids/
diff --git a/Pepiniere/Pepinière/devops/.gitlab-ci.yml b/Pepiniere/Pepinière/devops/.gitlab-ci.yml
new file mode 100644
index 0000000..ba67116
--- /dev/null
+++ b/Pepiniere/Pepinière/devops/.gitlab-ci.yml
@@ -0,0 +1,29 @@
+variables:
+ GIT_SUBMODULE_STRATEGY: recursive
+
+stages:
+ - build
+
+build:
+ stage: build
+ image:
+ name: astefanutti/decktape:2.11.0
+ entrypoint: [""]
+ tags:
+ - france
+ - sii
+ script:
+ #
+ # 1. We change the size with --size due to a strange rendering bug
+ # as decribed here: https://github.com/astefanutti/decktape/issues/151
+ #
+ # 2. We also specify --chrome-arg=--disable-web-security to autorize
+ # Cross origin requests in chrome as described here:
+ # https://github.com/astefanutti/decktape/issues/157
+ #
+ - node /decktape/decktape.js --chrome-path chromium-browser --chrome-arg=--no-sandbox --chrome-arg=--disable-web-security --size='1576x1182' index.html speakup-devops.pdf
+ artifacts:
+ name: speakup-devops
+ expire_in: 8 days
+ paths:
+ - speakup-devops.pdf
diff --git a/Pepiniere/Pepinière/devops/.gitmodules b/Pepiniere/Pepinière/devops/.gitmodules
new file mode 100644
index 0000000..57edee8
--- /dev/null
+++ b/Pepiniere/Pepinière/devops/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "revealjs"]
+ path = revealjs
+ url = ../../template-revealjs-sii-theme.git
diff --git a/Pepiniere/Pepinière/devops/0.introduction.md b/Pepiniere/Pepinière/devops/0.introduction.md
new file mode 100644
index 0000000..b1db0f6
--- /dev/null
+++ b/Pepiniere/Pepinière/devops/0.introduction.md
@@ -0,0 +1,52 @@
+
+![DevOps](images/devops_refactor.svg)
+
+__Introduction au DevOps__
+
+Alexan Andrieux | Christian Tritten
+
+Speak Up SII - 25 mars 2021
+
+
+
+
+
+
+
+
+
+## Introduction au DevOps
+
+De quoi on va parler aujourd'hui ?
+
+1. Constats du travail en Silo
+
+2. Le DevOps
+
+3. Les origines du DevOps
+
+4. La pratique du DevOps
+
+5. Mise en place du DevOps
+
+6. Conclusion
diff --git a/Pepiniere/Pepinière/devops/1.constats.md b/Pepiniere/Pepinière/devops/1.constats.md
new file mode 100644
index 0000000..6f3e39d
--- /dev/null
+++ b/Pepiniere/Pepinière/devops/1.constats.md
@@ -0,0 +1,163 @@
+
+
+## Constats du travail en Silo
+
+
+
+
+### Deux mondes opposés
+
+Dev vs Ops
+
+![versus](images/versus-retro-style.jpg)
+
+
+
+
+### Le monde du Dev
+
+But des développeurs :
+
+- Créer de nouveaux logiciels/librairies
+
+- Développer des nouvelles fonctionnalités
+
+- Améliorer le code existant (performance, élégance, maintenabilité)
+
+- Versionner du code
+
+- Tester facilement
+
+
+
+
+### Le monde du Dev
+
+- Organisé en sprint (Agilité)
+
+- Changement fréquent de l'application
+
+
+
+
+### Le monde du Dev
+
+Impacts possibles :
+
+- sécurité
+
+- stabilité
+
+- performances
+
+- l'introduction de bug
+
+- mise à jour et/ou réinstallation d'application
+
+- augmentation des ressources systèmes utilisées
+
+
+
+
+### Le monde de l'Ops
+
+Objectifs :
+
+- déployer et maintenir des plateformes
+ * stables,
+ * sécurisées
+ * performantes
+
+- administrer facilement les plateformes
+
+- avoir de la visibilité sur les incidents qui surviennent, voire anticiper l'arrivée des incidents (monitoring)
+
+- pouvoir réparer rapidement (procédures)
+
+
+
+
+### Le monde de l'Ops
+
+- Généralement organisé via des outils de ticketing (ITIL)
+
+- Tout changement doit être motivé et tamponné (objectif : stabilité)
+
+
+
+
+### Le monde de l'Ops
+
+Impacts possibles :
+
+- Manque de réactivité sur les nouvelles demandes
+
+- Contraintes fortes liées à la sécurité
+
+- Peu (voir pas) de retour d'informations vers les Dev
+
+
+
+
+### En résumé
+
+
+![dzon](images/people_twin.svg)
+
+
+
+
+### Petites phrases de Devs...
+
+- "Ça marche sur mon poste, donc ça doit fonctionner sur la VM..."
+
+- "Comment ça quelle version de Java ? La dernière…"
+
+- "C’est quoi ton serveur moisi ?"
+
+- "C'est pas mon code le problème, c'est la VM"
+
+
+
+
+### Petites phrases d'Ops
+
+- "Ton code est vraiment tout pourri, c'est pas optimisé !"
+
+- "Pas touche à mes plateformes !"
+
+- "C'est pas la VM le problème, c'est ton application"
+
+- "On ne peut pas faire confiance aux Devs !"
+
+
+
+
+
+Constat n°1 : Le monde du dev ne comprend pas le monde de l'ops.
+
+![wall](images/wallofconfusion.svg)
+
+Constat n°2 : Le monde de l'ops ne comprend pas le monde du dev.
+
+
+
+
+### Mise en lumière des problèmes avec l'Agilité
+
+- 2 semaines d'intégration tous les 6 mois, ce n'est pas choquant
+
+- 2 semaines d'intégration toutes les 2 semaines (sprint) ça commence à devenir problématique
+
+- On veut que lorsque la user story est finie, qu'elle soit vraiment finie !
+
+
+
+
+### Mise en lumière des problèmes avec l'ITIL
+
+- Il peut se passer (très) longtemps entre le commit et le déploiement en production
+
+- La mise en production est un réel événement
+
+- La mise en production sollicite un grand nombre de personnes
diff --git a/Pepiniere/Pepinière/devops/2.apport.md b/Pepiniere/Pepinière/devops/2.apport.md
new file mode 100644
index 0000000..88da1cf
--- /dev/null
+++ b/Pepiniere/Pepinière/devops/2.apport.md
@@ -0,0 +1,156 @@
+
+
+## Le DevOps
+
+
+
+
+### Ce que n'est pas le DevOps
+
+- une nouvelle technologie
+
+- un nouveau métier ou nouvelle fonction dans l’entreprise
+
+- une personne
+
+
+
+
+### Une petite définition DevOps
+
+>Le DevOps est une démarche visant l'adoption d'une _même culture dev et ops_ autour de méthodologies de travail et d'outils dans le but commun d'une _amélioration continue_ :
+* de la productivité
+* de la stabilité des process de développement (ci),
+* de la qualité,
+* et de la mise en production.
+
+
+
+
+Il y a souvent une confusion entre __culture__ et __profil__ DevOps
+
+Le DevOps est une __culture__.
+
+
+
+
+### Le But
+
+Le DevOps veut réconcilier ces deux mondes pour les faire travailler ensemble dans le but d'améliorer :
+
+- le Time To Market (TTM)
+
+- la qualité des développements
+
+- la fiabilité des déploiements
+
+![collaborate](images/collaborate.svg)
+
+
+
+
+### Les Concepts
+
+Le DevOps se base sur le modèle **CALMS** :
+- **C** ulture commune
+
+- **A** utomatisation des tâches répétitives
+
+- **L** ean (Amélioration Continue)
+
+- **M** esure
+
+- **S** olidarité et partage
+
+
+
+
+### CALMS - la Culture
+
+- Favorise la communication
+
+- Réduit les incompréhensions
+
+- Permet de mener un changement d'organisation et/ou de méthodologie
+
+- Entretien l'esprit d'équipe et la motivation
+
+- La productivité
+
+
+
+
+### CALMS - l'Automatisation
+
+- Automatiser tout ce qui peut l'être
+ Builds • Tests • Packaging • Cloud • Déploiements • Configuration • Chaos monkey
+
+- Assure la reproductibilité des actions
+
+- Apporte de la traçabilité
+
+- Évite les erreurs humaines
+
+- Augmente la productivité
+
+- Libère du temps pour les tâches à plus fortes valeurs ajoutées
+
+
+
+
+### CALMS - le Lean
+
+- C'est une théorie de gestion inventée par Toyota
+
+- Vise une recherche constante de la performance et de la qualité
+
+Le __Lean__ permet de :
+
+- supprimer les éléments inutiles et/ou complexes
+
+- trouver des solutions d'amélioration
+
+- résoudre les problèmes et d'en tirer les enseignements
+
+- produire "juste ce qu'il faut" "juste à temps"
+
+
+
+
+### CALMS - la Mesure
+
+- Identification des problèmes, des points d'améliorations,
+ mais aussi des réussites
+
+- Identification des ressources utilisées, de la stabilité globale d'une plateforme
+
+
+
+
+
+### CALMS - la Solidarité
+
+- Favorise la collaboration
+
+- Favorise l'esprit d'équipe
+
+- Amélioration du bien-être des personnes
+
+- Amélioration de la productivité
+
+
+
+
+### CALMS - le Partage
+
+- De l'information
+
+- Des échecs et succès (rétros)
+
+- Des responsabilités
+
+- Des visions (opérationnelle, stratégique)
+
+- Des techniques (outillage)
+
+- Des expériences
diff --git a/Pepiniere/Pepinière/devops/3.origines.md b/Pepiniere/Pepinière/devops/3.origines.md
new file mode 100644
index 0000000..ec2f418
--- /dev/null
+++ b/Pepiniere/Pepinière/devops/3.origines.md
@@ -0,0 +1,83 @@
+
+
+## Les origines du DevOps
+
+Le DevOps s'est essentiellement construit autour de l'_Agilité_ et du _Lean_.
+
+
+
+
+### L'Agilité
+
+- Méthodes pour répondre au besoin : __comment s'organiser pour développer des produits complexes ?__
+- Organisation en **Sprint**
+
+![agilecycle](images/cycle_agile.svg)
+
+
+
+
+### L'Agilité : 4 valeurs
+
+- La cohésion d'équipe
+
+- La production d'application fonctionnelle
+
+- La collaboration avec le client
+
+- L'acceptation du changement
+
+
+
+
+### L'Agilité : 12 principes
+
+![principeagile](images/principes_agile.svg)
+
+
+
+
+### Emprunts du DevOps à l'agilité
+
+- Cohésion et Communication
+(entre développeur et opérationnel)
+
+- Collaboration
+(développeur, opérationnel, business, client, ...)
+
+- Livraisons rapides et régulières
+(jusqu'à la mise en production)
+
+- Confiance et bienveillance
+
+- Réactivité au changement
+
+- Satisfaction client
+
+
+
+
+### Le Lean Management du monde industriel
+
+- Repose sur 5 grands principes (5P)
+
+![5Plean](images/lean.svg)
+
+- `Produit` - conception au plus juste d’un produit (MVP = Minimum Valuable Product).
+- `Process` - automatiser les tâches répétitives, amélioration continue
+- `Personnel` - autonomie et efficacité dans le travail
+- `Performance` - mesurer le progrès et combattre inefficacité
+- `Pilotage` - logique de flux tiré (juste à temps), niveller la production (juste ce qu'il faut)
+
+
+
+
+### Emprunts du DevOps au Lean
+
+- Automatisation des tâches répétitives
+
+- Amélioration continue
+
+- Mesure des difficultés et des progrès
+
+- Efficacité dans le travail
diff --git a/Pepiniere/Pepinière/devops/4.pratique.md b/Pepiniere/Pepinière/devops/4.pratique.md
new file mode 100644
index 0000000..4411f81
--- /dev/null
+++ b/Pepiniere/Pepinière/devops/4.pratique.md
@@ -0,0 +1,66 @@
+
+
+## La pratique du Devops
+
+
+
+
+### La démarche
+
+La démarche DevOps, c'est l'Agilité et l'amélioration continue
+de bout en bout :
+
+![devops_scope](images/devops-scope.svg)
+
+
+
+
+### La démarche
+
+Comparaison avec d'autres méthodologies :
+
+![demarche](images/waterfall_agile_devops.svg)
+
+
+
+
+### Cycle Agile VS Cycle DevOps
+
+
+![cycle_agile](images/cycle_agile.svg)
+
+![cycle_devops](images/devops-toolchain-refactor.svg)
+
+
+
+
+### L'outillage
+
+- `Plan` (Amélioration Continue)
+![confluence](images/confluence.png) ![trello](images/trello.png) ![gitlab](images/gitlab.jpeg)
+- `Code`
+![vscode](images/vscode.jpeg) ![github](images/github.png) ![gitlab](images/gitlab.jpeg)
+- `Build` (Intégration Continue)
+![jenkins](images/jenkins.png) ![travis](images/travis.png) ![gitlab](images/gitlab.jpeg)
+- `Test` (Intégration Continue)
+![selenium](images/selenium.png) ![sonar](images/sonar.png) ![checkmark](images/checkmarx.png)
+
+
+
+
+### L'outillage (suite)
+- `Release` (Livraison Continue)
+![jenkins](images/jenkins.png) ![travis](images/travis.png) ![gitlab](images/gitlab.jpeg)
+- `Deployment` (Déploiment continu)
+![puppet](images/puppet.png) ![ansible](images/ansible.png) ![k8s](images/kubernetes.png)
+- `Operate` (Déploiment continu)
+![bash](images/bash.png) ![terraform](images/terraform.png) ![k8s](images/kubernetes.png)
+- `Monitor` (Amélioration Continue)
+![kibana](images/kibana.jpeg) ![grafana](images/grafana.jpeg) ![prometheus](images/prometheus.jpeg)
+
+
+
+
+### L'outillage
+
+![xebialab](images/periodic_table_devops.png)
diff --git a/Pepiniere/Pepinière/devops/5.integration.md b/Pepiniere/Pepinière/devops/5.integration.md
new file mode 100644
index 0000000..641ccf5
--- /dev/null
+++ b/Pepiniere/Pepinière/devops/5.integration.md
@@ -0,0 +1,101 @@
+
+
+## Mise en place du Devops
+
+
+
+### DevOps et organisation
+
+- Il n'existe pas de système d'organisation universel
+pour mettre en place le DevOps
+
+- Vous seul pouvez définir ce que DevOps signifie pour vous
+
+- Le DevOps ne se résume pas uniquement à l'automatisation via des outils
+
+- La démarche implique un changement de paradigme
+(modèle orienté projet => modèle orienté produit)
+
+
+
+### La Finalité
+
+- La transmission du savoir-faire
+
+- Meilleur usage des infrastructures
+
+- Simplicité
+
+- Satisfaction client
+
+- Réduction du TTM
+
+- La mise en production doit devenir un non-évènement
+
+
+
+### Les clefs du succès
+
+- Apporter de l'énergie, proactivité et désir de connaissances
+
+- Favoriser le travail d'équipe, se faire confiance, être bienveillant, se laisser le droit à l'erreur
+
+- Partager les responsabilités, les problématiques, les succès et les échecs
+
+- Optimiser l'environnement de travail pour favoriser le bien être et la productivité
+
+- Encourager un management plus transparent
+
+
+
+
+### Anti patterns
+
+
+
+
+### Equipe Dev sans les Ops
+
+![team_without_ops](images/devops-topologies-anti-type-c-dev-don-t-need-ops.svg)
+
+
+
+
+### Equipe Sysadmin avec un autre nom
+
+![team_rename](images/devops-topologies-anti-type-e-rebranded-sysadmin.svg)
+
+
+
+
+### Equipe DevOps en silo
+
+![team_silo](images/devops-topologies-anti-type-b-devops-team-silo.svg)
+
+
+
+
+### Patterns
+
+
+
+
+### Collaboration Dev et Ops
+
+![team_collaborate](images/devops-topologies-type-1-dev-and-ops-collaboration.svg)
+
+
+
+
+### Partage complet des responsabilités
+### entre Dev et Ops
+
+
+![team_shared_responsability](images/devops-topologies-type-2-fully-shared-ops-responsabilities.svg)
+
+
+
+
+### Evangélisation Devops
+
+![team_evangelist](images/devops-topologies-type-6-devops-evangelists-team.svg)
diff --git a/Pepiniere/Pepinière/devops/6.conclusion.md b/Pepiniere/Pepinière/devops/6.conclusion.md
new file mode 100644
index 0000000..cab088e
--- /dev/null
+++ b/Pepiniere/Pepinière/devops/6.conclusion.md
@@ -0,0 +1,80 @@
+## Conclusion
+
+
+
+
+### Le DevOps implique
+
+- une nouvelle façon de travailler ensemble
+
+- une nouvelle organisation
+
+- l'utilisation d'outils adaptés aux besoins
+
+- de l'ouverture d'esprit, de la remise en question et éventuellement de la formation des équipes
+
+
+
+
+### Pour le mettre en place, il faut
+
+- une conduite du changement pour faire évoluer les comportements et les mentalités
+
+- redéfinir le rythme via de nouveaux rituels en se basant par exemple sur l'Agilité
+
+- tout le monde doit être acteur de la transformation (dev, ops, manager, métier, ...)
+
+- ne pas avoir peur de l’échec, appendre de ces erreurs et s'améliorer en continue
+
+
+
+
+### DevOps et au-delà...
+
+- DevSecOps
+
+- SRE (Site Reliability Engineering)
+
+
+
+
+### Meetups
+
+- Devops Container:
+https://www.meetup.com/fr-FR/devops-containers/
+- Docker Paris:
+https://www.meetup.com/fr-FR/Docker-Paris/
+- Git Paris:
+https://www.meetup.com/fr-FR/git-Paris/
+- Kubernetes Paris:
+https://www.meetup.com/fr-FR/Kubernetes-Paris/
+- CNCF Paris:
+https://community.cncf.io/paris/
+- Rennes Devops:
+https://www.meetup.com/fr-FR/rennes-devops/
+- Nantes Devops:
+https://www.meetup.com/fr-FR/Nantes-DevOps/?_locale=fr-FR
+
+
+
+
+### Liens utiles:
+
+- Blog tech de la communauté DevOps:
+https://sii-ouest.gitlab.io/devops/blog/articles/demystfication-du-devops/item/
+- Blog tech et formation:
+https://enix.io/
+- Tuto de Xavki:
+https://xavki.blog/
+- Podcast des compagnons du DevOps et de radio DevOps:
+https://lydra.fr/blog/
+- Podcast et interview de Dev’Obs:
+https://devobs.p7t.tech/
+- Interview tech de Electro Monkeys:
+https://podcast.electro-monkeys.fr/
+- Les vidéos DevOps et tech de Krustyhack:
+https://www.youtube.com/channel/UCM0mnsNbecIi_IAPXtHb-TA
+
+
+
+## Des questions ?
diff --git a/Pepiniere/Pepinière/devops/Dockerfile b/Pepiniere/Pepinière/devops/Dockerfile
new file mode 100644
index 0000000..071a961
--- /dev/null
+++ b/Pepiniere/Pepinière/devops/Dockerfile
@@ -0,0 +1,8 @@
+FROM nginx:1.12.2
+LABEL "com.example.vendor" = "SII Ouest"
+LABEL version="1.0"
+LABEL description="Speakup Devops"
+LABEL maintainer="abegou@sii-ouest.com"
+
+#COPY SOURCES FILES
+COPY ./ /usr/share/nginx/html
diff --git a/Pepiniere/Pepinière/devops/README.md b/Pepiniere/Pepinière/devops/README.md
new file mode 100644
index 0000000..da7361a
--- /dev/null
+++ b/Pepiniere/Pepinière/devops/README.md
@@ -0,0 +1,10 @@
+# DevOps
+
+La vision du DevOps par SII.
+
+## Jouer les slides en local
+
+1. Cloner le dépôt :
+`git clone --recurse-submodules https://gitlab.siinergy.net/sii-ouest/dejtechs/devops`
+
+2. Dans Firefox ouvrir le fichier `index.html`
diff --git a/Pepiniere/Pepinière/devops/images/Devops-toolchain.svg b/Pepiniere/Pepinière/devops/images/Devops-toolchain.svg
new file mode 100644
index 0000000..3c09b2b
--- /dev/null
+++ b/Pepiniere/Pepinière/devops/images/Devops-toolchain.svg
@@ -0,0 +1,221 @@
+
+
+
diff --git a/Pepiniere/Pepinière/devops/images/alexan.jpg b/Pepiniere/Pepinière/devops/images/alexan.jpg
new file mode 100644
index 0000000..c367b62
Binary files /dev/null and b/Pepiniere/Pepinière/devops/images/alexan.jpg differ
diff --git a/Pepiniere/Pepinière/devops/images/ansible.png b/Pepiniere/Pepinière/devops/images/ansible.png
new file mode 100644
index 0000000..7eaf857
Binary files /dev/null and b/Pepiniere/Pepinière/devops/images/ansible.png differ
diff --git a/Pepiniere/Pepinière/devops/images/bash.png b/Pepiniere/Pepinière/devops/images/bash.png
new file mode 100644
index 0000000..435eaee
Binary files /dev/null and b/Pepiniere/Pepinière/devops/images/bash.png differ
diff --git a/Pepiniere/Pepinière/devops/images/checkmarx.png b/Pepiniere/Pepinière/devops/images/checkmarx.png
new file mode 100644
index 0000000..cfda6f1
Binary files /dev/null and b/Pepiniere/Pepinière/devops/images/checkmarx.png differ
diff --git a/Pepiniere/Pepinière/devops/images/chris.png b/Pepiniere/Pepinière/devops/images/chris.png
new file mode 100644
index 0000000..fc40815
Binary files /dev/null and b/Pepiniere/Pepinière/devops/images/chris.png differ
diff --git a/Pepiniere/Pepinière/devops/images/collaborate.svg b/Pepiniere/Pepinière/devops/images/collaborate.svg
new file mode 100644
index 0000000..efdc440
--- /dev/null
+++ b/Pepiniere/Pepinière/devops/images/collaborate.svg
@@ -0,0 +1,378 @@
+
+
diff --git a/Pepiniere/Pepinière/devops/images/confluence.png b/Pepiniere/Pepinière/devops/images/confluence.png
new file mode 100644
index 0000000..8794111
Binary files /dev/null and b/Pepiniere/Pepinière/devops/images/confluence.png differ
diff --git a/Pepiniere/Pepinière/devops/images/cycle_agile.svg b/Pepiniere/Pepinière/devops/images/cycle_agile.svg
new file mode 100644
index 0000000..02a0062
--- /dev/null
+++ b/Pepiniere/Pepinière/devops/images/cycle_agile.svg
@@ -0,0 +1,488 @@
+
+
+
+
diff --git a/Pepiniere/Pepinière/devops/images/devops-scope.svg b/Pepiniere/Pepinière/devops/images/devops-scope.svg
new file mode 100644
index 0000000..6cb8dd2
--- /dev/null
+++ b/Pepiniere/Pepinière/devops/images/devops-scope.svg
@@ -0,0 +1,510 @@
+
+
+
+
diff --git a/Pepiniere/Pepinière/devops/images/devops-toolchain-refactor.svg b/Pepiniere/Pepinière/devops/images/devops-toolchain-refactor.svg
new file mode 100644
index 0000000..bc1f362
--- /dev/null
+++ b/Pepiniere/Pepinière/devops/images/devops-toolchain-refactor.svg
@@ -0,0 +1,362 @@
+
+
+
+
\ No newline at end of file
diff --git a/Pepiniere/Pepinière/devops/images/devops-topologies-anti-type-a-dev-and-ops-silos.svg b/Pepiniere/Pepinière/devops/images/devops-topologies-anti-type-a-dev-and-ops-silos.svg
new file mode 100644
index 0000000..a6125c1
--- /dev/null
+++ b/Pepiniere/Pepinière/devops/images/devops-topologies-anti-type-a-dev-and-ops-silos.svg
@@ -0,0 +1,119 @@
+
+
+
+
diff --git a/Pepiniere/Pepinière/devops/images/devops-topologies-anti-type-b-devops-team-silo.svg b/Pepiniere/Pepinière/devops/images/devops-topologies-anti-type-b-devops-team-silo.svg
new file mode 100644
index 0000000..5050eb8
--- /dev/null
+++ b/Pepiniere/Pepinière/devops/images/devops-topologies-anti-type-b-devops-team-silo.svg
@@ -0,0 +1,143 @@
+
+
+
+
diff --git a/Pepiniere/Pepinière/devops/images/devops-topologies-anti-type-c-dev-don-t-need-ops.svg b/Pepiniere/Pepinière/devops/images/devops-topologies-anti-type-c-dev-don-t-need-ops.svg
new file mode 100644
index 0000000..fb5c410
--- /dev/null
+++ b/Pepiniere/Pepinière/devops/images/devops-topologies-anti-type-c-dev-don-t-need-ops.svg
@@ -0,0 +1,143 @@
+
+
+
+
diff --git a/Pepiniere/Pepinière/devops/images/devops-topologies-anti-type-e-rebranded-sysadmin.svg b/Pepiniere/Pepinière/devops/images/devops-topologies-anti-type-e-rebranded-sysadmin.svg
new file mode 100644
index 0000000..7b92f99
--- /dev/null
+++ b/Pepiniere/Pepinière/devops/images/devops-topologies-anti-type-e-rebranded-sysadmin.svg
@@ -0,0 +1,143 @@
+
+
+
+
diff --git a/Pepiniere/Pepinière/devops/images/devops-topologies-anti-type-f-embedded-in-dev-team.svg b/Pepiniere/Pepinière/devops/images/devops-topologies-anti-type-f-embedded-in-dev-team.svg
new file mode 100644
index 0000000..e17d166
--- /dev/null
+++ b/Pepiniere/Pepinière/devops/images/devops-topologies-anti-type-f-embedded-in-dev-team.svg
@@ -0,0 +1,146 @@
+
+
+
+
diff --git a/Pepiniere/Pepinière/devops/images/devops-topologies-type-1-dev-and-ops-collaboration.svg b/Pepiniere/Pepinière/devops/images/devops-topologies-type-1-dev-and-ops-collaboration.svg
new file mode 100644
index 0000000..f3e22ab
--- /dev/null
+++ b/Pepiniere/Pepinière/devops/images/devops-topologies-type-1-dev-and-ops-collaboration.svg
@@ -0,0 +1,119 @@
+
+
+
+
diff --git a/Pepiniere/Pepinière/devops/images/devops-topologies-type-2-fully-shared-ops-responsabilities.svg b/Pepiniere/Pepinière/devops/images/devops-topologies-type-2-fully-shared-ops-responsabilities.svg
new file mode 100644
index 0000000..450c50b
--- /dev/null
+++ b/Pepiniere/Pepinière/devops/images/devops-topologies-type-2-fully-shared-ops-responsabilities.svg
@@ -0,0 +1,119 @@
+
+
+
+
diff --git a/Pepiniere/Pepinière/devops/images/devops-topologies-type-3-ops-as-infrastructure-as-a-service-platform.svg b/Pepiniere/Pepinière/devops/images/devops-topologies-type-3-ops-as-infrastructure-as-a-service-platform.svg
new file mode 100644
index 0000000..daf4611
--- /dev/null
+++ b/Pepiniere/Pepinière/devops/images/devops-topologies-type-3-ops-as-infrastructure-as-a-service-platform.svg
@@ -0,0 +1,147 @@
+
+
+
+
diff --git a/Pepiniere/Pepinière/devops/images/devops-topologies-type-5-devops-team-with-an-expiry-date.svg b/Pepiniere/Pepinière/devops/images/devops-topologies-type-5-devops-team-with-an-expiry-date.svg
new file mode 100644
index 0000000..a33ee81
--- /dev/null
+++ b/Pepiniere/Pepinière/devops/images/devops-topologies-type-5-devops-team-with-an-expiry-date.svg
@@ -0,0 +1,147 @@
+
+
+
+
diff --git a/Pepiniere/Pepinière/devops/images/devops-topologies-type-6-devops-evangelists-team.svg b/Pepiniere/Pepinière/devops/images/devops-topologies-type-6-devops-evangelists-team.svg
new file mode 100644
index 0000000..8aeb3e3
--- /dev/null
+++ b/Pepiniere/Pepinière/devops/images/devops-topologies-type-6-devops-evangelists-team.svg
@@ -0,0 +1,147 @@
+
+
+
+
diff --git a/Pepiniere/Pepinière/devops/images/devops-topologies-type-8-container-driven-collaboration.svg b/Pepiniere/Pepinière/devops/images/devops-topologies-type-8-container-driven-collaboration.svg
new file mode 100644
index 0000000..56d0f3c
--- /dev/null
+++ b/Pepiniere/Pepinière/devops/images/devops-topologies-type-8-container-driven-collaboration.svg
@@ -0,0 +1,147 @@
+
+
+
+
diff --git a/Pepiniere/Pepinière/devops/images/devops_refactor.svg b/Pepiniere/Pepinière/devops/images/devops_refactor.svg
new file mode 100644
index 0000000..429bbc4
--- /dev/null
+++ b/Pepiniere/Pepinière/devops/images/devops_refactor.svg
@@ -0,0 +1,98 @@
+
+
+
+
diff --git a/Pepiniere/Pepinière/devops/images/github.png b/Pepiniere/Pepinière/devops/images/github.png
new file mode 100644
index 0000000..1377716
Binary files /dev/null and b/Pepiniere/Pepinière/devops/images/github.png differ
diff --git a/Pepiniere/Pepinière/devops/images/gitlab.jpeg b/Pepiniere/Pepinière/devops/images/gitlab.jpeg
new file mode 100644
index 0000000..5cd2fa4
Binary files /dev/null and b/Pepiniere/Pepinière/devops/images/gitlab.jpeg differ
diff --git a/Pepiniere/Pepinière/devops/images/grafana.jpeg b/Pepiniere/Pepinière/devops/images/grafana.jpeg
new file mode 100644
index 0000000..bb0d809
Binary files /dev/null and b/Pepiniere/Pepinière/devops/images/grafana.jpeg differ
diff --git a/Pepiniere/Pepinière/devops/images/jenkins.png b/Pepiniere/Pepinière/devops/images/jenkins.png
new file mode 100644
index 0000000..d56aa75
Binary files /dev/null and b/Pepiniere/Pepinière/devops/images/jenkins.png differ
diff --git a/Pepiniere/Pepinière/devops/images/kibana.jpeg b/Pepiniere/Pepinière/devops/images/kibana.jpeg
new file mode 100644
index 0000000..54f5b1e
Binary files /dev/null and b/Pepiniere/Pepinière/devops/images/kibana.jpeg differ
diff --git a/Pepiniere/Pepinière/devops/images/kubernetes.png b/Pepiniere/Pepinière/devops/images/kubernetes.png
new file mode 100644
index 0000000..7b4ddd5
Binary files /dev/null and b/Pepiniere/Pepinière/devops/images/kubernetes.png differ
diff --git a/Pepiniere/Pepinière/devops/images/lean.svg b/Pepiniere/Pepinière/devops/images/lean.svg
new file mode 100644
index 0000000..95b8ef9
--- /dev/null
+++ b/Pepiniere/Pepinière/devops/images/lean.svg
@@ -0,0 +1,159 @@
+
+
+
+
diff --git a/Pepiniere/Pepinière/devops/images/people_twin.svg b/Pepiniere/Pepinière/devops/images/people_twin.svg
new file mode 100644
index 0000000..c2ef1d7
--- /dev/null
+++ b/Pepiniere/Pepinière/devops/images/people_twin.svg
@@ -0,0 +1,734 @@
+
+
diff --git a/Pepiniere/Pepinière/devops/images/periodic_table_devops.png b/Pepiniere/Pepinière/devops/images/periodic_table_devops.png
new file mode 100644
index 0000000..10d8fd0
Binary files /dev/null and b/Pepiniere/Pepinière/devops/images/periodic_table_devops.png differ
diff --git a/Pepiniere/Pepinière/devops/images/principes_agile.svg b/Pepiniere/Pepinière/devops/images/principes_agile.svg
new file mode 100644
index 0000000..b9a7114
--- /dev/null
+++ b/Pepiniere/Pepinière/devops/images/principes_agile.svg
@@ -0,0 +1,412 @@
+
+
+
+
diff --git a/Pepiniere/Pepinière/devops/images/prometheus.jpeg b/Pepiniere/Pepinière/devops/images/prometheus.jpeg
new file mode 100644
index 0000000..8b859e8
Binary files /dev/null and b/Pepiniere/Pepinière/devops/images/prometheus.jpeg differ
diff --git a/Pepiniere/Pepinière/devops/images/puppet.png b/Pepiniere/Pepinière/devops/images/puppet.png
new file mode 100644
index 0000000..0683e06
Binary files /dev/null and b/Pepiniere/Pepinière/devops/images/puppet.png differ
diff --git a/Pepiniere/Pepinière/devops/images/selenium.png b/Pepiniere/Pepinière/devops/images/selenium.png
new file mode 100644
index 0000000..2e0b71b
Binary files /dev/null and b/Pepiniere/Pepinière/devops/images/selenium.png differ
diff --git a/Pepiniere/Pepinière/devops/images/sonar.png b/Pepiniere/Pepinière/devops/images/sonar.png
new file mode 100644
index 0000000..c945bf4
Binary files /dev/null and b/Pepiniere/Pepinière/devops/images/sonar.png differ
diff --git a/Pepiniere/Pepinière/devops/images/terraform.png b/Pepiniere/Pepinière/devops/images/terraform.png
new file mode 100644
index 0000000..6b559f4
Binary files /dev/null and b/Pepiniere/Pepinière/devops/images/terraform.png differ
diff --git a/Pepiniere/Pepinière/devops/images/travis.png b/Pepiniere/Pepinière/devops/images/travis.png
new file mode 100644
index 0000000..e76b4a9
Binary files /dev/null and b/Pepiniere/Pepinière/devops/images/travis.png differ
diff --git a/Pepiniere/Pepinière/devops/images/trello.png b/Pepiniere/Pepinière/devops/images/trello.png
new file mode 100644
index 0000000..225cf1c
Binary files /dev/null and b/Pepiniere/Pepinière/devops/images/trello.png differ
diff --git a/Pepiniere/Pepinière/devops/images/versus-retro-style.jpg b/Pepiniere/Pepinière/devops/images/versus-retro-style.jpg
new file mode 100644
index 0000000..42855ba
Binary files /dev/null and b/Pepiniere/Pepinière/devops/images/versus-retro-style.jpg differ
diff --git a/Pepiniere/Pepinière/devops/images/vscode.jpeg b/Pepiniere/Pepinière/devops/images/vscode.jpeg
new file mode 100644
index 0000000..f37af22
Binary files /dev/null and b/Pepiniere/Pepinière/devops/images/vscode.jpeg differ
diff --git a/Pepiniere/Pepinière/devops/images/wallofconfusion.svg b/Pepiniere/Pepinière/devops/images/wallofconfusion.svg
new file mode 100644
index 0000000..6163742
--- /dev/null
+++ b/Pepiniere/Pepinière/devops/images/wallofconfusion.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/Pepiniere/Pepinière/devops/images/waterfall_agile_devops.svg b/Pepiniere/Pepinière/devops/images/waterfall_agile_devops.svg
new file mode 100644
index 0000000..1d49c0c
--- /dev/null
+++ b/Pepiniere/Pepinière/devops/images/waterfall_agile_devops.svg
@@ -0,0 +1,665 @@
+
+
+
+
diff --git a/Pepiniere/Pepinière/devops/index.html b/Pepiniere/Pepinière/devops/index.html
new file mode 100755
index 0000000..149d316
--- /dev/null
+++ b/Pepiniere/Pepinière/devops/index.html
@@ -0,0 +1,142 @@
+
+
+
+
+
+
+ SII - DevOps
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Code syntax highlighting courtesy of highlight.js.
+
+
+
+
Marvelous List
+
+
No order here
+
Or here
+
Or here
+
Or here
+
+
+
+
+
Fantastic Ordered List
+
+
One is smaller than...
+
Two is smaller than...
+
Three!
+
+
+
+
+
Tabular Tables
+
+
+
+
Item
+
Value
+
Quantity
+
+
+
+
+
Apples
+
$1
+
7
+
+
+
Lemonade
+
$2
+
18
+
+
+
Bread
+
$3
+
2
+
+
+
+
+
+
+
Clever Quotes
+
+ These guys come in two forms, inline: The nice thing about standards is that there are so many to choose from and block:
+
+
+ “For years there has been a theory that millions of monkeys typing at random on millions of typewriters would
+ reproduce the entire works of Shakespeare. The Internet has proven this theory to be untrue.”
+
+
+
+
+
Intergalactic Interconnections
+
+ You can link between slides internally,
+ like this.
+
+
+
+
+
Speaker View
+
There's a speaker view. It includes a timer, preview of the upcoming slide as well as your speaker notes.
+ Set data-state="something" on a slide and "something"
+ will be added as a class to the document element when the slide is open. This lets you
+ apply broader style changes, like switching the page background.
+
+
+
+
+
State Events
+
+ Additionally custom events can be triggered on a per slide basis by binding to the data-state name.
+