Подтвердить что ты не робот

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

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

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

  • Мы должны запустить одну простую команду, чтобы развернуть обновленную версию приложения. (Если начальное развертывание требует немного дополнительной сложности, это прекрасно.)
  • Когда мы запускаем эту команду, она должна скопировать определенные файлы, либо из репозитория Subversion, либо из локальной рабочей копии, в указанную "среду" на сервере, что, вероятно, означает другой virtualenv. У нас есть как промежуточная, так и производственная версия приложений на одном сервере, поэтому их нужно как-то сохранить отдельно. Если он устанавливает в site-пакеты, это тоже хорошо, если это работает.
  • У нас есть некоторые файлы конфигурации на сервере, которые должны быть сохранены (т.е. не перезаписаны или не удалены процессом развертывания).
  • Некоторые из этих приложений импортируют модули из других приложений, поэтому они должны иметь возможность ссылаться друг на друга как пакеты как-то. Это та часть, с которой у нас были самые проблемы! Меня не волнует, работает ли он через относительный импорт, сайт-пакеты или что-то еще, если он надежно работает как в разработке, так и в производстве.
  • В идеале процесс развертывания должен автоматически устанавливать внешние пакеты, от которых зависят наши приложения (например, psycopg2).

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

4b9b3361

Ответ 1

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

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

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

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

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

Настройка

(Чтобы все было просто, это довольно предписывающее. Не стесняйтесь расходиться по мере необходимости.)

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

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

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

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

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

Разработка

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

$ pip install -e pkg1

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

$ cd pkg1
$ python setup.py develop

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

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

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

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

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

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

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

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

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

Ответ 2

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

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

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

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

  • единственная команда для развертывания: Buildout - это ответ. Мы используем его с двух лет с небольшим количеством проблем.
  • Обычно это как вы проверяете источник. Затем запустите buildout. Кроме того, может быть нецелесообразно, чтобы установка была скопирована в пакеты сайта. Лучше сохранить среду отдельно.
  • Конфигурации не будут перезаписаны.
  • Вы можете/должны рассмотреть возможность создания яйца (ов) для общих пакетов. Как вы можете построить яйцо для пакета (например, commonlib) и загрузить его в свой репозиторий кода. Затем вы можете указать это как зависимость в файле buildout.cfg
  • Buildout способен создавать наиболее важные пакеты, полностью отделенные от установки центрального/верхнего уровня. Однако, по моему опыту, пакеты python с расширением c, если они были установлены как пакеты ОС, намного проще.

Ответ 3

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

Во-первых, мы настраиваем virtualenv.py с помощью своих способностей к загрузке, чтобы добавлять в ваши собственные пользовательские функции и флаги после создания. Это позволяет нам определять общие типы проектов, а также дает нам единую команду для создания нового виртуального сервера, проверки проекта из репозитория git и установки любых требований в virtualenv с помощью pip и требований. 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/

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

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

Вот пример функции тегирования: 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. Я знаю, что я обманывал несколько для моего собственного использования.

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

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

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

Ответ 7

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

Ответ 8

Похоже, что вы хотите построить script. Поэтому напишите один, используя shell, python, ant или ваш любимый инструмент сборки. Если вам не нравится писать в XML, pant позволяет писать скрипты ant в python. Несколько человек упомянули buildout, но у меня нет опыта с ним.

Сначала определите свои шаги. Похоже, вы хотите:

  • Экспорт SVN из вашего производственного тега (вы не хотите иметь рабочую копию в prod)
  • установить virtualenv
  • easy_install или pip установить необходимые пакеты (или, возможно, использовать предварительно загруженные и протестированные версии)
  • скопируйте файлы конфигурации производства в вашу целевую аудиторию (не рекомендуется хранить эту информацию в исходном репо - хотя вы могли бы их развернуть отдельно)
  • перезагрузите сервер и выполните любую другую задачу настройки
  • запустить тесты дыма и откатить при отказе

Если вы выполняете балансировку нагрузки или в зависимости от производства других сервисов, вам может понадобиться определить способ распространения ограниченного объема, поэтому все ваши клиенты не будут затронуты сразу. Если у вас есть производственная среда, которая также может удовлетворить эту потребность.