如何在Ubuntu 18.04上使用Ansible安装和设置Docker

Docker是一个简化*容器*中管理应用程序进程的过程的应用程序。本指南介绍如何使用Ansible自动执行如何在Ubuntu 18.04上安装和使用Docker的指南中包含的步骤。 Ansible是一种现代配置管理工具,可用于自动化远程系统的配置和配置。

介绍

随着容器化应用和微服务的普及,服务器自动化现在在系统管理中发挥着至关重要的作用。 它也是为新服务器建立标准过程并减少人为错误的一种方法。

本指南介绍如何使用Ansible自动执行如何在Ubuntu 18.04上安装和使用Docker的指南中包含的步骤。 Docker是一个简化管理容器的过程,资源隔离的过程,其行为方式与虚拟机类似,但更便于携带,更加资源友好,并且更依赖于主机操作系统。

虽然您可以手动完成此设置,但使用Ansible之类的配置管理工具来自动执行该过程将节省您的时间并建立可以在数十到数百个节点上重复的标准过程。 Ansible提供了一种简单的架构,不需要在节点上安装特殊软件,它提供了一组强大的功能和内置模块,便于编写自动化脚本。

飞行前检查

为了执行本指南中讨论的剧本提供的自动设置,您需要:

测试与节点的连接

要确保Ansible能够在节点上执行命令,请从Ansible Control节点运行以下命令:

ansible -m ping all

此命令将使用Ansible的内置ping模块在默认库存文件的所有节点上运行连接测试,并以当前系统用户身份进行连接。 ping模块将测试是否:

  • 你的Ansible主机是可访问的;
  • 您的Ansible控制节点具有有效的SSH凭据;
  • 您的主机能够使用Python运行Ansible模块。

如果您正确安装并配置了Ansible,您将得到与此类似的输出:

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


一旦您从主机获得pong回复,这意味着您已准备好在该服务器上运行Ansible命令和playbooks。

注意 :如果您无法从服务器获得成功的响应,请查看我们的“ Ansible备忘单指南” ,了解有关如何使用自定义连接选项运行Ansible命令的更多信息。

这本剧本有什么作用?

这个Ansible手册提供了另一种方法,可以手动运行Ubuntu 18.04如何安装和使用Docker的指南中概述的过程。

运行此playbook将在Ansible主机上执行以下操作:

  1. 安装aptitude ,Ansible首选它作为apt包管理器的替代品。
  2. 安装所需的系统包。
  3. 安装Docker GPG APT密钥。
  4. 将官方Docker存储库添加到apt源。
  5. 安装Docker。
  6. 通过pip安装Python Docker模块。
  7. 从Docker Hub中拉出default_container_image指定的默认图像。
  8. 创建create_containers字段定义的容器数,每个容器使用default_container_image定义的映像,并在每个新容器中执行default_container_command中定义的命令。

一旦playbook完成运行,您将根据在配置变量中定义的选项创建多个容器。

如何使用本手册

首先,我们将把Playbook的内容下载到Ansible Control Node。 为方便起见,剧本的内容也包含在本指南的下一部分中

使用curl从命令行下载此playbook:

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

这会将playbook的内容下载到当前工作目录中名为docker_ubuntu.yml的文件中。 您可以使用您选择的命令行编辑器打开文件来检查playbook的内容:

nano docker_ubuntu.yml

打开playbook文件后,您应该注意到一个名为vars的部分,其中包含需要引起注意的变量:

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

以下是这些变量的含义:

  • create_containers :要创建的容器数。
  • default_container_name :默认容器名称。
  • default_container_image :创建容器时要使用的默认Docker镜像。
  • default_container_command :在新容器上运行的默认命令。

完成更新docker_ubuntu.yml的变量docker_ubuntu.yml ,保存并关闭该文件。 如果你使用nano ,按CTRL + XY ,然后按ENTER

您现在已准备好在一台或多台服务器上运行此剧本。 默认情况下,大多数手册都配置为在您的广告资源中的all服务器上执行。 我们可以使用-l标志来确保只有一部分服务器或单个服务器受到该剧本的影响。 要仅在server1上执行playbook,可以使用以下命令:

ansible-playbook docker_ubuntu.yml -l server1

您将获得类似于此的输出:

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


注意 :有关如何运行Ansible playbooks的更多信息,请查看我们的Ansible Cheat Sheet Guide

当剧本运行完毕后,通过SSH登录到Ansible配置的服务器并运行docker docker ps -a来检查容器是否已成功创建:

sudo docker ps -a

您应该看到与此类似的输出:

CONTAINER 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

这意味着在playbook中定义的容器已成功创建。 由于这是剧本中的最后一项任务,它也确认该剧本在该服务器上完全执行。

Playbook内容

您可以在DigitalOcean社区GitHub组织ansible-playbooks存储库中找到本教程中的Docker手册。 要直接复制或下载脚本内容,请单击脚本顶部的“ 原始”按钮,或单击此处直接查看原始内容

为方便起见,此处还包含完整内容:

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 }}

您可以随意修改此剧本,以最适合您自己工作流程中的个人需求。 例如,您可以使用docker_image模块将图像推送到Docker Hub或docker_container模块以设置容器网络。

结论

自动化基础架构设置不仅可以节省您的时间,还有助于确保您的服务器遵循可根据您的需求进行定制的标准配置。 由于现代应用程序的分布式特性以及不同临时环境之间的一致性需求,这样的自动化已成为许多团队开发过程的核心组件。

在本指南中,我们演示了如何使用Ansible自动化在远程服务器上安装和设置Docker的过程。 由于每个人在使用容器时通常都有不同的需求,因此我们建议您查看官方的Ansible文档,以获取更多信息以及docker_container Ansible模块的使用案例。

如果您想在此剧集中包含其他任务以进一步自定义初始服务器设置,请参阅我们的安装指南配置管理101:编写Ansible Playbooks