Ceci est une ancienne révision du document !
Table des matières
Version - 2020.01
Dernière mise-à-jour : 2020/05/27 17:00
DOF504 - Facts, Facts Secrets et Docker
Contenu du Module
- DOF504 - Facts, Facts Secrets et Docker
- LAB #11 - Utilisation des Facts d'Ansible
- LAB #12 - La Commande ansible-vault
- Crypter le Fichier
- Editer le Fichier
- Décrypter le Fichier
- Utilisation de Mots de Passe Aléatoires
- LAB #13 - Ansible et Docker
- Présentation de Docker
- Installer Docker
- La Connexion à Docker
LAB #11 - Utilisation des Facts d'Ansible
Ansible Facts sont :
- des variables collectées automatiquement par le module setup d'Ansible lors du contrôle à distance d'un hôte,
- spécifiques à l'hôte concerné.
Il est cependant possible d'exécuter ce module manuellement afin de voir les Facts collectées :
trainee@ansible:~/.ansible/roles$ ansible all -i web01, -m setup web01 | SUCCESS => { "ansible_facts": { "ansible_all_ipv4_addresses": [ "10.0.2.11" ], "ansible_all_ipv6_addresses": [ "fe80::930d:2780:8f4f:3b5" ], "ansible_apparmor": { "status": "disabled" }, "ansible_architecture": "x86_64", "ansible_bios_date": "12/01/2006", "ansible_bios_version": "VirtualBox", "ansible_cmdline": { "BOOT_IMAGE": "/boot/vmlinuz-4.9.0-8-amd64", "quiet": true, "ro": true, "root": "UUID=b29b93ed-8de4-4980-a407-15bba3ad09ba" }, "ansible_date_time": { "date": "2019-01-30", "day": "30", "epoch": "1548832320", "hour": "08", "iso8601": "2019-01-30T07:12:00Z", "iso8601_basic": "20190130T081200108341", "iso8601_basic_short": "20190130T081200", "iso8601_micro": "2019-01-30T07:12:00.108409Z", "minute": "12", "month": "01", "second": "00", "time": "08:12:00", "tz": "CET", "tz_offset": "+0100", "weekday": "mercredi", "weekday_number": "3", "weeknumber": "04", "year": "2019" }, ... "module_setup": true }, "changed": false }
Important : Notez que le nom de chaque Fact commence par ansible_. Évitez donc de créer des variables commençant var cette valeur !
Parmi les Facts, les plus utiles sont :
- “ansible_hostname”: “web01”,
- “ansible_fqdn”: “web01.i2tch.loc”,
- “ansible_architecture”: “x86_64”,
- “ansible_distribution”: “Debian”,
- “ansible_distribution_major_version”: “9”,
- “ansible_distribution_version”: “9.7”,
- “ansible_os_family”: “Debian”,
- “ansible_memtotal_mb”: 240,
- “ansible_processor_cores”: 1,
- “ansible_virtualization_role”: “guest”.
Ainsi que dictionnaire ansible_default_ipv4 :
"ansible_default_ipv4": { "address": "10.0.2.11", "alias": "enp0s3", "broadcast": "10.0.2.255", "gateway": "10.0.2.2", "interface": "enp0s3", "macaddress": "08:00:27:16:85:dc", "mtu": 1500, "netmask": "255.255.255.0", "network": "10.0.2.0", "type": "ether" }
Démarrez maintenant la machine virtuelle TargetB. Si vous participez dans une FAD, utilisez les commandes suivantes :
trainee@ansible:~$ exit déconnexion Connection to localhost closed. desktop@server16:~$ VBoxManage startvm TargetB --type headless Waiting for VM "TargetB" to power on... VM "TargetB" has been successfully started. desktop@server16:~$ ssh -l trainee localhost -p 2222 trainee@localhost's password: Linux ansible.i2tch.loc 4.9.0-8-amd64 #1 SMP Debian 4.9.130-2 (2018-10-27) x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Sun Apr 12 09:57:34 2020 from 10.0.2.2 root@ansible:~#
Modifiez ensuite le fichier /etc/hosts de la machine Ansible :
trainee@ansible:~/.ansible/roles$ su - Mot de passe : fenestros root@ansible:~# vi /etc/hosts root@ansible:~# cat /etc/hosts 127.0.0.1 localhost 127.0.1.1 ansible.i2tch.loc ansible 10.0.2.9 ansible.i2tch.loc ansible 10.0.2.10 targeta.i2tch.loc targeta 10.0.2.11 web01.i2tch.loc web01 10.0.2.12 web02.i2tch.loc web02 10.0.2.13 web03.i2tch.loc web03 10.0.2.14 web04.i2tch.loc web04 10.0.2.15 targetb.i2tch.loc targetb # The following lines are desirable for IPv6 capable hosts ::1 localhost ip6-localhost ip6-loopback ff02::1 ip6-allnodes ff02::2 ip6-allrouters root@ansible:~# exit déconnexion trainee@ansible:~/.ansible/roles$
Modifiez le fichier inventory en mettant les deux machines TargetA et TargetB dans le groupe linux :
trainee@ansible:~/.ansible/roles$ vi inventory trainee@ansible:~/.ansible/roles$ cat inventory [linux] targeta targetb [group1] localhost ansible_connection=local [basededonnees] web01 [dotcms] web02 web03 [equilibrage] web04 [debian:children] basededonnees dotcms equilibrage [debian:vars] ansible_user=trainee
Modifiez le fichier playbook.yaml afin d'utiliser le Rôle exemple01.java en tant qu'utilisateur privilégié :
trainee@ansible:~/.ansible/roles$ vi playbook.yaml trainee@ansible:~/.ansible/roles$ cat playbook.yaml --- - hosts: all become: true roles: - exemple01.java
Connectez-vous à la machine TargetA et supprimez le paquet openjdk-8-jre :
trainee@ansible:~/.ansible/roles$ ssh targeta The authenticity of host 'targeta (10.0.2.10)' can't be established. ECDSA key fingerprint is SHA256:sEfHBv9azmK60cjqF/aJgUc9jg56slNaZQdAUcvBOvE. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'targeta' (ECDSA) to the list of known hosts. Debian GNU/Linux 9 Linux targeta.i2tch.loc 4.9.0-8-amd64 #1 SMP Debian 4.9.130-2 (2018-10-27) x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Sat Feb 9 16:40:14 2019 from 10.0.2.9 trainee@targeta:~$ su - Mot de passe : fenestros root@targeta:~# apt-get -y remove openjdk-8-jre root@targeta:~# exit déconnexion trainee@targeta:~$ exit déconnexion Connection to targeta closed.
Important : Notez que le mot de passe fenestros ne sera pas en clair.
Connectez-vous à la machine TargetB et supprimez le paquet java-1.8.0-openjdk :
trainee@ansible:~/.ansible/roles$ ssh targetb The authenticity of host 'targetb (10.0.2.15)' can't be established. ECDSA key fingerprint is SHA256:RgOsp/XI7JHNq+oIfHKw+jkHdtTnBIh+Dd7kVmHRxtU. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'targetb' (ECDSA) to the list of known hosts. Last login: Sat Feb 9 16:42:41 2019 from 10.0.2.9 [trainee@targetb ~]$ su - Mot de passe : fenestros Dernière connexion : samedi 9 février 2019 à 15:42:49 CET sur pts/0 [root@targetb ~]# yum -y remove java-1.8.0-openjdk [root@targetb ~]# exit logout [trainee@targetb ~]$ exit déconnexion Connection to targetb closed.
Important : Notez que le mot de passe fenestros ne sera pas en clair.
Grâce au Fact ansible_os_family il est possible d'appliquer le fichier /home/trainee/.ansible/roles/exemple01.java/tasks/main.yaml au deux distributions. Notez l'utilisation de la clause when :
trainee@ansible:~/.ansible/roles$ vi exemple01.java/tasks/main.yaml trainee@ansible:~/.ansible/roles$ cat exemple01.java/tasks/main.yaml --- - name: install jre (Debian) package: name=openjdk-8-jre state=present when: ansible_os_family == 'Debian' - name: install jre (CentOS) package: name=java-1.8.0-openjdk state=present when: ansible_os_family == 'RedHat'
Exécutez ansible-playbook et constatez le résultat :
trainee@ansible:~/.ansible/roles$ ansible-playbook -i inventory playbook.yaml -l linux PLAY [all] ************************************************************************************************************************************************************** TASK [Gathering Facts] ************************************************************************************************************************************************** ok: [targeta] ok: [targetb] TASK [exemple01.java : install jre (Debian)] **************************************************************************************************************************** skipping: [targetb] changed: [targeta] TASK [exemple01.java : install jre (CentOS)] **************************************************************************************************************************** skipping: [targeta] changed: [targetb] PLAY RECAP ************************************************************************************************************************************************************** targeta : ok=2 changed=1 unreachable=0 failed=0 targetb : ok=2 changed=1 unreachable=0 failed=0
Les conditions peuvent être combinées grâce à and et or. En voici un exemple :
tasks: - name: "Extinction des systèmes CentOS 6 et Debian 7" command: /sbin/shutdown -t now when: (ansible_distribution == "CentOS" and ansible_distribution_major_version == "6") or (ansible_distribution == "Debian" and ansible_distribution_major_version == "7")
LAB #12 - La Commande ansible-vault
La commande ansible-vault permet de créer et utiliser des fichiers cryptés, par exemple ceux qui contiennent des mots de passe.
Pour illustrer son utilisation, créez le Rôle vault :
trainee@ansible:~/.ansible/roles$ mkdir vault
Éditez le fichier /home/trainee/.ansible/roles/group_vars/all.yaml :
trainee@ansible:~/.ansible/roles$ vi /home/trainee/.ansible/roles/group_vars/all.yaml trainee@ansible:~/.ansible/roles$ cat /home/trainee/.ansible/roles/group_vars/all.yaml --- secret: gardezmoisecret
Modifiez le fichier /home/trainee/.ansible/roles/playbook.yaml :
trainee@ansible:~/.ansible/roles$ vi playbook.yaml trainee@ansible:~/.ansible/roles$ cat playbook.yaml --- - hosts: all tasks: - debug: msg: "Le secret est {{ secret }}"
Exécutez la commande ansible-playbook :
trainee@ansible:~/.ansible/roles$ ansible-playbook -i inventory playbook.yaml -l localhost PLAY [all] ************************************************************************************************************************************************************** TASK [Gathering Facts] ************************************************************************************************************************************************** ok: [localhost] TASK [debug] ************************************************************************************************************************************************************ ok: [localhost] => { "msg": "Le secret est gardezmoisecret" } PLAY RECAP ************************************************************************************************************************************************************** localhost : ok=2 changed=0 unreachable=0 failed=0
Important : L'exécution démontre que la variable secret est bien lue.
Crypter le Fichier
Cryptez maintenant le fichier /home/trainee/.ansible/roles/group_vars/all.yaml en utilisant la commande ansible-vault :
trainee@ansible:~/.ansible/roles$ ansible-vault encrypt group_vars/all.yaml New Vault password: fenestros Confirm New Vault password: fenestros Encryption successful
Important : Notez que le mot de passe fenestros ne sera pas en clair.
Important : Notez que le mot de passe est pour la commande ansible-vault et non pas uniquement pour l'action de cryptage en cours.
Constatez maintenant le contenu du fichier /home/trainee/.ansible/roles/group_vars/all.yaml :
trainee@ansible:~/.ansible/roles$ cat /home/trainee/.ansible/roles/group_vars/all.yaml $ANSIBLE_VAULT;1.1;AES256 65386665623833656366383938313561666433393865613465656365633166613263343361303361 3834616631626232353438393331333238316434656339300a386636626239323661656563393535 35636434663062316530346161383030626163303831323735636232366637336633663032616364 6337313434333831620a396130616138306161303330333730323866396135373830613636353730 36646532393537343563383434363364623336643333393936613634653637396439
Exécutez de nouveau la commande ansible-playbook :
trainee@ansible:~/.ansible/roles$ ansible-playbook -i inventory playbook.yaml -l localhost PLAY [all] ************************************************************************************************************************************************************** ERROR! Attempting to decrypt but no vault secrets found
Important : Notez l'erreur due au fait que le fichier a été crypté.
Pour indiquer à la commande ansible-playbook que le fichier qui doit être lu soit crypté, utilisez l'option –ask-vault-pass :
trainee@ansible:~/.ansible/roles$ ansible-playbook -i inventory playbook.yaml -l localhost --ask-vault-pass Vault password:fenestros PLAY [all] ************************************************************************************************************************************************************** TASK [Gathering Facts] ************************************************************************************************************************************************** ok: [localhost] TASK [debug] ************************************************************************************************************************************************************ ok: [localhost] => { "msg": "Le secret est gardezmoisecret" } PLAY RECAP ************************************************************************************************************************************************************** localhost : ok=2 changed=0 unreachable=0 failed=0
Important : Notez que le mot de passe fenestros ne sera pas en clair.
Editer le Fichier
Pour éditer le fichier, utilisez la sous-commande edit de la commande ansible-vault :
trainee@ansible:~/.ansible/roles$ ansible-vault edit group_vars/all.yaml Vault password: fenestros
Important : Notez que le mot de passe fenestros ne sera pas en clair.
Le fichier est chargé en mémoire pour édition :
--- secret: gardezmoisecret ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ "/tmp/tmpn2p84qb3.yaml" 2 lines, 28 characters
Modifiez le secret et sauvegardez le fichier :
--- secret: gardezlesecret ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ :x
Constatez que le contenu du fichier /home/trainee/.ansible/roles/group_vars/all.yaml est toujours crypté :
trainee@ansible:~/.ansible/roles$ cat /home/trainee/.ansible/roles/group_vars/all.yaml $ANSIBLE_VAULT;1.1;AES256 62356135383762346138326536396438646331313533326630373431313063663630343031353733 3032323565656264313738326462613961353963336264620a656430343634643764623337653137 33656438353831346230653764306461393235386464326132303239396438643263343962353030 3561376633396465630a616161636236303662626531323430353430663762383131666437303566 62303538613338636664623232323734643937316663623637363965383637646639
Exécutez de nouveau la commande ansible-playbook avec l'option –ask-vault-pass :
trainee@ansible:~/.ansible/roles$ ansible-playbook -i inventory playbook.yaml -l localhost --ask-vault-pass Vault password: PLAY [all] ************************************************************************************************************************************************************** TASK [Gathering Facts] ************************************************************************************************************************************************** ok: [localhost] TASK [debug] ************************************************************************************************************************************************************ ok: [localhost] => { "msg": "Le secret est gardezlesecret" } PLAY RECAP ************************************************************************************************************************************************************** localhost : ok=2 changed=0 unreachable=0 failed=0
Important : Notez que le mot de passe fenestros ne sera pas en clair.
Décrypter le Fichier
Il est possible de décrypter le fichier en utilisant la sous-commande decrypt de la commande ansible-vault :
trainee@ansible:~/.ansible/roles$ ansible-vault decrypt group_vars/all.yaml Vault password: fenestros Decryption successful
Important : Notez que le mot de passe fenestros ne sera pas en clair.
Constatez que le contenu du fichier /home/trainee/.ansible/roles/group_vars/all.yaml n'est plus crypté :
trainee@ansible:~/.ansible/roles$ cat /home/trainee/.ansible/roles/group_vars/all.yaml --- secret: gardezlesecret
Utilisation de Mots de Passe Aléatoires
Installez le paquet pwgen :
trainee@ansible:~/.ansible/roles$ su - Mot de passe : root@ansible:~# apt-get install pwgen root@ansible:~# exit déconnexion
Utilisez maintenant la commande pwgen pour générer un mot de passe aléatoire :
trainee@ansible:~/.ansible/roles$ pwgen 16 1 aqu2VeifohMue2Ee
Utilisez pwgen pour créer un mot de passe aléatoire contenu dans un fichier :
trainee@ansible:~/.ansible/roles$ pwgen 16 1 > vault-password trainee@ansible:~/.ansible/roles$ ls debug exemple01.java exemple1 geerlingguy.java group_vars haproxy host_vars inventory playbook.retry playbook.yaml tomcat vault-password vault trainee@ansible:~/.ansible/roles$ cat vault-password waide5sheemohZ4e
Utilisez maintenant le mot de passe aléatoire contenu dans le fichier vault-password pour crypter le fichier /home/trainee/.ansible/roles/group_vars/all.yaml :
trainee@ansible:~/.ansible/roles$ ansible-vault encrypt group_vars/all.yaml --vault-password-file vault-password Encryption successful
Constatez le contenu du fichier /home/trainee/.ansible/roles/group_vars/all.yaml :
trainee@ansible:~/.ansible/roles$ cat group_vars/all.yaml $ANSIBLE_VAULT;1.1;AES256 33363436656334616461646164393366636639356533323639636131373131343933636631383738 6465306265353838643132633234356538656137636332660a323965613931363065396234313961 31313330646632643431383262623639373731616237663435306533353263643566353132363238 6439626633343738370a306631333861323433333364643736666561386136363966303239343264 64373430383336323139396334346637316461393961633838303035386262396662
Exécutez de nouveau la commande ansible-playbook avec l'option –vault-password-file :
trainee@ansible:~/.ansible/roles$ ansible-playbook -i inventory playbook.yaml -l localhost --vault-password-file vault-password PLAY [all] ************************************************************************************************************************************************************** TASK [Gathering Facts] ************************************************************************************************************************************************** ok: [localhost] TASK [debug] ************************************************************************************************************************************************************ ok: [localhost] => { "msg": "Le secret est gardezlesecret" } PLAY RECAP ************************************************************************************************************************************************************** localhost : ok=2 changed=0 unreachable=0 failed=0
LAB #13 - Ansible et Docker
Présentation de Docker
Docker est une application de virtualisation légère qui utilise des images et des conteneurs.
Une image est un paquet exécutable contenant tout ce qu'il est nécessaire afin d'exécuter un logiciel donné, incluant :
- le code
- un runtime
- des bibliothèques,
- des variables d'environnement
- des fichiers de configuration
Un conteneur est une instance de l'image en cours d'exécution en mémoire. Elle est isolée de l'environnement de l'hôte par défaut mais peut accéder à des fichiers et de ports de l'hôte selon la configuration.
Les conteneurs exécutent des applications nativement en utilisant le noyau de la machine hôte. De ce fait les performances d'un conteneur sont supérieures à celles d'une machine virtuelle qui doit passer par un hyperviseur pour accéder aux ressources de la machine hôte :
Docker existe en deux versions Docker-CE (Docker Community Edition) et Docker-EE (Docker Enterprise Edition). Pour consulter les différences entre les deux versions, consultez le lien https://docs.docker.com/engine/installation/.
Installer docker
Docker n'est pas dans le dépôts de Debian. Afin de l'installer il convient d'ajouter le dépôt de docker. Premièrement, il est nécessaire d'installer les paquets permettant à Debian d'utiliser un dépôt en https :
trainee@ansible:~$ su - Mot de passe : root@ansible:~# apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common
Téléchargez la clef GPG officielle de docker :
root@ansible:~# curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add - OK
Vérifiez que l'ID de la clef est 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 :
root@ansible:~# apt-key fingerprint 0EBFCD88 pub rsa4096 2017-02-22 [SCEA] 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 uid [ unknown] Docker Release (CE deb) <docker@docker.com> sub rsa4096 2017-02-22 [S]
Ajoutez le dépôt stable de docker :
root@ansible:~# add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
Important - Notez que la commande lsb_release -cs retourne le nom de la distribution Debian, à savoir dans ce cas stretch.
Installez maintenant le paquet docker-ce :
root@ansible:~# apt-get update ... root@ansible:~# apt-get install docker-ce
Dernièrement, vérifiez la version de Docker client et serveur :
root@ansible:~# docker version Client: Version: 18.09.1 API version: 1.39 Go version: go1.10.6 Git commit: 4c52b90 Built: Wed Jan 9 19:35:59 2019 OS/Arch: linux/amd64 Experimental: false Server: Docker Engine - Community Engine: Version: 18.09.1 API version: 1.39 (minimum version 1.12) Go version: go1.10.6 Git commit: 4c52b90 Built: Wed Jan 9 19:02:44 2019 OS/Arch: linux/amd64 Experimental: false
Important - Docker est composé de trois éléments : un serveur, un client et un ou plusieurs Repositories ou Dépôts en français.
Démarrez un conteneur dénommé postgresql en mode détaché à partir d'une image CentOS :
root@ansible:~# docker run -d --name postgresql centos sleep infinity Unable to find image 'centos:latest' locally latest: Pulling from library/centos a02a4930cb5d: Pull complete Digest: sha256:184e5f35598e333bfa7de10d8fb1cebb5ee4df5bc0f970bf2b1e7c7345136426 Status: Downloaded newer image for centos:latest 220c66d30fa66a016e8bb171d6ce69c8f5b2e7966f700317e7dcc1fe6398cb5c
Vérifiez que le conteneur fonctionne :
root@ansible:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 220c66d30fa6 centos "sleep infinity" 2 minutes ago Up 2 minutes postgresql
La Connexion à Docker
Créez maintenant le Rôle docker :
trainee@ansible:~$ mkdir .ansible/roles/docker trainee@ansible:~$ cd .ansible/roles trainee@ansible:~/.ansible/roles$
Modifiez ensuite le fichier playbook.yaml :
trainee@ansible:~/.ansible/roles$ vi playbook.yaml trainee@ansible:~/.ansible/roles$ cat playbook.yaml --- - hosts: all tasks: - name: message debug: msg="Conteneur - {{ inventory_hostname }} sous {{ansible_distribution}}" - name: install package: name=postgresql state=present
Modifiez le fichier inventory :
trainee@ansible:~/.ansible/roles$ cp inventory inventory.old trainee@ansible:~/.ansible/roles$ vi inventory trainee@ansible:~/.ansible/roles$ cat inventory postgresql ansible_connection=docker
Supprimez le fichier /home/trainee/.ansible/roles/group_vars/all.yaml :
<code> trainee@ansible:~/.ansible/roles$ rm -rf /home/trainee/.ansible/roles/group_vars/all.yaml
Exécutez la commande ansible-playbook en tant que root :
trainee@ansible:~/.ansible/roles$ su - Mot de passe : root@ansible:~# cd /home/trainee/.ansible/roles/ root@ansible:/home/trainee/.ansible/roles# ansible-playbook -i inventory playbook.yaml PLAY [all] ************************************************************************************************************************************************************** TASK [Gathering Facts] ************************************************************************************************************************************************** ok: [postgresql] TASK [message] ********************************************************************************************************************************************************** ok: [postgresql] => { "msg": "Conteneur - postgresql sous CentOS" } TASK [install] ********************************************************************************************************************************************************** changed: [postgresql] PLAY RECAP ************************************************************************************************************************************************************** postgresql : ok=3 changed=1 unreachable=0 failed=0
Vérifiez maintenant que postgresql a été installé dans le conteneur :
root@ansible:/home/trainee/.ansible/roles# docker exec -it postgresql /bin/bash [root@220c66d30fa6 /]# psql --version psql (PostgreSQL) 9.2.24
<html>
Copyright © 2020 Hugh NORRIS
</html>