ansible批量管理linux服务器成功运行的核心是三步:控制机装对ansible、目标机ssh免密通、主机清单写准;缺一不可,任一环节出错都会导致ansible all -m ping失败。

Ansible 能批量管理 Linux 服务器,但不是装完 ansible 命令就能跑通——控制机装对、目标机 SSH 免密通、主机清单写准,三者缺一不可;任一环节出错,ansible all -m ping 就会失败。
控制机上怎么装 Ansible 才不踩坑
不同发行版的安装路径差异大,硬套命令容易卡在“no package found”:
- Ubuntu/Debian 直接
sudo apt update && sudo apt install ansible即可;如果版本太旧(比如 Ubuntu 20.04 默认只有 Ansible 2.9),想用新特性,改用python3 -m pip install ansible,但得确认python3 --version≥ 3.8 - CentOS/RHEL 7 必须先配 EPEL 源:
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo && yum clean all && yum repolist,再yum install ansible;跳过这步直接yum install ansible必然失败 - CentOS/RHEL 8+ 改用
dnf install ansible,不用额外配源;但注意dnf默认可能没启用 PowerTools,某些依赖模块(如community.general)要手动开 - 装完务必运行
ansible --version看输出:如果config file显示None,说明没读到配置,得检查/etc/ansible/ansible.cfg是否存在,或设ANSIBLE_CONFIG环境变量
为什么 ssh-copy-id 成功了,ansible 还是报 Permission denied (publickey)
这不是 Ansible 的问题,而是 SSH 认证链在目标机上被静默拒绝了。常见真实原因有三个:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
-
/etc/ssh/sshd_config里PubkeyAuthentication yes没开,或AuthorizedKeysFile被改成了非默认路径(比如.ssh/authorized_keys2),导致 sshd 根本不查你推过去的公钥 - 目标机用户家目录下
~/.ssh权限不是700,或~/.ssh/authorized_keys不是600,sshd 会直接跳过认证 - 目标机已禁用密码登录(
PasswordAuthentication no),但ssh-copy-id底层依赖密码登录来写文件——它成功只是因为当时密码还开着;等你关掉密码登录后,Ansible 就连不上了 - 验证方法:用
ssh -o ConnectTimeout=5 -o BatchMode=yes user@host测试,不带密钥参数,看是否秒退或报错;比ansible -m ping更快定位是 SSH 层还是 Ansible 层的问题
主机清单(inventory)写错一个字符就全盘失效
/etc/ansible/hosts 是默认路径,但新手常把它和 playbook 放一起却忘了加 -i 参数,结果命令走的是空 inventory。更隐蔽的错误是格式细节:
- INI 风格不支持
//或###注释,只认#开头的行;[web]# 生产组这种写法会让 Ansible 把# 生产组当成组名一部分,后续全找不到主机 - 主机组名后不能有空格,
[web](末尾带空格)会导致该组被忽略 - IP 后不能跟中文括号、全角空格或制表符;复制粘贴时容易混入不可见字符,建议用
cat -A hosts查看 - 推荐初学时显式指定 inventory:
ansible web -i ./hosts -m ping,而不是依赖默认路径;./hosts内容严格按如下格式(注意无缩进、无空格、空行可选):
[web] 192.168.1.10 192.168.1.11 <p>[db] 192.168.1.20</p>
ansible -m command 和 -m shell 到底该用哪个
区别不在“能不能执行”,而在“环境是否完整”:
-
command模块最安全,默认不走 shell 解释器,所以不支持管道(|)、重定向(>)、环境变量($PATH);适合执行简单命令,比如df -h、uptime -
shell模块调用远程主机的/bin/sh(或ansible_shell_type指定的 shell),支持所有 shell 特性,但拼接变量时有注入风险(比如-a "echo {{ item }}"中item含;就危险) - 真要执行多行逻辑,别把脚本塞进
-a,改用script模块:ansible web -i hosts -m script -a "./local_setup.sh",它会自动传本地脚本过去执行 - 查远程 PATH?
ansible web -m command -a "echo $PATH"输出为空;必须用-m shell才能生效
实际跑通的关键点往往藏在细节里:比如 ssh-copy-id 成功不代表 pubkey 认证就一定生效,ansible --version 显示 Python 2.7 也不代表不能用——只要模块支持就行;而 inventory 文件里一个看不见的全角空格,就足以让整个批量操作停摆。










