Azure Powershell 如何通过 Runbook 获取 VM 的 运行 服务?
Azure Powershell how to get running services of a VM via Runbook?
我正在尝试编写将启动 VM 的 Azure Powershell Runbook,然后检查 VM 上的 windows 服务是否 运行 并启动它。
我可以启动 VM,但无法枚举服务。我是 Azure Runbooks 的新手,所以我可能做错了什么。我将以下代码限制为仅 Get-Service
位而不是 VM 启动。
# Returns strings with status messages
[OutputType([String])]
param (
[Parameter(Mandatory=$false)]
[String] $AzureConnectionAssetName = "AzureRunAsConnection",
[Parameter(Mandatory=$false)]
[String] $ResourceGroupName = ""
)
try {
# Connect to Azure using service principal auth
$ServicePrincipalConnection = Get-AutomationConnection -Name $AzureConnectionAssetName
Write-Output "Logging in to Azure..."
$Null = Add-AzureRmAccount `
-ServicePrincipal `
-TenantId $ServicePrincipalConnection.TenantId `
-ApplicationId $ServicePrincipalConnection.ApplicationId `
-CertificateThumbprint $ServicePrincipalConnection.CertificateThumbprint
}
catch {
if(!$ServicePrincipalConnection) {
throw "Connection $AzureConnectionAssetName not found."
}
else {
throw $_.Exception
}
}
# If there is a specific resource group, then get all VMs in the resource group,
# otherwise get all VMs in the subscription.
if ($ResourceGroupName) {
$VMs = Get-AzureRmVM -ResourceGroupName $ResourceGroupName
}
else {
$VMs = Get-AzureRmVM
}
# Try and enumerate the VM's services
foreach ($VM in $VMs) {
Write-Output "Listing all services..."
Write-Output ("VM: {0}" -f $VM.Name)
$VM | Get-Service | Format-Table -AutoSize
Write-Output "Listing alternative method..."
Get-Service -ComputerName $VM.Name | Format-Table -AutoSize
Write-Output "Finished listing..."
}
输出是这样的:
Logging in to Azure...
Listing all services...
VM: demo-0
Listing alternative method...
Finished listing...
嗯,首先,启动 VM 是异步的,因此您需要等待 VM 真正启动,并且 Get-Service
无论如何都无法工作,至于从您的 VM 获取服务需要针对该 VM 进行身份验证,因此用户 PSsessions 或调用命令,类似的东西。看看如何使用 powershell 远程进入服务器或如何向远程 PC 发出 powershell 命令。这个案子没什么不同。而且它与 Azure 自动化的工作方式无关。
当您运行宁 Azure 自动化 运行书籍时,您可以选择 azure 队列或创建混合工作者。 Azure 队列适用于许多进程,但它无法直接访问虚拟机以使用 运行 命令,例如 get-service。
要扩展 @4c74356b41 答案,您需要使用远程 powershell 来执行命令(使用 New-PSSession) but you will also have to ensure that those commands are running on an Azure Automation Hybrid Worker
在下面的评论中,您询问了凭据。您可以在 Azure 自动化帐户中设置凭据,然后让您的脚本在创建新会话时使用它们。参见 this link
您可以尝试使用以下 cmdlet。它对我有用。
# Try and enumerate the VM's services
foreach ($VM in $VMs) {
Write-Output "Listing all services..."
Write-Output ("VM: {0}" -f $VM.Name)
$ResourceGroupName=$VM.ResourceGroupName
$Name=$VM.Name
$status=(Get-AzureRmVM -ResourceGroupName $ResourceGroupName -Name $Name -Status).Statuses[1].code
if($status -like "PowerState/deallocated")
{
Write-Output "VM is stopped, starting VM"
if (Start-AzureRmVm -ResourceGroupName $ResourceGroupName -Name $Name)
{
Write-Output "Start VM successfuly"
}else
{
Write-Output "Start VM failed"
break
}
}
##get VM's Public IP
$nicName = ($VM.NetworkInterfaceIDs[0] -split '/')[-1]
$pip = (Get-AzureRmNetworkInterface -Name $nicName -ResourceGroupName $ResourceGroupName).IpConfigurations.publicipaddress.id
$PublicIP=(Get-AzureRmPublicIpAddress -ResourceGroupName shui -Name ($pip -split '/')[-1]).IpAddress
$Uri="http://$($PublicIP):5986"
Write-Output "Get ConnectionUri $Uri"
##get Credential from assets
$shui=Get-AutomationPSCredential -Name 'shui'
$session=New-PSSession -ConnectionUri $Uri -Credential $shui -SessionOption (New-PSSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck)
$result=Invoke-Command -Session $session -ScriptBlock {ipconfig}
Write-Output "$result"
Write-Output "Finished listing..."
}
在你使用这个脚本之前。首先,你应该在你的VM的防火墙和NSG上打开端口5896,你可以检查如下link。请确保您可以 telnet IP 5986
在您的本地 PC 上。
- 您应该将
AzureRM.Network
模块导入您的自动化帐户。有关如何导入模块的更多信息,请参阅此 link。
3.Store你的虚拟机的Runbook密码,你可以参考这个link。当你想使用凭据时,你可以使用下面的脚本:
##get Credential from assets
$shui=Get-AutomationPSCredential -Name 'shui'
$session=New-PSSession -ConnectionUri $Uri -Credential $shui -SessionOption (New-PSSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck)
我正在尝试编写将启动 VM 的 Azure Powershell Runbook,然后检查 VM 上的 windows 服务是否 运行 并启动它。
我可以启动 VM,但无法枚举服务。我是 Azure Runbooks 的新手,所以我可能做错了什么。我将以下代码限制为仅 Get-Service
位而不是 VM 启动。
# Returns strings with status messages
[OutputType([String])]
param (
[Parameter(Mandatory=$false)]
[String] $AzureConnectionAssetName = "AzureRunAsConnection",
[Parameter(Mandatory=$false)]
[String] $ResourceGroupName = ""
)
try {
# Connect to Azure using service principal auth
$ServicePrincipalConnection = Get-AutomationConnection -Name $AzureConnectionAssetName
Write-Output "Logging in to Azure..."
$Null = Add-AzureRmAccount `
-ServicePrincipal `
-TenantId $ServicePrincipalConnection.TenantId `
-ApplicationId $ServicePrincipalConnection.ApplicationId `
-CertificateThumbprint $ServicePrincipalConnection.CertificateThumbprint
}
catch {
if(!$ServicePrincipalConnection) {
throw "Connection $AzureConnectionAssetName not found."
}
else {
throw $_.Exception
}
}
# If there is a specific resource group, then get all VMs in the resource group,
# otherwise get all VMs in the subscription.
if ($ResourceGroupName) {
$VMs = Get-AzureRmVM -ResourceGroupName $ResourceGroupName
}
else {
$VMs = Get-AzureRmVM
}
# Try and enumerate the VM's services
foreach ($VM in $VMs) {
Write-Output "Listing all services..."
Write-Output ("VM: {0}" -f $VM.Name)
$VM | Get-Service | Format-Table -AutoSize
Write-Output "Listing alternative method..."
Get-Service -ComputerName $VM.Name | Format-Table -AutoSize
Write-Output "Finished listing..."
}
输出是这样的:
Logging in to Azure...
Listing all services...
VM: demo-0
Listing alternative method...
Finished listing...
嗯,首先,启动 VM 是异步的,因此您需要等待 VM 真正启动,并且 Get-Service
无论如何都无法工作,至于从您的 VM 获取服务需要针对该 VM 进行身份验证,因此用户 PSsessions 或调用命令,类似的东西。看看如何使用 powershell 远程进入服务器或如何向远程 PC 发出 powershell 命令。这个案子没什么不同。而且它与 Azure 自动化的工作方式无关。
当您运行宁 Azure 自动化 运行书籍时,您可以选择 azure 队列或创建混合工作者。 Azure 队列适用于许多进程,但它无法直接访问虚拟机以使用 运行 命令,例如 get-service。
要扩展 @4c74356b41 答案,您需要使用远程 powershell 来执行命令(使用 New-PSSession) but you will also have to ensure that those commands are running on an Azure Automation Hybrid Worker
在下面的评论中,您询问了凭据。您可以在 Azure 自动化帐户中设置凭据,然后让您的脚本在创建新会话时使用它们。参见 this link
您可以尝试使用以下 cmdlet。它对我有用。
# Try and enumerate the VM's services
foreach ($VM in $VMs) {
Write-Output "Listing all services..."
Write-Output ("VM: {0}" -f $VM.Name)
$ResourceGroupName=$VM.ResourceGroupName
$Name=$VM.Name
$status=(Get-AzureRmVM -ResourceGroupName $ResourceGroupName -Name $Name -Status).Statuses[1].code
if($status -like "PowerState/deallocated")
{
Write-Output "VM is stopped, starting VM"
if (Start-AzureRmVm -ResourceGroupName $ResourceGroupName -Name $Name)
{
Write-Output "Start VM successfuly"
}else
{
Write-Output "Start VM failed"
break
}
}
##get VM's Public IP
$nicName = ($VM.NetworkInterfaceIDs[0] -split '/')[-1]
$pip = (Get-AzureRmNetworkInterface -Name $nicName -ResourceGroupName $ResourceGroupName).IpConfigurations.publicipaddress.id
$PublicIP=(Get-AzureRmPublicIpAddress -ResourceGroupName shui -Name ($pip -split '/')[-1]).IpAddress
$Uri="http://$($PublicIP):5986"
Write-Output "Get ConnectionUri $Uri"
##get Credential from assets
$shui=Get-AutomationPSCredential -Name 'shui'
$session=New-PSSession -ConnectionUri $Uri -Credential $shui -SessionOption (New-PSSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck)
$result=Invoke-Command -Session $session -ScriptBlock {ipconfig}
Write-Output "$result"
Write-Output "Finished listing..."
}
在你使用这个脚本之前。首先,你应该在你的VM的防火墙和NSG上打开端口5896,你可以检查如下link。请确保您可以 telnet IP 5986
在您的本地 PC 上。
- 您应该将
AzureRM.Network
模块导入您的自动化帐户。有关如何导入模块的更多信息,请参阅此 link。
3.Store你的虚拟机的Runbook密码,你可以参考这个link。当你想使用凭据时,你可以使用下面的脚本:
##get Credential from assets
$shui=Get-AutomationPSCredential -Name 'shui'
$session=New-PSSession -ConnectionUri $Uri -Credential $shui -SessionOption (New-PSSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck)