Идентичные пакеты установки pip Vagrant VM по-другому?
У меня есть бродячая виртуальная машина, предоставляемая через Puppet. Я тестирую это на двух разных Ubuntus, 12.04 и 13.10, оба в "стандартном" окне точного32. Приложение, которое я тестирую, является приложением Django, устанавливаемым с помощью Python setuptools (выполнив pip install /vagrant
). Используя 13.10 в качестве хоста, виртуальная машина, кажется, обеспечивает просто отлично.
Однако 12.04 некоторые более поздние правила Puppet перестают работать, что зависит от моего сценария manage.py:
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. Нет эффекта.
- Интересно, если я шелл к виртуальной машине и
pip install
что-то, права доступа установлены так, как я ожидал, так что, похоже, это как-то связано с Puppet или Vagrant. - Я прочитал исправления между версиями бродяги, но не смог найти ничего подходящего.
- Единственное существенное различие между этими двумя системами, которое я могу вспомнить, заключается в том, что система 12.04 имеет более закрытый umask, поэтому у группы и других пользователей нет возможности чтения / записи. Я понятия не имею, как это будет нести в ВМ, хотя.
- Интересно, что это только зависимости, которые имеют эту проблему. Основное приложение, кажется, в порядке... (правка: хорошо, с источниками все в порядке, но 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'],
],
}