9

この質問は特に Azure Virtual Machines に関連するものではないかもしれませんが、Azure が Amazon EC2 よりも簡単にこれを行う方法を提供してくれることを願っています。

複数の Azure 仮想マシン (つまり、Azure Web サイトまたは [Paas] ロールではない) で実行されている長期実行アプリがあります。これらは単純なコンソール アプリ/Windows サービスです。時折、コードの更新を行い、これらのプロセスを停止し、コード/バイナリを更新してから、これらのプロセスを再起動する必要があります。

過去に、PSTools ( psexec ) を使用してこれをリモートで実行しようとしましたが、そのようなハックのようです。アプリをリモートで強制終了し、展開を更新して、アプリを再起動するより良い方法はありますか?

理想的には、Visual Studio 内から、Azure Web サイトであるかのようにコードを展開できる " Publish Console App " に相当するものがあるでしょうが、それは不可能だと思います。

ご提案いただきありがとうございます。

4

3 に答える 3

4

タスクを実行するための「正しい」方法はいくつかあります。

WindowsAzureアプリケーションを実行している場合-MSDNに簡単なガイドがあります。ただし、通常のコンソールアプリでこれを行う必要がある場合は、問題があります。

Microsoftのやり方は、WMIを使用することです。これは、リモートWindowsサーバーのあらゆる種類の管理者にとって優れたテクノロジです。WMIはあなたの目的には問題ないと思います。

そして最後の方法:すべてのAzure VMにGitをインストールし、5分ごとに実行するようにスケジュールされた単純なサーバー側スクリプトを記述して、リポジトリからコードを更新し、ビルドし、古いプロセスを強制終了し、新しいプロセスを開始します。更新をリポジトリに公開します。これですべてです。間違いなくハックしますが、Windows以外のマシンでも機能します。

于 2012-07-12T16:02:32.233 に答える
3

一般的なパターンの 1 つは、コマンド ライン アプリなどのアイテムを Windows Azure Blob ストレージに格納することです。私はこれを頻繁に行います (たとえば、すべての MongoDB バイナリを、バージョンごとに 1 つの zip を使用して、zip で圧縮されたブロブに保存します #)。VM の起動時に、BLOB からローカル ディスクに zip をダウンロードし、ローカル フォルダーに解凍し、mongod.exe プロセスを開始するタスクがあります (これは、他のコンソール アプリにも同様に当てはまります)。より複雑なインストールを行う場合は、MSI またはその他のタイプの自動インストーラーを取得する必要があります。これらのアプリを Blob Storage に保存することの 2 つの良い点は、次のとおりです。

  • 展開パッケージ サイズの縮小
  • クラウド アプリの 1 つのコンポーネントを変更するためだけに、クラウド アプリ全体を再デプロイする必要はもうありません

コンソール アプリを更新する場合: 新しいバージョンを BLOB ストレージにアップロードできます。これで、VM を更新するように通知する方法がいくつかあります。例えば:

  • 構成ファイルを変更します (アプリ名とバージョン番号を参照するキーと値のペアがある可能性があります)。これが変更されると、web/worker ロールでイベントを処理できるようになり、コードが適切なアクションを実行できるようになります。このアクションは、exe を停止し、blob から新しいものを取得して、再起動することができます。または...それよりも複雑な場合は、VM インスタンスを単純に再起動させて、メモリ/一時ファイルなどをクリアすることもできます。そしてすべてをきれいに始めます。
  • アプリを更新するためのある種のコマンドを自分自身に送信します。「ソフトウェア更新」トピックには複数のサブスクライバーを含めることができるため、これを行うには Service Bus キューを使用する可能性があります。各インスタンスはキューにサブスクライブし、更新メッセージが表示されたときにそれを適切に処理できます (メッセージには、構成内のキーと値のペアのように、アプリ名とバージョン番号が含まれている場合があります)。これには Windows Azure Storage キューを使用することもできますが、その場合はおそらくインスタンスごとに 1 つのキューが必要になります (私はこれが好きではありません)。
  • コマンドを更新するために、ロール インスタンスがリッスンする何らかのタイプの wcf サービスを作成します。Windows Azure キューと同じ問題: Web/ワーカー ロールのすべてのインスタンスに同じメッセージをプッシュする方法を見つける必要があります。

これらはすべて、スタンドアロンの exe (または xcopy で展開可能な exe) に適用されます。管理者レベルのアクセス許可を必要とする MSI の場合、これらは起動スクリプトを介して実行する必要があります。この場合、(上記のように) ロール インスタンスによって処理される構成変更イベントを持つことができますが、インスタンスを再起動するだけで、起動スクリプトを介して MSI を実行できるようになります。

于 2012-07-12T17:45:57.730 に答える