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 を使用してこの問題を解決する 1 つの方法を次に示します。まず、依存関係の管理について説明します。これは、アプリケーションのインスタンスがいくつ管理されているかに関係なく、依存関係の管理は 1 回だけ行う必要があるためです。次に、Puppet で定義されたリソース タイプとリソース タイプを使用して、アプリの複数のインストールを処理する方法について説明しますvcsrepo

まず、同じアプリの複数のインストールを処理するためのパペット コードの編成についてです。あなたが言及したbeanstalkd、solr、PHP拡張機能などの依存関係は、Puppetクラスを使用してモデル化する必要があります。このクラスは、ノードで管理されているアプリケーションのコピーの数に関係なく、構成カタログに 1 回だけ含まれます。このクラスの例は次のようになります。

# <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 からこの情報を表示できるようにするための、すぐに使用できる簡単な方法は現在のところありません。ただし、External Node Classifier API を使用することは確かに可能です。外部データを Puppet に取り込む方法の詳細については、次のリソースを参照してください。

この情報がお役に立てば幸いです。

于 2012-01-12T20:56:00.907 に答える