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

介绍

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

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

本指南将说明如何使用Ansible自动化我们的指南中有关在Ubuntu 18.04上安装和使用Docker的步骤。Docker是一种简化容器管理过程的应用程序,容器是资源隔离的过程,其行为类似于虚拟机,但更具可移植性、更节约资源,并更依赖于宿主操作系统。

先决条件

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

  • One Ansible control node: an Ubuntu 18.04 machine with Ansible installed and configured to connect to your Ansible hosts using SSH keys. Make sure the control node has a regular user with sudo permissions and a firewall enabled, as explained in our Initial Server Setup guide. To set up Ansible, please follow our guide on How to Install and Configure Ansible on Ubuntu 18.04.
  • One or more Ansible Hosts: one or more remote Ubuntu 18.04 servers previously set up following the guide on How to Use Ansible to Automate Initial Server Setup on Ubuntu 18.04.

Note

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

这本剧本能做些什么? (Zhè zuò xiē ?)

这个 Ansible playbook 提供了一种替代手动按照我们在《在 Ubuntu 18.04 上安装和使用 Docker 的指南》中概述的步骤来运行的选择。设置好你的 playbook 后,每次安装都可以使用它。

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

    1. 安装aptitude,这是Ansible推荐的apt软件包管理器的替代方案。

 

    1. 安装所需的系统软件包。

 

    1. 安装Docker GPG APT密钥。

 

    1. 将官方Docker仓库添加到apt源中。

 

    1. 安装Docker。

 

    1. 通过pip安装Python Docker模块。

 

    1. 从Docker Hub拉取由default_container_image指定的默认镜像。

 

    使用container_count变量定义的数量创建容器,每个容器使用default_container_image定义的镜像,并在每个新容器中执行default_container_command定义的命令。

一旦Playbook运行完毕,根据你在配置变量中定义的选项,你将创建出许多容器。

首先,在您的Ansible控制节点服务器上以sudo权限登录一个启用的用户。

步骤1 — 准备你的操作手册

playbook.yml文件是定义所有任务的地方。任务是使用Ansible playbook能够自动化的最小动作单位。但首先,使用您喜欢的文本编辑器创建您的playbook文件。

  1. nano playbook.yml

 

这将打开一个空的YAML文件。在开始添加任务到你的playbook之前,首先添加以下内容。

playbook.yml的中文翻译可以为:剧本.yml
---
- hosts: all
  become: true
  vars:
    container_count: 4
    default_container_name: docker
    default_container_image: ubuntu
    default_container_command: sleep 1

几乎每个遇到的手册都会以类似的声明开始。hosts声明了Ansible控制节点将通过此手册来定位的服务器。become声明了是否以提升的root权限执行所有命令。

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

  • container_count: The number of containers to create.
  • default_container_name: Default container name.
  • default_container_image: Default Docker image to be used when creating containers.
  • default_container_command: Default command to run on new containers.

Note

注意:如果你想查看playbook文件的最终完成状态,请跳到第5步。YAML文件对于缩进结构非常敏感,因此在添加完所有任务后,你可能需要仔细检查你的playbook。

第二步-将软件包安装任务添加到您的Playbook中

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

这个 Playbook 中的所有任务都可以独立存在,并在你的其他 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

在这里,您使用了适用的Ansible内建模块指示Ansible安装您的软件包。Ansible中的模块是执行操作的快捷方式,否则您将不得不运行原始的bash命令。如果aptitude不可用,Ansible会安全地回退到apt来安装软件包,但是历史上Ansible更喜欢aptitude。

您可以按照自己的喜好添加或删除软件包。这将确保所有软件包不仅存在,而且都是最新版本,并在调用apt更新之后进行操作。

第三步 – 在您的Playbook中添加Docker安装任务

你的任务是从官方源安装最新版本的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 bionic 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_key和apt_repository内建的Ansible模块首先指向正确的URL,然后任务是确保它们存在。这允许安装最新版本的Docker,以及使用pip安装Python的模块。

步骤4 — 在你的Playbook中添加Docker镜像和容器任务。

在这里开始实际创建您的Docker容器,需要先拉取您想要的Docker镜像。默认情况下,这些镜像来自于官方的Docker Hub。使用这个镜像,根据playbook顶部声明的变量规定的规格,将会创建相应的容器。

用法书.yml
    - name: Pull default Docker image
      docker_image:
        name: "{{ default_container_image }}"
        source: pull

    - name: Create default containers
     .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变量提供了一个表示当前循环迭代的数字。这个数字在这里用于给您的容器命名。

第五步 — 评审完整的游戏计划

你的运行手册应该大致如下,根据你的定制需求可能会有些小差异。

playbook.yml 的翻译如下:
游戏策划书.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 bionic 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
      docker_image:
        name: "{{ default_container_image }}"
        source: pull

    - name: Create default containers
      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模块设置容器网络。

Note

注意:这是个温和的提醒,请注意你的缩进。如果你遇到错误,很可能是因为这个原因。YAML建议使用2个空格作为缩进,就像在这个例子中所做的那样。

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

步骤六 – 执行您的Playbook

你现在可以在一个或多个服务器上运行此playbook了。大多数playbook默认配置为在清单中的每个服务器上执行,但你这次将指定你的服务器。

只在服务器1上以sammy的身份执行playbook时,你可以使用以下命令:

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

Note

注意:了解如何运行Ansible playbook的更多信息,请查阅我们的Ansible Cheat Sheet指南。

这表示您的服务器设置已经完成!您的输出不必完全相同,但重要的是您没有任何失败。

当playbook运行完毕后,通过SSH登录到由Ansible提供的服务器上,检查容器是否成功创建。

使用以下方式登录到远程服务器:

  1. ssh sammy@your_remote_server_ip

 

在远程服务器上列出你的Docker容器。

  1. sudo docker ps -a

 

你应该看到类似这样的输出。

Output

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中的最后一个任务,它也确认了playbook在该服务器上的完全执行。

结论

自动化基础架构设定不仅能节省时间,还有助于确保服务器按照可根据您需求定制的标准配置工作。随着现代应用的分布式特性和不同测试环境之间的一致性需求,这样的自动化已经成为许多团队开发流程的核心组成部分。

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

如果您希望在此手册中包含其他任务以进一步定制初始服务器设置,请参考我们的简介性 Ansible 指南《配置管理 101:编写 Ansible Playbooks》。

广告
将在 10 秒后关闭
bannerAds