Ceci est une ancienne révision du document !


Version - 2022.01

Dernière mise-à-jour : 2021/12/29 10:30

DOF504 - Facts, Facts Secrets et Docker

Contenu du Module

  • DOF504 - 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@ansible:~/.ansible/roles$ ansible all -i web01, -m setup | more
/home/trainee/.local/lib/python3.5/site-packages/ansible/parsing/vault/__init__.py:44: CryptographyDeprecationWarning: Python 3.5 support will be dropped in the next release of cryptography. Please upgrade your Python.
  from cryptography.exceptions import InvalidSignature
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": "2021-03-24",
            "day": "24",
            "epoch": "1616599366",
            "hour": "16",
            "iso8601": "2021-03-24T15:22:46Z",
            "iso8601_basic": "20210324T162246325210",
            "iso8601_basic_short": "20210324T162246",
            "iso8601_micro": "2021-03-24T15:22:46.325210Z",
--Plus--

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@ansible:~/.ansible/roles$ vi inventory
trainee@ansible:~/.ansible/roles$ cat inventory
[linux]
targeta
targetb

[group1]
localhost ansible_connection=local

[basededonnees]
web01

[dotcms]
web02
web03

[equilibrage]
web04

[debian:children]
basededonnees
dotcms
equilibrage

[debian:vars]
ansible_user=trainee

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

trainee@ansible:~/.ansible/roles$ vi playbook.yaml 
trainee@ansible:~/.ansible/roles$ cat playbook.yaml 
---
- hosts: all
  become: true
  roles: 
    - exemple01.java 

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

trainee@ansible:~/.ansible/roles$ ssh targeta
The authenticity of host 'targeta (10.0.2.52)' can't be established.
ECDSA key fingerprint is SHA256:sEfHBv9azmK60cjqF/aJgUc9jg56slNaZQdAUcvBOvE.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'targeta' (ECDSA) to the list of known hosts.
Debian GNU/Linux 9
Linux targeta.i2tch.loc 4.9.0-8-amd64 #1 SMP Debian 4.9.130-2 (2018-10-27) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Wed Mar 24 11:49:46 2021 from 10.0.2.50
trainee@targeta:~$ su -
Mot de passe : fenestros
root@targeta:~# apt-get -y remove openjdk-8-jre
...
root@targeta:~# exit
déconnexion
trainee@targeta:~$ exit
déconnexion
Connection to targeta closed.

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

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

trainee@ansible:~/.ansible/roles$ cd ~
trainee@ansible:~$ scp .ssh/authorized_keys trainee@targetb.i2tch.loc:/home/trainee/.ssh/authorized_keys
The authenticity of host 'targetb.i2tch.loc (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)? yes
Warning: Permanently added 'targetb.i2tch.loc' (ECDSA) to the list of known hosts.
trainee@targetb.i2tch.loc's password: 
authorized_keys                                                                                                       100%  701    18.1KB/s   00:00    
trainee@ansible:~$ cd .ansible/roles
trainee@ansible:~/.ansible/roles$ 

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

trainee@ansible:~/.ansible/roles$ ssh targetb
Last login: Wed Mar 24 11:01:43 2021
[trainee@targetb ~]$ yum -y remove java-1.8.0-openjdk
Modules complémentaires chargés : fastestmirror, langpacks
Vous devez être super-utilisateur pour exécuter cette commande.
[trainee@targetb ~]$ su -
Mot de passe : fenestros
Dernière connexion : dimanche 21 mars 2021 à 13:34:55 CET sur pts/0
[root@targetb ~]# yum -y remove java-1.8.0-openjdk
...
[root@targetb ~]# exit
logout
[trainee@targetb ~]$ exit
déconnexion
Connection to targetb closed.

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

Grâce au Fact ansible_os_family il est possible d'appliquer le fichier /home/trainee/.ansible/roles/exemple01.java/tasks/main.yaml aux deux distributions. Notez l'utilisation de la clause when :

trainee@ansible:~/.ansible/roles$ vi exemple01.java/tasks/main.yaml 
trainee@ansible:~/.ansible/roles$ cat exemple01.java/tasks/main.yaml 
---
- name: install jre (Debian)
  package: name=openjdk-8-jre state=present
  when: ansible_os_family == 'Debian'

- name: install jre (CentOS)
  package: name=java-1.8.0-openjdk state=present
  when: ansible_os_family == 'RedHat'

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

trainee@ansible:~/.ansible/roles$ ansible-playbook -i inventory playbook.yaml -l linux
/home/trainee/.local/lib/python3.5/site-packages/ansible/parsing/vault/__init__.py:44: CryptographyDeprecationWarning: Python 3.5 support will be dropped in the next release of cryptography. Please upgrade your Python.
  from cryptography.exceptions import InvalidSignature

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

TASK [Gathering Facts] *********************************************************************************************************************************
ok: [targeta]
ok: [targetb]

TASK [exemple01.java : install jre (Debian)] ***********************************************************************************************************
skipping: [targetb]
[WARNING]: Updating cache and auto-installing missing dependency: python-apt
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@ansible:~/.ansible/roles$ mkdir vault

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

trainee@ansible:~/.ansible/roles$ vi /home/trainee/.ansible/roles/group_vars/all.yaml
trainee@ansible:~/.ansible/roles$ cat /home/trainee/.ansible/roles/group_vars/all.yaml
---
secret: gardezmoisecret

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

trainee@ansible:~/.ansible/roles$ vi playbook.yaml 
trainee@ansible:~/.ansible/roles$ cat playbook.yaml 
---
- hosts: all
  tasks:
  - debug:
      msg: "Le secret est {{ secret }}"

Exécutez la commande ansible-playbook :

trainee@ansible:~/.ansible/roles$ ansible-playbook -i inventory playbook.yaml -l localhost
/home/trainee/.local/lib/python3.5/site-packages/ansible/parsing/vault/__init__.py:44: CryptographyDeprecationWarning: Python 3.5 support will be dropped in the next release of cryptography. Please upgrade your Python.
  from cryptography.exceptions import InvalidSignature

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@ansible:~/.ansible/roles$ ansible-vault encrypt group_vars/all.yaml
/home/trainee/.local/lib/python3.5/site-packages/ansible/parsing/vault/__init__.py:44: CryptographyDeprecationWarning: Python 3.5 support will be dropped in the next release of cryptography. Please upgrade your Python.
  from cryptography.exceptions import InvalidSignature
New Vault password: fenestros
Confirm New Vault password: fenestros
Encryption successful

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

Important : Notez que le mot de passe est pour la commande ansible-vault et non pas uniquement pour l'action de cryptage en cours.

Constatez maintenant le contenu du fichier /home/trainee/.ansible/roles/group_vars/all.yaml :

trainee@ansible:~/.ansible/roles$ cat /home/trainee/.ansible/roles/group_vars/all.yaml
$ANSIBLE_VAULT;1.1;AES256
30626538653763633464663266313765353138393239613338633165626339346432633831306633
3235323032326163343665653130653131643936613363370a393235333431613135323963303064
64626264663239623030353534303035343738323631653533656433613664613037613434383134
6634653531373732380a393235666361643066383039356434643835353832393364623562316239
33613933653336333232643930306131313231633565383066646262316638663639

Exécutez de nouveau la commande ansible-playbook :

trainee@ansible:~/.ansible/roles$ ansible-playbook -i inventory playbook.yaml -l localhost
/home/trainee/.local/lib/python3.5/site-packages/ansible/parsing/vault/__init__.py:44: CryptographyDeprecationWarning: Python 3.5 support will be dropped in the next release of cryptography. Please upgrade your Python.
  from cryptography.exceptions import InvalidSignature

PLAY [all] *********************************************************************************************************************************************
ERROR! Attempting to decrypt but no vault secrets found

Important : Notez l'erreur due au fait que le fichier a été crypté.

Pour indiquer à la commande ansible-playbook que le fichier qui doit être lu soit crypté, utilisez l'option –ask-vault-pass :

trainee@ansible:~/.ansible/roles$ ansible-playbook -i inventory playbook.yaml -l localhost --ask-vault-pass
/home/trainee/.local/lib/python3.5/site-packages/ansible/parsing/vault/__init__.py:44: CryptographyDeprecationWarning: Python 3.5 support will be dropped in the next release of cryptography. Please upgrade your Python.
  from cryptography.exceptions import InvalidSignature
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@ansible:~/.ansible/roles$ ansible-vault edit group_vars/all.yaml
/home/trainee/.local/lib/python3.5/site-packages/ansible/parsing/vault/__init__.py:44: CryptographyDeprecationWarning: Python 3.5 support will be dropped in the next release of cryptography. Please upgrade your Python.
  from cryptography.exceptions import InvalidSignature
Vault password: fenestros

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

Le fichier est chargé en mémoire pour édition :

---
secret: gardezmoisecret
~                                                                                                                                                                        
~                                                                                                                                                                        
~                                                                                                                                                                        
~                                                                                                                                                                        
~                                                                                                                                                                        
~                                                                                                                                                                        
~                                                                                                                                                                        
~                                                                                                                                                                                                                                                                                                                                             
~                                                                                                                                                                        
~                                                                                                                                                                        
~                                                                                                                                                                        
~                                                                                                                                                                        
"/tmp/tmpn2p84qb3.yaml" 2 lines, 28 characters

Modifiez le secret et sauvegardez le fichier :

---
secret: gardezlesecret
~                                                                                                                                                                        
~                                                                                                                                                                        
~                                                                                                                                                                        
~                                                                                                                                                                        
~                                                                                                                                                                        
~                                                                                                                                                                        
~                                                                                                                                                                        
~                                                                                                                                                                                                                                                                                                                                             
~                                                                                                                                                                        
~                                                                                                                                                                        
~                                                                                                                                                                        
~                                                                                                                                                                        
:x

Constatez que le contenu du fichier /home/trainee/.ansible/roles/group_vars/all.yaml est toujours crypté :

trainee@ansible:~/.ansible/roles$ cat /home/trainee/.ansible/roles/group_vars/all.yaml
$ANSIBLE_VAULT;1.1;AES256
37616265353436313939616237316635373133353534316237633434633461373963376235313363
6333303263626436366137653630643439626230323732650a393037333030336432326135373834
38626238643938623935343032366231373066356135383661653733653832396437323964363334
3236303738643031390a343834663162626637363765356430313233666535323763616364383732
35643466613032646366313561313062333531306237616662363032353330393530

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

trainee@ansible:~/.ansible/roles$ ansible-playbook -i inventory playbook.yaml -l localhost --ask-vault-pass
/home/trainee/.local/lib/python3.5/site-packages/ansible/parsing/vault/__init__.py:44: CryptographyDeprecationWarning: Python 3.5 support will be dropped in the next release of cryptography. Please upgrade your Python.
  from cryptography.exceptions import InvalidSignature
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@ansible:~/.ansible/roles$ ansible-vault decrypt group_vars/all.yaml
/home/trainee/.local/lib/python3.5/site-packages/ansible/parsing/vault/__init__.py:44: CryptographyDeprecationWarning: Python 3.5 support will be dropped in the next release of cryptography. Please upgrade your Python.
  from cryptography.exceptions import InvalidSignature
Vault password: fenestros
Decryption successful

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

Constatez que le contenu du fichier /home/trainee/.ansible/roles/group_vars/all.yaml n'est plus crypté :

trainee@ansible:~/.ansible/roles$ cat /home/trainee/.ansible/roles/group_vars/all.yaml
---
secret: gardezlesecret

2.4 - Utilisation de Mots de Passe Aléatoires

Installez le paquet pwgen :

trainee@ansible:~/.ansible/roles$ su -
Mot de passe : fenestros
root@ansible:~# apt-get install pwgen
...
root@ansible:~# exit
déconnexion

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

trainee@ansible:~/.ansible/roles$ pwgen 16 1
Ceiripaht6Fi1aiF

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

trainee@ansible:~/.ansible/roles$ pwgen 16 1 > vault-password
trainee@ansible:~/.ansible/roles$ ls
backend.j2  debug  exemple01.java  geerlingguy.java  group_vars  haproxy  host_vars  inventory  playbook.yaml  tomcat  vault  vault-password

trainee@ansible:~/.ansible/roles$ cat vault-password
iezeich5ooSheifi

Utilisez maintenant le mot de passe aléatoire contenu dans le fichier vault-password pour crypter le fichier /home/trainee/.ansible/roles/group_vars/all.yaml :

trainee@ansible:~/.ansible/roles$ ansible-vault encrypt group_vars/all.yaml --vault-password-file vault-password
/home/trainee/.local/lib/python3.5/site-packages/ansible/parsing/vault/__init__.py:44: CryptographyDeprecationWarning: Python 3.5 support will be dropped in the next release of cryptography. Please upgrade your Python.
  from cryptography.exceptions import InvalidSignature
Encryption successful

Constatez le contenu du fichier /home/trainee/.ansible/roles/group_vars/all.yaml :

trainee@ansible:~/.ansible/roles$ cat group_vars/all.yaml
$ANSIBLE_VAULT;1.1;AES256
64613166306436313464333963336633373133323433303033383131376261343834356136633864
3665663332643735303836323362376662356435616136300a653834336561356361383736396436
63373761333738383637666237613339663637666439303131323862643939613735336534636131
3135653736393065320a646363646239373033613630346362383838633635313734373362366237
36333365376637323336303461613862376638663333646632633135653964346139

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

trainee@ansible:~/.ansible/roles$ ansible-playbook -i inventory playbook.yaml -l localhost --vault-password-file vault-password
/home/trainee/.local/lib/python3.5/site-packages/ansible/parsing/vault/__init__.py:44: CryptographyDeprecationWarning: Python 3.5 support will be dropped in the next release of cryptography. Please upgrade your Python.
  from cryptography.exceptions import InvalidSignature

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 Debian. Afin de l'installer il convient d'ajouter le dépôt de docker. Premièrement, il est nécessaire d'installer les paquets permettant à Debian d'utiliser un dépôt en https :

trainee@ansible:~/.ansible/roles$ su -
Mot de passe : fenestros
root@ansible:~# apt-get install -y apt-transport-https ca-certificates curl gnupg2 software-properties-common

Téléchargez la clef GPG officielle de docker :

root@ansible:~# curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
OK

Vérifiez que l'ID de la clef est 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 :

root@ansible:~# apt-key fingerprint 0EBFCD88
pub   rsa4096 2017-02-22 [SCEA]
      9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid           [ unknown] Docker Release (CE deb) <docker@docker.com>
sub   rsa4096 2017-02-22 [S]

Ajoutez le dépôt stable de docker :

root@ansible:~# add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"

Important - Notez que la commande lsb_release -cs retourne le nom de la distribution Debian, à savoir dans ce cas stretch.

Installez maintenant le paquet docker-ce :

root@ansible:~# apt-get update
...
root@ansible:~# apt-get -y install docker-ce

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

root@ansible:~# docker version
Client: Docker Engine - Community
 Version:           19.03.15
 API version:       1.40
 Go version:        go1.13.15
 Git commit:        99e3ed8919
 Built:             Sat Jan 30 03:17:11 2021
 OS/Arch:           linux/amd64
 Experimental:      false

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:40 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.4.3
  GitCommit:        269548fa27e0089a8b8278fc4fc781d7f65a939b
 runc:
  Version:          1.0.0-rc92
  GitCommit:        ff819c7e9184c13b7c2607fe6c30ae19403a7aff
 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@ansible:~# docker run -d --name postgresql centos sleep infinity
Unable to find image 'centos:latest' locally
latest: Pulling from library/centos
7a0437f04f83: Pull complete 
Digest: sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c04efc1
Status: Downloaded newer image for centos:latest
f9be86154d1dfaf652d888f478847fbc233ec8984d53a388eb000d2f9dd0344f

Vérifiez que le conteneur fonctionne :

root@ansible:~# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
f9be86154d1d        centos              "sleep infinity"    29 minutes ago      Up 29 minutes                           postgresql

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@ansible:~/.ansible/roles$ vi playbook.yaml 
trainee@ansible:~/.ansible/roles$ cat playbook.yaml 
---
- hosts: all
  tasks:
    - name: message
      debug: msg="Conteneur - {{ inventory_hostname }} sous {{ansible_distribution}}"
    - name: install
      package: name=postgresql state=present 

Modifiez le fichier inventory :

trainee@ansible:~/.ansible/roles$ cp inventory inventory.old
trainee@ansible:~/.ansible/roles$ vi inventory
trainee@ansible:~/.ansible/roles$ cat inventory
postgresql ansible_connection=docker

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

<code>
trainee@ansible:~/.ansible/roles$ rm -rf /home/trainee/.ansible/roles/group_vars/all.yaml

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

trainee@ansible:~/.ansible/roles$ su -
Mot de passe : 
root@ansible:~# cd /home/trainee/.ansible/roles/
root@ansible:/home/trainee/.ansible/roles# ansible-playbook -i inventory playbook.yaml

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

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

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

TASK [install] *****************************************************************************************************************************************
changed: [postgresql]

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

Vérifiez maintenant que postgresql a été installé dans le conteneur :

root@ansible:/home/trainee/.ansible/roles# docker exec -it postgresql /bin/bash
[root@f9be86154d1d /]# psql --version
psql (PostgreSQL) 10.15

Copyright © 2022 Hugh Norris.

Menu