6

我有一个用 PHP、MySQL 等编写的应用程序。该应用程序有一些依赖项,例如 beanstalkd、Solr 和一些 PHP 扩展。

对于每个客户,我们都有单独的应用程序安装,可以在与其他客户共享的服务器上,也可以在仅与该客户共享的服务器上。

现在我们使用 Puppet 脚本来引导新客户,然后我们手动转到每个客户进行 git pull、更新数据库等,只要有变化。

我们正在寻找的是真正具有尽可能多的以下功能的工具:

  1. 允许我们查看所有客户及其当前版本的 Web 界面
  2. 能够引导新安装
  3. 能够将现有安装更新到特定版本或分支

我们不是在寻找引导新服务器的工具——我们仍然手动进行。相反,我们正在寻找一种在现有服务器上自动设置客户端的方法。

Chef 或 Puppet 是否足以满足此要求,是否有更合适的工具,或者您会建议自己滚动一些东西吗?

4

1 回答 1

10

我是 Puppet Labs 的 Puppet 的全职开发人员。我也是 Pro Puppet 的合著者。

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如果您使用的是 Web 界面,这通常发生在文件或 Puppet 仪表板中。

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

接下来,您需要一种在系统上声明应用程序的多个实例的方法。不幸的是,目前还没有一种简单的方法可以从 Web 界面执行此操作,但可以使用 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' }
}

不幸的是,目前还没有一种易于使用的开箱即用方式来使这些信息从 Web GUI 中可见。但是,当然可以使用外部节点分类器 API。有关将外部数据拉入 Puppet 的更多信息,请参阅以下资源:

希望这些信息有所帮助。

于 2012-01-12T20:56:00.907 回答