如何在Ubuntu18.04上使用Ansible安装和设置Docker

来自菜鸟教程
跳转至:导航、​搜索

介绍

由于现代应用程序环境的一次性性质,服务器自动化现在在系统管理中发挥着重要作用。 配置管理工具,例如Ansible,通常用于通过为新服务器建立标准程序来简化服务器设置自动化的过程,同时减少与手动设置相关的人为错误。

Ansible 提供了一个简单的架构,不需要在节点上安装特殊软件。 它还提供了一组强大的功能和内置模块,有助于编写自动化脚本。

本指南解释了如何使用 Ansible 自动执行我们关于 如何在 Ubuntu 18.04 上安装和使用 Docker 的指南中包含的步骤。 Docker 是一个应用程序,它简化了管理 容器 的过程,这些容器是资源隔离的进程,其行为方式类似于虚拟机,但更便携、更资源友好且依赖更多地依赖于主机操作系统。

先决条件

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

  • 一个 Ansible 控制节点:安装了 Ansible 并配置为使用 SSH 密钥连接到 Ansible 主机的 Ubuntu 18.04 机器。 确保控制节点具有具有 sudo 权限的普通用户并启用了防火墙,如我们的 初始服务器设置 指南中所述。 要设置 Ansible,请按照我们关于 如何在 Ubuntu 18.04 上安装和配置 Ansible 的指南进行操作。
  • 一个或多个 Ansible 主机:一个或多个远程 Ubuntu 18.04 服务器以前按照 如何使用 Ansible 在 Ubuntu 18.04 上自动进行初始服务器设置的指南设置。

在继续之前,您首先需要确保您的 Ansible 控制节点能够连接并在您的 Ansible 主机上执行命令。 如需连接测试,请查看 如何在 Ubuntu 18.04 上安装和配置 Ansible 的第 3 步。


这个剧本有什么作用?

这个 Ansible playbook 提供了一种替代方法来手动运行我们在 如何在 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 完成运行,您将根据您在配置变量中定义的选项创建许多容器。

如何使用本手册

我们需要做的第一件事是从 do-community/ansible-playbooks 存储库中获取 Docker playbook 及其依赖项。 我们需要将此存储库克隆到 Ansible 控制节点内的本地文件夹。

如果您之前按照不同的指南克隆了此存储库,请访问您现有的 ansible-playbooks 副本并运行 git pull 命令以确保您已更新内容:

cd ~/ansible-playbooks
git pull

如果这是您第一次使用 do-community/ansible-playbooks 存储库,您应该首先将存储库克隆到您的主文件夹:

cd ~
git clone https://github.com/do-community/ansible-playbooks.git
cd ansible-playbooks

我们感兴趣的文件位于 docker_ubuntu1804 文件夹中,其结构如下:

docker_ubuntu1804
├── vars
│   └── default.yml
├── playbook.yml
└── readme.md

以下是每个文件的内容:

  • vars/default.yml:用于自定义剧本设置的变量文件。
  • playbook.yml:剧本文件,包含要在远程服务器上执行的任务。
  • readme.md:包含有关此剧本的信息的文本文件。

我们将编辑 playbook 的变量文件以自定义我们的 Docker 设置。 访问 docker_ubuntu1804 目录并使用您选择的命令行编辑器打开 vars/default.yml 文件:

cd docker_ubuntu1804
nano vars/default.yml

此文件包含一些需要您注意的变量:

变量/default.yml

---
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:在新容器上运行的默认命令。

更新完 vars/default.yml 中的变量后,保存并关闭此文件。 如果您使用 nano,请按 CTRL + XY,然后按 ENTER

您现在已准备好在一台或多台服务器上运行此 playbook。 默认情况下,大多数剧本都配置为在库存中的每台服务器上执行。 我们可以使用 -l 标志来确保只有一部分服务器或单个服务器受到剧本的影响。 我们还可以使用 -u 标志来指定我们使用远程服务器上的哪个用户来连接和执行远程主机上的 playbook 命令。

要仅在 server1 上执行 playbook,连接为 sammy,可以使用以下命令:

ansible-playbook playbook.yml -l server1 -u sammy

你会得到类似这样的输出:

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   

注意:有关如何运行 Ansible playbook 的更多信息,请查看我们的 Ansible 备忘单指南


当 playbook 运行完成后,通过 SSH 登录到 Ansible 提供的服务器并运行 docker ps -a 以检查容器是否创建成功:

sudo docker ps -a

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

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

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

剧本内容

您可以在 DigitalOcean Community Playbooks 存储库中的 docker_ubuntu1804 文件夹中找到本教程中介绍的 Docker 服务器设置。 要直接复制或下载脚本内容,请单击每个脚本顶部的 Raw 按钮。

为方便起见,此处还包含了剧本的全部内容及其相关文件。

变量/default.yml

default.yml 变量文件包含在服务器上设置 Docker 时将使用的值。

变量/default.yml

---
create_containers: 4
default_container_name: docker
default_container_image: ubuntu
default_container_command: sleep 1d

剧本.yml

playbook.yml 文件是定义此设置中的所有任务的位置。 它首先定义应作为此设置目标的服务器组 (all),然后使用 become: true 定义应使用权限提升执行的任务 ([ X197X]) 默认情况下。 然后,它包含 vars/default.yml 变量文件以加载配置选项。

剧本.yml

---
- hosts: all
  become: true
  vars_files:
    - vars/default.yml

  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

    - 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 values from vars file
    - 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] (https://docs.ansible.com/ansible/2.6/modules /docker_container_module.html#docker-container-module) 模块来设置容器网络。

结论

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

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

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