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


11

私は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を使用する方が良いようですね。

ありがとう。


私はモジュールforge.puppetlabs.comを使用して、tarballとしてのみ利用可能なもののダウンロード/解凍/配置を管理します。それは素晴らしい作品です。
jrjohnson 2014

回答:


0

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

いいえ、違います。

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

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


10
完璧な世界では、管理者は時間をかけてtarballからパッケージを作成します。現実の世界では、私の経験では、これは起こらないことが示されています。私たちのクライアントはtarballから多くのアプリケーション、時には非常に大きなアプリケーションをインストールし、これを変更するつもりはありません。
EmmEff 2015年

4
@EmmEffそれは完璧な世界と現実の世界の違いではありません。これは、「古い方法に固執していて、自動構成管理の準備ができていない」場所と構成管理が機能する場所の違いです。私は両方を見ました-そして、管理者の変更で後者が前者に変わることさえ見ました。
ダニエルC.ソブラル2015年

5
あなたには自分の意見を述べる権利があります。実世界での私の観察はそれとは異なります。
EmmEff、2015

13

あなたは使用してしようとする場合がありますFPMを RPMのか、あなたのtarボールののDEBを作成します。使い方は本当に簡単で、望まないパッケージ形式について何も理解する必要はありません。

元の質問に答えるために、Puppetを使用してアプリケーションをデプロイする正しい方法は、Puppetの動作をできるだけ少なくすることです。exectarballをダウンロードして抽出する複雑なリソースは非常に脆弱であり、Puppetを単なるyum installパッケージにすることは長期的にはより健全です。


私は自分がやっていることが非常に間違っていることを知っていました。しかし、rpmの構築はいつも私を怖がらせてきました。fpmは私の救いです。Handyman5に感謝します。ええ。
8None1

素晴らしいコメント。「use rpm」を説教するのではなく、単純な「偽のrpmを使用し、この単純なツールを使用してそれを達成する」ことを提供しました。
アンドレデミランダ

6

私はアプリを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;
}

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


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

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


0

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.