Déployer un conteneur Docker avec Ansible

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.25
  • backports.ssl_match_hostname (lors de l'utilisation de TLS en Python 2)
  • paramiko (Si use_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
defaults/main.yml

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 }}"
tasks/main.yml

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
docker.yml