我有一个通过 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'],
],
}