安装与清单

AnsibleBeginner
立即练习

简介

在本实验中,你将首次接触 Ansible——一款功能强大的开源自动化工具。

假设你需要管理 100 台服务器。如果逐台登录并安装软件或修改设置,过程既繁琐又容易出错。Ansible 允许你从一台 控制节点 管理这些服务器,即 受管节点,而且不需要在目标服务器上安装代理。

这种无代理设计是 Ansible 在运维团队中广受欢迎的重要原因。它减少了每台主机上需要维护的额外软件,也建立在管理员已经信任的工具之上,尤其是 SSH。

Ansible 的工作方式如下:

  1. 使用 SSH 连接服务器(SSH 也是远程登录时使用的工具)。
  2. 从简单的文本文件中读取指令(这些文件使用 YAML 编写)。
  3. 将小型程序(模块)发送到服务器执行任务。

这种无代理模式是 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 自动化搭建了基础环境。你学会了:

  1. 安装:在系统中准备好 Ansible。
  2. 设置 SSH 密钥:创建密钥,让 Ansible 无需密码即可安全登录。
  3. 清单:创建包含要管理服务器的列表(hosts.ini)。
  4. 连接检查:使用 ping 模块验证所有配置是否正常工作。

无论管理一台服务器还是一千台服务器,这些步骤——安装、访问、清单、测试——都是 Ansible 项目中首先要执行的步骤。