应优先使用系统包管理器安装Ansible,避免pip导致的Python环境冲突;需配置SSH免密、正确编写inventory文件;ansible-core不含第三方模块,需额外安装collection;注意禁用ControlPersist和预加载host key以确保自动化稳定运行。

直接用系统包管理器装,别 pip install ansible
绝大多数 Linux 发行版的官方仓库里都有现成的 ansible 包,版本稳定、依赖自动解决、升级路径清晰。用 pip install ansible 容易和系统 Python 环境冲突,尤其在 CentOS/RHEL 8+ 或 Ubuntu 22.04+ 上,可能触发 ImportError: cannot import name 'soft_unicode' 这类报错——本质是 pip 装的 Ansible 和系统自带的 Jinja2 版本不兼容。
- Ubuntu/Debian:运行
sudo apt update && sudo apt install ansible - CentOS/RHEL/Rocky/AlmaLinux 8+:先启用 EPEL(
sudo dnf install epel-release),再执行sudo dnf install ansible-core(注意是ansible-core,不是旧版ansible) - CentOS 7:启用 EPEL 后用
sudo yum install ansible
装完立刻验证 ssh 免密和 inventory 文件结构
Ansible 不是装完就能跑命令的工具,它默认依赖 SSH 连通性和主机清单定义。常见错误是执行 ansible all -m ping 报 UNREACHABLE! => {"msg": "Failed to connect to the host via ssh..."},其实跟 Ansible 本身无关,纯属环境没配好。
- 确保目标机器的
sshd正在运行,且防火墙放行 22 端口(sudo ufw allow 22或sudo firewall-cmd --permanent --add-service=ssh) - 本地生成密钥对(
ssh-keygen -t ed25519),并用ssh-copy-id user@host推送公钥 -
/etc/ansible/hosts或当前目录下的inventory文件必须有合法格式,比如:[web]<br>192.168.1.10<br>192.168.1.11
不能漏掉方括号或写错 IP
ansible-core 和 ansible 包的区别直接影响你能用什么模块
从 Ansible 2.10 开始,项目拆成了 ansible-core(核心引擎 + 基础模块)和 ansible(含大量第三方集合)。如果你用的是 RHEL/CentOS 8+ 的 ansible-core,会发现 community.mysql.mysql_user、amazon.aws.ec2_instance 这类模块根本不存在——它们不在核心包里,得额外安装 collection。
- 检查已装内容:
ansible --version看输出里有没有configured module search path;运行ansible-galaxy collection list查看已装集合 - 装一个常用集合示例:
ansible-galaxy collection install community.mysql(需要网络和python3-pip) - 注意权限:普通用户装 collection 默认到
~/.ansible/collections,root 用户装到/usr/share/ansible/collections,路径不一致会导致不同用户执行结果不同
第一次跑 playbook 前记得关掉 controlpersist 和校验 host key
Ansible 默认复用 SSH 连接(靠 ControlPersist),但在某些老旧 OpenSSH 版本或容器化环境中,这反而导致连接卡住或报 ssh: Could not resolve hostname;另外,首次连接新主机时若没提前录入 host key,playbook 可能停在交互式确认环节,自动化就断了。
- 临时禁用连接复用:在
ansible.cfg里加[ssh_connection]<br>control_path = None
- 跳过 host key 检查(仅限可信内网):
[defaults]<br>host_key_checking = False
- 更稳妥的做法是预加载 host key:
ssh-keyscan -H 192.168.1.10 >> ~/.ssh/known_hosts










