2011年12月23日金曜日

Powershell 3.0 と Workflow Foundation

※これは PowerShell Advent Calendar 2011 用の投稿です

PowerShell の最新版 3.0 では多くの機能強化が行われています。あまり深くチェックしていなかったのですが、@mutaguchi さんのツイートから興味を持って調べてみると、WF の機能を PowerShell から利用したり、逆に PowerShell の機能を WF で利用することができるようになっていました。 3.0 では多くのクラスが追加されており、半分ほどは WF で PowerShell を利用できるようにしたアクティビティクラスです。内部的に PowerShell のコマンドレットを Invoke で呼び出しているとの事で、これを利用することにより既存 PowerShell スクリプトのワークフロー化というのも可能になっています。

反対に WF で提供されていた長期間のインスタンス化等の機能を PowerShell で利用することも可能になり、恐らくはこれを用いてスクリプトのサスペンド/レジュームが行われているものと推測していたのですが、どうやら違っていた模様です。

1: WF4 のワークフローを PowerShell 3.0 より動作させる

まず試してみたものは、WF4 標準機能で作成したワークフローを PowerShell 3.0 上で動作させる事です。このようなワークフローを作成してみました。

WFPS0

標準出力にテキストを出力するだけの簡単なワークフローです。これを PowerShell 3.0 上で実行するには Import-Module [ワークフローのファイル名] を行います。その際ファイル名の拡張子を除いたものがコマンド名になります。例えば wfSample01.xaml というファイル名だった場合、コマンド名は wfSample01 になります。今回は PSWF2.xaml というファイル名で作成したので PSWF2 というコマンドになります。Import-Module を行ったので実行してみると・・・

WFPS0-1

何も出力されません。

これは WF4 で利用している標準出力と、PowerShell の出力先が異なるためです。PowerShell の出力として扱う場合には、アクティビティ内部で PowerShell オブジェクトを操作するか、Microsoft.PowerShell.Utilty.Activities 名前空間に用意された OutString アクティビティを利用する事で対応できます。

WFPS1

今度は上記のようなワークフローで試してみます。ワークフローにて変数を定義し(testString という名前)、それに対して Assign アクティビティで文字列をセット、それを OutString アクティビティに引き渡しそのまま出力させようというものです。

WFPS2

するとこのように PowerShell の出力としてワークフローの結果が表示されました。このように WF4 のワークフローを PowerShell 上で簡単に利用する事ができるようになっています。もし自作のアクティビティを利用してる場合は、[Reflection.Assembly]::LoadFrom 等でアセンブリを読み込めば同じように利用可能となります。

もうひとつサンプルとして Workflow Foundation のワークフロー上で引数を定義した場合の挙動を試してみます。

WFPS3-1

今度はこのようにワークフロー上で引数を定義し初期値も設定しておきます。引数は初期値が与えられているので、そのまま実行すると [Workflow Value] と出力されることになります。

WFPS3-3

実際に実行したものが上記になります。ワークフロー上で引数として定義したものは、そのままコマンドレットのオプションとなっているのがわかるかと思います。このような形で WF4 のワークフローを簡単に利用できます。

ここまで簡易に WF4 のワークフローを実行できてしまうのは非常にありがたい機能です。自作アプリでは独自にコンソール実行用アプリを用意して対応していたのが、ここまで簡単にできてしまうのは大変ありがたいことだと思います。

2:PowerShell 3.0 で提供されるアクティビティ

先程も書いたように、PowerShell 3.0 では非常に多くのアクティビティが提供されます。最初は一覧で・・・と考えたのですが、あまりに膨大なのでやめました。簡単に、名前空間と提供されるアクティビティの数だけ表にまとめておきます。

名前空間
アクティビティ数
Microsoft.PowerShell.Activities
※基本クラスのみ
Microsoft.PowerShell.Core.Activities
38
Microsoft.PowerShell.Security.Activities
10
Microsoft.PowerShell.Utilty.Activities
71
Microsoft.PowerShell.Diagnostics.Activities
5
Microsoft.PowerShell.Management.Activities
73

トータルすると 197 個ものアクティビティが利用できるようになります。PowerShell の基本コマンドレットを利用するものから、WMI オブジェクトを操作するようなもの、多数用意されています。中でもメインとなるのは PowerShell の基本コマンドレットなアクティビティです。MSDN で記載されている内容を見てもわかるとおり、
「Activity to invoke the xxxx\yyyy command in a Workflow.」
と書かれているものが物凄く大量にあると思います。これは PowerShell のコマンドレットを Invoke して利用しているもので、恐らく標準コマンドレットは大体カバーできているのではないでしょうか。一応自作ツールの WF Designer Express にて上記アセンブリを参照、利用してみたところ問題なく動作しています。

3:PowerShell 3.0 でワークフローを作成

PowerShell のスクリプトとしてのワークフロー作成も行えます。ただ、現時点では詳しく追い切れていないのですが、Workflow Foundation のワークフローを作成するのではなく、PowerShell 独自のワークフローを作成できる感じになっています。サンプルがあまり見かけなかったので追い切れていませんが、少し触ってみたところ次のような印象を持ちました。

  • 頭に workflow と定義させ通常の関数等とは異なる Workflow モードとして動作
  • 実行エンジンは恐らく PowerShell ジョブエンジンの拡張版
  • 初回実行時がやや重いのは内部的に初期化処理が結構行われていそう

一番大きいのは workflow モードとして動作、なのだと思います。この状態で実行している物が、レジュームやサスペンドに対応できるようです。また並列動作に対応しており、その際変数名を $parallel_xxx のように、頭に parallel_ を付与する必要があるそうです。通常であれば ForEach の –Parallel 指定なのですが、ワークフローの場合そうではないところが注意点ですね。

最初、ジョブのサスペンドやレジュームが行えるようになったとの事でしたので、Workflow Foundation の永続化を利用しているのかとも考えたのですが、どうやらそうではないようです。その方向で行く場合、どこかに永続化ストアの構築が必要になる(もしくは独自に永続化制御のロジックを用意する)のですが、PowerShell のジョブ制御自体 SQL Server がなくとも動作しますし、PowerShell の性質を考慮するとやっていたとしても独自に制御しているのではないか、と思われます。

逆に言うと、WF 上での永続化と PowerShell での永続化は別々に動作すると思われますので、このあたりは特に考え方を変える必要もない、ということになると思います。

なお、海外掲示板サイトにて PowerShell workflow と WF4 を同じサンプルにて表してみたものがあるので参考にしてみてください。

4:AST

最初 PowerShellXamlConverter というクラスを見つけた時、PowerShell の何かを xaml に変換するんだー、と思いその xaml は WF とかなのかなー、と考えていたのですが全然違いました

MSDN には 「Converts a PowerShell AST into the workflow XAML that represents it.」と記載されており、超意訳すると「PowerShell の AST(Abstract Syntax Tree) を xaml 形式で出力するよ!」という事で、海外の方が詳しく書かれていました。簡単に言うと構文を解析してくれるパーサーでして、詳しいことはこの海外の方が TechNet Gallerry にサンプルをアップしてくれていましたので、こちらを見ていただければわかるかと思います。

5:まとめ

一気に書き上げましたが、PowerShell 3.0 にて追加された WIndows PoerShell Workflow は PowerShell と Workflow Foundation が融合するような激しい機能強化だと感じています。そして次期 Windows である Windows 8 では管理フレームワークである Windows Management Framework と PowerShell、そして Workflow Foundation を用いた管理が主軸となっています。

PowerShell だけでは難しかった「多くの人が作成できる」点を Workflow Foundationで、Workflow Foundation では難しかった「他で用意されている機能の利用」を PowerShell が、お互いに弱かったと思われる部分を補完するような形になっているのではないか、と思います。

0 件のコメント:

コメントを投稿