【问题标题】:Azure Runbook CommandsAzure Runbook 命令
【发布时间】:2018-10-08 16:04:20
【问题描述】:

所以我有一个运行手册,可以在周末自动关闭和启动我的 Azure VM。然后,这会发送一封交易电子邮件,确认 VPS 已关闭/启动。

我已经如图所示设置了我的参数。为什么它在主题行中正确地说明了我的虚拟机的名称(突出显示)但在电子邮件正文(突出显示)中却出现了一个完全不同的名称,是否有原因。

逻辑会规定$VM.NAME 将是 VPS 的名称,而不是一些随机的命令行,那么这是为什么呢?它在主题行中正确显示,但不是电子邮件正文。

   param (

    [Parameter(Mandatory=$false)] 
    [String] $VMName ="ITAMTRADINGVPS",

    [Parameter(Mandatory=$false)] 
    [String] $ResourceGroupName
)

$connectionName = "AzureRunAsConnection"
try
{
    # Get the connection "AzureRunAsConnection "
    $servicePrincipalConnection=Get-AutomationConnection -Name $connectionName         

    "Logging in to Azure..."
    Add-AzureRmAccount `
        -ServicePrincipal `
        -TenantId $servicePrincipalConnection.TenantId `
        -ApplicationId $servicePrincipalConnection.ApplicationId `
        -CertificateThumbprint $servicePrincipalConnection.CertificateThumbprint 
}
catch {
    if (!$servicePrincipalConnection)
    {
        $ErrorMessage = "Connection $connectionName not found."
        throw $ErrorMessage
    } else{
        Write-Error -Message $_.Exception
        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 -And $VMName) 
{ 
    $VMs = Get-AzureRmVM -ResourceGroupName $ResourceGroupName -Name $VMName
}
elseif ($ResourceGroupName)
{
    $VMs = Get-AzureRmVM -ResourceGroupName $ResourceGroupName

}
else 
{ 
    $VMs = Get-AzureRmVM
}

$vms
# Start each of the VMs
# Stop each of the VMs
foreach ($VM in $VMs)
{
    $StopRtn = $VM | Stop-AzureRmVM -Force -ErrorAction Continue
    $StopRtn
    Write-Output " this is $StopRtn "

    if ($StopRtn.IsSuccessStatusCode -eq 'True')
    {
        # The VM stopped, so send notice
        Write-Output ($VM.Name + " has been stopped")
        $Username ="xxx"

        $Password = ConvertTo-SecureString "xxx" -AsPlainText -Force

        $credential = New-Object System.Management.Automation.PSCredential $Username, $Password

        $SMTPServer = "xxx"

        $EmailFrom = "xxxx

        [string[]]$EmailTo = "xxx"
        $Subject = $VM.NAME + " notification of scheduled deallocation"

        $Body = "We'd like to let you know that your Virtual Machine $VM.NAME has successfully deallocated.
        <br>This could either be due to maintenance or a scheduled shutdown. If you were expecting this notification, please disregard this email.
        <br><br>If you need any further assistance, please contact the system administrator on xxx<br><br>Yours Sincerely<br><br>The Technical Design Team<br>xxx<br><br>"

        Send-MailMessage -smtpServer $SMTPServer -Credential $credential -Usessl -Port 587 -from $EmailFrom -to $EmailTo -subject $Subject -Body $Body -BodyAsHtml
        Write-Output "Email sent succesfully."

    }
    else
    {
        # The VM failed to stop, so send notice
        Write-Output ($VM.Name + " failed to stop")
    }
}

插图

【问题讨论】:

  • 电子邮件正文带有什么名称?给名字加点灯
  • 它在插图中突出显示。谢谢。

标签: azure powershell powershell-2.0 azure-runbook


【解决方案1】:

电子邮件正文中的变量引用(例如 $VM.Name),默认情况下只会返回对象类型,其中 PowerShell 中的输出是一个特殊的管道活动,它会将内容呈现为列表或表格。为了在电子邮件中包含内容,我们必须引用属性

[string]$EmailBody = (“VMNAME IS = [{0}]” -f $VM.Name)

类似于C#中的string.format

参考这个SO

【讨论】:

  • 好的,那么我将把这个命令与我自己的代码放在哪里呢?谢谢
  • @ToddGilbey 只需根据我的回答更改$Body 的内容
猜你喜欢
  • 2020-07-24
  • 2021-05-15
  • 2019-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多