Comment utiliser Ansible pour installer et configurer Docker sur Ubuntu 18.04

introduction

Avec la vulgarisation des applications conteneurisées et des microservices, l’automatisation des serveurs joue désormais un rôle essentiel dans l’administration des systèmes. C'est également un moyen d'établir des procédures standard pour les nouveaux serveurs et de réduire les erreurs humaines.

Ce guide explique comment utiliserAnsible pour automatiser les étapes contenues dans notre guide surHow To Install and Use Docker on Ubuntu 18.04. Docker est une application qui simplifie le processus de gestion descontainers, des processus isolés par des ressources qui se comportent de la même manière que les machines virtuelles, mais qui sont plus portables, plus respectueux des ressources et dépendent davantage du système d'exploitation hôte.

Bien que vous puissiez effectuer cette configuration manuellement, l'utilisation d'un outil de gestion de la configuration tel qu'Ansible pour automatiser le processus vous fera gagner du temps et établira des procédures standard pouvant être répétées sur des dizaines à des centaines de nœuds. Ansible offre une architecture simple ne nécessitant pas l’installation de logiciels spéciaux sur les nœuds. Il offre un ensemble complet de fonctionnalités et de modules intégrés facilitant l’écriture de scripts d’automatisation.

Vérification pré-vol

Pour exécuter la configuration automatisée fournie par le livre de jeu décrit dans ce guide, vous aurez besoin des éléments suivants:

  • Ansible installé sur votre machine locale ou sur un serveur distant que vous avez configuré en tant queAnsible Control Node. Vous pouvez suivre l'étape 1 du didacticielHow to Install and Configure Ansible on Ubuntu 18.04 pour obtenir cette configuration.

    • Si vous envisagez d'utiliser un serveur distant en tant que nœud de contrôle Ansible, vous devez disposer d'un utilisateur non root doté de privilèges sudo et d'un pare-feu de base configuré avant l'installation d'Ansible. Suivez nosInitial Server Setup Guide for Ubuntu 18.04 pour configurer cela.

  • Accès à un ou plusieurs serveurs Ubuntu 18.04 qui seront utilisés comme vosAnsible hosts. Chacun doit avoir un utilisateur non root avec des privilèges sudo et un pare-feu de base configuré. Suivez notre guide surAutomating Initial Server Setup with Ansible on Ubuntu 18.04 pour le configurer automatiquement. Vous pouvez également le configurer manuellement en suivant nosInitial Server Setup Guide for Ubuntu 18.04 sur chacun de vos hôtes Ansible.

Test de la connectivité aux nœuds

Pour vous assurer que Ansible est capable d'exécuter des commandes sur vos nœuds, exécutez la commande suivante à partir de votre nœud de contrôle Ansible:

ansible -m ping all

Cette commande utilisera le module intégréping d'Ansible pour exécuter un test de connectivité sur tous les nœuds à partir de votre fichier d'inventaire par défaut, en se connectant en tant qu'utilisateur système actuel. Le moduleping testera si:

  • vos hôtes Ansible sont accessibles;

  • votre nœud de contrôle Ansible possède des informations d'identification SSH valides;

  • vos hôtes peuvent exécuter des modules Ansible à l'aide de Python.

Si vous avez installé et configuré Ansible correctement, vous obtiendrez une sortie semblable à celle-ci:

Outputserver1 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
server2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
server3 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

Une fois que vous avez reçu une réponse depong d'un hôte, cela signifie que vous êtes prêt à exécuter les commandes et playbooks Ansible sur ce serveur.

[.note] #Note: Si vous ne parvenez pas à obtenir une réponse réussie de vos serveurs, consultez nosAnsible Cheat Sheet Guide pour plus d'informations sur la façon d'exécuter des commandes Ansible avec des options de connexion personnalisées.
#

Que fait ce Playbook?

Ce playbook Ansible offre une alternative à l'exécution manuelle de la procédure décrite dans notre guide surHow To Install and Use Docker on Ubuntu 18.04.

L'exécution de ce livret effectuera les actions suivantes sur vos hôtes Ansible:

  1. Installezaptitude, qui est préféré par Ansible comme alternative au gestionnaire de paquetsapt.

  2. Installez les packages système requis.

  3. Installez la clé Docker GPG APT.

  4. Ajoutez le référentiel Docker officiel aux sources deapt.

  5. Installez Docker.

  6. Installez le module Python Docker viapip.

  7. Extrayez l'image par défaut spécifiée pardefault_container_image depuis Docker Hub.

  8. Créez le nombre de conteneurs défini par le champcreate_containers, chacun utilisant l'image définie pardefault_container_image, et exécutez la commande définie dansdefault_container_command dans chaque nouveau conteneur.

Une fois le playbook terminé, un certain nombre de conteneurs seront créés en fonction des options que vous avez définies dans vos variables de configuration.

Comment utiliser ce livre de jeu

Pour commencer, nous allons télécharger le contenu desplaybook sur votre nœud de contrôle Ansible. Pour votre commodité, le contenu du playbook est également inclus dansthe next section of this guide.

Utilisezcurl pour télécharger ce playbook à partir de la ligne de commande:

curl -L https://raw.githubusercontent.com/do-community/ansible-playbooks/master/docker/ubuntu1804.yml -o docker_ubuntu.yml

Cela téléchargera le contenu du playbook dans un fichier nommédocker_ubuntu.yml dans votre répertoire de travail actuel. Vous pouvez examiner le contenu du playbook en ouvrant le fichier à l'aide de l'éditeur de ligne de commande de votre choix:

nano docker_ubuntu.yml

Une fois que vous avez ouvert le fichier de playbook, vous devriez remarquer une section nomméevars avec des variables qui nécessitent votre attention:

docker_ubuntu.yml

. . .
vars:
  create_containers: 4
  default_container_name: docker
  default_container_image: ubuntu
  default_container_command: sleep 1d
. . .

Voici ce que signifient ces variables:

  • create_containers: le nombre de conteneurs à créer.

  • default_container_name: nom du conteneur par défaut.

  • default_container_image: Image Docker par défaut à utiliser lors de la création de conteneurs.

  • default_container_command: commande par défaut à exécuter sur de nouveaux conteneurs.

Une fois que vous avez terminé de mettre à jour les variables dansdocker_ubuntu.yml, enregistrez et fermez le fichier. Si vous avez utilisénano, faites-le en appuyant surCTRL + X,Y, puisENTER.

Vous êtes maintenant prêt à exécuter ce livre sur un ou plusieurs serveurs. La plupart des playbooks sont configurés pour être exécutés sur les serveursall de votre inventaire, par défaut. Nous pouvons utiliser l'indicateur-l pour nous assurer que seul un sous-ensemble de serveurs, ou un seul serveur, est affecté par le playbook. Pour exécuter le playbook uniquement surserver1, vous pouvez utiliser la commande suivante:

ansible-playbook docker_ubuntu.yml -l server1

Vous obtiendrez une sortie similaire à celle-ci:

Output...
TASK [Add Docker GPG apt Key] ********************************************************************************************************************
changed: [server1]

TASK [Add Docker Repository] *********************************************************************************************************************
changed: [server1]

TASK [Update apt and install docker-ce] **********************************************************************************************************
changed: [server1]

TASK [Install Docker Module for Python] **********************************************************************************************************
changed: [server1]

TASK [Pull default Docker image] *****************************************************************************************************************
changed: [server1]

TASK [Create default containers] *****************************************************************************************************************
changed: [server1] => (item=1)
changed: [server1] => (item=2)
changed: [server1] => (item=3)
changed: [server1] => (item=4)

PLAY RECAP ***************************************************************************************************************************************
server1                  : ok=9    changed=8    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

[.note] #Note: Pour plus d'informations sur l'exécution des playbooks Ansible, consultez nosAnsible Cheat Sheet Guide.
#

Lorsque le playbook est terminé, connectez-vous via SSH au serveur provisionné par Ansible et exécutezdocker ps -a pour vérifier si les conteneurs ont été créés avec succès:

sudo docker ps -a

Vous devriez voir une sortie semblable à ceci:

OutputCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
a3fe9bfb89cf        ubuntu              "sleep 1d"          5 minutes ago       Created                                 docker4
8799c16cde1e        ubuntu              "sleep 1d"          5 minutes ago       Created                                 docker3
ad0c2123b183        ubuntu              "sleep 1d"          5 minutes ago       Created                                 docker2
b9350916ffd8        ubuntu              "sleep 1d"          5 minutes ago       Created                                 docker1

Cela signifie que les conteneurs définis dans le livre de jeu ont été créés avec succès. S'agissant de la dernière tâche du playbook, cela confirme également que le playbook a été entièrement exécuté sur ce serveur.

Le contenu du livret

Vous pouvez trouver le playbook Docker présenté dans ce tutoriel dans lesansible-playbooks repository dans lesDigitalOcean Community GitHub organization. Pour copier ou télécharger directement le contenu du script, cliquez sur le boutonRaw vers le haut du script, ou surclick here to view the raw contents directly.

Le contenu complet est également inclus ici pour votre commodité:

docker_ubuntu.yml

---
- hosts: all
  become: true
  vars:
    create_containers: 4
    default_container_name: docker
    default_container_image: ubuntu
    default_container_command: sleep 1d

  tasks:
    - name: Install aptitude using apt
      apt: name=aptitude state=latest update_cache=yes force_apt_get=yes

    - name: Install required system packages
      apt: name={{ item }} state=latest update_cache=yes
      loop: [ 'apt-transport-https', 'ca-certificates', 'curl', 'software-properties-common', 'python3-pip', 'virtualenv', 'python3-setuptools']

    - name: Add Docker GPG apt Key
      apt_key:
        url: https://download.docker.com/linux/ubuntu/gpg
        state: present

    - name: Add Docker Repository
      apt_repository:
        repo: deb https://download.docker.com/linux/ubuntu bionic stable
        state: present

    - name: Update apt and install docker-ce
      apt: update_cache=yes name=docker-ce state=latest

    - name: Install Docker Module for Python
      pip:
        name: docker

    # Pull image specified by variable default_image from the Docker Hub
    - name: Pull default Docker image
      docker_image:
        name: "{{ default_container_image }}"
        source: pull

    # Creates the number of containers defined by the variable create_containers, using default values
    - name: Create default containers
      docker_container:
        name: "{{ default_container_name }}{{ item }}"
        image: "{{ default_container_image }}"
        command: "{{ default_container_command }}"
        state: present
      with_sequence: count={{ create_containers }}

N'hésitez pas à modifier ce livret pour l'adapter au mieux à vos besoins individuels au sein de votre propre flux de travail. Par exemple, vous pouvez utiliser le moduledocker_image pour pousser des images vers Docker Hub ou le moduledocker_container pour configurer des réseaux de conteneurs.

Conclusion

L'automatisation de la configuration de votre infrastructure peut non seulement vous faire gagner du temps, mais permet également de garantir que vos serveurs suivront une configuration standard pouvant être personnalisée en fonction de vos besoins. Avec la nature distribuée des applications modernes et le besoin de cohérence entre différents environnements de transfert, cette automatisation est devenue un élément central des processus de développement de nombreuses équipes.

Dans ce guide, nous avons montré comment utiliser Ansible pour automatiser le processus d'installation et de configuration de Docker sur un serveur distant. Étant donné que chaque individu a généralement des besoins différents lorsqu'il travaille avec des conteneurs, nous vous encourageons à consulter lesofficial Ansible documentation pour plus d'informations et des cas d'utilisation du module Ansibledocker_container.

Si vous souhaitez inclure d'autres tâches dans ce manuel pour personnaliser davantage la configuration initiale de votre serveur, veuillez consulter notre guide d'introduction AnsibleConfiguration Management 101: Writing Ansible Playbooks.