如何使用资源管理器模块停止所有 Azure 自动化虚拟机?

How to stop all VMs with Azure Automation using Resource Manager module?

我已经使用新的资源管理器创建了一些 Azure VM,我想每天停止它们。

为此,我发布了一个 runbook 来停止经典和 ARM VM,并且我创建了一个每晚运行 runbook 的调度程序:

workflow Stop-AzureVMs 
{ 
    $cred = Get-AutomationPSCredential -Name 'Cred'
    Add-AzureAccount -Credential $cred
    Select-AzureSubscription -Current 'SubscriptionName'

    Get-AzureVM | Stop-AzureVM –Force
    Get-AzureRmVM | Stop-AzureRmVM -Force
}

我已将 AzureResourceManager 模块导入我的 Azure 自动化帐户:

但是我收到了这个错误:

Exception
At line:34 char:2
 + Get-AzureRMVM | Stop-AzureRMVM -Force
 + ~~~~~~~~~~~~~ Cannot find the 'Get-AzureRMVM' command. If this command is defined as a workflow, ensure it is defined before the workflow that calls it. If it is a command intended to run directly within Windows PowerShell (or is not available on this system), place it in an InlineScript: 'InlineScript { Get-AzureRMVM }'

这怎么可能?

编辑:下面是解决方案

    $cred = Get-AutomationPSCredential -Name 'Cred'

    Add-AzureRmAccount -Credential $cred
    Select-AzureRmSubscription -Name 'SubscriptionName' -SubscipritionId 'SubscriptionId' 

    Get-AzureRmVM | Stop-AzureRmVM -Force

我发现的所有工作流程都没有提到使用 Add-AzureRmAccount 和 Select-AzureRmSubcription 而不是标准的 Add-AzureAccount 和 Select-AzureSubscription。我认为我们的 Azure 帐户的身份验证过程是相同的。

更新:现在可以在同一个运行手册中组合 ASM 和 ARM cmdlet,请参阅此 post 了解有关 ARM supported by default on Azure Automation[ 的更多信息=15=]

据我了解,ASM 模式是默认模式。如果您要使用 ARM 命令,首先需要使用 Switch-AzureMode

切换模式

另一个困惑是Get-AzureRMVM命令的目的是什么。我用谷歌搜索但找不到任何东西 -

Get-AzureRMVM cmdlet 在 AzureRM.Compute 模块中...AzureRM* cmdlet 仍处于预览阶段,我认为它们在 Azure 自动化中不可用。

上面屏幕截图中的两个模块可能对应于 cmdlet 的 0.9.x 版本,并且在 Switch-AzureMode 后面确实有两个不同的模块(Azure=ASM 和 AzureResourceManager=ARM)。 Switch-AzureMode 只是卸载一个并加载另一个。

如果 Automation 仍在使用 0.9.x 版本的 cmdlet,那么您应该能够使用 AzureResourceManager 模块将 Get-AzureVM 用于 ARM VM。

您似乎将旧版本的 ARM cmdlet(Azure PS 1.0 之前)导入了 Azure 自动化。这是在 *-AzureRm* 重命名之前。所以 tt 应该是 Stop-AzureVM 而不是 Stop-AzureRmVM.

然而,这使得您是否正在尝试调用 Azure 服务管理或 Azure 资源管理器 cmdlet 变得模棱两可——这正是 cmdlet 名称在 Azure PS 1.0 中重命名的原因。我建议您遵循指导 here.

下面是解决方案

$cred = Get-AutomationPSCredential -Name 'Cred'

Add-AzureRmAccount -Credential $cred
Select-AzureRmSubscription -Name 'SubscriptionName' -SubscriptionId 'SubscriptionId' 

Get-AzureRmVM | Stop-AzureRmVM -Force

目前还不可能将 ARM 和 ASM cmdlet 组合在同一个 runbook 中……因此您只能使用 ARM cmdlet 或 ASM cmdlet。

此外,我发现的所有工作流程都没有提到使用 Add-AzureRmAccount 和 Select-AzureRmSubscription 而不是标准的 Add-AzureAccount 和 Select-AzureSubscription。

我认为我们的 Azure 帐户的身份验证过程是相同的。

以下代码适用于旧式和新式 VM,但请注意,这将在没有警告的情况下关闭所有计算机。

{
    # TODO: update to the name of the credential asset in your Automation account
    $AutomationCredentialAssetName = "AzureAutomationRG"

    # Get the credential asset with access to my Azure subscription
    $Cred = Get-AutomationPSCredential -Name $AutomationCredentialAssetName

    # Authenticate to Azure Service Management and Azure Resource Manager
    Add-AzureAccount -Credential $Cred 
    Add-AzureRmAccount -Credential $Cred 

    "`n-Old Style VMS-`n"

    # Get and output Azure classic VMs
    $VMs = Get-AzureVM
    $VMs.Name

    Get-AzureVM | Stop-AzureVM -Force

    "`n-New Style Resource Group VMs-`n"

    # Get and output Azure v2 VMs
    $VMsv2 = Get-AzureRmVM
    $VMsv2.Name

    Get-AzureRmVM | Stop-AzureRmVM -Force
}

对于新的 Azure RM VM,使用以下命令访问扩展:

Set-AzureRmVMAccessExtension -ResourceGroupName "ResourceGroupName" -VMName "VMName" -Username "Admin User Name" -Password "Admin Password" -Name "Extension Name"

请注意-Name参数是任意扩展名。

这可能会迟到,但我建议您看看这个 link:

https://www.attosol.com/start-or-stop-all-vms-of-a-resource-group-in-azure/

基本上,您可以创建一个脚本并使用开关编写一些别名,让您的工作变得超级简单。