ローカルで正常に実行される次の PS スクリプトがあります。
Get-AzureVM | Where-Object { $_.Name -eq "my-server-selector" } | select name | ForEach-Object {
Write-Output $_.Name
Start-AzureVM $_.Name $_.Name
}
ローカル PS コンソールのコンテキストで、サブスクリプション情報を追加すると、コードは問題なく実行されます。すべての VM が出力に出力され、サーバーが起動されます。
クラウドに移動するときは、他にいくつかのことを行う必要があります。つまり、サブスクリプションをスコープに入れます。これを行うには、ポータルで資格情報資産を作成し、その資格情報を使用してスクリプトにアカウントを追加し、スクリプトで正しいサブスクリプションを選択します。また、それをワークフローにラップします (後でパラメーター化する予定の側面があります)。
最終的なコードは次のとおりです。
workflow StartServer
{
$credential = GetAutomationPSCredential -Name "credential-asset-name"
Add-AzureAccount -Credential $credential
Select-AzureSubscription -SubscriptionName "subscription-name"
Write-Output "Starting the server."
Get-AzureVM | Where-Object { $_.Name -Contains "my-server-selector" } | select name | ForEach-Object {
Write-Output $_.Name
Start-AzureVM $_.Name $_.Name
}
Write-Output "Execution Complete."
}
コマンドを削除するStart-AzureVM
と、ワークフローは期待どおりに実行されます。一致するすべての VM のリストが出力されます。コマンドを元に戻そうとすると、次のエラーが発生します。
Parameter set cannot be resolved using the specified named parameters.
だから、私が知っていると思うこと:
- VMの正しいリストを取得しているため、資格情報は機能しています
- 出力にダンプされるため、サブスクリプションは正しく設定されています
- スクリプトの内部部分は、何も変更せずにローカルの PowerShell コンソールで動作します。
これを機能させるには、Azure Automation ワークフローで何を別の方法で行う必要があるかについて、誰かアイデアを提供できますか?