gpt4 book ai didi

azure - 30 天后自动终止 Azure VM

转载 作者:行者123 更新时间:2023-12-04 15:20:49 26 4
gpt4 key购买 nike

在今天的事件中,我在 azure 中创建测试虚拟机,然后将其删除。由于某种原因,这次我计划创建 100 个测试虚拟机,并且想实现一个调度机制(通过 powershell 或 AzureRunbook),以便创建的服务器可以在 30 天后自动删除...

问题是我可以使用 Powershell 找到云服务的创建日期,但无法找到虚拟机的创建日期。很少有云服务包含我不想删除的旧虚拟机。

我正在考虑 vm 的不同命名约定,以便我可以使用它来删除时间 -

if($vm.name -like "mypattern*")
{
$out1 = $vm.Name
$out2 = $vm.ServiceName
Remove-AzureVM -Name $out1 -ServiceName $out2 -DeleteVHD
sleep -Seconds 60
}

我相信除此之外一定还有更多的方法。有什么替代选择吗?我更喜欢 powershell。

最佳答案

根据我所了解的情况,您正在尝试查找虚拟机的创建日期。所讨论的 VM 是“经典”VM,这意味着它们部署到云服务容器,而不是通过 Azure 资源管理器创建。有些虚拟机已经创建,有些将由您的脚本继续创建。有些云服务容器已经存在了一段时间,有些可能是较新的。

我无法找到通过服务管理 API 检索虚拟机创建日期的方法;然而,如果我们能够到达实际的虚拟机,那么我们还有更多工作要做。下面的脚本假设虚拟机创建日期与虚拟机上的操作系统安装日期相同(我认为这应该是一个很好的指标,我验证了它不是源镜像的日期,而是源镜像的日期)虚拟机创建)。为此,您需要在虚拟机上启用 PowerShell 远程端点(创建虚拟机时默认存在该端点),并且您必须在本地管理员权限下运行该脚本,因为它会与证书存储区混淆。

$remoteCreds = Get-Credential
$maxVMAgeInDays = 30
#Classic VMs
Get-AzureVM | ForEach-Object {
#Need to ensure we have the self-signed VM certificate installed to authenticate and secure the connection.
$winRmCertThumbprint = $_.Vm.DefaultWinRmCertificateThumbprint
$certPath = "Cert:\LocalMachine\Root\$winRmCertThumbprint"
if (!(Test-Path -Path $certPath)){
#Cert for VM isn't found, importing.
$winRmCert = Get-AzureCertificate -ServiceName $_.ServiceName -Thumbprint $winRmCertThumbprint -ThumbprintAlgorithm sha1

$certTempFile = [IO.Path]::GetTempFileName()
$winRmCert.Data | Out-File $certTempFile

# Target The Cert That Needs To Be Imported
$CertToImport = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 $certTempFile

$store = New-Object System.Security.Cryptography.X509Certificates.X509Store "Root", "LocalMachine"
$store.Open([System.Security.Cryptography.X509Certificates.OpenFlags]::ReadWrite)
$store.Add($CertToImport)
$store.Close()

"Imported cert: $certPath"

#clean up temp file
Remove-Item $certTempFile
}

#Retrieve the powerShell Remote port for this machine.
$remoteUri = Get-AzureWinRMUri -ServiceName $_.ServiceName -Name $_.Name

$osInstallDate = Invoke-Command -ConnectionUri $remoteUri -Credential $remoteCreds -ScriptBlock { ([WMI]'').ConvertToDateTime((Get-WmiObject Win32_OperatingSystem).InstallDate) }

$vmAgeInDays = (New-TimeSpan -Start $osInstallDate -End (Get-Date)).Days
if ($vmAgeInDays -gt $maxVMAgeInDays) {
"$($_.Name) VM in $($_.ServiceName) cloud service is older than $maxVMAgeInDays ... you can remove it."
#Add your code to remove the VM
} else {
"$($_.Name) VM in $($_.ServiceName) cloud service is only $($vmAgeInDays) old."
#Do soemthing else or just remove the else.
}
}

该脚本假定您已执行 Add-AzureAccount 并选择了要使用的订阅。它将提示您输入虚拟机的凭据,该特定脚本假定您拥有一个已设置为适用于每个虚拟机的凭据。这可以是您在创建 VM 时提供的凭据,也可以是您随后添加到每个 VM 的正确权限中的凭据。既然您说您通过脚本创建了数百个虚拟机,我的猜测是它们都将具有相同的管理凭据。对于您现有的虚拟机,您可能需要手动添加帐户(这可能会很痛苦,具体取决于您拥有的虚拟机数量)。

该脚本循环遍历每个虚拟机并检查本地计算机上是否加载了 WinRM 证书。如果没有,则会将其拉下来并安装。这是保护远程 PowerShell session 所需的。我从Michael Washam's script on TechNet获取代码。

在我们知道我们拥有保护连接的证书后,他们会执行远程 PowerShell 命令来检索操作系统安装日期(我在 ScioSoft blog 上找到的提示)。最后,它根据该日期检查虚拟机的使用期限,然后可以执行您想要的任何操作。根据您的情况,您可以将其删除。如果您确实想清除所有内容,您需要确保在删除虚拟机时也清除底层磁盘等。

最后,为了改进我建议您删除的任何虚拟机的脚本,您可以通过指纹删除证书来清理您的证书存储。

这适用于经典虚拟机,听起来您已经拥有了。有人已经为您提供了一种通过标记处理基于 ARM 的虚拟机的方法,这将消除实际处理远程命令的需要。

关于azure - 30 天后自动终止 Azure VM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32498946/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com