安装 Ansible 并连接受管主机

PythonBeginner
立即练习

介绍

你正在准备一个 Ansible 控制节点,用于管理两台 Linux 服务器。编写自动化流程之前,需要获得可预测的安装环境,并证明控制节点能在两个目标节点上执行 Python 模块。

在本实验中,你将创建项目虚拟环境,从离线软件包缓存安装 Ansible Core,在终端中激活该环境,并使用提供的清单测试两个真实的 SSH 连接。只需熟悉基本命令行操作,无需 Ansible 使用经验。

创建隔离的控制节点环境

本步骤将创建用于安装你自己的 Ansible 的 Python 环境。

Ansible 在控制节点上运行,通过 SSH 连接到受管节点。你的 LabEx 终端就是 Ubuntu 控制节点。预先准备的两个 Linux 容器 web1 和 web2 充当独立的受管节点:它们拥有不同的地址、主机名和文件系统,但共享虚拟机的内核。无需使用 Docker 命令,也无需修改平台登录设置。

Python 虚拟环境将项目软件包与操作系统及课程共享工具隔离。镜像中已有供基础设施使用的共享 Ansible 命令,但你的任务是在 /home/labex/project/.venv 中安装单独的副本。

打开终端。使用 cd 进入项目目录;后续相对路径都以此目录为基准解析:

cd /home/labex/project

pwd 会打印当前工作目录:

pwd

输出应为 /home/labex/project。整个实验中请一直使用此目录。

ansible-python 选择预先准备的课程 Python。--version 显示其版本:

ansible-python --version

预期输出为 Python 3.12.15。控制节点的系统 Python 与其相互独立;请勿替换系统 Python。

-m venv 选项运行 Python 的虚拟环境模块。最后的 .venv 参数指定在项目内创建的目录名。开头的点使其不会出现在普通目录列表中:

ansible-python -m venv .venv

通常此命令完成后没有输出。它会创建环境和 Python 软件包安装工具 pip;此时尚未安装 Ansible。

通过相对路径运行新环境中的 Python。这能确认你无需先激活环境就可以使用隔离的解释器:

.venv/bin/python --version

它也应打印 Python 3.12.15。这两个 Python 命令使用相同的 Python 版本,但安装到 .venv 中的软件包属于本项目。

离线安装并激活 Ansible

本步骤将把固定版本的 Ansible Core 安装到 .venv,并让终端使用它。

Ansible Core 提供本课程使用的 ansible 命令和内置模块。预先准备的 wheel 文件是本地 Python 软件包,因此安装过程不依赖从互联网下载。requirements 文件指定了相互兼容的固定版本。

以下命令使用项目 Python 运行 pip。install 安装软件包,--no-index 禁用在线软件包索引,--find-links 选择本地 wheel 目录,-r 读取 requirements 文件:

.venv/bin/python -m pip install --no-index --find-links /opt/labex/ansible-course/wheels -r /opt/labex/ansible-course/requirements.txt

输出会列出从本地缓存处理的软件包,并以 Successfully installed ... 结尾,其中包括 ansible-core-2.21.5。重复安装时可能改为显示 Requirement already satisfied。

激活会将环境的命令目录放到当前 shell 搜索路径的最前面。source 在当前终端中运行激活脚本,因此这一更改会持续影响后续命令:

source .venv/bin/activate

提示符现在可能以 (.venv) 开头。终端使用 zsh;安装新可执行文件后,rehash 会刷新缓存的命令位置:

rehash

command -v 显示命令名实际选择的可执行文件:

command -v ansible

预期为 /home/labex/project/.venv/bin/ansible。/usr/local/bin/ansible 等共享路径不能证明项目安装已激活。如果打开了新终端,请返回项目目录,再次激活环境并运行 rehash。

现在查看正在运行的 Ansible 版本:

ansible --version

在输出中查找以下字段:

ansible [core 2.21.5]
  config file = /home/labex/project/ansible.cfg
  ...
  ansible python module location = /home/labex/project/.venv/lib/python3.12/site-packages/ansible
  executable location = /home/labex/project/.venv/bin/ansible
  python version = 3.12.15 ...
  ...

可执行文件和模块的路径表明你正在运行项目安装的版本。配置文件由实验提供;你将在下一组技能中学习如何配置它。

最后,pip 的 check 命令用于测试已安装软件包的依赖是否兼容:

.venv/bin/python -m pip check

预期输出为 No broken requirements found.。你现在拥有可用的控制节点,而无需更改系统软件包或共享工具链。

连接两个受管节点

本步骤将查看预先准备的清单,并在两个 SSH 目标节点上运行基于 Python 的连接测试。

清单告诉 Ansible 可以管理哪些主机。cat 打印文件内容;请阅读提供的项目清单:

cat inventory.ini

其结构如下:

web1 ansible_host=...
web2 ansible_host=...

[all:vars]
ansible_user=automation
ansible_ssh_private_key_file=/home/labex/.local/share/ansible-course/id_ed25519
ansible_python_interpreter=/usr/bin/python3

实际地址会替换 ...;请使用现有值。web1 和 web2 是清单名称,而 ansible_host 指定各自的 SSH 连接目标。[all:vars] 将后面的连接设置应用到两台主机。automation 是受管节点内部的普通账户,并非控制节点上的 labex 登录账户。实验提供全新的训练密钥和受信任的主机密钥;无需生成密钥或更改 SSH 设置。

目标 Python 路径 /usr/bin/python3 属于各个受管节点。它与控制节点的项目 Python 不同:大多数 Ansible 模块除了需要控制节点上的 Python,也需要目标节点上的 Python。

在项目目录中运行命令时,提供的 ansible.cfg 会选择此清单。all 选择清单中的所有主机;--list-hosts 预览选择结果,而不运行模块:

ansible all --list-hosts

预期恰好显示以下两个主机名,顺序可能不同:

  hosts (2):
    web1
    web2

-m 选项选择模块,即 Ansible 执行工作的单元。ansible.builtin.ping 是内置 ping 模块的完全限定名称。它通过 SSH 连接,并在每个目标节点上运行 Python;它不是网络 ICMP ping:

ansible all -m ansible.builtin.ping

两台主机都应返回包含以下稳定字段的结果;结果顺序可能不同:

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

pong 证明该主机的 SSH 身份验证和目标 Python 执行均已成功。changed: false 表示此连接测试未请求配置更改。仅一台主机成功还不够:请确认两个名称都有结果。UNREACHABLE 表示连接失败;FAILED 表示任务失败。空主机列表也不能证明连通性。

如果命令失败,请首先确认你仍处于项目目录,command -v ansible 选择的是 .venv/bin/ansible,并且提供的清单仍包含两个原始目标地址。请勿更改平台的登录、SSH 和 sudo 配置。

总结

你创建了隔离的控制节点环境,从离线缓存安装了固定版本的 Ansible Core 软件包,激活了项目命令,并检查了它们的路径与依赖。你阅读了提供的清单,并从两个不同的 SSH 受管节点分别收到了 Python pong 响应。在学习项目配置之前,你现在能够区分控制节点 Python、目标节点 Python 和清单名称。