Ansible network_cli未使用虚拟环境Python的问题求助
解决Ansible强制使用系统Python而非pyenv/Poetry虚拟环境的问题
核心问题分析
错误提示明确显示:Ansible调用cisco.ios.ios_facts模块时,使用了系统级的/usr/bin/python3,而非你通过pyenv/Poetry搭建的虚拟环境Python,导致找不到已安装的ansible-pylibssh依赖。即使配置了ansible_python_interpreter仍无效,大概率是配置路径不正确或Ansible未继承虚拟环境上下文。
解决方案
1. 获取虚拟环境的真实Python路径
不要使用which python返回的shims路径(/root/.pyenv/shims/python),直接获取Poetry虚拟环境的实际Python路径:
poetry run which python
输出示例:/root/.pyenv/versions/3.11.6/envs/ansible-env/bin/python
2. 正确配置ansible_python_interpreter
将上述真实路径写入group_vars/switches.yml,覆盖原有配置:
--- ansible_connection: ansible.netcommon.network_cli ansible_network_os: cisco.ios.ios ansible_network_cli_ssh_type: libssh ansible_python_interpreter: "/root/.pyenv/versions/3.11.6/envs/ansible-env/bin/python"
也可以在inventory文件中针对交换机组单独配置:
[switches] REDACTED ansible_host=你的交换机IP ansible_python_interpreter=/root/.pyenv/versions/3.11.6/envs/ansible-env/bin/python
3. 通过Poetry上下文运行Ansible
确保Ansible完全运行在虚拟环境中,不要直接调用ansible-playbook,而是用Poetry启动:
poetry run ansible-playbook your_playbook.yml
如果需要sudo权限(比如读取系统敏感文件),添加-E参数保留环境变量:
sudo -E poetry run ansible-playbook your_playbook.yml
4. 验证依赖安装状态
确认ansible-pylibssh确实在虚拟环境中:
poetry run pip list | grep ansible-pylibssh
如果未找到,重新执行poetry install确保所有依赖完成安装。
额外注意事项
- Debian 12默认限制系统pip直接安装包是正常设计,无需修改,所有依赖通过Poetry管理即可。
- 避免混用系统Python和虚拟环境Python,所有Ansible相关操作都要在Poetry激活的环境中执行(或用
poetry run前缀)。
内容的提问来源于stack exchange,提问作者Taavi Ansper
相关产品推荐
相关产品推荐

