azure - 在管道中使用 PowerShell 任务 Sysprep Azure VM

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

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

我知道我可以手动 RDP 进入虚拟机(再次)和 sysprep(使用 oobe/generalize/shutdown),然后也许返回到 Azure 门户并磁盘导出操作系统磁盘(指定SAS URL 过期时间任意(每篇文章 36000))但这一切都可以自动化吗?

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

最佳答案

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

您需要的内容是:

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

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

2 - 在虚拟机上调用它:

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

关于azure - 在管道中使用 PowerShell 任务 Sysprep Azure VM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59908086/

相关文章:

azure-devops - 以前的 Azure Pipeline 构建中的预定义变量

AKS 中的 Azure Functions HttpTrigger 键

c# - 运行 powershell 脚本时云无法加载文件或程序集 'System.Management.Automation'

azure-devops - VSTS 版本 : NuGet Publisher Step Fails

deployment - 无论错误如何,都使用 capistrano 执行代码

continuous-integration - 快照和发布存储库的使用方式有何不同?

gatsby - Netlify 部署抛出 : Error: Invalid version: “1”

c# - 应该在哪里实例化NotificationHubClient?

powershell - 使用 PowerShell 从 Azure 存储帐户中删除超过 3 个月的表

git - 以编程方式查询托管在 TFS 上的 Git 存储库的权限