Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
elearning:workbooks:debian:6:avance:l130:part3 [2022/03/09 18:44] adminelearning:workbooks:debian:6:avance:l130:part3 [2023/08/25 01:29] (Version actuelle) admin
Ligne 1: Ligne 1:
 ~~PDF:LANDSCAPE~~ ~~PDF:LANDSCAPE~~
  
-Version - **2022.01**+Version - **2023.01**
  
 Dernière mise-à-jour : ~~LASTMOD~~ Dernière mise-à-jour : ~~LASTMOD~~
  
-====== DOF503 - Rôles, Gabarits et Hiérarchie des Variables======+====== LCF803 - Rôles, GabaritsVariables et Facts======
  
 =====Contenu du Module===== =====Contenu du Module=====
  
-  * **DOF503 - Rôles, Gabarits et Hiérarchie des Variables**+  * **LCF803 - Rôles, GabaritsVariables et Facts**
     * Contenu du Module     * Contenu du Module
     * LAB #1 - Dépendances de Rôles     * LAB #1 - Dépendances de Rôles
Ligne 25: Ligne 25:
         * 2.6.2 - Le Gabarit Enfant         * 2.6.2 - Le Gabarit Enfant
     * LAB #3 - Gestion de la Hiérarchie des Variables     * LAB #3 - Gestion de la Hiérarchie des Variables
 +    * LAB #4 - Utilisation des Facts d'Ansible
 +    * LAB #5 - La Commande ansible-vault
 +      * 5.1 - Crypter le Fichier
 +      * 5.2 - Editer le Fichier
 +      * 5.3 - Décrypter le Fichier
 +      * 5.4 - Utilisation de Mots de Passe Aléatoires
  
 =====LAB #1 - Dépendances de Rôles===== =====LAB #1 - Dépendances de Rôles=====
Ligne 39: Ligne 45:
 </code> </code>
  
-<WRAP center round important 60%>+<WRAP center round important>
 **Important** : Notez que dans ce Rôle nous n'avons besoin que des répertoires **defaults**, **tasks** et **templates**. **Important** : Notez que dans ce Rôle nous n'avons besoin que des répertoires **defaults**, **tasks** et **templates**.
 </WRAP> </WRAP>
Ligne 61: Ligne 67:
 </code> </code>
  
-<WRAP center round important 60%>+<WRAP center round important>
 **Important** : Notez que le paquet à installer n'est pas explicitement déclaré. Le paquet est référencé par le contenu de la variable **java_package**, elle-même déclarée dans le fichier **main.yaml** du sous-répertoire **defaults** du Rôle. Notez aussi l'utilisation d'un gabarit, appelé **template**, qui fournit le fichier **java.sh** qui doit être copié à l'emplacement **/etc/profile.d/** à partir du sous-répertoire **templates** du Rôle. **Important** : Notez que le paquet à installer n'est pas explicitement déclaré. Le paquet est référencé par le contenu de la variable **java_package**, elle-même déclarée dans le fichier **main.yaml** du sous-répertoire **defaults** du Rôle. Notez aussi l'utilisation d'un gabarit, appelé **template**, qui fournit le fichier **java.sh** qui doit être copié à l'emplacement **/etc/profile.d/** à partir du sous-répertoire **templates** du Rôle.
 </WRAP> </WRAP>
Ligne 75: Ligne 81:
 </code> </code>
  
-<WRAP center round important 60%>+<WRAP center round important>
 **Important** : Notez qu'ici sont déclarées deux variables : **java_home** et **java_package**. **Important** : Notez qu'ici sont déclarées deux variables : **java_home** et **java_package**.
 </WRAP> </WRAP>
Ligne 85: Ligne 91:
 </code> </code>
  
-<WRAP center round important 60%>+<WRAP center round important>
 **Important** : Ce fichier ne serait pas normalement vide. Par contre dans ce LAB, nous nous concentrons sur Ansible et seule la présence du fichier est nécessaire pour le bon fonctionnement du LAB. **Important** : Ce fichier ne serait pas normalement vide. Par contre dans ce LAB, nous nous concentrons sur Ansible et seule la présence du fichier est nécessaire pour le bon fonctionnement du LAB.
 </WRAP> </WRAP>
Ligne 97: Ligne 103:
 </code> </code>
  
-<WRAP center round important 60%>+<WRAP center round important>
 **Important** : Notez que dans ce Rôle nous n'avons besoin que des répertoires **meta** et **tasks**. **Important** : Notez que dans ce Rôle nous n'avons besoin que des répertoires **meta** et **tasks**.
 </WRAP> </WRAP>
Ligne 121: Ligne 127:
 </code> </code>
  
-<WRAP center round important 60%>+<WRAP center round important>
 **Important** : Ce fichier informe Ansible que le Rôle **tomcat** dépend du Rôle **exemple01.java**. **Important** : Ce fichier informe Ansible que le Rôle **tomcat** dépend du Rôle **exemple01.java**.
 </WRAP> </WRAP>
Ligne 137: Ligne 143:
 </code> </code>
  
-<WRAP center round important 60%>+<WRAP center round important>
 **Important** : Notez que dans le Play Book, nous appelons **uniquement** le Rôle **tomcat**. **Important** : Notez que dans le Play Book, nous appelons **uniquement** le Rôle **tomcat**.
 </WRAP> </WRAP>
Ligne 226: Ligne 232:
 </code> </code>
  
-<WRAP center round important 60%>+<WRAP center round important>
 **Important** : Notez que le Rôle **exemple01.java** est traité **avant** le Rôle **tomcat**. **Important** : Notez que le Rôle **exemple01.java** est traité **avant** le Rôle **tomcat**.
 </WRAP> </WRAP>
Ligne 267: Ligne 273:
 </code> </code>
  
-<WRAP center round important 60%>+<WRAP center round important>
 **Important** : Notez que cette fois-ci, la valeur de la variable **java_package** spécifiée dans le fichier **/home/trainee/.ansible/roles/exemple01.java/defaults/main.yaml** est sur-chargée par la valeur **tree**. **Important** : Notez que cette fois-ci, la valeur de la variable **java_package** spécifiée dans le fichier **/home/trainee/.ansible/roles/exemple01.java/defaults/main.yaml** est sur-chargée par la valeur **tree**.
 </WRAP> </WRAP>
Ligne 337: Ligne 343:
 Les **Gabarits** ou //Templates// d'Ansible utilisent une bibliothèque Python qui s'appelle **[[http://jinja.pocoo..org/|Jinja2]]**. Les **Gabarits** ou //Templates// d'Ansible utilisent une bibliothèque Python qui s'appelle **[[http://jinja.pocoo..org/|Jinja2]]**.
  
-<WRAP center round important 60%>+<WRAP center round important>
 **Important** : La documentation des gabarits se trouvent à cette adresse: **[[https://docs.ansible.com/ansible/latest/modules/template_module.html]]**. **Important** : La documentation des gabarits se trouvent à cette adresse: **[[https://docs.ansible.com/ansible/latest/modules/template_module.html]]**.
 </WRAP> </WRAP>
Ligne 352: Ligne 358:
 </code> </code>
  
-<WRAP center round important 60%>+<WRAP center round important>
 **Important** : Notez que dans ce Rôle nous n'avons besoin que des répertoires **defaults**, **handlers**, **tasks** et **templates**. **Important** : Notez que dans ce Rôle nous n'avons besoin que des répertoires **defaults**, **handlers**, **tasks** et **templates**.
 </WRAP> </WRAP>
Ligne 378: Ligne 384:
 </code> </code>
  
-<WRAP center round important 60%>+<WRAP center round important>
 **Important** : Notez que l'installation fait appel à un gabarit suivi par un **Handler** qui s'appelle **reload haproxy**. **Important** : Notez que l'installation fait appel à un gabarit suivi par un **Handler** qui s'appelle **reload haproxy**.
 </WRAP> </WRAP>
Ligne 452: Ligne 458:
 </code> </code>
  
-<WRAP center round important 60%>+<WRAP center round important>
 **Important** : Notez l'utilisation de deux variables Ansible dans ce fichier - **%%{{ haproxy_listen_address }}%%** et **%%{{haproxy_listen_port}}%%**. **Important** : Notez l'utilisation de deux variables Ansible dans ce fichier - **%%{{ haproxy_listen_address }}%%** et **%%{{haproxy_listen_port}}%%**.
 </WRAP> </WRAP>
Ligne 597: Ligne 603:
 </code> </code>
  
-<WRAP center round important 60%>+<WRAP center round important>
 **Important** : Notez que les valeurs des variables spécifiées dans le fichier **/home/trainee/.ansible/roles/haproxy/defaults/main.yaml** ont été injectées à la place des variables **%%{{ haproxy_listen_address }}%%** et **%%{{haproxy_listen_port}}%%**. **Important** : Notez que les valeurs des variables spécifiées dans le fichier **/home/trainee/.ansible/roles/haproxy/defaults/main.yaml** ont été injectées à la place des variables **%%{{ haproxy_listen_address }}%%** et **%%{{haproxy_listen_port}}%%**.
 </WRAP> </WRAP>
Ligne 629: Ligne 635:
 </code> </code>
  
-<WRAP center round important 60%>+<WRAP center round important>
 **Important** : Notez la condition **%%{% if haproxy_stats %}%%** qui ne tiendra compte des quatre lignes jusqu'à la ligne **%%{% endif %}%%** que dans le cas où la valeur de la variable **haproxy_stats** est **True**. **Important** : Notez la condition **%%{% if haproxy_stats %}%%** qui ne tiendra compte des quatre lignes jusqu'à la ligne **%%{% endif %}%%** que dans le cas où la valeur de la variable **haproxy_stats** est **True**.
 </WRAP> </WRAP>
Ligne 645: Ligne 651:
 </code> </code>
  
-<WRAP center round important 60%>+<WRAP center round important>
 **Important** : Notez qu'Ansible teste si la variable est définie. Par conséquent la variable peut contenir la valeur **True**, **true** voire toute autre chaîne telle que **toto**. **Important** : Notez qu'Ansible teste si la variable est définie. Par conséquent la variable peut contenir la valeur **True**, **true** voire toute autre chaîne telle que **toto**.
 </WRAP> </WRAP>
Ligne 710: Ligne 716:
 </code> </code>
  
-<WRAP center round important 60%>+<WRAP center round important>
 **Important** : Notez que les quatre lignes concernant les statistiques ont été incluses dans le fichier. **Important** : Notez que les quatre lignes concernant les statistiques ont été incluses dans le fichier.
 </WRAP> </WRAP>
Ligne 726: Ligne 732:
 </code> </code>
  
-<WRAP center round important 60%>+<WRAP center round important>
 **Important** : Notez qu'Ansible teste si la variable n'est pas définie ou définie avec la valeur de **False** ou **false**. La valeur donc **haproxy_stats:** seule est considérée comme étant fausse.  **Important** : Notez qu'Ansible teste si la variable n'est pas définie ou définie avec la valeur de **False** ou **false**. La valeur donc **haproxy_stats:** seule est considérée comme étant fausse. 
 </WRAP> </WRAP>
Ligne 795: Ligne 801:
 </code> </code>
  
-<WRAP center round important 60%>+<WRAP center round important>
 **Important** : Notez que les quatre lignes concernant les statistiques n'ont pas été incluses dans le fichier. **Important** : Notez que les quatre lignes concernant les statistiques n'ont pas été incluses dans le fichier.
 </WRAP> </WRAP>
Ligne 834: Ligne 840:
 </code> </code>
  
-<WRAP center round important 60%>+<WRAP center round important>
 **Important** : Notez que la variable **haproxy_backends** est une liste YAML. **Important** : Notez que la variable **haproxy_backends** est une liste YAML.
 </WRAP> </WRAP>
Ligne 1107: Ligne 1113:
 </code> </code>
  
-<WRAP center round important 60%>+<WRAP center round important>
 **Important** : Ce gabarit ne contient que des directives générales. Les directives spécifiques au protocole http ont été remplacées par des **blocs** nommés **globals**, **defaults** et **server**. **Important** : Ce gabarit ne contient que des directives générales. Les directives spécifiques au protocole http ont été remplacées par des **blocs** nommés **globals**, **defaults** et **server**.
 </WRAP> </WRAP>
Ligne 1158: Ligne 1164:
 </code> </code>
  
-<WRAP center round important 60%>+<WRAP center round important>
 **Important** : Notez que les **blocs** nommés **globals**, **defaults** et **server** contiennent les directives qui seront injectées dans le fichier **haproxy.cfg** aux emplacements des trois blocs respectifs. **Important** : Notez que les **blocs** nommés **globals**, **defaults** et **server** contiennent les directives qui seront injectées dans le fichier **haproxy.cfg** aux emplacements des trois blocs respectifs.
 </WRAP> </WRAP>
Ligne 1276: Ligne 1282:
 </code> </code>
  
-<WRAP center round important 60%>+<WRAP center round important>
 **Important** : Notez que les **blocs** nommés **globals**, **defaults** et **server** ont été renseignés. **Important** : Notez que les **blocs** nommés **globals**, **defaults** et **server** ont été renseignés.
 </WRAP> </WRAP>
Ligne 1449: Ligne 1455:
 </code> </code>
  
-<WRAP center round important 60%>+<WRAP center round important>
 **Important** : La variable fixée dans **defaults/main.yaml** surcharge la variable fixée dans **tasks/main.yaml**. **Important** : La variable fixée dans **defaults/main.yaml** surcharge la variable fixée dans **tasks/main.yaml**.
 </WRAP> </WRAP>
Ligne 1462: Ligne 1468:
 </code> </code>
  
-<WRAP center round important 60%>+<WRAP center round important>
 **Important** : La déclaration de la variable peut être faite dans **roles/group_vars/all** ou dans **roles/group_vars/all.yaml** ou dans un fichier *.yaml dans le répertoire **roles/group_vars/all/**. **Important** : La déclaration de la variable peut être faite dans **roles/group_vars/all** ou dans **roles/group_vars/all.yaml** ou dans un fichier *.yaml dans le répertoire **roles/group_vars/all/**.
 </WRAP> </WRAP>
Ligne 1500: Ligne 1506:
 </code> </code>
  
-<WRAP center round important 60%>+<WRAP center round important>
 **Important** : La variable fixée dans **group_vars/all.yaml** surcharge la variable fixée dans **defaults/main.yaml** qui surcharge la variable fixée dans **tasks/main.yaml**. **Important** : La variable fixée dans **group_vars/all.yaml** surcharge la variable fixée dans **defaults/main.yaml** qui surcharge la variable fixée dans **tasks/main.yaml**.
 </WRAP> </WRAP>
Ligne 1549: Ligne 1555:
 </code> </code>
  
-<WRAP center round important 60%>+<WRAP center round important>
 **Important** : La variable fixée dans **playbook.yaml** surcharge la variable fixée dans **group_vars/all.yaml** qui surcharge la variable fixée dans **defaults/main.yaml** qui surcharge la variable fixée dans **tasks/main.yaml**. **Important** : La variable fixée dans **playbook.yaml** surcharge la variable fixée dans **group_vars/all.yaml** qui surcharge la variable fixée dans **defaults/main.yaml** qui surcharge la variable fixée dans **tasks/main.yaml**.
 </WRAP> </WRAP>
Ligne 1648: Ligne 1654:
 </code> </code>
  
-<WRAP center round important 60%>+<WRAP center round important>
 **Important** : Notez que la valeur de la variable **endroit** spécifiée dans le fichier **group_vars/all.yaml** s'applique à tous les groupes **et** à tous les hôtes. **Important** : Notez que la valeur de la variable **endroit** spécifiée dans le fichier **group_vars/all.yaml** s'applique à tous les groupes **et** à tous les hôtes.
 </WRAP> </WRAP>
Ligne 1718: Ligne 1724:
 </code> </code>
  
-<WRAP center round important 60%>+<WRAP center round important>
 **Important** : La variable fixée dans **group_vars/group1.yaml** surcharge la variable fixée dans **group_vars/all.yaml**. **Important** : La variable fixée dans **group_vars/group1.yaml** surcharge la variable fixée dans **group_vars/all.yaml**.
 </WRAP> </WRAP>
Ligne 1770: Ligne 1776:
 </code> </code>
  
-<WRAP center round important 60%>+<WRAP center round important>
 **Important** : La variable fixée dans **host_vars/localhost.yaml** surcharge la variable fixée dans **group_vars/group1.yaml** qui surcharge la variable fixée dans **group_vars/all.yaml**. **Important** : La variable fixée dans **host_vars/localhost.yaml** surcharge la variable fixée dans **group_vars/group1.yaml** qui surcharge la variable fixée dans **group_vars/all.yaml**.
 </WRAP> </WRAP>
Ligne 1813: Ligne 1819:
 </code> </code>
  
-<WRAP center round important 60%>+<WRAP center round important>
 **Important** : La variable fixée dans sur la **ligne de commande** surcharge toutes les autres variables. **Important** : La variable fixée dans sur la **ligne de commande** surcharge toutes les autres variables.
 </WRAP> </WRAP>
 +
 +=====LAB #4 - 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 :
 +
 +<code>
 +[trainee@centos8 roles]$ ansible all -i web01, -m setup | more
 +web01 | SUCCESS => {
 +    "ansible_facts": {
 +        "ansible_all_ipv4_addresses": [
 +            "10.0.2.54"
 +        ],
 +        "ansible_all_ipv6_addresses": [
 +            "fe80::d255:17e1:74c1:306e"
 +        ],
 +        "ansible_apparmor": {
 +            "status": "disabled"
 +        },
 +        "ansible_architecture": "x86_64",
 +        "ansible_bios_date": "04/01/2014",
 +        "ansible_bios_vendor": "SeaBIOS",
 +        "ansible_bios_version": "rel-1.14.0-0-g155821a1990b-prebuilt.qemu.org",
 +        "ansible_board_asset_tag": "NA",
 +        "ansible_board_name": "NA",
 +        "ansible_board_serial": "NA",
 +        "ansible_board_vendor": "NA",
 +        "ansible_board_version": "NA",
 +        "ansible_chassis_asset_tag": "NA",
 +        "ansible_chassis_serial": "NA",
 +        "ansible_chassis_vendor": "QEMU",
 +        "ansible_chassis_version": "pc-i440fx-5.2",
 +        "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": "2022-03-09",
 +            "day": "09",
 +            "epoch": "1646840799",
 +            "hour": "16",
 +            "iso8601": "2022-03-09T15:46:39Z",
 +            "iso8601_basic": "20220309T164639891872",
 +            "iso8601_basic_short": "20220309T164639",
 +            "iso8601_micro": "2022-03-09T15:46:39.891872Z",
 +            "minute": "46",
 +            "month": "03",
 +            "second": "39",
 +            "time": "16:46:39",
 +            "tz": "CET",
 +            "tz_dst": "CEST",
 +            "tz_offset": "+0100",
 +            "weekday": "mercredi",
 +            "weekday_number": "3",
 +            "weeknumber": "10",
 +            "year": "2022"
 +        },
 +        "ansible_default_ipv4": {
 +            "address": "10.0.2.54",
 +            "alias": "ens18",
 +            "broadcast": "10.0.2.255",
 +            "gateway": "10.0.2.1",
 +--More--
 +</code>
 +
 +<WRAP center round important>
 +**Important** : Notez que le nom de chaque **Fact** commence par **ansible_**. Évitez donc de créer des variables commençant var cette valeur !
 +</WRAP>
 +
 +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** :
 +
 +<file>
 +        "ansible_default_ipv4": {
 +            "address": "10.0.2.54",
 +            "alias": "ens18",
 +            "broadcast": "10.0.2.255",
 +            "gateway": "10.0.2.1",
 +            "interface": "ens18",
 +            "macaddress": "de:b9:d4:17:cd:da",
 +            "mtu": 1500,
 +            "netmask": "255.255.255.0",
 +            "network": "10.0.2.0",
 +            "type": "ether"
 +        },
 +</file>
 +
 +Modifiez le fichier **inventory** en mettant les deux machines TargetA et TargetB dans le groupe **linux** :
 +
 +<code>
 +[trainee@centos8 roles]$ vi inventory
 +[trainee@centos8 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
 +</code>
 +
 +Modifiez le fichier **playbook.yaml** afin d'utiliser le Rôle **exemple01.java** en tant qu'utilisateur privilégié :
 +
 +<code>
 +[trainee@centos8 roles]$ vi playbook.yaml
 +[trainee@centos8 roles]$ cat playbook.yaml
 +---
 +- hosts: all
 +  become: true
 +  roles: 
 +    - exemple01.java 
 +</code>
 +
 +Connectez-vous à la machine TargetA et supprimez le paquet **openjdk-8-jre** :
 +
 +<code>
 +[trainee@centos8 roles]$ ssh 10.0.2.52
 +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: Wed Mar  9 11:29:25 2022 from 10.0.2.45
 +trainee@targeta:~$ sudo apt-get -y remove openjdk-8-jre
 +...
 +trainee@targeta:~$ exit
 +déconnexion
 +Connection to 10.0.2.52 closed.
 +[trainee@centos8 roles]$
 +</code>
 +
 +Utilisez la commande scp pour copier le fichier authorized_keys de la machine virtuelle centos8 vers la machine virtuelle targetb :
 +
 +<code>
 +[trainee@centos8 roles]$ cd ~
 +[trainee@centos8 ~]$ scp .ssh/authorized_keys trainee@10.0.2.53:/home/trainee/.ssh/authorized_keys
 +trainee@10.0.2.53's password: 
 +authorized_keys                                                                                                                                                                 100%  888     8.9KB/  00:00    
 +[trainee@centos8 ~]$ cd -
 +/home/trainee/.ansible/roles
 +[trainee@centos8 roles]$ 
 +</code>
 +
 +Connectez-vous à la machine TargetB et supprimez le paquet **java-1.8.0-openjdk** :
 +
 +<code>
 +[trainee@centos8 roles]$ ssh 10.0.2.53
 +Last login: Wed Mar  9 16:51:41 2022 from 10.0.2.45
 +[trainee@targetb ~]$ sudo yum -y remove java-1.8.0-openjdk
 +...
 +[trainee@targetb ~]$ exit
 +logout
 +Connection to 10.0.2.53 closed.
 +[trainee@centos8 roles]$ 
 +</code>
 +
 +Grâce au Fact **ansible_os_family** il est possible d'appliquer le fichier **/home/trainee/.ansible/roles/exemple01.java/tasks/main.yaml** aux deux distributions. Notez l'utilisation de la clause **when** :
 +
 +<code>
 +[trainee@centos8 roles]$ vi exemple01.java/tasks/main.yaml
 +[trainee@centos8 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'
 +</code>
 +
 +Modifiez le fichier **/etc/hosts** de la machine **centos8** :
 +
 +<code>
 +[trainee@centos8 roles]$ su -
 +Password: fenestros
 +[root@centos8 ~]# vi /etc/hosts
 +[root@centos8 ~]# cat /etc/hosts
 +127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
 +::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
 +10.0.2.45 centos8.ittraining.loc centos8
 +10.0.2.54 web01.i2tch.loc web01
 +10.0.2.55 web02.i2tch.loc web02
 +10.0.2.56 web03.i2tch.loc web03
 +10.0.2.57 web04.i2tch.loc web04
 +10.0.2.52 targeta.i2tch.loc targeta 
 +10.0.2.53 targetb.i2tch.loc targetb
 +[root@centos8 ~]# exit
 +logout
 +[trainee@centos8 roles]$
 +</code>
 +
 +Connectez-vous en ssh à targeta et testez la configuration de sudo :
 +
 +<code>
 +[trainee@centos8 roles]$ ssh targeta
 +The authenticity of host 'targeta (10.0.2.52)' can't be established.
 +ECDSA key fingerprint is SHA256:sEfHBv9azmK60cjqF/aJgUc9jg56slNaZQdAUcvBOvE.
 +Are you sure you want to continue connecting (yes/no/[fingerprint])? 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: Wed Mar  9 16:52:16 2022 from 10.0.2.45
 +
 +trainee@targeta:~$ sudo apt update
 +Réception de:1 http://security.debian.org/debian-security stretch/updates InRelease [53,0 kB]
 +Ign:2 http://ftp.fr.debian.org/debian stretch InRelease               
 +Réception de:3 http://ftp.fr.debian.org/debian stretch-updates InRelease [93,6 kB]
 +Réception de:4 http://ftp.fr.debian.org/debian stretch Release [118 kB]
 +Réception de:5 http://ftp.fr.debian.org/debian stretch Release.gpg [3 177 B]
 +Réception de:6 http://security.debian.org/debian-security stretch/updates/main Sources [396 kB]
 +Réception de:7 http://security.debian.org/debian-security stretch/updates/main amd64 Packages [759 kB]
 +Réception de:8 http://security.debian.org/debian-security stretch/updates/main Translation-en [354 kB]
 +Réception de:9 http://ftp.fr.debian.org/debian stretch/main Sources [6 736 kB]       
 +Réception de:10 http://ftp.fr.debian.org/debian stretch/main amd64 Packages [7 080 kB]
 +Réception de:11 http://ftp.fr.debian.org/debian stretch/main Translation-en [5 377 kB]
 +21,0 Mo réceptionnés en 7s (2 753 ko/s)                                                                                                                                                                          
 +Lecture des listes de paquets... Fait
 +Construction de l'arbre des dépendances       
 +Lecture des informations d'état... Fait
 +333 packages can be upgraded. Run 'apt list --upgradable' to see them.
 +
 +trainee@targeta:~$ exit
 +déconnexion
 +Connection to targeta closed.
 +</code>
 +
 +Connectez-vous en ssh à targetb et testez la configuration de sudo :
 +
 +<code>
 +[trainee@centos8 roles]$ ssh targetb
 +The authenticity of host 'targetb (10.0.2.53)' can't be established.
 +ECDSA key fingerprint is SHA256:RgOsp/XI7JHNq+oIfHKw+jkHdtTnBIh+Dd7kVmHRxtU.
 +Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
 +Warning: Permanently added 'targetb' (ECDSA) to the list of known hosts.
 +Last login: Wed Mar  9 16:56:33 2022 from 10.0.2.45
 +
 +[trainee@targetb ~]$ yum clean all
 +Loaded plugins: fastestmirror, langpacks
 +Cleaning repos: base extras updates
 +Other repos take up 190 M of disk space (use --verbose for details)
 +
 +[trainee@targetb ~]$ sudo yum -y makecache
 +Loaded plugins: fastestmirror, langpacks
 +Loading mirror speeds from cached hostfile
 + * base: centos.mirror.ate.info
 + * extras: mirror.plusserver.com
 + * updates: mirror.plusserver.com
 +base                                                                                                                                                                                       | 3.6 kB  00:00:00     
 +extras                                                                                                                                                                                     | 2.9 kB  00:00:00     
 +updates                                                                                                                                                                                    | 2.9 kB  00:00:00     
 +(1/6): extras/7/x86_64/other_db                                                                                                                                                            | 147 kB  00:00:00     
 +(2/6): base/7/x86_64/filelists_db                                                                                                                                                          | 7.2 MB  00:00:00     
 +(3/6): base/7/x86_64/other_db                                                                                                                                                              | 2.6 MB  00:00:00     
 +(4/6): extras/7/x86_64/filelists_db                                                                                                                                                        | 277 kB  00:00:00     
 +(5/6): updates/7/x86_64/other_db                                                                                                                                                           | 1.0 MB  00:00:00     
 +(6/6): updates/7/x86_64/filelists_db                                                                                                                                                       | 7.8 MB  00:00:00     
 +Metadata Cache Created
 +
 +[trainee@targetb ~]$ exit
 +logout
 +Connection to targetb closed.
 +[trainee@centos8 roles]$
 +</code>
 +
 +Exécutez **ansible-playbook** et constatez le résultat :
 +
 +<code>
 +[trainee@centos8 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    skipped=1    rescued=0    ignored=0   
 +targetb                    : ok=2    changed=1    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0  
 +</code>
 +
 +Les conditions peuvent être combinées grâce à **and** et **or**. En voici un exemple :
 +
 +<file>
 +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")
 +</file>
 +
 +=====LAB #5 - La Commande ansible-vault=====
 +
 +La commande **ansible-vault** permet de créer et d'utiliser des fichiers cryptés, par exemple, ceux qui contiennent des mots de passe.
 +
 +Pour illustrer son utilisation, créez le Rôle **vault** :
 +
 +<code>
 +[trainee@centos8 roles]$ mkdir vault
 +</code>
 +
 +Éditez le fichier **/home/trainee/.ansible/roles/group_vars/all.yaml** :
 +
 +<code>
 +[trainee@centos8 roles]$ vi /home/trainee/.ansible/roles/group_vars/all.yaml
 +[trainee@centos8 roles]$ cat /home/trainee/.ansible/roles/group_vars/all.yaml
 +---
 +secret: gardezmoisecret
 +</code>
 +
 +Modifiez le fichier **/home/trainee/.ansible/roles/playbook.yaml** :
 +
 +<code>
 +[trainee@centos8 roles]$ vi playbook.yaml
 +[trainee@centos8 roles]$ cat playbook.yaml
 +---
 +- hosts: all
 +  tasks:
 +  - debug:
 +      msg: "Le secret est {{ secret }}"
 +</code>
 +
 +Exécutez la commande **ansible-playbook** :
 +
 +<code>
 +[trainee@centos8 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    skipped=0    rescued=0    ignored=0
 +</code>
 +
 +<WRAP center round important>
 +**Important** : L'exécution démontre que la variable **secret** est bien lue.
 +</WRAP>
 +
 +====5.1 - Crypter le Fichier====
 +
 +Cryptez maintenant le fichier **/home/trainee/.ansible/roles/group_vars/all.yaml** en utilisant la commande **ansible-vault** :
 +
 +<code>
 +[trainee@centos8 roles]$ ansible-vault encrypt group_vars/all.yaml
 +New Vault password: fenestros
 +Confirm New Vault password: fenestros
 +Encryption successful
 +[trainee@centos8 roles]$ 
 +</code>
 +
 +<WRAP center round important>
 +**Important** : Notez que le mot de passe **fenestros** ne sera pas en clair.
 +</WRAP>
 +
 +<WRAP center round important>
 +**Important** : Notez que le mot de passe est pour la commande **ansible-vault** et non pas uniquement pour l'action de cryptage en cours.
 +</WRAP>
 +
 +Constatez maintenant le contenu du fichier **/home/trainee/.ansible/roles/group_vars/all.yaml** :
 +
 +<code>
 +[trainee@centos8 roles]$ cat /home/trainee/.ansible/roles/group_vars/all.yaml
 +$ANSIBLE_VAULT;1.1;AES256
 +33343664333931323331346338346439613439633633396262393733663463363438663163383761
 +6566653230323032396434356132653262313962633265630a366436666261363933343663623131
 +63373230663530313864373236316465333464323131643933363664303332336261353732623064
 +3538303864633035320a376235333637656534376638613661303765373165383936653336646562
 +31376535333861616165346433306230366231333139323062366432333033386366
 +</code>
 +
 +Exécutez de nouveau la commande **ansible-playbook** :
 +
 +<code>
 +[trainee@centos8 roles]$ ansible-playbook -i inventory playbook.yaml -l localhost
 +
 +PLAY [all] *******************************************************************************************************************************************************************************************************
 +ERROR! Attempting to decrypt but no vault secrets found
 +</code>
 +
 +<WRAP center round important>
 +**Important** : Notez l'erreur due au fait que le fichier a été crypté.
 +</WRAP>
 +
 +Pour indiquer à la commande **ansible-playbook** que le fichier qui doit être lu soit crypté, utilisez l'option **--ask-vault-pass** :
 +
 +<code>
 +[trainee@centos8 roles]$ ansible-playbook -i inventory playbook.yaml -l localhost
 +
 +PLAY [all] *******************************************************************************************************************************************************************************************************
 +ERROR! Attempting to decrypt but no vault secrets found
 +[trainee@centos8 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    skipped=0    rescued=0    ignored=0    
 +</code>
 +
 +<WRAP center round important>
 +**Important** : Notez que le mot de passe **fenestros** ne sera pas en clair.
 +</WRAP>
 +
 +====5.2 - Editer le Fichier====
 +
 +Pour éditer le fichier, utilisez la sous-commande **edit** de la commande **ansible-vault** :
 +
 +<code>
 +[trainee@centos8 roles]$ ansible-vault edit group_vars/all.yaml
 +Vault password: fenestros
 +</code>
 +
 +<WRAP center round important>
 +**Important** : Notez que le mot de passe **fenestros** ne sera pas en clair.
 +</WRAP>
 +
 +Le fichier est chargé en mémoire pour édition :
 +
 +<code>
 +---
 +secret: gardezlesecret
 +~                                                                                                                                                                                                                 
 +~                                                                                                                                                                                                                 
 +~                                                                                                                                                                                                                                                                                                             
 +~                                                                                                                                                                                                                 
 +~                                                                                                                                                                                                                 
 +~                                                                                                                                                                                                                 
 +~                                                                                                                                                                                                                 
 +~                                                                                                                                                                                                                 
 +-- INSERT --
 +</code>
 +
 +Modifiez le secret et sauvegardez le fichier :
 +
 +<code>
 +---
 +secret: gardezlesecret
 +~                                                                                                                                                                                                                 
 +~                                                                                                                                                                                                                 
 +~                                                                                                                                                                                                                                                                                                             
 +~                                                                                                                                                                                                                 
 +~                                                                                                                                                                                                                 
 +~                                                                                                                                                                                                                 
 +~                                                                                                                                                                                                                 
 +~                                                                                                                                                                                                                 
 +:x
 +</code>
 +
 +Constatez que le contenu du fichier **/home/trainee/.ansible/roles/group_vars/all.yaml** est toujours crypté :
 +
 +<code>
 +[trainee@centos8 roles]$ cat /home/trainee/.ansible/roles/group_vars/all.yaml
 +$ANSIBLE_VAULT;1.1;AES256
 +36633861376466313363373336643832646663666334633931663262666361306236386232316461
 +3331633863386666626230663038653136653830303465660a353337316634363465663962336365
 +61396430313965653666333738376663336139613566636437353935653232306264336235333538
 +6439366539653436310a666361313237623137666634663439343132393532623962353163303364
 +37626635363832333934363930383265313932663230356234343235643935353535
 +</code>
 +
 +Exécutez de nouveau la commande **ansible-playbook** avec l'option **--ask-vault-pass** :
 +
 +<code>
 +[trainee@centos8 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 gardezlesecret"
 +}
 +
 +PLAY RECAP *******************************************************************************************************************************************************************************************************
 +localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
 +</code>
 +
 +<WRAP center round important>
 +**Important** : Notez que le mot de passe **fenestros** ne sera pas en clair.
 +</WRAP>
 +
 +====5.3 - Décrypter le Fichier====
 +
 +Il est possible de décrypter le fichier en utilisant la sous-commande **decrypt** de la commande **ansible-vault** :
 +
 +<code>
 +[trainee@centos8 roles]$ ansible-vault decrypt group_vars/all.yaml
 +Vault password: fenestros
 +Decryption successful
 +</code>
 +
 +<WRAP center round important>
 +**Important** : Notez que le mot de passe **fenestros** ne sera pas en clair.
 +</WRAP>
 +
 +Constatez que le contenu du fichier **/home/trainee/.ansible/roles/group_vars/all.yaml** n'est plus crypté :
 +
 +<code>
 +[trainee@centos8 roles]$ cat /home/trainee/.ansible/roles/group_vars/all.yaml
 +---
 +secret: gardezlesecret
 +</code>
 +
 +====5.4 - Utilisation de Mots de Passe Aléatoires====
 +
 +Installez le paquet **pwgen** :
 +
 +<code>
 +[trainee@centos8 roles]$ su -
 +Password: fenestros
 +[root@centos8 ~]#
 +
 +[root@centos8 ~]# dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
 +Last metadata expiration check: 1:30:37 ago on Wed 09 Mar 2022 10:10:01 EST.
 +epel-release-latest-8.noarch.rpm                                                                                                                                                   47 kB/s |  22 kB     00:00    
 +Dependencies resolved.
 +==================================================================================================================================================================================================================
 + Package                                              Architecture                                   Version                                           Repository                                            Size
 +==================================================================================================================================================================================================================
 +Installing:
 + epel-release                                         noarch                                         8-14.el8                                          @commandline                                          22 k
 +
 +Transaction Summary
 +==================================================================================================================================================================================================================
 +Install  1 Package
 +
 +Total size: 22 k
 +Installed size: 32 k
 +Is this ok [y/N]: y
 +Downloading Packages:
 +Running transaction check
 +Transaction check succeeded.
 +Running transaction test
 +Transaction test succeeded.
 +Running transaction
 +  Preparing        :                                                                                                                                                                                          1/1 
 +  Installing       : epel-release-8-14.el8.noarch                                                                                                                                                             1/
 +  Running scriptlet: epel-release-8-14.el8.noarch                                                                                                                                                             1/
 +  Verifying        : epel-release-8-14.el8.noarch                                                                                                                                                             1/
 +Installed products updated.
 +
 +Installed:
 +  epel-release-8-14.el8.noarch                                                                                                                                                                                    
 +
 +Complete!
 +
 +[root@centos8 ~]# dnf install pwgen
 +Extra Packages for Enterprise Linux 8 - x86_64                                                                                                                                    1.1 MB/s |  11 MB     00:09    
 +Extra Packages for Enterprise Linux Modular 8 - x86_64                                                                                                                            530 kB/s | 979 kB     00:01    
 +Last metadata expiration check: 0:00:01 ago on Wed 09 Mar 2022 11:41:14 EST.
 +Dependencies resolved.
 +==================================================================================================================================================================================================================
 + Package                                          Architecture                                      Version                                                 Repository                                       Size
 +==================================================================================================================================================================================================================
 +Installing:
 + pwgen                                            x86_64                                            2.08-3.el8                                              epel                                             31 k
 +
 +Transaction Summary
 +==================================================================================================================================================================================================================
 +Install  1 Package
 +
 +Total download size: 31 k
 +Installed size: 46 k
 +Is this ok [y/N]: y
 +
 +[root@centos8 ~]# exit
 +logout
 +[trainee@centos8 roles]$ 
 +</code>
 +
 +Utilisez maintenant la commande **pwgen** pour générer un mot de passe aléatoire :
 +
 +<code>
 +[trainee@centos8 roles]$ pwgen 16 1
 +di3Be1AiPayeehai
 +</code>
 +
 +Utilisez pwgen pour créer un mot de passe aléatoire contenu dans un fichier :
 +
 +<code>
 +[trainee@centos8 roles]$ pwgen 16 1 > vault-password
 +
 +[trainee@centos8 roles]$ ls
 +backend.j2  debug  exemple01.java  geerlingguy.java  group_vars  haproxy  host_vars  inventory  playbook.yaml  tomcat  vault  vault-password
 +
 +[trainee@centos8 roles]$ cat vault-password
 +oo3aeph5PaiVeiBu
 +</code>
 +
 +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** :
 +
 +<code>
 +[trainee@centos8 roles]$ ansible-vault encrypt group_vars/all.yaml --vault-password-file vault-password
 +Encryption successful
 +</code>
 +
 +Constatez le contenu du fichier **/home/trainee/.ansible/roles/group_vars/all.yaml** :
 +
 +<code>
 +[trainee@centos8 roles]$ cat group_vars/all.yaml
 +$ANSIBLE_VAULT;1.1;AES256
 +61326364653334653935643735623863353362333536396638356362376631633732306332316661
 +6662333436336237346433363637393666623165643438620a343436366136386637343238303063
 +38383866386631363834623461323334313030623136333334646335626165363263373966373663
 +3137333330653635620a396133346264656335633530353966383930613731626639393631623066
 +31323331383563373830306331653166326563333135326631363461313666313864
 +</code>
 +
 +Exécutez de nouveau la commande **ansible-playbook** avec l'option **--vault-password-file** :
 +
 +<code>
 +[trainee@centos8 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    skipped=0    rescued=0    ignored=0  
 +</code>
 +
  
 ----- -----
  
-Copyright © 2022 Hugh Norris.+Copyright © 2023 Hugh Norris.
Menu