相同的 Vagrant VM 安装 pip 包的方式不同吗?

相同的 Vagrant VM 安装 pip 包的方式不同吗?

我有一个通过 Puppet 配置的 vagrant VM。我在两个不同的 Ubuntu 12.04 和 13.10 上测试它,两者都使用“标准”precise32 框。我正在测试的应用程序是一个使用 Python 的 setuptools 安装的 Django 应用程序(通过执行pip install /vagrant)。使用 13.10 作为主机,VM 似乎配置得很好。

然而在 12.04 上,一些依赖于我的 manage.py 脚本的后续 Puppet 规则开始失败:

vagrant@precise32:~$ sudo -u buffet ~buffet/project/manage.py collectstatic
Traceback (most recent call last):
  File "/home/buffet/project/manage.py", line 11, in <module>
    import settings
  File "/home/buffet/project/settings.py", line 3, in <module>
    import pkg_resources
  File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 2727, in <module>
    add_activation_listener(lambda dist: dist.activate())
  File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 700, in subscribe
    callback(dist)
  File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 2727, in <lambda>
    add_activation_listener(lambda dist: dist.activate())
  File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 2227, in activate
    self.insert_on(path)
  File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 2334, in insert_on
    self.check_version_conflict()
  File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 2373, in check_version_conflict
    for modname in self._get_metadata('top_level.txt'):
  File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 2221, in _get_metadata
    for line in self.get_metadata_lines(name):
  File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 1209, in get_metadata_lines
    return yield_lines(self.get_metadata(name))
  File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 1201, in get_metadata
    return self._get(self._fn(self.egg_info,name))
  File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 1316, in _get
    stream = open(path, 'rb')
IOError: [Errno 13] Permission denied: '/usr/local/lib/python2.7/dist-packages/Pygments-1.6.egg-info/top_level.txt'

因此,看起来我可以删除我所有东西中的pkg_resources导入和相关代码,但我不希望系统处于只需导入即可使应用程序崩溃的状态。看起来,setuptools 安装的所有内容(文件除外)*.pyc都没有读取权限,因此非特权用户可以使用它们。

我尝试排除以下几种情况:

  • 在这两个发行版中,我都使用 Ubuntu 的 vagrant 版本 (1.0.1)。有时 12.04 上的程序太旧,无法正常工作,因此我尝试将主机系统升级到 Vagrant 1.2.2(13.10 使用的就是这个版本)。这似乎没有影响任何东西。
  • 我尝试通过 PyPI 将 VM 升级到最新的 pip。没有效果。
  • 有趣的是,如果我进入 VM,并且pip install某些权限设置符合我的预期,那么它似乎与 Puppet 或 Vagrant 有关。
  • 我阅读了 vagrant 版本之间的错误修复但找不到任何适用的内容。
  • 我能想到的这两个系统之间唯一的主要站点差异是 12.04 系统的 umask 更严格,因此组和其他用户没有读/写权限。不过我不知道这会如何延续到 VM 中。
  • 有趣的是,这只是依赖项有此问题。主应用程序似乎没问题...(编辑:嗯,源代码没问题,但 top_level.txt 和相关文件有问题)

对此有什么想法吗?由于几个月后我们将升级到 14.04,因此它不会很快变得重要,但如果它在此期间能正常工作就好了。

这是安装应用程序(和依赖项)的规则:

exec{'buffet::install library':
  path    => "/usr/bin",
  command => "pip install /vagrant",
  notify  => [
    Exec['buffet::collect static'],
    Exec['buffet::generate hookenv'],
    Service['uwsgi'],
  ],
}

相关内容