Ceci est une ancienne révision du document !


Version - 2022.02

Dernière mise-à-jour : 2022/05/17 08:05

LCF704 - Facts, Facts Secrets et Docker

Contenu du Module

  • LCF704 - Facts, Facts Secrets et Docker
    • Contenu du Module
    • LAB #1 - Utilisation des Facts d'Ansible
    • LAB #2 - La Commande ansible-vault
      • 2.1 - Crypter le Fichier
      • 2.2 - Editer le Fichier
      • 2.3 - Décrypter le Fichier
      • 2.4 - Utilisation de Mots de Passe Aléatoires
    • LAB #3 - Ansible et Docker
      • 3.1 - Présentation de Docker
      • 3.2 - Installer Docker
      • 3.3 - La Connexion à Docker

LAB #1 - 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@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--

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.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"
        },

Modifiez le fichier inventory en mettant les deux machines TargetA et TargetB dans le groupe linux :

[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

Modifiez le fichier playbook.yaml afin d'utiliser le Rôle exemple01.java en tant qu'utilisateur privilégié :

[trainee@centos8 roles]$ vi playbook.yaml
[trainee@centos8 roles]$ cat playbook.yaml
---
- hosts: all
  become: true
  roles: 
    - exemple01.java 

Connectez-vous à la machine TargetA et supprimez le paquet openjdk-8-jre :

[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]$

Utilisez la commande scp pour copier le fichier authorized_keys de la machine virtuelle centos8 vers la machine virtuelle targetb :

[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/s   00:00    
[trainee@centos8 ~]$ cd -
/home/trainee/.ansible/roles
[trainee@centos8 roles]$ 

Connectez-vous à la machine TargetB et supprimez le paquet java-1.8.0-openjdk :

[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]$ 

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 :

[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'

Modifiez le fichier /etc/hosts de la machine centos8 :

[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]$

Connectez-vous en ssh à targeta et testez la configuration de sudo :

[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.

Connectez-vous en ssh à targetb et testez la configuration de sudo :

[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]$

Exécutez ansible-playbook et constatez le résultat :

[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  

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 #2 - 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 :

[trainee@centos8 roles]$ mkdir vault

Éditez le fichier /home/trainee/.ansible/roles/group_vars/all.yaml :

[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

Modifiez le fichier /home/trainee/.ansible/roles/playbook.yaml :

[trainee@centos8 roles]$ vi playbook.yaml
[trainee@centos8 roles]$ cat playbook.yaml
---
- hosts: all
  tasks:
  - debug:
      msg: "Le secret est {{ secret }}"

Exécutez la commande ansible-playbook :

[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

Important : L'exécution démontre que la variable secret est bien lue.

2.1 - Crypter le Fichier

Cryptez maintenant le fichier /home/trainee/.ansible/roles/group_vars/all.yaml en utilisant la commande ansible-vault :

[trainee@centos8 roles]$ ansible-vault encrypt group_vars/all.yaml
New Vault password: fenestros
Confirm New Vault password: fenestros
Encryption successful
[trainee@centos8 roles]$ 

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@centos8 roles]$ cat /home/trainee/.ansible/roles/group_vars/all.yaml
$ANSIBLE_VAULT;1.1;AES256
33343664333931323331346338346439613439633633396262393733663463363438663163383761
6566653230323032396434356132653262313962633265630a366436666261363933343663623131
63373230663530313864373236316465333464323131643933363664303332336261353732623064
3538303864633035320a376235333637656534376638613661303765373165383936653336646562
31376535333861616165346433306230366231333139323062366432333033386366

Exécutez de nouveau la commande ansible-playbook :

[trainee@centos8 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@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    

Important : Notez que le mot de passe fenestros ne sera pas en clair.

2.2 - Editer le Fichier

Pour éditer le fichier, utilisez la sous-commande edit de la commande ansible-vault :

[trainee@centos8 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: gardezlesecret
~                                                                                                                                                                                                                 
~                                                                                                                                                                                                                 
~                                                                                                                                                                                                                                                                                                             
~                                                                                                                                                                                                                 
~                                                                                                                                                                                                                 
~                                                                                                                                                                                                                 
~                                                                                                                                                                                                                 
~                                                                                                                                                                                                                 
-- INSERT --

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@centos8 roles]$ cat /home/trainee/.ansible/roles/group_vars/all.yaml
$ANSIBLE_VAULT;1.1;AES256
36633861376466313363373336643832646663666334633931663262666361306236386232316461
3331633863386666626230663038653136653830303465660a353337316634363465663962336365
61396430313965653666333738376663336139613566636437353935653232306264336235333538
6439366539653436310a666361313237623137666634663439343132393532623962353163303364
37626635363832333934363930383265313932663230356234343235643935353535

Exécutez de nouveau la commande ansible-playbook avec l'option –ask-vault-pass :

[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

Important : Notez que le mot de passe fenestros ne sera pas en clair.

2.3 - Décrypter le Fichier

Il est possible de décrypter le fichier en utilisant la sous-commande decrypt de la commande ansible-vault :

[trainee@centos8 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@centos8 roles]$ cat /home/trainee/.ansible/roles/group_vars/all.yaml
---
secret: gardezlesecret

2.4 - Utilisation de Mots de Passe Aléatoires

Installez le paquet pwgen :

[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/1 
  Running scriptlet: epel-release-8-14.el8.noarch                                                                                                                                                             1/1 
  Verifying        : epel-release-8-14.el8.noarch                                                                                                                                                             1/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]$ 

Utilisez maintenant la commande pwgen pour générer un mot de passe aléatoire :

[trainee@centos8 roles]$ pwgen 16 1
di3Be1AiPayeehai

Utilisez pwgen pour créer un mot de passe aléatoire contenu dans un fichier :

[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

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@centos8 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@centos8 roles]$ cat group_vars/all.yaml
$ANSIBLE_VAULT;1.1;AES256
61326364653334653935643735623863353362333536396638356362376631633732306332316661
6662333436336237346433363637393666623165643438620a343436366136386637343238303063
38383866386631363834623461323334313030623136333334646335626165363263373966373663
3137333330653635620a396133346264656335633530353966383930613731626639393631623066
31323331383563373830306331653166326563333135326631363461313666313864

Exécutez de nouveau la commande ansible-playbook avec l'option –vault-password-file :

[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  

LAB #3 - Ansible et Docker

3.1 - 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/.

3.2 - Installer docker

Docker n'est pas dans le dépôts de CentOS. Afin de l'installer il convient d'ajouter le dépôt de docker :

[trainee@centos8 roles]$ su -
Password: fenestros
[root@centos8 ~]# dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
Adding repo from: https://download.docker.com/linux/centos/docker-ce.repo

[root@centos8 ~]# dnf list docker-ce
Docker CE Stable - x86_64                                                                                                                                                          83 kB/s |  20 kB     00:00    
Last metadata expiration check: 0:00:01 ago on Wed 09 Mar 2022 12:38:58 EST.
Available Packages
docker-ce.x86_64                                                                                 3:20.10.12-3.el8                                                                                 docker-ce-stable

Installez ensuite la dépendance containerd de docker-ce :

[root@centos8 ~]# dnf install https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.10-3.2.el7.x86_64.rpm
Last metadata expiration check: 0:06:03 ago on Wed 09 Mar 2022 12:38:58 EST.
containerd.io-1.2.10-3.2.el7.x86_64.rpm                                                                                                                                            13 MB/s |  23 MB     00:01    
Dependencies resolved.
==================================================================================================================================================================================================================
 Package                                             Architecture                                 Version                                                Repository                                          Size
==================================================================================================================================================================================================================
Installing:
 containerd.io                                       x86_64                                       1.2.10-3.2.el7                                         @commandline                                        23 M
     replacing  runc.x86_64 1.0.2-1.module_el8.5.0+911+f19012f9

Transaction Summary
==================================================================================================================================================================================================================
Install  1 Package

Total size: 23 M
Is this ok [y/N]: y

Installez maintenant le paquet docker-ce :

[root@centos8 ~]# dnf install docker-ce --nobest -y

Dernièrement, vérifiez le statut et la version de Docker client et serveur :

[root@centos8 ~]# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: activating (start) since Wed 2022-03-09 12:48:23 EST; 51s ago
     Docs: https://docs.docker.com
 Main PID: 59410 (dockerd)
    Tasks: 16
   Memory: 37.7M
   CGroup: /system.slice/docker.service
           └─59410 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Mar 09 12:48:23 centos8.ittraining.loc dockerd[59410]: time="2022-03-09T12:48:23.125986199-05:00" level=info msg="Starting up"
Mar 09 12:48:23 centos8.ittraining.loc dockerd[59410]: time="2022-03-09T12:48:23.128455293-05:00" level=info msg="parsed scheme: \"unix\"" module=grpc
Mar 09 12:48:23 centos8.ittraining.loc dockerd[59410]: time="2022-03-09T12:48:23.128518502-05:00" level=info msg="scheme \"unix\" not registered, fallback to default scheme" module=grpc
Mar 09 12:48:23 centos8.ittraining.loc dockerd[59410]: time="2022-03-09T12:48:23.128568972-05:00" level=info msg="ccResolverWrapper: sending update to cc: {[{unix:///run/containerd/containerd.sock 0  <nil>}] <>
Mar 09 12:48:23 centos8.ittraining.loc dockerd[59410]: time="2022-03-09T12:48:23.128603681-05:00" level=info msg="ClientConn switching balancer to \"pick_first\"" module=grpc
Mar 09 12:48:28 centos8.ittraining.loc dockerd[59410]: time="2022-03-09T12:48:28.105356011-05:00" level=info msg="parsed scheme: \"unix\"" module=grpc
Mar 09 12:48:28 centos8.ittraining.loc dockerd[59410]: time="2022-03-09T12:48:28.105423457-05:00" level=info msg="scheme \"unix\" not registered, fallback to default scheme" module=grpc
Mar 09 12:48:28 centos8.ittraining.loc dockerd[59410]: time="2022-03-09T12:48:28.105455755-05:00" level=info msg="ccResolverWrapper: sending update to cc: {[{unix:///run/containerd/containerd.sock 0  <nil>}] <>
Mar 09 12:48:28 centos8.ittraining.loc dockerd[59410]: time="2022-03-09T12:48:28.105470536-05:00" level=info msg="ClientConn switching balancer to \"pick_first\"" module=grpc
Mar 09 12:48:28 centos8.ittraining.loc dockerd[59410]: time="2022-03-09T12:48:28.106759173-05:00" level=error msg="Failed to built-in GetDriver graph btrfs /var/lib/docker"
[root@centos8 ~]# docker --version
Docker version 20.10.12, build e91ed57
[root@centos8 ~]# docker version
Client: Docker Engine - Community
 Version:           20.10.12
 API version:       1.40
 Go version:        go1.16.12
 Git commit:        e91ed57
 Built:             Mon Dec 13 11:45:22 2021
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          19.03.15
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       99e3ed8919
  Built:            Sat Jan 30 03:15:19 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.10
  GitCommit:        b34a5c8af56e510852c35414db4c1f4fa6172339
 runc:
  Version:          1.0.0-rc8+dev
  GitCommit:        3e425f80a8c931f88e6d94a8c831b9d5aa481657
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

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@centos8 ~]# docker run -d --name postgresql centos sleep infinity
Unable to find image 'centos:latest' locally
latest: Pulling from library/centos
a1d0c7532777: Pull complete 
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:latest
1028e25f81d14d685678794902cd599aa618eb283d80e274526d71ec9708e69d

Vérifiez que le conteneur fonctionne :

[root@centos8 ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND            CREATED              STATUS          PORTS     NAMES
1028e25f81d1   centos    "sleep infinity"   About a minute ago   Up 30 seconds             postgresql
[root@centos8 ~]# exit
logout
[trainee@centos8 roles]$

3.3 - La Connexion à Docker

Créez maintenant le Rôle docker :

trainee@ansible:~/.ansible/roles$ mkdir docker

Modifiez ensuite le fichier playbook.yaml :

[trainee@centos8 roles]$ vi playbook.yaml 
[trainee@centos8 roles]$ cat playbook.yaml 
---
- hosts: all
  tasks:
    - name: message
      debug: msg="Conteneur - {{ inventory_hostname }} sous {{ansible_distribution}}"

Modifiez le fichier inventory :

[trainee@centos8 roles]$ cp inventory inventory.old
[trainee@centos8 roles]$ vi inventory
[trainee@centos8 roles]$ cat inventory
postgresql ansible_connection=docker

Supprimez le fichier /home/trainee/.ansible/roles/group_vars/all.yaml :

[trainee@centos8 roles]$ rm -rf /home/trainee/.ansible/roles/group_vars/all.yaml

Exécutez la commande ansible-playbook en tant que root :

[root@centos8 roles]# ansible-playbook -i inventory playbook.yaml
[DEPRECATION WARNING]: Ansible will require Python 3.8 or newer on the controller starting with Ansible 2.12. Current version: 3.6.8 (default, Sep 10 2021, 09:13:53) [GCC 8.5.0 20210514 (Red Hat 8.5.0-3)]. 
This feature will be removed from ansible-core in version 2.12. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.

PLAY [all] *******************************************************************************************************************************************************************************************************

TASK [Gathering Facts] *******************************************************************************************************************************************************************************************
ok: [postgresql]

TASK [message] ***************************************************************************************************************************************************************************************************
ok: [postgresql] => {
    "msg": "Conteneur - postgresql sous CentOS"
}

PLAY RECAP *******************************************************************************************************************************************************************************************************
postgresql                 : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0    

Copyright © 2022 Hugh Norris.

Menu