Ansible安装virtualenv后创建虚拟环境报错,手动运行命令正常是什么原因
你遇到的报错本质不是虚拟环境路径不存在,[Errno 2] No such file or directory是指Ansible执行环境中找不到virtualenv可执行文件,和你手动执行的差异来自于shell环境的区别:
- 手动执行命令时使用的是登录态交互式shell,会自动加载
~/.bashrc、~/.bash_profile等用户配置,PATH环境变量包含了pip安装virtualenv的路径(比如普通用户pip默认安装到的~/.local/bin目录),所以可以正常识别命令。 - Ansible执行默认使用非登录非交互式shell,不会加载用户自定义的PATH配置,如果virtualenv没有安装到系统全局路径(如
/usr/bin、/usr/local/bin),Ansible就无法找到该命令,触发报错。你看到的stdout、stderr全为空也符合命令未被成功启动的特征。
修复方案
方案1:指定virtualenv绝对路径
先在目标主机执行which virtualenv获取绝对路径,比如返回/home/me/.local/bin/virtualenv,直接在task中填写完整路径:
- name: Create python virtualenv command: /home/me/.local/bin/virtualenv {{user_home_path}}/my_venv -p python3.6 creates={{user_home_path}}/my_venv become_user: "{{app_user}}"
方案2:为task补充PATH环境变量
在task中显式配置PATH,包含virtualenv所在的目录:
- name: Create python virtualenv command: virtualenv {{user_home_path}}/my_venv -p python3.6 creates={{user_home_path}}/my_venv become_user: "{{app_user}}" environment: PATH: "/usr/local/bin:/usr/bin:{{ user_home_path }}/.local/bin"
方案3:使用Ansible pip模块原生能力创建虚拟环境(更推荐)
不用手动调用command执行virtualenv,pip模块原生支持虚拟环境创建,兼容性更强:
- name: Initialize my_venv virtual environment pip: name: pip state: latest virtualenv: "{{user_home_path}}/my_venv" virtualenv_python: python3.6 become_user: "{{app_user}}"
内容的提问来源于stack exchange,提问作者leoOrion
相关产品推荐
相关产品推荐

