Déployer un conteneur Docker avec Ansible

Déployer des Conteneurs Docker manuellement c'est bien beau, mais utiliser l'Infrastructure-As-Code (IaC) avec Ansible c'est mieux ! Que ce soit pour la gestion des variables, des templates Jinja2 ou encore du déploiement en masse, Ansible peut s'avérer très puissant couplé à Docker !
Intérêt
Il est très utile de pouvoir déployer des conteneurs Docker avec Ansible de manière efficace, et ce, dans beaucoup de situations différentes. Notamment :
- Pour le déploiement d'un correctif de sécurité en masse avec un conteneur Docker "éphémère"
- Déployer un conteneur Docker de test (Hello World) pour s'assurer que son parc de serveurs dispose bien de Docker d'installé
- La mise en place de différents conteneurs Docker (middlewares, serveurs web, bases de données etc...)
Et bien d'autres cas !
Prérequis
Pour avoir les modules Ansible nécessaires à la création d'un conteneur Docker, il faut installer la collection Ansible Galaxy community.docker
développée et maintenue par la communauté de cette manière :
ansible-galaxy collection install community.docker
Voici aussi les dépendances requises sur le controller Ansible :
Docker API
>= 1.25backports.ssl_match_hostname
(lors de l'utilisation de TLS en Python 2)paramiko
(Siuse_ssh_client=false
utilisé)pyOpenSSL
pywin32
requests
Le rôle Ansible pour Docker
Voici la structure pour ce Rôle Ansible Docker. Il s'agit d'une structure minimaliste.
docker
├── defaults
│ └── main.yml
└── tasks
└── main.yml
Dans notre cas, nous allons déployer un simple conteneur Apache (httpd).
Les variables
Lorsque l'on travaille avec un outil d'Infrastructure-As-Code, il est important de bien nommer et ordonner ses variables. Voici les variables utiles au déploiement d'un conteneur Apache avec Docker rangées dans le fichier defaults/main.yml
:
---
container:
httpd:
image: httpd
tag: latest
ports:
- 80:80
name: httpd
volumes:
- /var/www/html/wordpress:/usr/local/apache2/htdocs/
detach: true
Si vous souhaitez déployer plusieurs conteneurs Docker, vous avez la possibilité d'ajouter un élément à la liste container.
La task de déploiement
Voici le fichier tasks/main.yml
:
---
- name: Déploiement d'un conteneur {{ container.httpd.name }}
community.docker.docker_container:
name: "{{ container.httpd.name }}"
image: "{{ container.httpd.image }}:{{ container.httpd.tag }}"
volumes: "{{ container.httpd.volumes }}"
ports: "{{ container.httpd.ports }}"
detach: "{{ container.httpd.detach }}"
Comme vous pouvez le voir, tout est en variable ! Il s'agit d'une bonne pratique dans le développement de playbooks Ansible.
Vous avez maintenant un Rôle Ansible pour déployer des conteneurs Docker ! Voici le résultat de mon côté avec un simple playbook Ansible :
---
- name: Deploiement de Docker
become: true
hosts: localhost
roles:
- docker
