我的应用程序的多个安装 - 我该如何处理它

时间:2012-01-09 20:09:14

标签: deployment automation chef puppet

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

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

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

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

  1. 允许我们查看所有客户及其当前版本的Web界面
  2. 能够引导新装置
  3. 能够将现有安装更新为特定版本或分支
  4. 我们不是在寻找引导新服务器的工具 - 我们仍然手动执行此操作。相反,我们正在寻找一种在现有服务器上自动设置客户端的方法。

    Chef或Puppet对此是否足够,是否有更合适的工具,或者您是否建议自己滚动?

1 个答案:

答案 0 :(得分:10)

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

Puppet肯定足以实现您的目标。这是使用Puppet解决这个问题的一种方法。首先,我将讨论依赖关系管理,因为这些应该只管理一次,无论管理多少个应用程序实例。然后,我将介绍如何使用Puppet中定义的资源类型和vcsrepo资源类型处理应用程序的多个安装。

首先,关于用于处理同一应用程序的多个安装的puppet代码的组织。您提到的依赖项(如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 Dashboard中。

# $(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的更多信息,请参阅以下资源:

希望这些信息有所帮助。