Как человек, который запускает несколько веб-серверов, на каждом из которых работает набор сайтов Django, очень важно поддерживать мой стек Python. Из-за (вероятно, плохой) привычки я полагаюсь на Ubuntu для ряда моих пакетов Python, включая python-django
и множество python-django-*
дополнений. Веб-сайты требуют, чтобы они запускались, но пока пакет существует, это не проблема. Я делаю это вместо того, чтобы использовать VirtualEnv (и др.), Потому что я хочу, чтобы Ubuntu установила обновления безопасности.
Однако репозитории Ubuntu предназначены не для всех. В некоторых случаях я буду использовать pip
или easy_install
, чтобы засосать последнюю версию пакета Python. Когда вы обновляете Python (как это иногда бывает в Ubuntu), вы теряете все ваши pip
-установленные пакеты.
Меня пугает то, что чем глубже я получаю, тем больше серверов я администрирую, и в один прекрасный день произойдет обновление ОС, которое потребует часов и часов моего бега вокруг, тестирования сайтов, переустановки пакетов python через pip
. Хуже всего это потенциальное время простоя для клиентских сайтов, хотя я тестирую на своей машине для разработки (всегда в Ubuntu-latest), поэтому это должно компенсировать некоторые из этих опасений.
Могу ли я что-нибудь сделать, чтобы обновления Python означали, что существующие, не dpgk'd пакеты Python были перенесены?
Это позволило бы мне всегда иметь доступ к тем же пакетам. Я все еще должен был бы проверить на несовместимость, но это было бы хорошим началом.
Возможно, есть еще одно лучшее решение: приложение, которое ведет себя как apt
и dpkg
, но для взаимодействия с PyPi (где pip
и easy_install
получают большую часть своего mojo)). Что-то, что хранит локальный список установленных пакетов, проверяется наличие обновлений, таких как apt
, управляемая установка и т. Д. Существует ли такая вещь? Или это чепуха?
Относительно того, как сохранить ваши пакеты Python при обновлении системы Python: я вижу две опции:
Вы можете установить не-Ubuntu Python с помощью easy_install
--install-dir /usr/local/python
. Тогда вы убедитесь, что что все ваши веб-приложения включают этот каталог в sys.path
, например, включив его в PYTHONPATH, или используя каталог, который автоматически включается в site.py
(документ которого гласит, что «Локальные дополнения входят в /usr/local/lib/python<version>/dist-packages
»)
Вы можете использовать virtualenvs, при условии, что вы можете поместить все данные и конфигурацию вашего приложения в каталог, независимый от кода. Вот процедура эскиза:
a. Поместите все независимые от кода вещи в каталог myapp-data/
b. Создать virtualenv myapp-code.XXX/
(где XXX
- некоторый уникальный номер версии, например, date -I
)
c. Поместите код приложения и все пакеты зависимостей в myapp-code.XXX
d. ln -s myapp-code.XXX myapp-code
Когда вам нужно обновить, просто повторите шаги б. и с. с другим кодом ревизии YYY, затем: остановите запущенное приложение, символическую ссылку myapp-code
- myapp-code.YYY
, запустите app из virtualenv myapp-code.YYY
. Если что-то пойдет не так, вы все равно сможете быстро вернуться к старому virtualenv.
По-видимому, 2. это больше работы (но pip
плюс некоторые сценарии оболочки помогут вам проделать долгий путь к автоматизации), но это также должно быть более надежным и позволит вам одновременно запускать приложения, которые зависит от разных версий некоторых пакетов Python.
Относительно вашего вопроса о apt-get
-подобном для пакетов Python: pip
явно запрещает такую вещь, и на то есть веская причина: API и поведение пакетов могут изменяться в разных версиях. Поэтому, если ваш код работает нормально с версией X, он может завершиться ошибкой при запуске с версией X + 1. Это именно то, что pip
пытается предотвратить с помощью функций «замораживания» и «списка требований».
Конечно, тот же аргумент может быть применен к любой программе в бинарном дистрибутиве, например Ubuntu; действительно, то, что делает apt-get
полезным, заключается в том, что Debian и Ubuntu обеспечивают скоординированный выпуск совместимых пакетов: сопровождающие прилагают много усилий для обеспечения совместимости всех пакетов Ubuntu в основных репозиториях.
Такого скоординированного выпуска пакетов Python просто не существует: каждый пакет независим и нет информации о том, какая версия других пакетов Python совместима с ним. (Это может быть хорошим дополнением к метаданным PyPI.)
Я бы использовал систему управления конфигурацией, такую как puppet или chef , чтобы запускать скрипты на всех серверах, чтобы поддерживать их синхронизацию. Ваши сценарии (рецепты) могут управлять обновлением, включая автоматическое тестирование, если обновление прошло успешно или что-то сломалось.