Назад | Перейти на главную страницу

развертывание кода Python с помощью Puppet

Я пытаюсь реализовать систему развертывания для своего веб-приложения на основе 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.