Простая проблема развертывания Python - целый мир боли

У нас есть несколько приложений Python 2.6, работающих на Linux. Некоторые из них являются веб-приложениями Опор, другие являются просто продолжительными процессами, которые мы выполняем от использования командной строки nohup. Мы также используем virtualenv, и в разработке и в производстве. Что лучший способ состоит в том, чтобы развернуть эти приложения на рабочем сервере?

В разработке мы просто получаем исходное дерево в любой каталог, настраиваем virtualenv и работаем - достаточно легкий. Мы могли сделать то же в производстве и возможно который действительно является наиболее практическим решением, но это просто чувствует немного неправильное работать svn update в производстве. Мы также попробовали fab, но это просто никогда не работает в первый раз. Для каждого приложения что-то еще идет не так, как надо. Это ударяет меня, что целый процесс просто слишком труден, учитывая, что то, чего мы пытаемся достигнуть, существенно очень просто. Вот то, что мы хотим от процесса развертывания.

  1. Мы должны смочь выполнить одну простую команду для развертывания обновленной версии приложения. (Если начальное развертывание включает немного дополнительной сложности, это прекрасно.)
  2. Когда мы выполняем эту команду, она должна скопировать определенные файлы, или из репозитория Подверсии или из локальной рабочей копии, к указанной "среде" на сервере, который, вероятно, означает другой virtualenv. У нас есть и версия подготовки и производства приложений на том же сервере, таким образом, они должны так или иначе быть разделены. Если это устанавливает в пакеты сайта, это прекрасно также, пока это работает.
  3. У нас есть некоторые конфигурационные файлы на сервере, который должен быть сохранен (т.е. не перезаписан или удален процессом развертывания).
  4. Некоторые из этих приложений импортируют модули из других приложений, таким образом, они должны смочь сослаться друг на друга как на пакеты так или иначе. Это - часть, с которой мы испытали большинство затруднений! Я не забочусь, работает ли это через относительный импорт, пакеты сайта или что бы то ни было, пока это работает надежно и в разработке и в производстве.
  5. Идеально процесс развертывания должен автоматически установить внешние пакеты, что наши приложения зависят от (например, psycopg2).

Это - действительно это! Как трудно это может быть?

21
задан EMP 30 April 2010 в 03:41
поделиться

7 ответов

Разработка и развертывание кода Python значительно облегчается благодаря setuptools в сочетании с virtualenv и pip.

Основные идеи

Самая сложная часть, как я обнаружил, это запуск среды разработки, которая как можно точнее повторяет развернутую установку, и в то же время уважает инструменты и идиомы Pythonic. Но оказалось, что этого очень легко добиться с помощью pip и setuptools, которые вместе позволяют "установить" дерево разработки в среду Python без перемещения файлов. (На самом деле setuptools делает это сам по себе, но pip действует как front end для лучшей обработки зависимостей.)

Другой ключевой вопрос - подготовка чистой среды с известным набором пакетов для обеих сред. Virtualenv Python - просто находка в этом отношении, позволяющая вам настроить полностью индивидуальную среду Python с вашим собственным выбором пакетов, не требуя root-доступа, пакетов ОС (rpm или dpkg), и не будучи ограниченным пакетами и их версиями, которые установлены в вашем дистрибутиве.

Наконец, одним из раздражающих недостатков является сложность создания скриптов командной строки, которые хорошо работают с PYTHON_PATH. С этим довольно элегантно справляется setuptools.

Настройка

(Чтобы не усложнять ситуацию, здесь даны довольно подробные указания. Не стесняйтесь отклоняться от них по мере необходимости.)

  1. Подготовьте рабочий каталог, в котором ваши Python-материалы смогут стать домом.
  2. Возьмите последнюю версию virtualenv из нижней части этой страницы и распакуйте ее (неважно, где).
  3. Из рабочего каталога создайте новое виртуальное окружение Python:

    $ python /virtualenv.py venv
    
  4. Вы захотите выполнять большую часть своей работы из этой виртуальной среды. Для этого используйте эту команду (. - это сокращение для source):

    $ . venv/bin/activate
    
  5. Установите pip:

    $ easy_install pip
    
  6. Создайте каталоги для каждого устанавливаемого пакета, который вы хотите создать.

  7. В каждой директории вам понадобится setup.py, определяющий содержимое и структуру пакета. Документация setuptools documentation - очень хороший ресурс для начала работы. Стоит потратить время на изучение больших ее частей.

Разработка

Когда ваша древовидная структура готова, вы почти готовы приступить к кодированию. Но сейчас пакеты, зависящие друг от друга, не видят друг друга так, как они будут видеться в развернутой среде. Эта проблема решается с помощью маленькой хитрости, которую предлагает setuptools и которую использует pip. Для каждого пакета, который вы разрабатываете, выполните следующую команду (убедитесь, что вы находитесь в виртуальной среде вашего проекта, как указано в шаге 3 выше):

$ pip install -e pkg1

Эта команда установит pkg1 в вашу виртуальную среду, причем без копирования каких-либо файлов. Она просто добавляет ссылку в каталог site-packages, указывающую на корень разработки пакета, и создает каталог egg-info в этом корне. Вы также можете сделать это без pip, следующим образом:

$ cd pkg1
$ python setup.py develop

И это обычно работает, но если у вас есть сторонние зависимости (которые должны быть указаны в setup.py, как объясняется здесь в документации по setuptools), pip будет умнее в их поиске.

Одна оговорка: ни setuptools, ни pip не умеют находить зависимости среди ваших собственных пакетов. Если PkgB в каталоге B зависит от PkgA в каталоге A, то pip install -e B потерпит неудачу, потому что pip не знает, что PkgA можно найти в каталоге A; вместо этого он попытается загрузить PkgA из его онлайн-репозитория. Обходной путь - просто установить каждый пакет после его зависимостей.

На этом этапе вы можете запустить python, загрузить один из ваших модулей и начать с ним возиться. Вы можете редактировать код, и он будет сразу же доступен при следующем импорте.

Наконец, если вы хотите создать инструменты командной строки с вашими пакетами. Не пишите их вручную. В итоге вы получите ужасный беспорядок из хаков PYTHON_PATH, который никогда не будет работать должным образом. Просто прочитайте о автоматическом создании скриптов в документации по setuptools. Это избавит вас от многих проблем.

Развертывание

Когда ваши пакеты готовы к работе, вы можете использовать setup.py для создания пакетов развертывания. Здесь слишком много вариантов, но следующие должны помочь вам начать:

$ cd pkg1
$ python setup.py --help
$ python setup.py --help-commands

Свободные концы

Из-за широкой природы вопроса этот ответ будет неполным. Я не рассматривал долго работающие серверы, веб-фреймворки и сам процесс установки (в частности, использование --index-url в pip install для управления частным репозиторием сторонних и внутренних пакетов и -e vcs+.... , который будет извлекать пакеты из svn, git, hg или bzr). Но я надеюсь, что дал вам достаточно веревки, чтобы связать все это вместе (только не повесьтесь на ней:-).

23
ответ дан 29 November 2019 в 20:55
поделиться

Я работаю над реализацией этого для наших рабочих проектов. Здесь задействовано несколько разных частей.

Во-первых, мы настраиваем virtualenv.py, используя их возможности начальной загрузки, чтобы добавить ваши собственные пользовательские функции и флаги после создания. Это позволяет нам определять общие типы проектов, а также дает нам единую команду для создания нового виртуального сервера, извлечения проекта из репозитория git и установки любых требований в виртуальный сервер с помощью файлов pip и requirements.txt .

поэтому наши команды выглядят так: python venv.py --no-site-packages -g $ git_proj -t $ tag_num $ venv_dir

http://pypi.python.org/pypi/ virtualenv http://pip.openplans.org/

Теперь мы проводим первоначальную проверку существующего проекта. По мере работы и обновления проекта мы используем команды структуры в каждом проекте для создания выпусков, а затем для их развертывания:

http://docs.fabfile.org/0.9.0/

У меня есть потрясающая команда : make_tag, который проверяет наличие неиспользуемых коммитов, открывает файлы, которым необходимо обновить строки версии, строит и загружает документы sphinx, а затем фиксирует последний тег в репозитории.

Обратной стороной является команда fab deploy, которая через ssh выполняет git co указанного тега, запускает обновление pip для любых новых требований, выполняет любые необходимые миграции базы данных, а затем сбрасывает веб-сервер, если это необходимо. веб-приложение.

Вот пример функции тегов: http://www.google.com/codesearch/p?hl=en#9tLIXCbI4vU/fabfile.py&q=fabfile.py%20git%20tag_new_version&sa = N & cd = 1 & ct = rc & l = 143

Есть масса хороших файлов структуры, которые вы можете просмотреть с помощью поиска по коду Google.Я знаю, что несколько обманул для себя.

Это определенно сложно и состоит из нескольких частей, чтобы все работало гладко. Однако, как только вы его запустите, гибкость и скорость работы просто потрясающие.

5
ответ дан 29 November 2019 в 20:55
поделиться

Посмотрите на Buildout для воспроизводимых развертываний.

2
ответ дан 29 November 2019 в 20:55
поделиться

Еще один голос за fabric (еще не пробовал Buildout). Мы успешно используем его уже несколько месяцев.

Если у вас проблемы с тканью, другой вариант - Capistrano. Работает отлично (даже для приложений без rails). Перестал использовать его только потому, что мне кажется странным использовать Ruby для развертывания приложений на Python ;)

0
ответ дан 29 November 2019 в 20:55
поделиться

Это действительно несложно. Вам нужно играть в основном с buildout и supervisord IMO.

Хотя изучение buildout может занять немного времени, но оно того стоит, учитывая количество боли, которую он уменьшает при повторных настройках.

О nohup: подход nohup не подходит для серьезных развертываний. У меня очень хороший опыт работы с supervisord. Это отличное решение для запуска производственных python-приложений. Его очень легко настроить.

Некоторые конкретные ответы ниже.

  1. одна команда для развертывания: Buildout - это решение. Мы используем его уже несколько лет без особых проблем
  2. Обычно это выглядит так: вы проверяете исходники. Затем запускаете buildout. Далее, возможно, это не очень хорошая идея - позволить установке копироваться в пакеты сайта. Лучше держать окружения отдельно.
  3. Конфиги не будут перезаписаны.
  4. Вы можете/должны рассмотреть возможность создания яиц (яиц) для общих пакетов. Например, вы можете создать яйцо для пакета (скажем, commonlib) и загрузить его в свой репозиторий кода. Затем вы можете указать это как зависимость в buildout.cfg
  5. Buildout способен собирать большинство необходимых пакетов полностью отдельно от центральной установки/установки верхнего уровня. Однако, по моему опыту, пакеты python с расширением c, если они установлены как пакеты ОС, намного проще.
6
ответ дан 29 November 2019 в 20:55
поделиться

Я бы использовал rsync для внешней синхронизации с вашего производственного «основного» сервера на другие и с вашей «бета-тестовой» платформы на производственный «основной» сервер.

rsync имеет преимущество копирования только тех файлов, которые изменились, и копирования только частей файлов, которые изменились частично, и проверки целостности и идентичности содержимого в конце на всех машинах. Обновление, которое выполняется частично и прерывается, можно легко продолжить позже, что сделает ваше развертывание более надежным.

Subversion или Mercurial в этом случае тоже были бы неплохой идеей. У Mercurial есть преимущество в том, что вы можете "тянуть" или "проталкивать" вместо простого обновления из одного центрального источника. Вы можете найти интересные случаи, когда децентрализованная модель (ртутная) работает лучше.

0
ответ дан 29 November 2019 в 20:55
поделиться

если вы специалист по наращиванию, то вам следует знать о возможности minitage.recipe.scripts создать файл для настройки вашего питона. среда. Исходный код для вашего веб-сервера, и ваша сборка полностью переносима.

0
ответ дан 29 November 2019 в 20:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: