ansible批量管理服务器成功运行的核心是三步:控制机安装ansible、目标机配置ssh免密登录、正确编写主机清单;任一环节出错都会导致ansible all -m ping失败。

Ansible 批量管理服务器环境能跑起来,核心就三件事:控制机装好 Ansible、目标机打通 SSH 免密、主机清单写对。缺一不可,任何一步卡住,ansible all -m ping 都会失败。
控制机上安装 Ansible 要看系统源是否可用
Ubuntu/Debian 直接 sudo apt update && sudo apt install ansible 即可;CentOS/RHEL 7 必须先配 EPEL 源,否则 yum install ansible 会报“no package found”。常见错误是直接运行 yum install ansible 失败后放弃,其实只差一步:wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo && yum clean all && yum repolist,再装就行。Python 版本不影响使用,但 ansible --version 输出里如果显示 Python 2.7,说明是旧版 CentOS 7 默认环境,无需升级——Ansible 2.9 仍完全支持。
SSH 免密登录必须用 ssh-copy-id 推公钥,不能手动复制
手动把 ~/.ssh/id_rsa.pub 内容追加到目标机 ~/.ssh/authorized_keys 极易出错:权限不对(authorized_keys 必须 600,.ssh 目录必须 700)、换行符混乱、多出空格都会导致 SSH 登录时提示 Permission denied (publickey)。正确做法是统一用 ssh-keygen -t rsa -N "" 生成密钥(无密码),再用 ssh-copy-id user@192.168.1.11。如果目标机禁了密码登录,需确认其 /etc/ssh/sshd_config 中 PubkeyAuthentication yes 已启用,并执行 systemctl restart sshd。
hosts 文件路径和格式错一个字符就全盘失效
默认 inventory 路径是 /etc/ansible/hosts,但新手常把它和 playbook 放一起,然后执行时忘记加 -i 参数,结果命令走的是空配置。更隐蔽的坑是格式:INI 风格不支持 YAML 注释(# 可以,// 或 ### 不行);主机组名后不能有空格;IP 后不能跟中文括号或全角符号。推荐初学时单独建 hosts 文件(比如当前目录下),显式用 -i hosts 调用。示例必须严格如下:
[web] 192.168.1.10 192.168.1.11 [db] 192.168.1.20
注意空行和缩进无关,但每行 IP 或主机名前不能有空格。
测试连通性别跳过 ping 模块,也别信 ssh 成功就等于 Ansible 可用
ssh user@192.168.1.10 能登录,不代表 ansible web -i hosts -m ping 能过。常见断点有三个:一是目标机没装 Python(CentOS 7 默认有,但最小化安装可能删了,需 ansible web -i hosts -m raw -a "yum install -y python3" 临时补);二是用户没有 become 权限(ping 模块本身不提权,但某些安全加固系统会限制非 root 用户执行特定系统调用);三是控制机时间与目标机偏差超 5 分钟(Kerberos 或证书验证场景下会失败,虽不常见但排查费时)。最稳的第一步永远是:ansible all -i hosts -m ping,绿字回显 "ping": "pong" 才算真正打通。
真正容易被忽略的不是语法细节,而是变量作用域和模块行为差异——比如 command 模块不走 shell 环境,$PATH 和别名全失效;而 shell 模块能用管道却可能因交互式提示卡住。这些不会在 ping 测试里暴露,要等写 playbook 时才突然崩掉。











