二、环境准备:控制节点与受管节点的要求、安装Ansible、配置SSH免密与基础连通性测试

Ansible 之所以能在众多自动化运维工具中脱颖而出,核心在于其“无代理(Agentless)”架构。这意味着我们无需在受管节点上预先安装任何客户端程序,仅需通过 SSH 协议即可完成指令下发与数据采集。然而,这种简洁架构的前提是:控制节点(Control Node)与受管节点(Managed Node)必须满足特定的环境要求,且 SSH 通道必须稳定、可信、高效。本章将围绕环境准备这一主题,从节点规格、Ansible 安装、SSH 免密配置到连通性验证,构建一套可复用的标准化交付流程。下图展示了本章的核心知识框架与操作链路:

Ansible 环境准备与连通性验证链路 控制节点 (Control Node) • Python 3.8+ / 2.7 • Ansible 2.9+ 或 AWX • SSH 客户端工具 • 支持 Linux/macOS/WSL 受管节点 (Managed Node) • Python 2.6+ / 3.5+ • SSH 服务端 (sshd) • 无需安装 Agent • 支持 Linux/Unix/Windows SSH 免密通道 密钥对生成 → 公钥分发 ssh-copy-id / 手动追加 基础连通性测试 ansible all -m ping 1. 系统要求核对 OS / Python / 权限 2. 安装 Ansible pip / yum / apt 3. 配置 SSH 免密 ssh-keygen / copy-id 4. 验证与排障 ping / command 模块 关键点:控制节点需 Python3,受管节点仅需 SSH 与 Python,无需额外代理

上图清晰地展示了 Ansible 环境准备的两大核心域:左侧为控制节点,右侧为受管节点,中间通过 SSH 免密通道连接。下方四个步骤构成了从系统核对到连通性验证的完整闭环。接下来,我们将逐一深入每个环节的具体要求与操作细节。

2.1 控制节点与受管节点的硬性要求

核心原理:Ansible 采用“推”模式,控制节点是执行 Playbook 的发起方,受管节点是被动接收指令并执行的对象。控制节点必须安装 Ansible 软件包,而受管节点仅需具备 SSH 服务端和 Python 解释器。这种设计大幅降低了受管节点的维护成本,但也对控制节点的网络连通性和 SSH 配置提出了更高要求。

判断方法与操作流程:在规划环境时,应首先确认操作系统类型与版本。控制节点推荐使用 Linux(如 CentOS 7/8、Ubuntu 20.04+)或 macOS,Windows 需通过 WSL 或虚拟机实现。受管节点支持绝大多数 Unix-like 系统,Windows 需启用 OpenSSH 服务并配置 WinRM 或 SSH 连接。Python 版本方面,控制节点需 Python 3.8 以上(Ansible 4.0+ 强制要求),受管节点至少 Python 2.6 或 3.5 以上。此外,控制节点应具备至少 2GB 内存和 10GB 可用磁盘空间,受管节点资源要求较低,但需确保 SSH 端口(默认 22)未被防火墙阻断。

检查项控制节点要求受管节点要求验证命令
操作系统Linux/macOS/WSLLinux/Unix/Windowsuname -a
Python 版本≥ 3.8≥ 2.6 或 ≥ 3.5python3 --version
SSH 服务客户端 (openssh-clients)服务端 (sshd)systemctl status sshd
网络端口出站 22 端口入站 22 端口telnet <IP> 22
权限要求普通用户 + sudo普通用户或 rootsudo -l
风险提示:若受管节点 Python 版本过低(如 CentOS 6 默认 Python 2.6),部分 Ansible 模块可能无法正常工作。建议在受管节点上安装 python3 或使用 raw 模块进行引导升级。

2.2 安装 Ansible:多方式对比与实战选择

核心原理:Ansible 的安装本质上是将 Python 包及其依赖(如 Jinja2、PyYAML、cryptography)部署到控制节点。不同安装方式对应不同的适用场景:包管理器适合快速部署,pip 适合版本控制,源码安装适合开发调试。

操作流程:最推荐的方式是使用 pip 安装,因为它能确保获取最新稳定版且不依赖系统仓库的滞后版本。具体命令如下:

# 1. 更新 Python 包管理工具
curl -sS https://bootstrap.pypa.io/get-pip.py | python3

# 2. 安装 Ansible(全局安装)
pip3 install ansible

# 3. 验证安装版本
ansible --version

对于 CentOS/RHEL 系统,也可使用 EPEL 仓库:yum install epel-release -y && yum install ansible -y。Ubuntu/Debian 则使用 apt update && apt install ansible -y。若需安装指定版本(如 2.9.27),可执行 pip3 install ansible==2.9.27。

案例拆解:某企业生产环境使用 CentOS 7.9,系统自带 Python 2.7.5。运维团队最初使用 yum 安装 Ansible 2.9,但发现部分新模块(如 community.general)无法使用。后改用 pip3 安装 Ansible 4.10,并利用 virtualenv 创建独立环境,成功解决了依赖冲突问题。关键操作如下:
# 创建虚拟环境
python3 -m venv /opt/ansible-env
source /opt/ansible-env/bin/activate
pip install ansible==4.10.0
# 配置 PATH
echo "export PATH=/opt/ansible-env/bin:$PATH" >> ~/.bashrc
此方案既保留了系统 Python 的稳定性,又实现了 Ansible 版本的灵活切换。
经验提醒:安装完成后,务必检查 ansible --version 输出中的“python version”字段,确保其指向正确的 Python 解释器。若出现“ModuleNotFoundError: No module named 'ansible'”,通常是因为 pip 安装到了用户目录而 PATH 未包含。

2.3 配置 SSH 免密:从密钥生成到批量分发

核心原理:SSH 免密登录基于公钥加密算法。控制节点生成一对密钥(私钥保留本地,公钥分发至受管节点),受管节点将公钥追加到 ~/.ssh/authorized_keys 文件中。当控制节点发起 SSH 连接时,受管节点用公钥加密挑战值,控制节点用私钥解密并返回,从而完成身份验证。

操作流程:推荐使用 ssh-keygen 生成 RSA 4096 位密钥对,并通过 ssh-copy-id 工具批量分发。具体步骤如下:

# 1. 生成密钥对(一路回车即可)
ssh-keygen -t rsa -b 4096 -C "ansible-control"

# 2. 分发公钥到受管节点(需输入密码)
ssh-copy-id -i ~/.ssh/id_rsa.pub user@192.168.1.101
ssh-copy-id -i ~/.ssh/id_rsa.pub user@192.168.1.102

# 3. 验证免密登录
ssh user@192.168.1.101 "hostname"

若受管节点较多,可编写循环脚本批量分发。同时,建议在 ~/.ssh/config 中配置主机别名,简化后续命令:

Host web1
    HostName 192.168.1.101
    User ansible
    Port 22
    IdentityFile ~/.ssh/id_rsa
配置项推荐值说明
密钥类型RSA 4096 或 Ed25519Ed25519 性能更优,但需受管节点 OpenSSH 6.5+
PermitRootLoginno禁止 root 直接登录,使用普通用户 + sudo
PasswordAuthenticationno(配置完成后)关闭密码登录,增强安全性
AllowUsersansible限制 SSH 登录用户
安全警告:生产环境严禁使用空密码或弱密码的密钥对。私钥文件权限必须为 600(chmod 600 ~/.ssh/id_rsa),否则 SSH 会拒绝加载。若受管节点存在多个用户,建议为 Ansible 创建专用账号(如 ansible),并赋予 sudo 权限。

2.4 基础连通性测试:从 ping 模块到 Ad-Hoc 命令

核心原理:Ansible 的 ping 模块并非 ICMP 协议,而是通过 SSH 连接受管节点并执行 Python 脚本,验证 Python 解释器可用性和 SSH 通道连通性。成功返回 pong 即表示环境就绪。

操作流程:首先创建主机清单文件 /etc/ansible/hosts 或项目目录下的 inventory 文件,定义受管节点分组:

[webservers]
192.168.1.101
192.168.1.102

[dbservers]
192.168.1.201 ansible_user=root

然后执行连通性测试:

# 测试所有主机
ansible all -m ping

# 测试指定分组
ansible webservers -m ping

# 使用 Ad-Hoc 命令查看系统信息
ansible all -m command -a "uptime"

预期输出如下:

192.168.1.101 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
192.168.1.102 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
排障案例:某次测试中,ansible all -m ping 对 192.168.1.102 返回 UNREACHABLE,错误信息为 “Permission denied (publickey,gssapi-keyex,password)”。排查过程如下:
  1. 检查 SSH 端口:telnet 192.168.1.102 22 确认端口开放。
  2. 手动 SSH 登录:ssh user@192.168.1.102 提示密码错误,说明公钥未正确分发。
  3. 重新执行 ssh-copy-id,发现目标主机 ~/.ssh 目录权限为 777,导致 SSH 拒绝读取 authorized_keys。
  4. 修正权限:chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys,再次测试成功。
此案例表明,SSH 免密配置不仅涉及密钥分发,还需关注目标主机目录权限、SELinux 上下文等细节。
总结复盘:环境准备阶段应遵循“最小化验证”原则:先验证 SSH 免密,再验证 Python 版本,最后验证 Ansible 模块。建议将 ansible all -m ping 作为每次环境变更后的回归测试命令。此外,可在 ansible.cfg 中设置 host_key_checking = False 以跳过首次连接的主机指纹确认,但生产环境建议保持默认并提前将主机指纹加入 known_hosts。