web-dev-qa-db-ja.com

Puppetでアプリケーション(.tar.gz内)をデプロイする方法は?

私はPuppetの初心者ですが、Puppetでアプリケーションをデプロイするための正しい方法にいるかどうか知りたいのですが。

アプリケーションは、バージョン番号が記載されたファイルを含むtar.gzファイルにあります。したがって、私はこれをデプロイするために実行します(サーバーに移動し、クライアントを再起動して新しいtarballを取得します)。

nodes.pp

node 'server1.domain.com' inherits basenode {
    apps { apps:
            version => 56,
            apps_name => "apps_tarball.tgz",
    }


init.pp (modules)

exec {"apps_wget":
            command => "/usr/bin/wget http://web_server/${version}-${apps_name} -O /tmp/${container_Zip_name}",
            unless  => "test -f /tmp/${version}-${apps_name}",
            require => [ Package["wget"] ],
    }

exec {"apps_unzip":
            cwd     => "/usr/local/apps/path",
            command => "/usr/bin/unzip /tmp/${version}-${apps_name}",
            unless  => "test -f /usr/local/apps/path/apps-version-${version}",
            require => [ Package["unzip"], Exec["container_wget"] ],
    }

しかし、アップグレードしたいときに、Puppetに古いディレクトリを削除するように言うのがわかりませんか?たとえば、バージョン56を57にアップグレードする場合:56のバージョンディレクトリを削除する必要があります。

Capristranoについて聞いたところ、パッケージを管理し、構成ファイルを作成し、Capristranoを使用してアプリをデプロイするためにPuppetを使用する方が良いようですね。

ありがとう。

11
Richy

Puppetでアプリケーションをデプロイする正しい方法にいるかどうか知りたいのですが。

いいえ、違います。

オペレーティングシステムで使用可能なパッケージ管理を使用する必要があります。ソフトウェアがtar.gz形式の場合は、.deb.rpmなどとしてローカルに再パッケージする必要があります。

ソフトウェアがローカルで開発されたものである場合は、そのソフトウェアで使用可能なビルド/デプロイツールを使用する必要があります。

0

fpm を使用してtarballのRPMまたはDEBを作成してみてください。使い方はとても簡単で、パッケージのフォーマットについて、理解したくないものは何も理解する必要はありません。

元の質問に答えるために、Puppetを使用してアプリケーションをデプロイする正しい方法は、Puppetができる限り機能しないようにすることです。 tarballをダウンロードして抽出する複雑なexecリソースは非常に非常に壊れやすく、Puppetをyum installパッケージは長期的に見てより健康的です。

13
Handyman5

私はアプリをRPMまたは.debパッケージとしてバンドルし、パッケージを保持するためにyumまたはaptリポジトリを構築するために非常に一生懸命に努力します。ディレクトリに開いているtarballまたはZipのパッケージ化は非常に簡単です(ただし、別の質問になります)。この方法で利用できるパッケージは、バージョンを適切に追跡し、tarballを開いただけではうまく処理できないあらゆる種類のことを処理します。

本当に適切なパッケージを構築できなかった場合、次のようにします。

nodes.pp:

node 'server1.domain.com' inherits basenode {
    apps { apps:
            version    => 56,
            oldversion => 55,
            apps_name  => "apps_tarball.tgz",
    }

init.pp(モジュール):

file {
   [ "/usr/local/apps/path/apps-version-${oldversion}", "/tmp/${oldversion}-${apps_name}" ]:
            recurse => true,
            ensure  => absent;
}
exec {
      "apps_wget_${apps_name}":
            command   => "/usr/bin/wget http://web_server/${version}-${apps_name} -O /tmp/${container_Zip_name}",
            logoutput => on_failure,
            creates   => "/tmp/${version}-${apps_name}",
            require   => [ Package["wget"] ];

      "apps_unzip_${apps_name}":
            cwd     => "/usr/local/apps/path",
            command => "/usr/bin/unzip /tmp/${version}-${apps_name}",
            creates => "/usr/local/apps/path/apps-version-${version}",
            require => [ Package["unzip"], Exec["container_wget"], Exec["apps_wget_${apps_name}] ];
}

別の選択肢は、次のような再帰的な人形リソースを単に使用することです:

file {
    "/usr/local/apps/path/":
      source => "puppet:///modules/modulename/apps/path",
      ensure => directory,
      replace => true,
      purge   => true,
      recurse => true;
}

(パペットマスターですでに正しく解凍されている場合。おそらく、サービスを実行しているパッケージも必要であり、実行されているサービスを通知します)。

6
freiheit

私は確かにtarball(RPMなど)のパッケージ化を好みますが、いくつかのヒント:

古いバージョンを削除するには、インストールしているバージョン以外のすべてのバージョンを削除するだけです。最近十分なbashとextglobが有効になっていると、rm -r /usr/local/apps/path/apps-version-!(${version})を実行できます。設定ファイルなどを一掃することに注意してください。インストールexecからexecrefreshonly => trueを作成し、次にnotifyを作成できます。

unless => 'test -f ...'の代わりにcreates属性を使用できます。しかし、より理解しやすい。

0
chutz
file { "/usr/local/apps/path/apps-version-${old-version}":
    ensure => absent
}

余談ですが、幹部としてすべてを行うのは少し醜く、状況が悪化し始めたときにトラブルシューティングするのが難しい場合があります。可能であれば、抽出されたバージョンのアプリファイルをパペットサーバーに保存し、再帰的なfileリソースを使用して取得しますか?

0
Shane Madden