Ansible安装后command not found主因是~/.local/bin未加入PATH;SSH不可达需手动配免密;inventory解析失败多因格式错误;become必须置于play层级而非task内。

Ansible 安装后 ansible --version 报错“command not found”
根本原因通常是安装路径没进 $PATH,尤其用 pip install ansible 时,Python 用户级安装默认放在 ~/.local/bin/,而该目录常不在系统 PATH 中。
验证当前 PATH 是否包含该路径:echo $PATH | grep -o "$HOME/.local/bin"
- 如果没输出,执行
export PATH="$HOME/.local/bin:$PATH"并写入~/.bashrc或~/.zshrc - Ubuntu/Debian 系统建议优先用 apt:运行
sudo apt update && sudo apt install ansible,避免路径问题 - CentOS/RHEL 8+ 推荐启用 EPEL 后安装:
sudo dnf install epel-release && sudo dnf install ansible-core(注意:RHEL 9+ 默认只提供ansible-core,不含ansible元包)
执行 ansible all -m ping 提示 “UNREACHABLE!” 或 “Permission denied”
这是 SSH 连通性问题,不是 Ansible 配置错误。Ansible 本身不管理密钥分发,它依赖已配置好的 SSH 访问能力。
- 确保目标主机已开启 SSH 服务:
systemctl is-active sshd(Ubuntu/Debian 是ssh) - 手动测试连接:
ssh user@host;若需密码,Ansible 默认不支持交互式输入,必须提前配好免密登录 - 生成并分发密钥:
ssh-keygen -t ed25519→ssh-copy-id user@host(注意:目标用户需有 shell,不能是/usr/sbin/nologin) - 检查
/etc/ansible/ansible.cfg中是否禁用了 SSH 密钥验证:host_key_checking = False可跳过指纹确认,但仅限可信网络
ansible-inventory --list 输出空或报错 “Unable to parse …”
Ansible 默认读取 /etc/ansible/hosts,但该文件格式敏感——哪怕多一个空格、少一个冒号,解析器都会静默失败或报错。
- 最简可用 INI 格式示例:
[webservers]<br>web1.example.com<br>web2.example.com<br><br>[dbservers]<br>db1.example.com
- 若用 YAML 格式(如
inventory.yml),必须以all:开头,且缩进严格为 2 空格,不可用 Tab - 检查文件权限:
ansible用户需有读取权限;若 inventory 在非标准路径,必须用-i /path/to/inventory显式指定 - 常见陷阱:文件名含
.ini后缀但内容是 YAML,或反之;Ansible 不按扩展名判断格式,而是按内容特征自动识别
Playbook 执行时报 “ERROR! 'become' is not a valid attribute”
这是语法层级错误,说明你把 become: true 写在了 play 之外,比如直接放在 tasks 列表第一行,或嵌套在某个模块参数里。
-
become是 play 级关键字,只能出现在- hosts:同级,例如:- hosts: webservers<br> become: true<br> tasks:<br> - name: Install nginx<br> apt:<br> name: nginx<br> state: present
- 若只想对某 task 提权,改用
become: true放在 task 内部(Ansible 2.7+ 支持) - 注意
become_method默认是sudo,目标主机必须预装 sudo 且对应用户有 NOPASSWD 权限,否则卡住无提示
Ansible 的“零配置”是假象——它不管理 SSH、不初始化用户、不校验目标环境完整性。所有看似自动的行为,背后都依赖你提前铺好的 Linux 基础设施。最容易被忽略的,是那个连不上就全盘失效的 SSH 连接层。

















