System Center OrchestratorのWebサービスを利用してRunbookを実行するサンプルを作ってみました。
Webサービスから実行するRunbook
今回実行するRunbookはこちらです。単純なのにしました。ここに私の名前をインプット項目として渡して実行します。
フォルダパス | \2_テスト\2.2_テストRunbooks |
---|---|
Runbook名 | TEST001 |
インプットパラメータ | 名前 |
実行したいRunbookのIDを知る
プログラムを開発する前に、上記のRunbookのIDを確認します。IDを取得するプログラムも書けるのですが、ここは簡単に以下のODataのQueryで取得してみます。
http://orchestrator:81/Orchestrator2012/Orchestrator.svc/Runbooks?$select=Id,Path,Name
出力結果からRunbookのIDが確認できました。
<!--省略--> <feed> <entry>...</entry> <entry m:etag="W/"datetime'2014-11-18T15%3A43%3A11'""> <!--省略--> <content type="application/xml"> <m:properties> <d:Id m:type="Edm.Guid">f5763354-fc7e-41d3-a574-9534071e1fbe</d:Id> <d:Name>TEST001</d:Name> <d:Path>\2_テスト\2.2_テストRunbooks\TEST001</d:Path> </m:properties> </content> </entry> </feed> <!--省略-->
プログラムの開発開始
ここからVisual Studioを使ってRunbookを実行するためのプログラムの開発を始めます。
サービス参照を追加する
まず、Visual Studioでプロジェクトを作成したら、作成したプロジェクトにサービス参照を追加します。
追加するURLは以下です。
http://orchestrator:81/Orchestrator2012/Orchestrator.svc
今回は「ServiceReferenceSco」という名前で追加しました。
サンプルコード
簡単なコンソールアプリケーションを書いてみました。
using System; using System.Linq; using System.Text; using System.Collections; using System.Data.Services.Client; using SampleApp.ServiceReferenceSco; //追加したサービス参照 namespace SampleApp { class Program { static void Main(string[] args) { //必要な情報を設定 string user = "user"; //Runbookに対する適切な操作権限のあるユーザを設定 string domain = "domain"; string password = "password"; string orchestratorHostName = "orchestrator"; string runbookGuid = "f5763354-fc7e-41d3-a574-9534071e1fbe"; //上記で入手したRunbookのID string paramName = "名前"; //Runbookのインプット項目 string paramValue = "大友佑介"; //インプット項目へ設定する文字列 //Orchestrator Web Service URLとログオン情報を指定している var context = new OrchestratorContext(new Uri(String.Format("http://{0}:81/Orchestrator2012/Orchestrator.svc",orchestratorHostName))); context.Credentials = new System.Net.NetworkCredential(user, password, domain); //実行するRunbookの情報を指定している Guid runbookId = new Guid(runbookGuid); var parameterValues = new Hashtable(); parameterValues.Add(paramName,paramValue); //OData Queryのhttp://orchestrator:81/Orchestrator2012/Orchestrator.svc/RunbookParametersで取得した //全Runbookパラメータ情報に対して、LyncでInput項目とRunbookIDを利用してフィルタをしている。 var runbookParams = context.RunbookParameters .Where(runbookParam => runbookParam.RunbookId == runbookId && runbookParam.Direction == "In"); var parametersXml = new StringBuilder(); if (runbookParams != null && runbookParams.Count() > 0) { parametersXml.Append("<Data>"); foreach (var param in runbookParams) { parametersXml .AppendFormat("<Parameter><ID>{0}</ID><Value>{1}</Value></Parameter>", param.Id.ToString("B"), parameterValues[param.Name]); } parametersXml.Append("</Data>"); } try { //Runbookジョブの実行定義を設定(Runbookの指定、パラメータの設定) Job job = new Job(); job.RunbookId = runbookId; job.Parameters = parametersXml.ToString(); //ここはサンプルとは異なる部分ですが、この設定が無いとArgumentOutOfRangeExceptionが発生します。 job.CreationTime = System.DateTime.Now; job.LastModifiedTime = System.DateTime.Now; //Runbookジョブの実行登録 context.AddToJobs(job); context.SaveChanges(); Console.WriteLine("Successfully started runbook. Job ID: {0}", job.Id.ToString()); } catch(DataServiceQueryException ex) { throw new ApplicationException("Error starting runbook.", ex); } } } }
参考URL
参考のサンプルコード
http://msdn.microsoft.com/en-us/library/hh921685.aspx
ただし、このままだと以下のエラーが出て動きません。この記事のサンプルコードの通りJobオブジェクトの時間関係のプロパティ(CreationTime、LastModifiedTime)を設定する必要があります。
An unhandled exception of type 'System.ArgumentOutOfRangeException' occurred in Microsoft.Data.OData.dll Additional information: オフセットの適用時に表される UTC 時間の年は 0 から 10,000 の間でなければなりません。
このエラーと対応方法に関する記事
Exception using code sample in UTC +1 Timezone
参考URL
ODataは色々な情報をURL指定で簡単にQueryできるので便利です。
OData Queries Using the Orchestrator Web Service
関連記事:
Excel PowerBI(PowerPivot)を利用したSystem Center Orchestraotrレポーティング - YOMON8.NET