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

介绍

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

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

本指南解释了如何使用 Ansible 来自动化我们在 Ubuntu 22.04 上安装和使用 Docker 的手册中所包含的步骤(https://andsky.com/tech/tutorials/how-to-install-and-use-docker-on-ubuntu-22-04)。 Docker是一个简化管理 containers 过程的应用程序,资源隔离的流程以与虚拟机相似的方式行为,但更便携式,更易于资源使用,并且更依赖主机操作系统。

前提条件

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

<$>[注] 在继续之前,您需要先确保您的 Ansible 控制节点能够在您的 Ansible 主机(s)上连接和执行命令。

这个 Playbook 能做什么?

这个 Ansible 播放本提供了通过我们在 Ubuntu 22.04 上如何安装和使用 Docker 指南中描述的程序手动运行的替代方案(https://andsky.com/tech/tutorials/how-to-install-and-use-docker-on-ubuntu-22-04)。

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

安裝「aptitude」,以 Ansible 為「apt」包管理器的替代方案 2.安裝所需的系統包 3.安裝 Docker GPG APT 鍵 4.將官方的 Docker 儲存庫添加到「apt」來源 5.安裝 Docker 6.透過「pip」安裝 Python Docker 模塊 7.從 Docker Hub 8 提取「default_container_image」指定的默認圖像。 使用「default_container_image」指定的圖像,在每個新容器中執行「default_container_command

一旦播放簿完成运行,您将根据您在配置变量中定义的选项创建一系列容器。

首先,在您的 Ansible 控制节点服务器上登录一个具有sudo功能的用户。

步骤1 - 准备你的剧本

「playbook.yml」文件是您所有 tasks 都定义的文件。 任务是您可以使用 Ansible 播放簿自动化操作的最小单位,但首先使用您偏好的文本编辑器创建播放簿文件:

1nano playbook.yml

这样会打开一个空的 YAML 文件. 在进入将任务添加到播放簿之前,请先添加以下内容:

 1[label playbook.yml]
 2[environment local]
 3---
 4- hosts: all
 5  become: true
 6  vars:
 7    container_count: 4
 8    default_container_name: docker
 9    default_container_image: ubuntu
10    default_container_command: sleep 1

几乎每本你遇到的读本都会以类似的声明开始。‘主机’声明了 Ansible 控制节点将针对该读本的哪些服务器。

vars允许您将数据存储为变量. 如果您决定在未来更改这些变量,您只需要在文件中编辑这些单行。

●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●

<$>[注] 注: 如果你想看到播放本文件的最终完成状态,跳到 步骤 5

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

默认情况下,Ansible 会将任务同步执行,顺序从播放簿的顶部到底部,这意味着任务排序很重要,您可以安全地假设一个任务在下一个任务开始之前完成执行。

本剧本中的所有任务都可以单独站立,并在你的其他剧本中重复使用。

添加你的第一个任务,即安装aptitude,一个与Linux包管理器接口的工具,并安装所需的系统包。

 1[label playbook.yml]
 2[environment local]
 3  tasks:
 4    - name: Install aptitude
 5      apt:
 6        name: aptitude
 7        state: latest
 8        update_cache: true
 9
10    - name: Install required system packages
11      apt:
12        pkg:
13          - apt-transport-https
14          - ca-certificates
15          - curl
16          - software-properties-common
17          - python3-pip
18          - virtualenv
19          - python3-setuptools
20        state: latest
21        update_cache: true

在这里,你正在使用apt Ansible builtin module 来指导 Ansible 安装你的软件包。 Ansible 中的模块是执行操作的捷径,否则你将不得不作为原始 bash 命令运行。

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

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

你的任务将是从官方存储库中安装最新版本的Docker。添加了Docker GPG密钥来验证下载,作为新包源添加了官方存储库,然后安装了Docker。

 1[label playbook.yml]
 2[environment local]
 3    - name: Add Docker GPG apt Key
 4      apt_key:
 5        url: https://download.docker.com/linux/ubuntu/gpg
 6        state: present
 7
 8    - name: Add Docker Repository
 9      apt_repository:
10        repo: deb https://download.docker.com/linux/ubuntu jammy stable
11        state: present
12
13    - name: Update apt and install docker-ce
14      apt:
15        name: docker-ce
16        state: latest
17        update_cache: true
18
19    - name: Install Docker Module for Python
20      pip:
21        name: docker

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

步骤 4 — 将 Docker 图像和容器任务添加到 Playbook

您的 Docker 容器的实际创建从此开始,您需要抽取所需的 Docker 图像。 默认情况下,这些图像来自官方的 Docker Hub。 使用此图像,将根据您玩本顶部声明的变量规格创建容器:

 1[label playbook.yml]
 2[environment local]
 3    - name: Pull default Docker image
 4      community.docker.docker_image:
 5        name: "{{ default_container_image }}"
 6        source: pull
 7
 8    - name: Create default containers
 9      community.docker.docker_container:
10        name: "{{ default_container_name }}{{ item }}"
11        image: "{{ default_container_image }}"
12        command: "{{ default_container_command }}"
13        state: present
14      with_sequence: count={{ container_count }}

「docker_image」用于将您想要用作集装箱的基础的 Docker 图像抽取。

with_sequence 是创建循环的 Ansible 方式,在这种情况下,它将根据您指定的计数循环来循环创建您的容器。

步骤5 - 审查您的完整游戏簿

您的播放簿应该大致如下,根据您的自定义而有所不同:

 1[label playbook.yml]
 2[environment local]
 3---
 4- hosts: all
 5  become: true
 6  vars:
 7    container_count: 4
 8    default_container_name: docker
 9    default_container_image: ubuntu
10    default_container_command: sleep 1d
11
12  tasks:
13    - name: Install aptitude
14      apt:
15        name: aptitude
16        state: latest
17        update_cache: true
18
19    - name: Install required system packages
20      apt:
21        pkg:
22          - apt-transport-https
23          - ca-certificates
24          - curl
25          - software-properties-common
26          - python3-pip
27          - virtualenv
28          - python3-setuptools
29        state: latest
30        update_cache: true
31
32    - name: Add Docker GPG apt Key
33      apt_key:
34        url: https://download.docker.com/linux/ubuntu/gpg
35        state: present
36
37    - name: Add Docker Repository
38      apt_repository:
39        repo: deb https://download.docker.com/linux/ubuntu jammy stable
40        state: present
41
42    - name: Update apt and install docker-ce
43      apt:
44        name: docker-ce
45        state: latest
46        update_cache: true
47
48    - name: Install Docker Module for Python
49      pip:
50        name: docker
51
52    - name: Pull default Docker image
53      community.docker.docker_image:
54        name: "{{ default_container_image }}"
55        source: pull
56
57    - name: Create default containers
58      community.docker.docker_container:
59        name: "{{ default_container_name }}{{ item }}"
60        image: "{{ default_container_image }}"
61        command: "{{ default_container_command }}"
62        state: present
63      with_sequence: count={{ container_count }}

例如,您可以使用 docker_image模块将图像推到 Docker Hub 或 docker_container模块来设置容器网络。

<$>[注] 注: 这是一个温和的提醒,要记住你的入口。如果你遇到错误,这很可能是罪魁祸首。YAML建议使用2个空间作为入口,正如本例所做的。

一旦您对播放书满意,您可以退出文本编辑器并保存。

步骤6 - 运行你的游戏簿

您现在已经准备好在一个或多个服务器上运行此播放簿. 大多数播放簿默认配置为在您的库存中的每个服务器上执行,但您将此时指定您的服务器。

要只在「server1」上執行播放簿,以「sammy」方式連接,您可以使用以下命令:

1[environment local]
2ansible-playbook playbook.yml -l server1 -u sammy

-l旗指明您的服务器,而-u旗指明哪些用户要登录远程服务器。

 1[secondary_label Output]
 2. . .
 3changed: [server1]
 4
 5TASK [Create default containers] *****************************************************************************************************************
 6changed: [server1] => (item=1)
 7changed: [server1] => (item=2)
 8changed: [server1] => (item=3)
 9changed: [server1] => (item=4)
10
11PLAY RECAP ***************************************************************************************************************************************
12server1              	: ok=9	changed=8	unreachable=0	failed=0	skipped=0	rescued=0	ignored=0

<$>[注] :有关如何运行 Ansible 播放本的更多信息,请参阅我们的 Ansible Cheat Sheet Guide

这表明您的服务器设置已经完成!您的输出不一定完全相同,但重要的是您有零故障。

播放簿完成运行后,通过 SSH 登录到 Ansible 提供的服务器,以检查容器是否成功创建。

登录远程服务器:

1[environment local]
2ssh sammy@your_remote_server_ip

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

1[environment second]
2sudo docker ps -a

你应该看到类似于此的输出:

1[secondary_label Output]
2CONTAINER ID    	IMAGE           	COMMAND         	CREATED         	STATUS          	PORTS           	NAMES
3a3fe9bfb89cf    	ubuntu          	"sleep 1d"      	5 minutes ago   	Created                             	docker4
48799c16cde1e    	ubuntu          	"sleep 1d"      	5 minutes ago   	Created                             	docker3
5ad0c2123b183    	ubuntu          	"sleep 1d"      	5 minutes ago   	Created                             	docker2
6b9350916ffd8    	ubuntu          	"sleep 1d"      	5 minutes ago   	Created                             	docker1

这意味着在播放簿中定义的容器被创建成功. 由于这是播放簿中的最后一个任务,它也证实了播放簿在这个服务器上完全执行。

结论

自动化基础设施设置不仅可以节省时间,还可以帮助确保服务器遵循标准配置,可根据您的需求进行定制。随着现代应用程序的分布性和不同阶段环境之间的一致性,这样的自动化已成为许多团队开发过程的核心组成部分。

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

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

Published At
Categories with 技术
comments powered by Disqus