2012-01-09 8 views
6

私は、PHP、MySQLなどで書かれたアプリを持っています。このアプリはbeanstalkd、Solr、PHP拡張などいくつかの依存関係があります。私のアプリの複数インストール - どのように対処するのですか

お客様ごとに、他の顧客と共有されているサーバーまたはその顧客のみのサーバーに、個別にアプリをインストールしています。

今のところ、新しい顧客をブートストラップするためのPuppetスクリプトを使用しています。変更するたびに手動でgit pull、dbの更新などの作業を行います。

私たちが探していることは本当に可能な限り、以下の機能の多くを持っているツールです。私たちはすべての顧客とその現在のリビジョンにブートストラップする

  • 能力を確認することができます

    1. Webインターフェイス私たちは、新しいサーバをブートストラップするためのツールを探していない新規インストール
    2. 特定のリビジョンに既存のインストールを更新する機能やブランチ

    - 我々はまだそれを手動で行います。代わりに、既存のサーバー上でクライアントの設定を自動化する方法を探しています。

    シェフやパペットがこれに十分であれば、もっと適したツールがあるのでしょうか、あるいは自分で何かを動かすことをお勧めしますか?

  • 答えて

    10

    私は、Puppet LabsのPuppetで働く常勤の開発者です。私はPro Puppetの共著者でもあります。

    あなたの目標には確かに人形は十分です。 Puppetを使用してこの問題を解決する1つの方法があります。まず、アプリケーションのインスタンス数を管理しているかどうかにかかわらず、これらの管理は一度だけ行う必要があるため、依存関係管理について説明します。次に、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'], 
        } 
    } 
    

    :このクラスの例のようなものかもしれません。これは、通常、Webインターフェイスを使用している場合、site.ppファイルまたはパペットダッシュボードで発生します。

    # $(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を使用することは確かに可能です。人形に外部データを引っ張っての詳細については、これらのリソースを参照してください。

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

    +0

    私は非常に似たようなことをしようとしていますが、ファクトリパターンインターフェイスを使用していますが、インスタンス間で共有されているディレクトリを扱う時間がとてもあります。@ http://serverfault.com/questions/ 442520/puppet-possible-to-use-software-design-in-modules –

    関連する問題