Ubuntu 18.04下使用Ansible自动化部署Docker:完整指南
引言
在现代应用环境中,由于其一次性特性,服务器自动化在系统管理中扮演着至关重要的角色。配置管理工具,例如Ansible,常被用于简化服务器设置过程,通过建立新服务器的标准流程,同时减少与手动设置相关的人为错误。
Ansible提供了一个简洁的架构,无需在节点上安装特殊软件。它还提供了一套强大的功能和内置模块,可以方便地编写自动化脚本。
本指南将详细说明如何使用Ansible自动化在Ubuntu 18.04上安装和使用Docker的步骤。Docker是一种简化容器管理过程的应用程序。容器是资源隔离的过程,其行为类似于虚拟机,但更具可移植性、更节约资源,并更依赖于宿主操作系统。
先决条件
为了执行本指南中提供的自动化设置流程,您需要:
- 一个Ansible控制节点:一台安装并配置了Ansible的Ubuntu 18.04机器,通过SSH密钥连接到您的Ansible主机。请确保控制节点拥有一个具有sudo权限的普通用户并启用了防火墙,具体请参考我们的初始服务器设置指南。要设置Ansible,请遵循我们的如何在Ubuntu 18.04上安装和配置Ansible的指南。
- 一个或多个Ansible主机:一个或多个远程Ubuntu 18.04服务器,这些服务器已按照如何使用Ansible自动化Ubuntu 18.04上的初始服务器设置指南进行过设置。
注意:在继续之前,您首先需要确保您的Ansible控制节点能够连接并在您的Ansible主机上执行命令。有关连接测试,请查看《在Ubuntu 18.04上安装和配置Ansible》的步骤3。
此Playbook的功能
这个Ansible Playbook提供了一种替代手动按照我们在《在Ubuntu 18.04上安装和使用Docker的指南》中概述的步骤来运行的选择。设置好您的Playbook后,每次安装都可以重复使用它。
运行此Playbook将在您的Ansible主机上执行以下操作:
- 安装aptitude,这是Ansible推荐的apt软件包管理器的替代方案。
- 安装所需的系统软件包。
- 安装Docker GPG APT密钥。
- 将官方Docker仓库添加到apt源中。
- 安装Docker。
- 通过pip安装Python Docker模块。
- 从Docker Hub拉取由
default_container_image
指定的默认镜像。 - 使用
container_count
变量定义的数量创建容器,每个容器使用default_container_image
定义的镜像,并在每个新容器中执行default_container_command
定义的命令。
一旦Playbook运行完毕,根据您在配置变量中定义的选项,您将创建出相应数量的容器。
首先,在您的Ansible控制节点服务器上以sudo权限登录一个已启用的用户。
步骤1 — 准备您的Playbook
playbook.yml
文件是定义所有任务的地方。任务是使用Ansible Playbook能够自动化的最小动作单位。但首先,使用您喜欢的文本编辑器创建您的Playbook文件。
nano playbook.yml
这将打开一个空的YAML文件。在开始添加任务到您的Playbook之前,首先添加以下内容:
---
- hosts: all
become: true
vars:
container_count: 4
default_container_name: docker
default_container_image: ubuntu
default_container_command: sleep 1
几乎每个遇到的Playbook都会以类似的声明开始。hosts
声明了Ansible控制节点将通过此Playbook来定位的服务器。become
声明了是否以提升的root权限执行所有命令。
变量允许您在其中存储数据。如果您将来决定更改这些数据,您只需在文件中编辑这些单行即可。以下是每个变量的简要说明:
container_count
: 要创建的容器数量。default_container_name
: 默认容器名称。default_container_image
: 创建容器时使用的默认Docker镜像。default_container_command
: 在新容器中运行的默认命令。
注意:如果您想查看Playbook文件的最终完成状态,请跳到第5步。YAML文件对于缩进结构非常敏感,因此在添加完所有任务后,您可能需要仔细检查您的Playbook。
步骤2 — 将软件包安装任务添加到您的Playbook中
默认情况下,Ansible按照您的Playbook从上到下的顺序同步执行任务。这意味着任务的顺序很重要,您可以安全地假设一个任务在下一个任务开始之前会完成执行。
这个Playbook中的所有任务都可以独立存在,并在您的其他Playbook中重复使用。
添加您的第一个任务,即安装aptitude
(一个与Linux软件包管理器交互的工具)并安装所需的系统包。Ansible将确保这些软件包始终安装在您的服务器上。
这是文章《如何使用Ansible在Ubuntu 18.04上安装和设置Docker》的第2部分(共5部分)。
tasks:
- name: 安装 aptitude
apt:
name: aptitude
state: latest
update_cache: true
- name: 安装所需的系统软件包
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: 添加 Docker GPG apt 密钥
apt_key:
url: https://download.docker.com/linux/ubuntu/gpg
state: present
- name: 添加 Docker 仓库
apt_repository:
repo: deb https://download.docker.com/linux/ubuntu bionic stable
state: present
- name: 更新 apt 并安装 docker-ce
apt:
name: docker-ce
state: latest
update_cache: true
- name: 安装 Python 的 Docker 模块
pip:
name: docker
您将看到,apt_key
和 apt_repository
这两个Ansible内置模块首先指向正确的URL,然后任务是确保它们存在。这允许安装最新版本的Docker,以及使用pip安装Python的模块。
步骤4 — 在您的Playbook中添加Docker镜像和容器任务
在这里开始实际创建您的Docker容器,需要先拉取您想要的Docker镜像。默认情况下,这些镜像来自于官方的Docker Hub。使用这个镜像,根据Playbook顶部声明的变量规定的规格,将会创建相应的容器。
用法书.yml
这是文章《如何使用Ansible在Ubuntu 18.04上安装和设置Docker》的第3部分(共5部分)。
- name: 拉取默认Docker镜像
docker_image:
name: "{{ default_container_image }}"
source: pull
- name: 创建默认容器
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)应该大致如下所示,根据您的定制需求可能会有一些细微差异。
playbook.yml
这是文章《如何使用Ansible在Ubuntu 18.04上安装和设置Docker》的第4部分(共5部分)。
---
- hosts: all
become: true
vars:
container_count: 4
default_container_name: docker
default_container_image: ubuntu
default_container_command: sleep 1d
tasks:
- name: 安装 aptitude
apt:
name: aptitude
state: latest
update_cache: true
- name: 安装所需的系统软件包
apt:
pkg:
- apt-transport-https
- ca-certificates
- curl
- software-properties-common
- python3-pip
- virtualenv
- python3-setuptools
state: latest
update_cache: true
- name: 添加 Docker GPG apt 密钥
apt_key:
url: https://download.docker.com/linux/ubuntu/gpg
state: present
- name: 添加 Docker 仓库
apt_repository:
repo: deb https://download.docker.com/linux/ubuntu bionic stable
state: present
- name: 更新 apt 并安装 docker-ce
apt:
name: docker-ce
state: latest
update_cache: true
- name: 为 Python 安装 Docker 模块
pip:
name: docker
- name: 拉取默认 Docker 镜像
docker_image:
name: "{{ default_container_image }}"
source: pull
- name: 创建默认容器
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
上以sammy
的身份执行剧本时,你可以使用以下命令:
- ansible-playbook playbook.yml -l server1 -u sammy
-l
选项指定了你的服务器,而-u
选项指定了在远程服务器上登录的用户。你将获得类似这样的输出:
. . . 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剧本的信息,请查阅我们的Ansible速查表指南。这表示你的服务器设置已经完成!你的输出不必完全相同,但重要的是你没有任何失败。
当剧本运行完毕后,通过SSH登录到由Ansible配置的服务器上,检查容器是否成功创建。
使用以下方式登录到远程服务器:
- ssh sammy@your_remote_server_ip
在远程服务器上列出你的Docker容器。
- 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
这意味着在剧本中定义的容器已成功创建。由于这是剧本中的最后一个任务,它也确认了剧本在该服务器上的完全执行。
结论
自动化基础设施设定不仅能节省时间,还有助于确保服务器按照可根据你需求定制的标准配置工作。随着现代应用的分布式特性和不同测试环境之间的一致性需求,这样的自动化已经成为许多团队开发流程的核心组成部分。
在这个指南中,你演示了如何使用Ansible自动化安装和设置远程服务器上的Docker的过程。因为每个人在使用容器时通常有不同的需求,我们鼓励你查阅官方的Ansible文档获取有关docker_container
Ansible模块的更多信息和用例。
如果你希望在此手册中包含其他任务以进一步定制初始服务器设置,请参考我们的入门级Ansible指南《配置管理 101:编写 Ansible Playbooks》。