二、环境准备:控制节点与受管节点的要求、安装Ansible、配置SSH免密与基础连通性测试
Ansible 之所以能在众多自动化运维工具中脱颖而出,核心在于其“无代理(Agentless)”架构。这意味着我们无需在受管节点上预先安装任何客户端程序,仅需通过 SSH 协议即可完成指令下发与数据采集。然而,这种简洁架构的前提是:控制节点(Control Node)与受管节点(Managed Node)必须满足特定的环境要求,且 SSH 通道必须稳定、可信、高效。本章将围绕环境准备这一主题,从节点规格、Ansible 安装、SSH 免密配置到连通性验证,构建一套可复用的标准化交付流程。下图展示了本章的核心知识框架与操作链路:
上图清晰地展示了 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/WSL | Linux/Unix/Windows | uname -a |
| Python 版本 | ≥ 3.8 | ≥ 2.6 或 ≥ 3.5 | python3 --version |
| SSH 服务 | 客户端 (openssh-clients) | 服务端 (sshd) | systemctl status sshd |
| 网络端口 | 出站 22 端口 | 入站 22 端口 | telnet <IP> 22 |
| 权限要求 | 普通用户 + sudo | 普通用户或 root | sudo -l |
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。
# 创建虚拟环境
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 或 Ed25519 | Ed25519 性能更优,但需受管节点 OpenSSH 6.5+ |
| PermitRootLogin | no | 禁止 root 直接登录,使用普通用户 + sudo |
| PasswordAuthentication | no(配置完成后) | 关闭密码登录,增强安全性 |
| AllowUsers | ansible | 限制 SSH 登录用户 |
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)”。排查过程如下:
- 检查 SSH 端口:
telnet 192.168.1.102 22确认端口开放。 - 手动 SSH 登录:
ssh user@192.168.1.102提示密码错误,说明公钥未正确分发。 - 重新执行
ssh-copy-id,发现目标主机~/.ssh目录权限为 777,导致 SSH 拒绝读取 authorized_keys。 - 修正权限:
chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys,再次测试成功。
ansible all -m ping 作为每次环境变更后的回归测试命令。此外,可在 ansible.cfg 中设置 host_key_checking = False 以跳过首次连接的主机指纹确认,但生产环境建议保持默认并提前将主机指纹加入 known_hosts。