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

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

介绍

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

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

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

先决条件

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

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

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


这个剧本有什么作用?

这个 Ansible playbook 提供了一种替代方法,可以手动运行我们在 如何在 Ubuntu 20.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. 创建由container_count变量定义的容器数量,每个容器使用由default_container_image定义的图像,并在每个新容器中执行default_container_command中定义的命令。

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

首先,在 Ansible 控制节点服务器上登录启用 sudo 的用户。

第 1 步——准备你的剧本

playbook.yml 文件是定义所有 任务 的地方。 任务是您可以使用 Ansible playbook 自动执行的最小操作单元。 但首先,使用您喜欢的文本编辑器创建您的剧本文件:

nano playbook.yml

这将打开一个空的 YAML 文件。 在开始向您的剧本添加任务之前,请先添加以下内容:

剧本.yml

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

几乎你遇到的每一本剧本都会以类似的声明开头。 hosts 声明 Ansible 控制节点将使用此 playbook 定位哪些服务器。 become 说明是否所有命令都将使用升级的 root 权限完成。

vars 允许您将数据存储在变量中。 如果您决定将来更改这些,您只需在文件中编辑这些单行。 以下是每个变量的简要说明:

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

注意:如果要查看最终完成状态的playbook文件,请跳转到步骤5。 YAML 文件的缩进结构可能很特殊,因此您可能需要在添加所有任务后仔细检查您的剧本。


第 2 步 — 将包安装任务添加到您的 Playbook

默认情况下,Ansible 在 playbook 中按照从上到下的顺序同步执行任务。 这意味着任务顺序很重要,您可以放心地假设一个任务将在下一个任务开始之前完成执行。

此剧本中的所有任务都可以独立存在,并可在您的其他剧本中重复使用。

添加安装 aptitude(用于连接 Linux 包管理器的工具)和安装所需系统包的第一个任务。 Ansible 将确保这些软件包始终安装在您的服务器上:

剧本.yml

  tasks:
    - name: Install aptitude
      apt:
        name: aptitude
        state: latest
        update_cache: true

    - name: Install required system packages
      apt:
        pkg:
          - apt-transport-https
          - ca-certificates
          - curl
          - software-properties-common
          - python3-pip
          - virtualenv
          - python3-setuptools
        state: latest
        update_cache: true

在这里,您使用 apt Ansible 内置 模块 来指导 Ansible 安装您的包。 Ansible 中的模块是执行操作的快捷方式,否则您必须将其作为原始 bash 命令运行。 如果 aptitude 不可用,Ansible 安全地回退到 apt 来安装包,但 Ansible 历来首选 aptitude

您可以根据自己的喜好添加或删除软件包。 这将确保所有软件包不仅存在,而且在最新版本上,并且在调用 apt 更新后完成。

第 3 步 — 将 Docker 安装任务添加到您的 Playbook

您的任务将从官方存储库安装最新版本的 Docker。 添加 Docker GPG 密钥以验证下载,添加官方存储库作为新的包源,并将安装 Docker。 此外,还将安装 Python 的 Docker 模块:

剧本.yml

    - 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 focal stable
        state: present

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

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

您会看到 apt_keyapt_repository 内置 Ansible 模块首先指向正确的 URL,然后负责确保它们存在。 这允许安装最新版本的 Docker,以及使用 pip 安装 Python 模块。

第 4 步 — 将 Docker 映像和容器任务添加到您的 Playbook

Docker 容器的实际创建从拉取所需的 Docker 映像开始。 默认情况下,这些镜像来自官方的 Docker Hub。 使用此映像,将根据剧本顶部声明的变量所规定的规范创建容器:

剧本.yml

    - name: Pull default Docker image
      community.docker.docker_image:
        name: "{{ default_container_image }}"
        source: pull

    - name: Create default containers
      community.docker.docker_container:
        name: "{{ default_container_name }}{{ item }}"
        image: "{{ default_container_image }}"
        command: "{{ default_container_command }}"
        state: present
      with_sequence: count={{ container_count }}

docker_image 用于拉取要用作容器基础的 Docker 映像。 docker_container 允许你指定你创建的容器的细节,以及你想要传递给它们的命令。

with_sequence 是 Ansible 创建循环的方式,在这种情况下,它将根据您指定的计数循环创建容器。 这是一个基本的计数循环,因此这里的 item 变量提供了一个代表当前循环迭代的数字。 这个数字在这里用来命名你的容器。

第 5 步 — 回顾你的完整剧本

您的剧本应大致如下所示,根据您的自定义设置略有不同:

剧本.yml

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

  tasks:
    - name: Install aptitude
      apt:
        name: aptitude
        state: latest
        update_cache: true

    - name: Install required system packages
      apt:
        pkg:
          - apt-transport-https
          - ca-certificates
          - curl
          - software-properties-common
          - python3-pip
          - virtualenv
          - python3-setuptools
        state: latest
        update_cache: true

    - 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 focal stable
        state: present

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

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

    - name: Pull default Docker image
      community.docker.docker_image:
        name: "{{ default_container_image }}"
        source: pull

    - name: Create default containers
      community.docker.docker_container:
        name: "{{ default_container_name }}{{ item }}"
        image: "{{ default_container_image }}"
        command: "{{ default_container_command }}"
        state: present
      with_sequence: count={{ container_count }}

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

注意: 这是一个温柔的提醒,要注意你的缩进。 如果您遇到错误,这很可能是罪魁祸首。 YAML 建议使用 2 个空格作为缩进,如本示例中所做的那样。


一旦你对你的剧本感到满意,你可以退出你的文本编辑器并保存。

第六步——运行你的剧本

您现在已准备好在一台或多台服务器上运行此 playbook。 大多数剧本默认配置为在您库存中的每台服务器上执行,但这次您将指定您的服务器。

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

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

-l 标志指定您的服务器,-u 标志指定在远程服务器上登录的用户。 你会得到类似这样的输出:

Output. . .
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 提供的服务器,检查容器是否创建成功。

使用以下命令登录远程服务器:

ssh sammy@your_remote_server_ip

并列出远程服务器上的 Docker 容器:

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 已在此服务器上完全执行。

结论

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

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

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