简介
在本实验中,你将首次接触 Ansible——一款功能强大的开源自动化工具。
假设你需要管理 100 台服务器。如果逐台登录并安装软件或修改设置,过程既繁琐又容易出错。Ansible 允许你从一台 控制节点 管理这些服务器,即 受管节点,而且不需要在目标服务器上安装代理。
这种无代理设计是 Ansible 在运维团队中广受欢迎的重要原因。它减少了每台主机上需要维护的额外软件,也建立在管理员已经信任的工具之上,尤其是 SSH。
Ansible 的工作方式如下:
- 使用 SSH 连接服务器(SSH 也是远程登录时使用的工具)。
- 从简单的文本文件中读取指令(这些文件使用 YAML 编写)。
- 将小型程序(模块)发送到服务器执行任务。
这种无代理模式是 Ansible 广受欢迎的原因之一。它基于 Linux 管理员熟悉的工具,尤其是 SSH 和基于文本的配置。
在本实验中,你将同时扮演管理者和受管对象。你会在当前环境中安装 Ansible,并将其配置为管理自身(localhost)。这是安全学习基础知识的好方法。
你将学习如何:
- 使用软件包管理器安装 Ansible。
- 设置 SSH 密钥,让 Ansible 无需密码即可登录。
- 创建 清单文件,列出要管理的计算机。
- 使用
ping模块测试连接。
安装 Ansible
第一步是在计算机上安装 Ansible。由于当前使用的是 Ubuntu,可以使用 apt 软件包管理器。它类似于 Linux 命令行工具的「应用商店」。
首先,虽然初始化脚本已经执行过更新,但确保软件包列表为最新状态仍是一个好习惯:
sudo apt update
现在,运行以下命令安装 Ansible:
sudo apt install ansible -y
命令说明:
sudo:以管理员(root)权限运行命令。apt install:通知软件包管理器安装程序。ansible:要安装的软件包名称。-y:对确认提示自动回答「yes」(例如「Do you want to continue?」)。
安装完成后,检查版本以验证安装结果:
ansible --version
你应该会看到以 ansible [core 2.x.x] 开头的输出。这表示 Ansible 已安装并可以使用。
生成 SSH 密钥
Ansible 使用 SSH(Secure Shell)与服务器通信。SSH 是远程访问 Linux 服务器的标准方式。
这也是清单非常重要的原因。Ansible 需要一份清晰的列表,说明有哪些计算机、这些计算机如何分组,以及如何连接到它们。清单实际上就是自动化系统的地址簿。
默认情况下,SSH 需要密码。但对于 Ansible 这样的自动化工具,每次连接服务器都输入密码是不现实的。因此,我们使用 SSH 密钥。
可以把 SSH 密钥理解为锁和钥匙:
- 公钥(锁):放置在你要访问的服务器上。
- 私钥(钥匙):安全地保存在控制计算机上。
Ansible 连接时,服务器会检查你的「钥匙」是否与它的「锁」匹配。如果匹配,就可以无需密码登录。
运行以下命令生成密钥对:
ssh-keygen -t rsa -b 2048 -N "" -f ~/.ssh/id_rsa
命令说明:
ssh-keygen:用于生成密钥的工具。-t rsa:创建 RSA 类型的密钥(标准类型)。-b 2048:将密钥长度设置为 2048 位(足够安全)。-N "":设置一个空密码短语。这一点很重要!它表示「使用此密钥时不要询问密码」,从而让 Ansible 完全自动运行。-f ~/.ssh/id_rsa:将密钥保存到标准位置。
检查文件是否已创建:
ls -l ~/.ssh/
你应该会看到 id_rsa(你的私钥)和 id_rsa.pub(你的公钥)。
授权密钥
现在你已经有了密钥,需要将公钥放置到要管理的服务器上。在本实验中,要管理的是 localhost(也就是你当前使用的同一台计算机)。
这一步展示了身份验证逻辑与自动化逻辑之间的区别。在 Ansible 能够执行任何自动化任务之前,必须先以可靠的非交互方式向目标进行身份验证。
你需要将 id_rsa.pub 的内容添加到 .ssh 目录中名为 authorized_keys 的文件里。
通常可以使用 ssh-copy-id 命令完成此操作。不过,该命令通常会先要求输入密码,以证明你是账户所有者。由于本实验环境无需密码,因此我们手动复制密钥。
运行以下命令,将公钥追加到授权密钥列表中:
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
命令说明:
cat ...:读取你的公钥。>>:将输出追加到目标文件末尾,而不是覆盖文件。.../authorized_keys:SSH 会检查此文件,以确认哪些用户可以登录。
现在设置正确的权限,让 SSH 信任该文件:
chmod 600 ~/.ssh/authorized_keys
接下来测试连接。尝试 SSH 登录本机:
ssh localhost "echo Hello from SSH"
如果系统询问「Are you sure you want to continue connecting?」,输入 yes,然后按回车键。
你应该会立即看到输出「Hello from SSH」,并且不会被要求输入密码。这表示 Ansible 也可以无需密码建立连接。
创建清单文件
Ansible 需要一份要管理的服务器列表,这份列表称为清单(Inventory)。
清单可以是一个简单的文本文件。我们将创建一个项目目录,并在其中创建名为 hosts.ini 的清单文件。
创建名为 hosts.ini 的空文件:
touch hosts.ini
目前,Ansible 还不知道任何服务器。下一步将把服务器添加到清单中。
将主机添加到清单
现在编辑 hosts.ini 文件,添加服务器。Ansible 清单通常使用 INI 格式,格式如下:
[group_name]
server_address
将服务器分组(例如 [webservers] 或 [databases])后,可以一次对同类服务器执行命令。
现在将 localhost 添加到名为 [webservers] 的组中。运行以下命令写入文件:
echo -e "[webservers]\nlocalhost" > hosts.ini
命令说明:
echo -e:输出文本,并识别\n(换行符)等特殊字符。"[webservers]\nlocalhost":要写入的文本。它会将[webservers]放在第一行,将localhost放在第二行。> hosts.ini:使用这些内容覆盖文件。
你可以检查文件内容:
cat hosts.ini
输出应与下面完全一致:
[webservers]
localhost
测试连接
现在到了验证结果的时刻!我们将要求 Ansible 连接清单中的所有服务器,并检查它们是否正常运行。
使用 ansible 命令(用于运行一次性任务)和 ping 模块。
运行以下命令:
ansible all -m ping -i hosts.ini
命令说明:
all:匹配清单中的所有主机。-m ping:告诉 Ansible 使用名为ping的模块。- 注意:这与网络中的
ping命令不同。Ansible 的 ping 模块实际上会登录服务器,检查 Python 是否可用,然后返回「pong」。这可以证明当前配置能够正常工作。
- 注意:这与网络中的
-i hosts.ini:告诉 Ansible 使用刚刚创建的清单文件,而不是系统默认的清单文件。
你应该会看到绿色的「SUCCESS」消息:
localhost | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}
如果看到 "ping": "pong",恭喜你!你已经成功配置 Ansible 来管理服务器。
总结
在本实验中,你为 Ansible 自动化搭建了基础环境。你学会了:
- 安装:在系统中准备好 Ansible。
- 设置 SSH 密钥:创建密钥,让 Ansible 无需密码即可安全登录。
- 清单:创建包含要管理服务器的列表(
hosts.ini)。 - 连接检查:使用
ping模块验证所有配置是否正常工作。
无论管理一台服务器还是一千台服务器,这些步骤——安装、访问、清单、测试——都是 Ansible 项目中首先要执行的步骤。


