在管道中使用 PowerShell 任务对 Azure VM 进行 Sysprep
Sysprep an Azure VM using PowerShell task in a pipeline
我的 (dotNET) 应用程序是通过构建管道构建的(使用 Windows 托管代理),在随后的发布管道中,我提供了一个 16GB-Win2016 VM(启用 RDP、HTTP、HTT PS、WinRM和SSH),我手动RDP进去(这里有一个Manual Intervention任务),然后配置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 文件复制任务,它实质上是复制构建工件(来自 $(System.DefaultWorkingDirectory)
)并粘贴到我指定的目录中。奇迹般有效。我的下一个任务是创建整个 VM 的 VHD(基本上在复制完成后)。
我知道我可以手动 RDP(再次)和 sysprep
(使用 oobe/generalize/shutdown),然后返回到 Azure 门户和磁盘导出 OS 磁盘(指定 SAS URL 到期时间(每篇文章 36000))但是这一切都可以自动化吗?
所以,长话短说 - 我想知道 sysprep oobe/generalize/shutdown
是否可以通过 PS 任务远程执行。我知道它的另一部分(导出磁盘和所有)可以,但如果 sysprep 可以远程完成,那就没有了。
因此,您不必手动配置 winrm,您可以在配置虚拟机时编写 it\configure 它的脚本。 if\when winrm 正在运行,您可以使用 powershell remoting 对虚拟机发出命令:
Invoke-Command -ComputerName dnsname\ipaddress_goes_hehe
-ScriptBlock { sysprep /shutdown /generalise}
https://github.com/Azure/azure-quickstart-templates/tree/master/201-vm-winrm-windows
您可以使用 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
我试过了,得到了我想要的:
$sysprep= 'C:\Windows\System32\Sysprep\Sysprep.exe'
$arg1 = '/generalize'
$arg2 = '/oobe'
$arg3 = '/shutdown'
$arg4 = '/quiet'
& $sysprep $arg1 $arg2 $arg3 $arg4 -Wait
确保您不使用 Azure 自定义脚本扩展 运行 sysprep。
本地系统用户上下文下的 Azure 脚本 运行:source
Custom Script Extension will run under the LocalSystem Account
这是有问题的,因为 sysprep 在系统用户上下文中不支持 运行ning:source
Sysprep cannot be run under the context of a System account. Running Sysprep under the context of System account by using Task Scheduler or PSExec, for example, is not supported.
提供这个是为了让人们避免我的错误:)
我的 (dotNET) 应用程序是通过构建管道构建的(使用 Windows 托管代理),在随后的发布管道中,我提供了一个 16GB-Win2016 VM(启用 RDP、HTTP、HTT PS、WinRM和SSH),我手动RDP进去(这里有一个Manual Intervention任务),然后配置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 文件复制任务,它实质上是复制构建工件(来自 $(System.DefaultWorkingDirectory)
)并粘贴到我指定的目录中。奇迹般有效。我的下一个任务是创建整个 VM 的 VHD(基本上在复制完成后)。
我知道我可以手动 RDP(再次)和 sysprep
(使用 oobe/generalize/shutdown),然后返回到 Azure 门户和磁盘导出 OS 磁盘(指定 SAS URL 到期时间(每篇文章 36000))但是这一切都可以自动化吗?
所以,长话短说 - 我想知道 sysprep oobe/generalize/shutdown
是否可以通过 PS 任务远程执行。我知道它的另一部分(导出磁盘和所有)可以,但如果 sysprep 可以远程完成,那就没有了。
因此,您不必手动配置 winrm,您可以在配置虚拟机时编写 it\configure 它的脚本。 if\when winrm 正在运行,您可以使用 powershell remoting 对虚拟机发出命令:
Invoke-Command -ComputerName dnsname\ipaddress_goes_hehe
-ScriptBlock { sysprep /shutdown /generalise}
https://github.com/Azure/azure-quickstart-templates/tree/master/201-vm-winrm-windows
您可以使用 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
我试过了,得到了我想要的:
$sysprep= 'C:\Windows\System32\Sysprep\Sysprep.exe'
$arg1 = '/generalize'
$arg2 = '/oobe'
$arg3 = '/shutdown'
$arg4 = '/quiet'
& $sysprep $arg1 $arg2 $arg3 $arg4 -Wait
确保您不使用 Azure 自定义脚本扩展 运行 sysprep。
本地系统用户上下文下的 Azure 脚本 运行:source
Custom Script Extension will run under the LocalSystem Account
这是有问题的,因为 sysprep 在系统用户上下文中不支持 运行ning:source
Sysprep cannot be run under the context of a System account. Running Sysprep under the context of System account by using Task Scheduler or PSExec, for example, is not supported.
提供这个是为了让人们避免我的错误:)