在 Ubuntu 上安装 Ansible

AnsibleBeginner
立即练习

介绍

在本实验中,你将学习如何在 Ubuntu 系统上安装和设置 Ansible。Ansible 是一款功能强大的开源自动化工具,能够简化配置管理、应用程序部署和任务自动化。通过本实验,你将完成 Ansible 的安装和配置,并准备好高效地管理远程系统。

这是一个实验(Guided Lab),提供逐步指导来帮助你学习和实践。请仔细按照说明完成每个步骤,获得实际操作经验。根据历史数据,这是一个 初级 级别的实验,完成率为 82%。获得了学习者 98% 的好评率。

更新系统包

在安装任何新软件之前,确保系统已更新至最新版本至关重要。这有助于避免潜在的冲突,并确保你拥有最新的安全补丁。

首先,更新包列表:

sudo apt update
Terminal showing updated package list

此命令会连接到 Ubuntu 的软件仓库,并下载有关最新可用包的信息。你可能会看到如下输出:

Hit:1 http://mirrors.cloud.aliyuncs.com/ubuntu jammy InRelease
Hit:2 http://mirrors.cloud.aliyuncs.com/ubuntu jammy-updates InRelease
Hit:3 http://mirrors.cloud.aliyuncs.com/ubuntu jammy-backports InRelease
Hit:4 http://mirrors.cloud.aliyuncs.com/ubuntu jammy-security InRelease
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
All packages are up to date.

如果你看到一些 "Hit" 或 "Get" 行,请不要担心——这是正常的,显示正在更新哪些仓库信息。

安装 Ansible

现在你的系统已更新至最新版本,可以继续安装 Ansible。Ubuntu 的默认仓库中包含了 Ansible,这使得安装过程非常简单。

使用以下命令安装 Ansible:

sudo apt install ansible -y

让我们分解一下这个命令:

  • sudo:以管理员权限运行命令,这是安装软件所必需的。
  • apt install:告诉包管理器安装一个新的包。
  • ansible:这是我们要安装的包的名称。
  • -y:此标志会自动在安装过程中对所有提示回答“是”。

你将看到显示安装进度的输出:

Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
...
Processing triggers for man-db (2.10.2-1) ...

不要被大量的文本吓到——这只是显示与 Ansible 一起安装的所有依赖项。

安装完成后,建议验证 Ansible 是否正确安装。你可以通过检查其版本来完成此操作:

ansible --version

此命令应显示已安装的 Ansible 版本信息:

ansible 2.10.8
  config file = None
  configured module search path = ['/home/labex/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3/dist-packages/ansible
  executable location = /usr/bin/ansible
  python version = 3.10.12 (main, Jul 29 2024, 16:56:48) [GCC 11.4.0]

如果你看到类似的输出,恭喜!Ansible 现已成功安装在你的系统上。

为 Ansible 配置 SSH

Ansible 使用 SSH 与被管理节点通信。为了简化这个过程并增强安全性,我们将设置基于 SSH 密钥的身份验证。这允许 Ansible 连接到其他机器,而无需每次都输入密码。

首先,生成一个 SSH 密钥对:

ssh-keygen -t rsa -b 4096 -C "labex@example.com"

让我们分解一下这个命令:

  • ssh-keygen:这是生成密钥对的程序。
  • -t rsa:这指定我们想要一个 RSA 类型的密钥。
  • -b 4096:这设置密钥大小为 4096 位,这非常安全。
  • -C "labex@example.com":这向密钥添加一个注释,通常是一个电子邮件地址。

当你运行这个命令时,你会看到提示:

Generating public/private rsa key pair.
Enter file in which to save the key (/home/labex/.ssh/id_rsa):

按 Enter 键接受默认位置。

Enter passphrase (empty for no passphrase):
Enter same passphrase again:

对于这个实验(Lab),你可以按 Enter 键两次,使密码短语(passphrase)为空。在生产环境中,你应该使用一个强密码短语。

你将看到确认密钥创建的输出:

Your identification has been saved in /home/labex/.ssh/id_rsa
Your public key has been saved in /home/labex/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:abcdefghijklmnopqrstuvwxyz1234567890ABCDEFG labex@example.com
The key's randomart image is:
+---[RSA 4096]----+
|    .            |
|   . .           |
|    o            |
|   . o           |
|    + = S        |
|   + * +         |
|  . = o .        |
| . + =           |
|  +.+.           |
+----[SHA256]-----+

接下来,我们需要将这个密钥复制到本地机器。在实际场景中,你会将其复制到远程主机,但对于这个实验(Lab),我们将使用本地机器:

ssh-copy-id labex@localhost

输入 yes 以继续。

Prompt for labex user password

系统将提示你输入 labex 用户的密码。

对于这个实验(Lab)环境,你可以通过打开 VNC 终端并运行以下命令来找到密码:

不要关闭当前的终端会话,并打开一个新的 Xfce 终端来运行以下命令:

echo $PASSWORD

注意:你必须在 VNC 终端中运行此命令。密码仅在 VNC 终端中可用,并且无法通过 SSH 或 Web 终端访问。

SSH key copy prompt

ssh-copy-id 提示时,输入密码。你应该看到类似以下的输出:

/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
labex@localhost's password:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'labex@localhost'"
and check to make sure that only the key(s) you wanted were added.

要验证 SSH 密钥设置是否成功,请尝试 SSH 进入本地机器:

ssh labex@localhost

如果密钥设置正确,你应该能够登录,而无需提示输入密码。你将看到一个新的命令提示符。键入 exit 返回到你的原始会话。

创建并配置 Ansible 库存文件

Ansible 库存文件是一个定义主机和主机组的文件,用于指定 playbook 中的命令、模块和任务所操作的目标。它就像是 Ansible 的地址簿,告诉它可以连接到哪些机器。

首先,创建 Ansible 配置目录:

sudo mkdir -p /etc/ansible

此命令会在 /etc/ansible 目录不存在时创建它。-p 标志确保如果目录已存在,不会抛出错误。

现在,创建并编辑库存文件:

sudo nano /etc/ansible/hosts

这将打开 nano 文本编辑器。如果你不熟悉 nano,不用担心——它是一个简单易用的编辑器。

在此文件中,添加以下内容:

[local]
localhost ansible_connection=local

[webservers]
web1 ansible_host=localhost ansible_connection=ssh ansible_user=labex

让我们分解一下这些内容的含义:

  • [local][webservers] 是组名。你可以使用这些名称来组织你的主机。
  • localhost ansible_connection=local 告诉 Ansible 直接连接到本地机器,而不使用 SSH。
  • web1 ansible_host=localhost ansible_connection=ssh ansible_user=labex 设置了一个名为 web1 的主机。在本实验中,它也连接到 localhost,但使用 SSH,并以用户 labex 登录。

要在 nano 中保存文件,请按 Ctrl+X,然后按 Y,最后按 Enter

要验证库存文件的内容,请使用 cat 命令:

cat /etc/ansible/hosts

你应该会看到刚刚添加到文件中的内容。

测试 Ansible 连接性

现在我们已经安装并配置了 Ansible,接下来让我们测试连接性,以确保一切正常运行。

首先,让我们 ping 库存文件中的所有主机:

ansible all -m ping

让我们分解一下这个命令:

  • ansible:这是运行 Ansible 的基础命令。
  • all:告诉 Ansible 在库存文件中的所有主机上运行。
  • -m ping:指定要使用的 Ansible 模块。ping 模块用于检查主机是否响应。

你应该会看到类似以下的输出:

localhost | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
web1 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

如果你看到两个主机的状态均为 "SUCCESS",则意味着 Ansible 可以成功连接并与这些主机通信。

接下来,让我们尝试在所有主机上运行一个简单的命令:

ansible all -a "uptime"

此命令使用 Ansible 的命令模块(当未使用 -m 指定模块时,默认为命令模块)在所有主机上运行 uptime 命令。uptime 命令显示系统已运行的时间。

你应该会看到类似以下的输出:

localhost | CHANGED | rc=0 >>
 14:30:15 up 1 day,  3:24,  1 user,  load average: 0.00, 0.00, 0.00

web1 | CHANGED | rc=0 >>
 14:30:15 up 1 day,  3:24,  1 user,  load average: 0.00, 0.00, 0.00

此输出显示 Ansible 成功在两个主机上执行了 uptime 命令。"CHANGED" 状态表示命令已成功运行并产生了输出。

提示:你可能会看到一条弃用警告 "Distribution ubuntu 22.04 on host localhost should use /usr/bin/python3",这是由于在较新版本的 Ubuntu 中默认的 Python 解释器发生了变化。

如果你希望抑制此警告,可以在 /etc/ansible/hosts 文件中添加以下行:

[all:vars]
ansible_python_interpreter=/usr/bin/python3

此行告诉 Ansible 显式地为所有主机使用 Python 3。添加此行后,你可以再次运行 ansible all -m ping 命令,以验证警告是否不再出现。

总结

恭喜!在本实验中,你已成功在 Ubuntu 系统上安装并配置了 Ansible。你学习了如何:

  1. 更新系统包,以确保为 Ansible 提供稳定的环境。
  2. 使用包管理器安装 Ansible。
  3. 设置基于 SSH 密钥的身份验证,以实现安全且无需密码的连接。
  4. 创建并配置 Ansible 库存文件,以定义受管主机。
  5. 测试 Ansible 连接性并在受管主机上执行基本命令。

这些基础步骤为你使用 Ansible 自动化各种 IT 任务(从简单的命令执行到复杂的配置管理和应用程序部署)奠定了坚实的基础。

请记住,本实验使用 localhost 进行演示,但在实际场景中,你通常会管理多个远程主机。你在这里学到的原理和命令可以轻松应用于管理整个基础设施中的远程服务器。

随着你继续探索 Ansible,你将发现它在简化操作和提升系统管理与 DevOps 实践中的生产力方面的强大能力。接下来,你可以考虑探索 Ansible playbooks,它允许你自动化更复杂的任务和工作流。