読者です 読者をやめる 読者になる 読者になる

C#クラスライブラリ(DLL)をAzure Automationで利用する方法

Azure PowerShell

Azure上からIT管理の自動化ができるAzure Automationですが、Igniteやde:codeを見ていても、Microsoftの自動化ツールの中心になっていくのではと思っています。solution.realtech.jp




Azure Automationでは実行エンジンとしてPowerShell Workflowを使っています。このため、自動化の実装で利用できるのはPowerShellのみです。


C#のクラスライブラリを使いたい場合はPowerShellを通して呼び出すことになります。ここでは、Azure AutomationでC#ライブラリを使う方法の一例を書こうと思います。



クラスライブラリ

以下のような「MyClassLibrary.dll」というDLLを持っていたとします。これをAzure Automationで使いたいです。

using System;

namespace MyClassLibrary
{
    public class MyMessage
    {
        public static string GetMessage(string Name)
        {
            return String.Format("Hello {0} !", Name);
        }
    } 
}

PowerShellコマンドレット

以下のように参照にSystem.Management.Automationを追加して、PowerShellコマンドレットを開発ます。ここから先程のDLLを呼び出しています。

DLLファイル名は「GetMessageCmdlet.dll」とします。

using System;
using System.Management.Automation;
using MyClassLibrary;

namespace GetMessageCmdlet
{
    [Cmdlet(VerbsCommon.Get, "HelloMessage")]
    public class GetHelloMessage : Cmdlet
    {
        [Parameter]
        public string Name { get; set; }

        protected override void ProcessRecord()
        {
            WriteObject(MyMessage.GetMessage(Name));
        }        
    }
}

PowerShell Module化

SampleCmdletというフォルダを作成し、そこにPowerShellマニュフェストファイルを出力します。

New-ModuleManifest .\SampleCmdlet\SampleCmdlet.psd1

ファイルの中身を以下のように書き換えます。

#省略
RootModule = 'SampleCmdlet.dll'
#省略
NestedModules = @('MyClassLibrary.dll')
#省略

 


この時点でPowerShellモジュールのフォルダ構造ができました。モジュールをインポートして利用できるところまで確認できます。

PS> gci .\SampleCmdlet
Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2015/07/24     21:43       4608 GetMessageCmdlet.dll
-a---        2015/07/24     21:43       4608 MyClassLibrary.dll
-a---        2015/07/24     21:45       4014 SampleCmdlet.psd1
PS> Import-Module .\SampleCmdlet
PS> Get-Module
ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Binary     1.0        SampleCmdlet                        Get-HelloMessage
PS> Get-HelloMessage -Name yomon8
Hello yomon8 !

PowerShellモジュールをAzure Automationにアップロードして使う

まずはモジュールのフォルダ「.\SampleCmdlet」をZIPにします。「SampleCmdlet.zip」とします。


Azure Preview Portalからアップロードしてみます。
Azure Automationアカウント>アセット>モジュール>モジュールの追加でZIPファイルをアップロードします。
f:id:yomon8:20150725001308p:plain

モジュールの読み込みが終わるまで数分待ちます。
f:id:yomon8:20150725001319p:plain

読み込みが完了すればRunbookのコマンドレットとして使えるようになります。
f:id:yomon8:20150725001325p:plain

実行すれば、DLLを使って処理が動いていることがわかります。
f:id:yomon8:20150725001332p:plain


注意点

Azure Automationが実際に実行されているのはWindows Serverのはずですが、それでも手元のWindowsで動く全てのクラスライブラリが動くわけではありません。

WMIなどは使えないようですが、.Netの標準ライブラリは使えるので、それでOSの情報などを取得するとヒントになるかもしれません。yomon.hatenablog.com
 
 


Hybrid Workerを使ったオンプレミス環境などの自動化を行う場合は、Hybrid Worker側のOSにPowerShellモジュールをインストールします。PSModulePathに配置したり、Import-Moduleで明示的にインポートすれば使えます。