Worker Role で Powershell スクリプトを実行する

更新日:

Worker Role で Powershell スクリプトを実行する方法について書かれていた記事があったので紹介します。

http://www.gine.jp/blog/kusa/post/Worker-Role-e381a6-Powershell-e382b9e382afe383aae38395e38388e38292e5ae9fe8a18ce38199e3828b.aspx

以下、上記URLから本文を引用して紹介します。

Windows Azure Code Sample で Powershell を動かすためのサンプルが公開されています。
http://code.msdn.microsoft.com/windowsazuresamples

今回は、このサンプルをビルドするまでに発生したエラーの回避方法と、サンプルを参考に Web Role は使用せずに Worker Role で Powershellスクリプトを実行させ、結果を Windows Azure トレースログに出力するまでの部分を確認してみます。

■サンプルのビルド
1:上記MSDNでダウンロードしたファイルを解凍します。
2:解凍したフォルダの中にある「PowershellRole.sln」を Visual Studio で開きます。
3:このままビルドすると、下図のように「指定したパス、ファイル名のどちらか一方、または両方が長すぎます。完全修飾ファイル名は 260 文字未満、ディレクトリ名は 248 文字未満にする必要があります。 」と表示されますので、ユーザー変数を使って回避します。
201093_13225_984

4:「システムのプロパティ」から「環境変数」で、ユーザーの環境変数の「新規」を選択します。
2010913_173533_1000

5:新しいユーザー変数として、下図の様に設定します。
※変数名は「_CSRUN_STATE_DIRECTORY」とし、変数値のパスは各自の環境に合わせてください。
201093_131535_983

6:コレでサンプルをビルドすることが出来ます。 

■Worker Role での Powershell 実行とトレースログ出力
1:「Worker Role」を選択してプロジェクトを作成します。
2:Windows Azure Code Sample でダウンロードして回答したフォルダの中にある、「PowershellRole.Common.dll」を参照設定に追加します。
3:WorkerRole.cs に、実行させるスクリプトとトレースログ出力設定をします。

 

[csharp]
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Threading;
using Microsoft.Samples.PowershellRole.Common;
using Microsoft.WindowsAzure.Diagnostics;
using Microsoft.WindowsAzure.ServiceRuntime;

namespace WorkerRole1
{
public class WorkerRole : PowershellRole
{
public WorkerRole() : base(string.Empty){ }

protected override bool ShouldRecycle()
{
Thread.Sleep(1000);
return true;
}

public override void Run()
{
string script = "gwmi Win32_OperatingSystem | select SystemDirectory, Organization, BuildNumber, Name, Version";

while (true)
{
string result = string.Empty;
using (var psrun = new PowershellRunspace())
{
result = psrun.RunScript(script);
}

Thread.Sleep(1000);
if(!string.IsNullOrEmpty(result))
{
System.Diagnostics.Trace.WriteLine(result, "Information");
}
}
}

public override bool OnStart()
{
// トレースログの出力設定
var config = DiagnosticMonitor.GetDefaultInitialConfiguration();
config.Logs.ScheduledTransferPeriod = System.TimeSpan.FromSeconds(20);
config.Logs.ScheduledTransferLogLevelFilter = LogLevel.Undefined;

DiagnosticMonitor.Start("DiagnosticsConnectionString", config);

RoleEnvironment.Changing += RoleEnvironmentChanging;

return base.OnStart();
}

private void RoleEnvironmentChanging(object sender, RoleEnvironmentChangingEventArgs e)
{
if (e.Changes.Any(change => change is RoleEnvironmentConfigurationSettingChange))
{
e.Cancel = true;
}
}
}
}
[/csharp]

 

■結果
2010915_222337_1003

-Blog

Copyright© fullvirtue.com プロダクトオーナー支援スペシャリストのBlog , 2024 All Rights Reserved.