我在我的ansible剧本中有这个剧本
- name: Setup virtualenv
pip:
requirements="/vagrant/webapp/requirements/{{ requirements_filename }}"
virtualenv="$HOME/.envs/{{ project_name }}"
但是,我收到一个Permission denied错误。似乎ansible试图将软件包安装到系统路径而不是virtualenv。
这是完整的追溯:
TASK: [deploy | Setup virtualenv] *********************************************
failed: [default] => {"cmd": "/usr/bin/pip install -r /vagrant/webapp/requirements/dev.txt", "failed": true}
msg: stdout: New python executable in /home/vagrant/.envs/venv/bin/python
Installing setuptools, pip...done.
Downloading/unpacking django>=1.8 (from -r /vagrant/webapp/requirements/requirements.txt (line 3))
Requirement already satisfied (use --upgrade to upgrade): wsgiref>=0.1.2 in /usr/lib/python2.7 (from -r /vagrant/webapp/requirements/requirements.txt (line 4))
Downloading/unpacking django-allauth>=0.19.1 (from -r /vagrant/webapp/requirements/requirements.txt (line 5))
Running setup.py (path:/tmp/pip_build_vagrant/django-allauth/setup.py) egg_info for package django-allauth
Downloading/unpacking psycopg2>=2.6 (from -r /vagrant/webapp/requirements/requirements.txt (line 6))
Running setup.py (path:/tmp/pip_build_vagrant/psycopg2/setup.py) egg_info for package psycopg2
Downloading/unpacking django-currencies>=0.3.3 (from -r /vagrant/webapp/requirements/requirements.txt (line 7))
Downloading django-currencies-0.3.3.tar.gz
Running setup.py (path:/tmp/pip_build_vagrant/django-currencies/setup.py) egg_info for package django-currencies
Downloading/unpacking django-countries>=3.2 (from -r /vagrant/webapp/requirements/requirements.txt (line 8))
Running setup.py (path:/tmp/pip_build_vagrant/django-countries/setup.py) egg_info for package django-countries
Downloading/unpacking stripe>=1.22.1 (from -r /vagrant/webapp/requirements/requirements.txt (line 9))
Running setup.py (path:/tmp/pip_build_vagrant/stripe/setup.py) egg_info for package stripe
Downloading/unpacking pillow>=2.8.0 (from -r /vagrant/webapp/requirements/requirements.txt (line 10))
Running setup.py (path:/tmp/pip_build_vagrant/pillow/setup.py) egg_info for package pillow
Single threaded build, not installing mp_compile: 1 processes
warning: no files found matching 'LICENSE' under directory 'docs'
Downloading/unpacking django-compressor>=1.4 (from -r /vagrant/webapp/requirements/requirements.txt (line 11))
Downloading/unpacking djangorestframework>=3.1.1 (from -r /vagrant/webapp/requirements/requirements.txt (line 12))
Downloading/unpacking django-filter>=0.9.2 (from -r /vagrant/webapp/requirements/requirements.txt (line 13))
Downloading django_filter-0.9.2-py2.py3-none-any.whl
Obtaining formtools from git+https://github.com/django/django-formtools.git#egg=formtools (from -r /vagrant/webapp/requirements/requirements.txt (line 14))
Cloning https://github.com/django/django-formtools.git to ./src/formtools
Running setup.py (path:/tmp/src/formtools/setup.py) egg_info for package formtools
Installing extra requirements: 'egg'
Downloading/unpacking django-widget-tweaks>=1.3 (from -r /vagrant/webapp/requirements/requirements.txt (line 15))
Downloading django-widget-tweaks-1.3.tar.gz
Running setup.py (path:/tmp/pip_build_vagrant/django-widget-tweaks/setup.py) egg_info for package django-widget-tweaks
Downloading/unpacking django-braces>=1.4.0 (from -r /vagrant/webapp/requirements/requirements.txt (line 16))
Downloading django_braces-1.4.0-py2.py3-none-any.whl
Downloading/unpacking django-debug-toolbar>=1.3.0 (from -r /vagrant/webapp/requirements/dev.txt (line 4))
Downloading/unpacking python-openid>=2.2.5 (from django-allauth>=0.19.1->-r /vagrant/webapp/requirements/requirements.txt (line 5))
Running setup.py (path:/tmp/pip_build_vagrant/python-openid/setup.py) egg_info for package python-openid
warning: no files found matching 'CHANGELOG'
warning: no files found matching '*.css' under directory 'doc'
warning: no files found matching '*.html' under directory 'doc'
Downloading/unpacking requests-oauthlib>=0.3.0 (from django-allauth>=0.19.1->-r /vagrant/webapp/requirements/requirements.txt (line 5))
Downloading requests_oauthlib-0.4.2-py2.py3-none-any.whl
Requirement already satisfied (use --upgrade to upgrade): requests>=1.0.3 in /usr/lib/python2.7/dist-packages (from django-allauth>=0.19.1->-r /vagrant/webapp/requirements/requirements.txt (line 5))
Downloading/unpacking django-appconf>=0.4 (from django-compressor>=1.4->-r /vagrant/webapp/requirements/requirements.txt (line 11))
Downloading django_appconf-1.0.1-py2.py3-none-any.whl
Requirement already satisfied (use --upgrade to upgrade): six in /usr/local/lib/python2.7/dist-packages (from django-braces>=1.4.0->-r /vagrant/webapp/requirements/requirements.txt (line 16))
Downloading/unpacking sqlparse (from django-debug-toolbar>=1.3.0->-r /vagrant/webapp/requirements/dev.txt (line 4))
Running setup.py (path:/tmp/pip_build_vagrant/sqlparse/setup.py) egg_info for package sqlparse
Downloading/unpacking oauthlib>=0.6.2 (from requests-oauthlib>=0.3.0->django-allauth>=0.19.1->-r /vagrant/webapp/requirements/requirements.txt (line 5))
Running setup.py (path:/tmp/pip_build_vagrant/oauthlib/setup.py) egg_info for package oauthlib
Installing collected packages: django, django-allauth, psycopg2, django-currencies, django-countries, stripe, pillow, django-compressor, djangorestframework, django-filter, formtools, django-widget-tweaks, django-braces, django-debug-toolbar, python-openid, requests-oauthlib, django-appconf, sqlparse, oauthlib
Cleaning up...
Exception:
Traceback (most recent call last):
File "/usr/lib/python2.7/dist-packages/pip/basecommand.py", line 122, in main
status = self.run(options, args)
File "/usr/lib/python2.7/dist-packages/pip/commands/install.py", line 283, in run
requirement_set.install(install_options, global_options, root=options.root_path)
File "/usr/lib/python2.7/dist-packages/pip/req.py", line 1435, in install
requirement.install(install_options, global_options, *args, **kwargs)
File "/usr/lib/python2.7/dist-packages/pip/req.py", line 671, in install
self.move_wheel_files(self.source_dir, root=root)
File "/usr/lib/python2.7/dist-packages/pip/req.py", line 901, in move_wheel_files
pycompile=self.pycompile,
File "/usr/lib/python2.7/dist-packages/pip/wheel.py", line 206, in move_wheel_files
clobber(source, lib_dir, True)
File "/usr/lib/python2.7/dist-packages/pip/wheel.py", line 193, in clobber
os.makedirs(destsubdir)
File "/usr/lib/python2.7/os.py", line 157, in makedirs
mkdir(name, mode)
OSError: [Errno 13] Permission denied: '/usr/local/lib/python2.7/dist-packages/Django-1.8.dist-info'
Storing debug log for failure in /home/vagrant/.pip/pip.log
FATAL: all hosts have already failed -- aborting
答案 0 :(得分:4)
我通过明确设置路径而不使用$HOME
变量来解决问题。
- name: Setup virtualenv
pip:
virtualenv="/home/vagrant/.envs/{{ project_name }}"
requirements="/vagrant/webapp/requirements/{{ requirements_filename }}"
答案 1 :(得分:2)
尝试同时指定pip
可执行路径:
executable="$HOME/.envs/{{ project_name }}/bin/pip"
没有搜索TBH的确切原因,但必须这样做才能将内容安装到虚拟环境中。似乎它试图使用全局pip
安装到虚拟环境中。也许在某些情况下可以这样做,不是我的情况。
答案 2 :(得分:1)
pip模块似乎正在使用系统Python,所以它会尝试在预期的site-packages
系统路径上安装软件包,因为你没有以root身份运行它或者使用sudo它可以&# 39; t写入' /usr/local/lib/python2.7 /...'
我假设你想在virtualenv下安装pip包,对吗?
如果是这样,请注意Ansible模块默认使用系统默认的Python解释器,除非您设置ansible_python_interpreter
。
有关如何执行此操作的示例,请参阅Best way to always run ansible inside a virtualenv on remote machines?
有关该主题的简短讨论的链接以及为什么Ansible人不想更改#!/usr/bin/python
以获得更为虚拟友好的#!/usr/bin/env python
here。< / p>
作为一个说明,如果您从本地virtualenv运行Ansible并尝试使用say ec2
模块而不在系统中安装boto
,则会遇到同样的问题 - 级别(但安装在virtualenv级别)。
答案 3 :(得分:0)
看起来它使用的是/usr/bin/pip
,而不是来自virtualenv的pip
。不确定为什么会这样--Ansible中的一个错误?你能手动检查你的virtualenv有pip
命令吗?我可以从我的头pip
中想出一件事是为root(sudo)创建的,并且您尝试以普通用户身份运行该命令,并且它没有读取virtualenv&p?ed pip的权限。
您可以像这样手动使用pip来解决此问题。
- name: Create virtualenv for app using chosen Python
shell: virtualenv --python=python3.4 {{deploy_location}}/venv
sudo: yes
- name: Install Python packages
sudo: yes
command: {{deploy_location}}/venv/bin/pip -r {{deploy_location}}/requirements.txt