WSFC ではスクリプトをリソースとして登録するための [汎用スクリプト] があります。
このリソースですが Windows Scripting Host (WSH) を実行するためのリソースとなるため、PowerShell スクリプトを実行することができません。
既存資産を使用する場合は、WSH ベースの汎用スクリプトを使用してもいいと思いますが、新規にスクリプトを作成する場合は、PowerShell でスクリプトを書いたほうが効率的ですので、今回の投稿ではクラスターリソースとして PowerShell スクリプトを登録する方法を。
汎用スクリプトで ps1 は登録することができません。
そこで [汎用アプリケーション] を利用します。
汎用アプリケーションでは実行するコマンドラインとパラメーターを指定することができますので PowerShell.exe からスクリプトを実行するようにします。
# 以下の例ではローカルドライブのスクリプトを実行していますが、共有ディスクや共有フォルダのスクリプトを実行できるのであれば、スクリプトの二重管理をしなくてよいのでそちらにした方が楽かと。
コマンドライン | powershell.exe |
パラメーター | -Command "<スクリプトのフルパス>" 例) -Command "C:PSResourceClusterResource.ps1" |
注意点としてはスクリプトが終了するとリソースが失敗の状態になってしまいます。
そこで以下のスクリプトのようにスクリプトが終了しないように Read-Host 等の処理を入れておきます。
これで汎用アプリケーションリソースがオンラインのままの状態となります。
$ENV:Computername | Out-File -FilePath C:PSResourcetmp.txt -Force Read-Host
クラスターリソースがオンラインになった時に待機系のノードで特定の処理を実行したい場合などは以下のようなスクリプトを登録することで処理ができます。
$ENV:Computername | Out-File -FilePath C:PSResourcetmp.txt -Force $PassiveNodes = Get-ClusterNode | Where Name -ne $ENV:ComputerName foreach ($PassiveNode in $PassiveNodes){ Invoke-Command -ComputerName $PassiveNode.Name -ScriptBlock {Remove-Item C:PSResourcetmp.txt -Force} } Read-Host
注意点としてはクラスターのサービス (Cluster Service) は [Local System] として動作している点になります。
Invoke-Command に Credential を渡して実行することで、待機系ノードに対して処理を実行することもできるのですが、クラスターの各ノードの Administrators グループに自身以外のノードのコンピューターアカウントを指定することでも実行することができます
他にも方法はあるかと思いますがメモとして。