微软云代充值 Azure虚拟机自动快照脚本

微软云Azure / 2026-05-17 01:18:58

引言:别让手动快照拖垮你的运维生涯

想象一下,你正悠闲地喝着咖啡,突然收到警报:某台重要虚拟机的磁盘损坏了!你手忙脚乱地翻出备份,却发现昨天忘记手动创建快照了。这种场景是不是很熟悉?手动备份就像用勺子挖泳池,效率低还容易出错。而自动快照脚本,就是你的“备份救星”,一劳永逸地解决这个问题。本文将手把手教你如何用Azure脚本实现自动化快照,轻松搞定备份,让运维工作从“救火队员”变成“悠闲管家”。

脚本原理与核心逻辑

自动快照脚本的核心逻辑其实很简单:遍历所有虚拟机,为它们的磁盘创建快照,并定期清理旧快照。但细节决定成败。快照是虚拟机磁盘的只读副本,存储在Azure存储账户中,可以用于恢复数据或创建新虚拟机。脚本需要获取当前资源组下的所有虚拟机,逐个处理它们的磁盘,生成带时间戳的快照名称,然后删除超过保留周期的旧快照。

快照策略设计

快照策略要科学合理。比如,保留最近7天的快照,每天凌晨执行一次。保留时间可以根据业务重要性调整,核心业务可能保留30天,测试环境7天即可。快照名称最好包含VM名称和时间戳,比如“web-server-20240520080000”,这样方便查找和管理。同时,快照的位置要和原磁盘一致,避免跨区域导致延迟或额外费用。

权限配置要点

脚本需要访问Azure资源的权限,最安全的方式是使用服务主体。首先在Azure AD中创建应用注册,然后生成客户端密钥或证书。接着,在资源组的“访问控制(IAM)”中,为该服务主体分配“参与”角色,或者更精细的自定义角色,仅包含Microsoft.Compute/snapshots/write和Microsoft.Compute/snapshots/delete权限。这就像给快递员只配一把钥匙,而不是整栋楼的钥匙,安全又靠谱。切记不要用管理员账号直接运行脚本,否则一旦泄露,整个云环境都可能沦陷。

脚本编写实战

下面以PowerShell为例,写一个实用的脚本:

# 配置参数
$resourceGroup = "MyResourceGroup"
$retentionDays = 7
$date = Get-Date -Format "yyyyMMddHHmmss"

# 登录Azure(如果是Azure Automation,可能用Managed Identity)
Connect-AzAccount -Identity

# 获取所有VM
$vms = Get-AzVM -ResourceGroupName $resourceGroup

foreach ($vm in $vms) {
    $osDisk = $vm.StorageProfile.OsDisk
    $diskName = $osDisk.Name
    $snapshotName = "$($vm.Name)-snapshot-$date"

    # 创建快照
    $snapshotConfig = New-AzSnapshotConfig -SourceUri $osDisk.ManagedDisk.Id -Location $vm.Location -CreateOption Copy
    New-AzSnapshot -Snapshot $snapshotConfig -SnapshotName $snapshotName -ResourceGroupName $resourceGroup

    # 清理旧快照
    $oldSnapshots = Get-AzSnapshot -ResourceGroupName $resourceGroup | Where-Object {
        $_.TimeCreated -lt (Get-Date).AddDays(-$retentionDays) -and $_.Name -like "$($vm.Name)-snapshot-*"
    }
    foreach ($old in $oldSnapshots) {
        Remove-AzSnapshot -ResourceGroupName $resourceGroup -SnapshotName $old.Name -Force
    }
}

这段代码看似简单,但关键点很多。比如,使用-Identity参数登录,适用于Azure Automation中的托管身份,省去了密钥管理。快照名称包含VM名和时间戳,避免重复。清理时用-Name -like过滤特定前缀,防止误删其他快照。不过,这还只是基础版,实际中还需添加错误处理和日志记录,例如:

try {
    # 创建快照
} catch {
    Send-MailMessage -To "[email protected]" -Subject "快照创建失败" -Body $_.Exception.Message
}

这样,出错时自动报警,比半夜被电话吵醒要舒服多了。

CLI脚本对比

用Azure CLI写的话,脚本更简洁。例如:

#!/bin/bash

RESOURCE_GROUP="MyResourceGroup"
RETENTION_DAYS=7
DATE=$(date +%Y%m%d%H%M%S)

# 登录Azure(需提前配置CLI)
az login --service-principal -u $APP_ID -p $PASSWORD --tenant $TENANT_ID

VM_LIST=$(az vm list -g $RESOURCE_GROUP --query "[].name" -o tsv)

for vm in $VM_LIST; do
    DISK_NAME=$(az vm show -g $RESOURCE_GROUP -n $vm --query "storageProfile.osDisk.name" -o tsv)
    SNAPSHOT_NAME="${vm}-snapshot-${DATE}"

    # 创建快照
    az snapshot create -g $RESOURCE_GROUP -n $SNAPSHOT_NAME --source $DISK_NAME --location $(az vm show -g $RESOURCE_GROUP -n $vm --query location -o tsv)

    # 清理旧快照
    OLD_SNAPSHOTS=$(az snapshot list -g $RESOURCE_GROUP --query "[?timeCreated < '$(date -d "$RETENTION_DAYS days ago" +%Y-%m-%dT%H:%M:%SZ)'].name" -o tsv)
    for old in $OLD_SNAPSHOTS; do
        if [[ $old == *"${vm}-snapshot-"* ]]; then
            az snapshot delete -g $RESOURCE_GROUP -n $old --yes
        fi
    done
done

CLI脚本适合Linux环境,但要注意时间格式的转换。比如,date -d "$RETENTION_DAYS days ago" +%Y-%m-%dT%H:%M:%SZ 在某些系统可能需要调整。不过,CLI的好处是跨平台,Mac或Linux都能跑。

自动化调度方案

脚本写好了,怎么让它自动运行呢?Azure Automation是首选。在Azure门户创建Automation账户,然后新建Runbook,选择PowerShell类型,粘贴脚本内容。接着设置计划,比如每天凌晨2点执行。这样,你可以在睡梦中完成备份,醒来查看日志确认是否成功。

如果你不想用Azure Automation,也可以在Linux VM上配置cron任务。比如,将脚本保存为backup.sh,然后用crontab -e添加:

0 2 * * * /usr/bin/bash /path/to/backup.sh

这样每天2点自动执行。不过要注意,VM必须一直运行,否则任务不会执行。对于关键业务,还是建议用Azure Automation,它更可靠。

常见问题与避坑指南

Q1:快照创建失败,提示权限不足?

微软云代充值 A:检查服务主体是否被赋予正确的角色。建议用自定义角色,仅包含compute/snapshots/write和delete权限。另外,确认脚本中指定的资源组是否存在。

Q2:快照名称重复导致创建失败?

A:时间戳格式要规范。比如用%Y%m%d%H%M%S,确保精确到秒。如果脚本在1秒内运行多次,可能会冲突,所以建议每分钟最多运行一次。

Q3:误删了正在使用的快照?

A:在删除前增加条件判断,例如只删除名称包含特定前缀的快照。或者,将快照存到单独的资源组,避免和其他资源混淆。

Q4:如何验证备份是否成功?

A:脚本中添加检查步骤,创建快照后立即验证是否存在。例如:

if (Get-AzSnapshot -ResourceGroupName $resourceGroup -SnapshotName $snapshotName) {
    Write-Host "快照 $snapshotName 创建成功"
} else {
    Write-Error "快照创建失败"
}

结语:自动化带来的效率革命

自动快照脚本看似简单,却能彻底改变你的运维节奏。当你不再为手动备份焦头烂额,就能把精力放在更有价值的事情上——比如优化系统架构、学习新技术,甚至多喝两杯咖啡。记住,好的自动化不是取代人,而是让人从重复劳动中解放出来,专注于真正的创新。所以,赶紧行动起来吧,用脚本为你的数据筑起一道安全防线,让运维工作从此变得优雅而从容。

Telegram售前客服
客服ID
@cloudcup
联系
Telegram售后客服
客服ID
@yanhuacloud
联系