Я пытаюсь реализовать систему развертывания для своего веб-приложения на основе Puppet.
Приложение состоит из нескольких сервисов (пара веб-серверов: на Django и Tornado и рабочий на базе Celery). Они живут в разных git
репозитории, размещенные на github.
Я использовал Chef для своих предыдущих проектов. В случае Chef развернуть такую штуку было бы легко: я бы просто использовал git
ресурс для проверки необходимого кода для этого конкретного узла и настройки всего остального.
Однако я не понимаю, как это делается в Puppet. Я не нашел git
введите документацию. Я пробовал погуглить, но из того, что я обнаружил, кажется, что проверка и обновление git
код из Puppet - не обычная задача.
Ясно, что предполагаемый мной рабочий процесс несколько необычен для Puppet. Я мог бы попробовать что-нибудь еще. Каков естественный способ развертывания таких приложений с помощью Puppet?
Правда нет родного git
тип ресурса в Puppet, но я бы не назвал это «необычной задачей».
Существует множество решений, позволяющих реализовать это самостоятельно, используя define
. Мы используем git
класс, который определяет git::repository
тип ресурса вроде этого:
class git {
define repository (
$url,
$workdir=undef,
$branch=undef,
$recursive=undef,
$pull=true
) {
if $workdir {
$r_workdir = $workdir
} else {
$r_workdir = $name
}
if $branch {
$branch_arg = "--branch $branch"
}
if $recursive {
$recursive_arg = '--recursive'
}
exec { "clone-gitrepo-$name":
creates => "$r_workdir",
command => "/usr/bin/git clone $branch_arg $recursive_arg $url $r_workdir",
}
# This is here so other things can depend on
# File[/path/to/working/directory].
file { $r_workdir:
ensure => directory,
require => Exec["clone-gitrepo-$name"],
}
if $pull {
exec { "update-gitrepo-$name":
require => Exec["clone-gitrepo-$name"],
cwd => "$r_workdir",
command => '/usr/bin/git pull',
}
}
}
}
Мы используем его, например, так:
class openstack::controller::novnc {
include git
git::repository { '/opt/noVNC':
url => 'git://github.com/cloudbuilders/noVNC.git',
}
}
Он выполняет git pull
операции каждый раз при запуске Puppet, если вы не установите pull
к false
.
Обратите внимание, что я не делаю никаких заявлений относительно правильности или надежности этого решения; это то, что мы используем, и это работает для нас, но могут быть более функциональные решения.
Вы можете найти наш код онлайн Вот.
Самый быстрый способ - использовать exec:
exec { 'install abcd':
path => ['/bin', '/usr/bin'],
cwd => '/usr/local',
command => 'git clone http:/.../abcd',
creates => '/usr/local/abcd',
}
Также несложно создать собственный ресурс git, исходя из этого:
define git ($package, $source) {
exec {...}
}
Однако я думаю, что чистый способ - упаковать все программное обеспечение, которое вы используете, в пакеты (deb или yum или что-то еще, что использует ваша операционная система) и загрузить его в мастер Puppet. Затем, когда сервер устанавливается, он найдет все, что ему нужно, на мастере Puppet, вместо того, чтобы подключаться к различным репозиториям git (и репозиториям pip, и репозиториям mercurial, поскольку, если вы начнете делать этот трюк для git, вы Сделаю это и для пипса). Тогда установка будет более надежной (одно из подключений git / pip / hg может быть временно отключено или могло быть перемещено) и будет использовать меньшую пропускную способность, особенно если вы устанавливаете свое программное обеспечение на многих серверах. Если у вас нет времени на создание пакетов, создание пакетов .tar.gz является промежуточным решением. Конечно, это тоже требует времени, я знаю; Я также использую быстрый и грязный способ, когда спешу.
Я бы использовал ткань для развертывания кода Python - фактически, я делаю. Но если вам нужен только git, вот пример из моих конфигураций марионеток с использованием модуль vcsrepo:
vcsrepo { '/var/www/gitorious':
ensure => present,
owner => 'git',
source => 'git://gitorious.org/gitorious/mainline.git',
revision => 'v2.2.1',
provider => git,
}
Вообще говоря, Puppet - не лучший инструмент, если вы хотите, чтобы все было сделано в сжатые сроки. Puppetlabs решает эти задачи. MCollective, которые я использовал и не любил.
Чтобы развернуть код Python в производственной среде, вы должны сильно рассмотреть возможность использования virtualenv.
Если вы развертываете через Puppet, вам следует посмотреть на питон-марионетка модуль. Это позволяет вам организовать все, что вам может понадобиться в производственной среде Python, включая virtualenvs.