私は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を使用する方が良いようですね。
ありがとう。
Puppetでアプリケーションをデプロイする正しい方法にいるかどうか知りたいのですが。
いいえ、違います。
オペレーティングシステムで使用可能なパッケージ管理を使用する必要があります。ソフトウェアがtar.gz
形式の場合は、.deb
、.rpm
などとしてローカルに再パッケージする必要があります。
ソフトウェアがローカルで開発されたものである場合は、そのソフトウェアで使用可能なビルド/デプロイツールを使用する必要があります。
fpm を使用してtarballのRPMまたはDEBを作成してみてください。使い方はとても簡単で、パッケージのフォーマットについて、理解したくないものは何も理解する必要はありません。
元の質問に答えるために、Puppetを使用してアプリケーションをデプロイする正しい方法は、Puppetができる限り機能しないようにすることです。 tarballをダウンロードして抽出する複雑なexec
リソースは非常に非常に壊れやすく、Puppetをyum install
パッケージは長期的に見てより健康的です。
私はアプリをRPMまたは.debパッケージとしてバンドルし、パッケージを保持するためにyumまたはaptリポジトリを構築するために非常に一生懸命に努力します。ディレクトリに開いているtarballまたはZipのパッケージ化は非常に簡単です(ただし、別の質問になります)。この方法で利用できるパッケージは、バージョンを適切に追跡し、tarballを開いただけではうまく処理できないあらゆる種類のことを処理します。
本当に適切なパッケージを構築できなかった場合、次のようにします。
node 'server1.domain.com' inherits basenode {
apps { apps:
version => 56,
oldversion => 55,
apps_name => "apps_tarball.tgz",
}
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;
}
(パペットマスターですでに正しく解凍されている場合。おそらく、サービスを実行しているパッケージも必要であり、実行されているサービスを通知します)。
私は確かにtarball(RPMなど)のパッケージ化を好みますが、いくつかのヒント:
古いバージョンを削除するには、インストールしているバージョン以外のすべてのバージョンを削除するだけです。最近十分なbashとextglobが有効になっていると、rm -r /usr/local/apps/path/apps-version-!(${version})
を実行できます。設定ファイルなどを一掃することに注意してください。インストールexecからexec
refreshonly => true
を作成し、次にnotify
を作成できます。
unless => 'test -f ...'
の代わりにcreates
属性を使用できます。しかし、より理解しやすい。
file { "/usr/local/apps/path/apps-version-${old-version}":
ensure => absent
}
余談ですが、幹部としてすべてを行うのは少し醜く、状況が悪化し始めたときにトラブルシューティングするのが難しい場合があります。可能であれば、抽出されたバージョンのアプリファイルをパペットサーバーに保存し、再帰的なfile
リソースを使用して取得しますか?