반응형
728x90
일반화 이미지 생성을 목적으로 VM에서 Capture 진행 (사전에 Guest OS에서 sysprep사용하지 않음)
guest os 에서 sysprep 을 진행하고 캡처로 이미지를 만들어야 이미지로 생성되는 VM이 정상 배포 됩니다.
sysprep진행하지 않은 이미지로 VM을 생성하면 정상배포되는것 처럼 보이지만 아래와 같은 오류가 발생합니다.
반응형
Deployment failed. Correlation ID: 0e1a6337-5a79-4a08-b6f3-be2a80182c59. {
"status": "Failed",
"error": {
"code": "ResourceDeploymentFailure",
"message": "The resource operation completed with terminal provisioning state 'Failed'.",
"details": [
{
"code": "OSProvisioningClientError",
"message": "OS Provisioning for VM 'testVM' did not finish in the allotted time. However, the VM guest agent was detected running. This suggests the guest OS has not been properly prepared
to be used as a VM image (with CreateOption=FromImage). To resolve this issue, either use the VHD as is with CreateOption=Attach or prepare it properly for use as an image:\r\n * Instructions for Windows: https://azure.microsoft.com/documentation/articles/virtual-machines-windows-upload-image/ \r\n * Instructions for Linux: https://azure.microsoft.com/documentation/articles/virtual-machines-linux-capture-image/ "
}
]
}
}
이미지 생성을 테스트 해보며 느낀 이미지 생성 단계를 나누어 보면
-
GueatOS의 일반화
-
VM에 마킹 (일반화된 VM인지, 특수화된 VM인지)
-
이미지 생성 (VM Capture)
위 처럼 총 세 가지 과정이 필요합니다.
다만 2번 과정은 생략될 수 있고, 생략된 경우 3번 VM Capture단계에서 선택(일반화된, 특수화된) 하게 됩니다.
DataDisk가 있는 VM을 이미지로 만들고 해당 이미지로 VM을 생성하면 별도의 데이터 디스크를 추가 하지 않더라도 자동으로 DataDisk가 생성됩니다.
물론 데이터도 보존되어 있습니다.
다만 일반화 타입의 이미지경우 가상머신의 모든 디스크 합이 1TB를 넘으면 이미지로 만들 수 없습니다.
이 때 자동으로 생성되는 DataDisk의 이름은 지정할 수 없고, 이름에 random string이 추가 됩니다.
이를 회피 해보고자
-
데이터 디스크를 먼저 생성 하고,
-
--attach-data-disk옵션으로 미리 만든 디스크를 붙이면서
-
가상머신을 생성하면... 혹시라도...
아래 스크립트 처럼 미리 만든 디스크를 attach 하면서 VM을 생성하면
아래 이미지 처럼 image에 포함된 datadisk와 attach했던 datadisk가 함께 붙어 있습니다.
이미지로 가상머신을 만들 때 특정 이미지 버전을 지칭하지 않으면 해당 이미지 정의의 최신 버전으로 가상머신이 생성됩니다.
"/subscriptions/4c3e8c6f-e570-448b-82c5-1507cb59d0b5/resourceGroups/rgShared/providers/Microsoft.Compute/galleries/Gallery/images/imgLoginServer/versions/1.0.1"
or
"/subscriptions/4c3e8c6f-e570-448b-82c5-1507cb59d0b5/resourceGroups/rgShared/providers/Microsoft.Compute/galleries/Gallery/images/imgLoginServer"
원본 가상머신에서 설정한 내용이 (일반화된)이미지로 만든 가상머신에 그대로 있는지 확인
테스트로 아래와 같은 설정을 한 VM을 기준으로 이미지를 생성 했습니다.
-
DataDisk Attach
-
Local Group Policy
-
SCONFIG
-
Firewall Rule
위 에서 생성한 이미지를 기준으로 VM을 생성 했을 때 누락되는 항목이 발견되었습니다.
(본 테스트 에서는 SCONFIG 설정이 누락되었습니다.)
이미지를 기준으로 VM을 생성하더라도 100% 동일한 가상머신이 생성되지는 않는것으로 보여집니다.
(이미지 만들 때마다 확인 필요)
기본 가상머신에서의 설정
이미지로 생성한 가상머신의 설정확인
테스트에 사용한 스크립트
$location = "eastus"
$rgName = "rgShared"
$galleryName = "Gallery"
$galleryImageDefName = "imgLoginServer"
$originVmName = "vmSample"
$genVmName = "vmGenTest"
#az sig image-definition list --resource-group $rgName --gallery-name $galleryName --query "[].[name, id]" --output tsv
#az sig image-definition list --resource-group $rgName --gallery-name $galleryName
#$imgLogin = "/subscriptions/4c3e8c6f-e570-448b-82c5-1507cb59d0b5/resourceGroups/rgShared/providers/Microsoft.Compute/galleries/Gallery/images/imgLoginServer/versions/1.0.1"
#$imgLogin = "/subscriptions/4c3e8c6f-e570-448b-82c5-1507cb59d0b5/resourceGroups/rgShared/providers/Microsoft.Compute/galleries/Gallery/images/imgLoginServer"
# https://docs.microsoft.com/ko-kr/azure/virtual-machines/generalize
# 1. sysprep
# cd %windir%\system32\sysprep
# sysprep
# 2. vm generalize marking
# 일반화 마킹 하지 않아도 이미지 기반으로 vm생성 잘 되네.
# 반대로 sysprep하지 않고 일반화 마킹만 해도 정상이려나? 이건 안되네
az vm generalize --resource-group $rgName --name $originVmName
# 3. vm capture
# 4. create vm from shared image
$imgDefs = @(az sig image-definition list --resource-group $rgName --gallery-name $galleryName --output json | ConvertFrom-Json)
$imgDefDic = New-Object 'system.collections.generic.Dictionary[String, String]'
foreach ($def in $imgDefs) {
$imgDefDic.Add($def.name, $def.id)
}
$imgDefId = $imgDefDic[$galleryImageDefName]
az vm create -l $location -g $rgName -n $genVmName --size "Standard_f2s_v2" --image $imgDefId --admin-username "rapker" --admin-password "zmffnzjtm12!@"
<#
# 일괄배포 테스트
$vmList =@(
[PSCustomObject]@{Location="eastus"; RgName="rgEastUS"; VmName="vm-test1"; VmSize="Standard_f2s_v2"},
[PSCustomObject]@{Location="westus"; RgName="rgWestUS"; VmName="vm-test1"; VmSize="Standard_f2s_v2"},
[PSCustomObject]@{Location="southcentralus"; RgName="rgSouthCentralUS"; VmName="vm-test1"; VmSize="Standard_f2s_v2"},
[PSCustomObject]@{Location="westcentralus"; RgName="rgWestCentralUS"; VmName="vm-test1"; VmSize="Standard_d2s_v3"},
[PSCustomObject]@{Location="francecentral"; RgName="rgFranceCentral"; VmName="vm-test1"; VmSize="Standard_f2s_v2"},
[PSCustomObject]@{Location="germanywestcentral"; RgName="rgGermanyWestCentral"; VmName="vm-test1"; VmSize="Standard_f2s_v2"},
[PSCustomObject]@{Location="southeastasia"; RgName="rgSouthEastAsia"; VmName="vm-test1"; VmSize="Standard_f2s_v2"},
[PSCustomObject]@{Location="koreacentral"; RgName="rgKoreaCentral"; VmName="vm-test1"; VmSize="Standard_f2s_v2"}
)
$vmList | ForEach-Object -Parallel {
$imgDefId = $using:imgDefId
az group create -l $_.Location -n $_.RgName
az vm create -l eastus -g $_.RgName -n $_.VmName --size $_.VmSize --image $imgDefId --admin-username "rapker" --admin-password "zmffnzjtm12!@"
} -ThrottleLimit 20
#>
<#
# 데이터 디스크 Attach 테스트
$dataDiskName = $genVmName + "_DataDisk_0"
az disk create -g $rgName -n $dataDiskName -l $location --size-gb 256 --sku "Premium_LRS"
az vm create -l $location -g $rgName -n $genVmName --size "Standard_f2s_v2" --attach-data-disks $dataDiskName --image $imgDefId --admin-username "rapker" --admin-password "zmffnzjtm12!@"
#>
# az vm run-command invoke -g $rgName -n "vmBase" --command-id RunPowerShellScript --scripts "@C:\change_rdp_port.ps1"
반응형
LIST
'IT > Azure' 카테고리의 다른 글
Windows RDP Port 변경 (0) | 2023.04.29 |
---|---|
Azure Patch Orchestration (패치 오케스트레이션) (0) | 2023.04.29 |
AzureAD로 VM에 로그인 (0) | 2023.04.29 |
Windows 10 한국어 언어팩 설치 (0) | 2023.04.29 |
GPU VM 확인하는법 (0) | 2023.04.29 |