Несколько установок моего приложения - как мне с этим справиться - PullRequest
6 голосов
/ 10 января 2012

У меня есть приложение, написанное на PHP, MySQL и т. Д. Приложение имеет несколько зависимостей, таких как beanstalkd, Solr и несколько расширений PHP.

Для каждого клиента у нас есть отдельная установка приложения,либо на сервере, доступном для других клиентов, либо на сервере, где есть только этот клиент.

На данный момент мы используем сценарий Puppet для начальной загрузки новых клиентов, а затем вручную обращаемся к каждому клиенту, чтобы выполнить git pull,обновлять БД и т. д. всякий раз, когда что-то меняется.

То, что мы ищем, - это действительно инструмент, который имеет максимально возможное количество следующих функций:

  1. Веб-интерфейс, которыйпозволяет нам видеть всех клиентов и их текущую версию
  2. Возможность загрузки новых установок
  3. Возможность обновления существующих установок до определенной ревизии или ветви

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

Будет ли для этого достаточно Chef или Puppet, есть ли более подходящий инструмент, или вы бы порекомендовали что-то самостоятельно?

1 Ответ

10 голосов
/ 13 января 2012

Я полный рабочий день, работаю над Puppet в Puppet Labs. Я также соавтор Pro Puppet.

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

Во-первых, относительно организации кода марионетки для обработки нескольких установок одного и того же приложения. Упомянутые вами зависимости, такие как beanstalkd, solr и расширения PHP, должны быть смоделированы с использованием класса Puppet. Этот класс будет включен в каталог конфигурации только один раз, независимо от того, сколько копий приложения управляется на узле. Примером этого класса может быть что-то вроде:

# <modulepath>/site/manifests/app_dependencies.pp
class site::app_dependencies {
  # Make all package resources in this class default to
  # being managed as installed on the node
  Package { ensure => installed }
  # Now manage the dependencies
  package { 'php': }
  package { 'solr': }
  package { 'beanstalk': }
  # The beanstalk worker queue service needs to be running
  service { 'beanstalkd':
    ensure  => running,
    require => Package['beanstalk'],
  }
}

Теперь, когда у вас есть зависимости в классе, вы можете просто включить этот класс в узлы, где будет развернуто ваше приложение. Обычно это происходит в файле site.pp или на панели инструментов Puppet, если вы используете веб-интерфейс.

# $(puppet config print confdir)/manifests/site.pp
node www01 {
  include site::app_dependencies
}

Далее вам нужен способ объявления нескольких экземпляров приложения в системе. К сожалению, сейчас нет простого способа сделать это из веб-интерфейса, но это возможно, используя манифесты Puppet и определенный тип ресурса. Это решение использует ресурс vcsrepo для управления извлечением git-репозитория для приложения.

# <modulepath>/myapp/manifests/instance.pp
define myapp::instance($git_rev='master') {
  # Resource defaults.  The owner and group might be the web
  # service account instead of the root account.
  File {
    owner => 0,
    group => 0,
    mode  => 0644,
  }
  # Create a directory for the app.  The resource title will be copied
  # into the $name variable when this resource is declared in Puppet
  file { "/var/lib/myapp/${name}":
    ensure => directory
  }
  # Check out the GIT repository at a specific version
  vcsrepo { "/var/lib/myapp/${name}/working_copy":
    ensure   => present,
    provider => git,
    source   => 'git://github.com/puppetlabs/facter.git',
    revision => $git_rev,
  }
}

С этим определенным типом ресурса вы можете объявить несколько установок вашего приложения следующим образом:

# $(puppet config print confdir)/manifests/site.pp
node www01 {
  include site::app_dependencies
  # Our app instances always need their dependencies to be managed first.
  Myapp::Instance { require => Class['site::app_dependencies'] }

  # Multiple instances of the application
  myapp::instance { 'jeff.acme.com': git_rev => 'tags/1.0.0' }
  myapp::instance { 'josh.acme.com': git_rev => 'tags/1.0.2' }
  myapp::instance { 'luke.acme.com': git_rev => 'tags/1.1.0' }
  myapp::instance { 'teyo.acme.com': git_rev => 'master' }
}

К сожалению, в настоящее время нет простого в использовании способа сделать эту информацию видимой из веб-интерфейса. Однако это, безусловно, возможно сделать с помощью API Class Node Classifier. Для получения дополнительной информации о добавлении внешних данных в Puppet, пожалуйста, обратитесь к следующим ресурсам:

Надеюсь, эта информация поможет.

...