遇到 Ansible 提示 Could not resolve host,通常是因为控制节点无法通过 DNS 解析 inventory 中定义的主机名,最直接的止血方案是在控制节点的 /etc/hosts 文件中添加静态映射。
先说结论:该错误表明 Ansible 控制节点无法解析目标主机名,需在本机 hosts 文件配置 IP 与 hostname 映射。
- 先备份:修改前备份 /etc/hosts 防止配置丢失
- 再查重:使用 grep 确认记录未存在,避免重复
- 后验证:使用 ansible ping 模块测试连接是否恢复
操作前准备与备份
修改系统网络配置文件前,务必备份原文件,以便出错时快速恢复:
sudo cp /etc/hosts /etc/hosts.bak.$(date +%F)如果配置失误,可通过以下命令恢复:
sudo cp /etc/hosts.bak.* /etc/hosts命令速用版(含备份与查重)
如果你确定目标主机 IP 地址不变,可以直接在控制节点执行以下命令。该方案包含备份及重复记录检查:
grep -q "web01" /etc/hosts || echo "192.168.1.100 web01" | sudo tee -a /etc/hosts添加完成后,立即测试解析是否生效:
ping -c 2 web01如何获取目标主机 IP
如果不确定目标主机的 IP 地址,可通过以下方式查询:
- 云平台控制台:登录 AWS/阿里云/腾讯云控制台查看实例详情。
- DHCP 租赁记录:在路由器或 DHCP 服务器中查看租赁列表。
- 目标机本地查询:若能物理接触或通过其他网络可达,在目标机执行
hostname -I。
分步处理
按照以下步骤在控制节点上进行配置,确保每一步都有检查点:
1. 确认控制节点身份
确保你登录的是运行 ansible 命令的机器,而不是目标机器。hosts 文件配置必须在做操作的那台机器上生效。
2. 编辑 hosts 文件
使用文本编辑器打开 /etc/hosts 文件:
sudo vim /etc/hosts在文件末尾添加一行,格式为 "IP 地址 主机名",例如:
192.168.1.100 web01注意:IP 与主机名之间用空格或 Tab 分隔,不要使用等号或其他符号。如果有多个别名,可以写在同一行后面。
3. 检查语法
保存退出后,再次查看文件末尾,确保没有多余的空格或不可见字符,确保 IP 地址格式正确。
怎么验证是否生效
配置完成后,不要直接运行复杂 playbook,先用最基础的模块测试连通性:
ansible web01 -m ping如果返回 SUCCESS 且 pong 字样,说明解析和 SSH 连接均正常。如果仍然报错,请检查 SSH 密钥配置或防火墙设置。
你也可以单独测试域名解析:
getent hosts web01如果该命令能返回对应的 IP 地址,说明系统层面解析已生效。
常见坑
1. 配错了机器
最常见的问题是在目标服务器上配置了 hosts,但 Ansible 是在控制节点发起连接的。必须确保控制节点能解析目标主机名。
2. 重复记录导致解析异常
多次执行追加命令会导致 hosts 文件出现多条相同主机名记录,系统可能解析到错误的 IP。添加前务必使用 grep 查重。
3. IP 地址变更
hosts 文件是静态映射。如果目标主机使用 DHCP 或 IP 发生变动,hosts 文件不会自动更新,会导致连接突然中断。生产环境中建议配合动态 inventory 或内部 DNS 使用。
4. 主机名不一致
inventory 文件中写的是 web01,hosts 文件里写的是 web01.local,两者必须完全匹配。Linux 系统默认区分大小写,建议统一使用小写。