如何使用 Ansible 在 Ubuntu 18.04 上安装和设置 Docker
介绍
由于现代应用程序环境的一次性特性,服务器自动化现在在系统管理中起着至关重要的作用。 Ansible 通常用于通过为新服务器建立标准程序来简化自动化服务器设置的过程,同时还减少与手动设置相关的人为错误。
Ansible 提供了一种简单的架构,不需要在节点上安装特殊软件。它还提供了一组强大的功能和内置模块,有助于编写自动化脚本。
本指南解释了如何使用 Ansible 来自动化我们关于 Docker 的指南中包含的步骤是一个应用程序,它简化了管理容器的过程,资源隔离的进程以类似于虚拟机的方式运行,但是更便携,对资源更友好,并且更依赖于主机操作系统。
先决条件
为了执行本指南中剧本提供的自动设置,您需要:
- 一个 Ansible 控制节点:一台安装了 Ansible 并配置为使用 SSH 密钥连接到 Ansible 主机的 Ubuntu 18.04 机器。确保控制节点的普通用户具有 sudo 权限并启用了防火墙,如我们的如何在 Ubuntu 18.04 上安装和配置 Ansible 中所述。
- 一台或多台 Ansible 主机:一台或多台远程 Ubuntu 18.04 服务器,之前已按照有关如何使用 Ansible 在 Ubuntu 18.04 上自动进行初始服务器设置的指南进行设置。
在继续之前,您首先需要确保您的 Ansible 控制节点能够连接并在您的 Ansible 主机上执行命令。对于连接测试,请查看如何在 Ubuntu 18.04 上安装和配置 Ansible 的步骤 3。
这本剧本有什么作用?
这个 Ansible 剧本提供了一种替代方法,可以手动运行我们关于如何在 Ubuntu 18.04 上安装和使用 Docker 的指南中概述的过程。设置您的 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
中定义的命令在每个新容器中。
剧本运行完毕后,您将根据您在配置变量中定义的选项创建许多容器。
首先,在 Ansible 控制节点服务器上登录启用 sudo
的用户。
第 1 步 — 准备你的剧本
playbook.yml
文件是定义所有任务 的地方。任务是您可以使用 Ansible 剧本自动执行的最小操作单元。但首先,使用您喜欢的文本编辑器创建您的剧本文件:
- nano playbook.yml
这将打开一个空的 YAML 文件。在深入研究向您的剧本添加任务之前,请先添加以下内容:
---
- 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 权限完成。
vars
允许您将数据存储在变量中。如果您决定将来更改这些,您只需在文件中编辑这些单行。以下是对每个变量的简要说明:
container_count
:要创建的容器数量。default_container_name
:默认容器名称。default_container_image
:创建容器时使用的默认 Docker 镜像。default_container_command
:在新容器上运行的默认命令。
注意:如果您想查看最终完成状态的 playbook 文件,请跳至第 5 步。YAML 文件的缩进结构可能很特别,因此您可能需要在添加所有任务后仔细检查您的 playbook。
第 2 步 — 将软件包安装任务添加到您的 Playbook
默认情况下,Ansible 会按照您的剧本中从上到下的顺序同步执行任务。这意味着任务排序很重要,您可以安全地假设一个任务将在下一个任务开始之前完成执行。
此剧本中的所有任务都可以独立存在,并可在您的其他剧本中重复使用。
添加安装 aptitude
的第一个任务,这是一个与 Linux 包管理器交互的工具,并安装所需的系统包。 Ansible 将确保这些包始终安装在您的服务器上:
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 模块:
- 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 步 — 将 Docker 镜像和容器任务添加到您的 Playbook
Docker 容器的实际创建从这里开始,拉取您想要的 Docker 映像。默认情况下,这些镜像来自官方 Docker Hub。使用此图像,将根据剧本顶部声明的变量制定的规范创建容器:
- 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
变量提供了一个代表当前循环迭代次数的数字。这个数字在这里用来命名你的容器。
第 5 步 — 回顾你的完整剧本
您的 playbook 应大致如下所示,根据您的自定义设置有细微差别:
---
- 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_container 模块来设置容器网络。
注意:这是一个温和的提醒,请注意您的缩进。如果您遇到错误,这很可能是罪魁祸首。 YAML 建议使用 2 个空格作为缩进,如本示例中所做的那样。
一旦您对剧本感到满意,就可以退出文本编辑器并保存。
第 6 步 — 运行你的 Playbook
您现在已准备好在一台或多台服务器上运行此剧本。默认情况下,大多数剧本都配置为在清单中的每台服务器上执行,但这次您将指定服务器。
要仅在 server1
上执行剧本,连接为 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 Cheat Sheet Guide。
这表明您的服务器设置已完成!您的输出不必完全相同,但零失败很重要。
当 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 已在此服务器上完全执行。
结论
自动化您的基础架构设置不仅可以节省您的时间,而且还有助于确保您的服务器将遵循可根据您的需求进行定制的标准配置。由于现代应用程序的分布式特性以及对不同暂存环境之间一致性的需求,像这样的自动化已成为许多团队开发过程中的核心组件。
在本指南中,您演示了如何使用 Ansible 自动执行在远程服务器上安装和设置 Docker 的过程。因为每个人在使用容器时通常都有不同的需求,所以我们鼓励您查看官方 Ansible 文档以了解更多信息和 docker_container
Ansible 模块的用例。
如果您想在此剧本中包含其他任务以进一步自定义您的初始服务器设置,请参阅我们的介绍性 Ansible 指南配置管理 101:编写 Ansible 剧本。