在管道中使用PowerShell任务对Azure VM进行系统准备

时间:2020-01-25 09:42:02

标签: azure azure-devops continuous-deployment azure-virtual-machine sysprep

我的(dotNET)应用程序是通过构建管道构建的(使用Windows Hosted代理),在随后的Release管道中,我预配置了16GB-Win2016 VM(启用RDP,HTTP,HTTPS,WinRM和SSH),我将其手动放入RDP中(这里有一个手动干预任务),并配置WinRM(本文之后:https://docs.microsoft.com/en-us/azure/marketplace/cloud-partner-portal/virtual-machine/cpp-configure-winrm-after-vm-creation#configure-vm-to-enable-winrm)。一切都很好,直到这里。下一个任务是Azure文件复制任务,该任务实质上是复制Build构件(来自$(System.DefaultWorkingDirectory))并粘贴到我指定的目录中。奇迹般有效。我的下一个任务是创建整个VM的VHD(基本上是在复制完成之后)。

我知道我可以再次手动将RDP导入VM和sysprep(使用oobe / generalize / shutdown),然后也许返回Azure门户并磁盘导出OS磁盘(指定SAS URL到期时间如何(每篇文章36000条),但是这一切可以自动化吗?

长话短说-我想知道sysprep oobe/generalize/shutdown是否可以最好通过PS任务远程执行。我知道它的另一部分(导出磁盘和全部磁盘)可以,但是如果sysprep可以远程完成,那么就什么也没有。

4 个答案:

答案 0 :(得分:1)

我尝试了这个,然后得到了我想要的东西:

$sysprep= 'C:\Windows\System32\Sysprep\Sysprep.exe'
$arg1 = '/generalize'
$arg2 = '/oobe'
$arg3 = '/shutdown'
$arg4 = '/quiet'

& $sysprep $arg1 $arg2 $arg3 $arg4 -Wait

答案 1 :(得分:0)

因此,您不必手动配置winrm,可以在配置虚拟机时对其进行脚本\配置。并且,如果\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\,

Invoke-Command -ComputerName dnsname\ipaddress_goes_hehe
    -ScriptBlock { sysprep /shutdown /generalise}

https://github.com/Azure/azure-quickstart-templates/tree/master/201-vm-winrm-windows

答案 2 :(得分:0)

您可以使用Azure自定义脚本扩展来实现此目的。有一个github项目: https://github.com/jlongo62/AzureVMToImage包含用于镜像VM的powershell脚本。这些脚本旨在在创建映像时保留VM,而不是销毁原始VM。可以从Azure Devops调用脚本。无需针对VM进行身份验证。

您所需要的是:

1-创建一个包含以下脚本的storageaccount blob(-Wait非常重要):

Start-Process -FilePath C:\Windows\System32\Sysprep\Sysprep.exe -ArgumentList '/generalize /oobe /quiet /quit'  -Wait 

2-在VM上调用它:

$response = Set-AzureRmVMCustomScriptExtension  `
                -ResourceGroupName  $vm.ResourceGroupName `
                -VMName $vm.Name `
                -Location $vm.Location `
                -Name $ExtensionName  `
                -FileUri $blobUri  `
                -Run $FileName 

答案 3 :(得分:0)

确保不使用Azure自定义脚本扩展来运行sysprep。

Azure脚本在LocalSystem用户上下文中运行:source

自定义脚本扩展将在LocalSystem帐户下运行

这是有问题的,因为sysprep不支持在系统用户上下文中运行:source

Sysprep无法在系统帐户的上下文中运行。例如,不支持使用任务计划程序或PSExec在系统帐户的上下文中运行Sysprep。

提供这一点,以便人们避免我的错误:)