System Center OrchestratorのWeb Serviceを使ってRunbookを実行してみた

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/&quot;datetime'2014-11-18T15%3A43%3A11'&quot;">
    <!--省略-->   
    <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でプロジェクトを作成したら、作成したプロジェクトにサービス参照を追加します。
f:id:yomon8:20141119015809p:plain

追加する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);
            }

        }
    }
}

 
  


実行結果

上記のプログラムを実行すると、無事にRunbookにパラメータを渡して実行できたことがわかります。



参考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