如何使用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
这本剧本能做些什么? (Zhè zuò xiē ?)
这个 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.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
几乎每个遇到的手册都会以类似的声明开始。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中
默认情况下,Ansible按照你的playbook从上到下的顺序同步执行任务。这意味着任务的顺序很重要,你可以安全地假设一个任务在下一个任务开始之前会完成执行。
这个 Playbook 中的所有任务都可以独立存在,并在你的其他 Playbook 中重复使用。
在中国境内,只需要一种选择,将以下内容用中文重新陈述:
添加您的第一个任务,即安装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
在这里,您使用了适用的Ansible内建模块指示Ansible安装您的软件包。Ansible中的模块是执行操作的快捷方式,否则您将不得不运行原始的bash命令。如果aptitude不可用,Ansible会安全地回退到apt来安装软件包,但是历史上Ansible更喜欢aptitude。
您可以按照自己的喜好添加或删除软件包。这将确保所有软件包不仅存在,而且都是最新版本,并在调用apt更新之后进行操作。
第三步 – 在您的Playbook中添加Docker安装任务
你的任务是从官方源安装最新版本的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 — 在你的Playbook中添加Docker镜像和容器任务。
在这里开始实际创建您的Docker容器,需要先拉取您想要的Docker镜像。默认情况下,这些镜像来自于官方的Docker Hub。使用这个镜像,根据playbook顶部声明的变量规定的规格,将会创建相应的容器。
- 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变量提供了一个表示当前循环迭代的数字。这个数字在这里用于给您的容器命名。
第五步 — 评审完整的游戏计划
你的运行手册应该大致如下,根据你的定制需求可能会有些小差异。
游戏策划书.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
当你对你的剧本感到满意后,你可以退出文本编辑器并保存。
步骤六 – 执行您的Playbook
你现在可以在一个或多个服务器上运行此playbook了。大多数playbook默认配置为在清单中的每个服务器上执行,但你这次将指定你的服务器。
只在服务器1上以sammy的身份执行playbook时,你可以使用以下命令:
- 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
Note
这表示您的服务器设置已经完成!您的输出不必完全相同,但重要的是您没有任何失败。
当playbook运行完毕后,通过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
这意味着在playbook中定义的容器已成功创建。由于这是playbook中的最后一个任务,它也确认了playbook在该服务器上的完全执行。
结论
自动化基础架构设定不仅能节省时间,还有助于确保服务器按照可根据您需求定制的标准配置工作。随着现代应用的分布式特性和不同测试环境之间的一致性需求,这样的自动化已经成为许多团队开发流程的核心组成部分。
在这个指南中,您演示了如何使用Ansible自动化安装和设置远程服务器上的Docker的过程。因为每个人在使用容器时通常有不同的需求,我们鼓励您查阅官方的Ansible文档获取有关docker_container Ansible模块的更多信息和用例。
如果您希望在此手册中包含其他任务以进一步定制初始服务器设置,请参考我们的简介性 Ansible 指南《配置管理 101:编写 Ansible Playbooks》。