我有以下PS脚本在本地运行良好:
Get-AzureVM | Where-Object { $_.Name -eq "my-server-selector" } | select name | ForEach-Object {
Write-Output $_.Name
Start-AzureVM $_.Name $_.Name
}
在我的本地PS控制台的上下文中,我添加了我的订阅信息,代码执行没有问题;所有虚拟机都打印到输出,服务器启动。
当我将它移到云端时,我需要做一些其他的事情,即在范围内进行订阅。我通过在门户中创建凭证资产,通过所述凭证将帐户添加到我的脚本,然后在脚本中选择正确的订阅来实现。我还将它包装在一个工作流程中(有些方面我打算在以后进行参数化)。
最终代码如下:
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
命令,工作流程将按预期运行。我得到了打印出的所有匹配虚拟机的列表。如果我尝试重新输入命令,则会出现以下错误:
Parameter set cannot be resolved using the specified named parameters.
所以,我认为我知道的事情:
任何人都可以提供任何关于Azure自动化工作流程中需要采取哪些不同措施的想法,以使其发挥作用?
答案 0 :(得分:1)
在Where-Object
的过滤器以及Start-AzureVM
的调用中,修复在参数命名中更明确。我不确定为什么这会有所作为;正如我所说,写入服务器名称的调用在没有显式参数名称的情况下工作,但是很低,看哪,这里它与它一起工作。
内部块的最终代码如下:
Get-AzureVM | Where-Object -FilterScript { $_.Name -Contains "my-server-selector" } | select name | ForEach-Object {
Write-Output $_.Name
Start-AzureVM -ServiceName $_.Name -Name $_.Name
}
感谢Twitter上的@DexterPOSH关于-FilterScript
的方向。
答案 1 :(得分:0)
请查看有关此确切问题的http://azure.microsoft.com/blog/2014/11/25/introducing-the-azure-automation-script-converter/。在ISE中创建Powershell以进入Azure自动化时,请确保您在ISE中测试/编写Powershell工作流,因为Powershell工作流与Powershell脚本存在一些差异。
或者,如果您需要使用PS脚本并在Azure自动化中使用它,请确保导入脚本,而不是将其粘贴到其中。然后,Azure Automation会将PS脚本转换为PS Workflow。上面的链接有更多详细信息。