Azure VM Image Builder Service DevOps 작업(미리 보기)

적용 대상: ✔️ Linux VM ✔️ 유연한 확장 집합

이 문서에서는 애플리케이션과 운영 체제를 설치하고 구성할 수 있도록 Azure DevOps 작업을 사용하여 VM(가상 머신) 이미지에 빌드 아티팩트를 넣는 방법을 보여줍니다.

DevOps 작업 버전

현재 다음과 같은 두 가지 Azure VM Image Builder DevOps 작업이 있습니다.

사전 요구 사항

참고

VM Image Builder 작업은 현재 Windows 다시 시작 또는 관리자 권한 명령 실행을 지원하지 않습니다. 즉, 이 작업은 Azure Virtual Desktop 시나리오 또는 이러한 기능이 필요한 Windows 사용자 지정에 적합하지 않습니다. VM Image Builder에서 DevOps를 사용하려면 템플릿을 Azure Resource Manager 작업 내에 중첩하고, Azure CLI 또는 PowerShell 작업을 사용해야 합니다.

시작하기 전에 다음을 수행해야 합니다.

  • Visual Studio Marketplace에서 안정적 DevOps 작업을 설치합니다.

  • Azure DevOps Services(이전에는 VSTS(Visual Studio Team Services)) 계정과 빌드 파이프라인을 만듭니다.

  • 파이프라인에서 사용하는 구독에서 VM Image Builder 기능 요구 사항을 등록하고 사용하도록 설정합니다.

  • 원본 이미지 리소스 그룹에 표준 Azure 스토리지 계정을 만듭니다. 다른 리소스 그룹 또는 스토리지 계정을 사용해도 됩니다. 스토리지 계정은 DevOps 작업에서 이미지로 빌드 아티팩트를 전송하는 데 사용됩니다.

    # Azure PowerShell
    $timeInt=$(get-date -UFormat "%s")
    $storageAccName="aibstorage"+$timeInt
    $location=westus
    # Create a storage account and blob in the resource group
    New-AzStorageAccount -ResourceGroupName $strResourceGroup -Name $storageAccName -Location $location -SkuName Standard_LRS
    
    # The Azure CLI
    location=westus
    scriptStorageAcc=aibstordot$(date +'%s')
    # Create a storage account and blob in the resource group
    az storage account create -n $scriptStorageAcc -g $strResourceGroup -l $location --sku Standard_LRS
    

릴리스 파이프라인에 작업 추가

  1. 릴리스 파이프라인>편집을 선택합니다.

  2. [사용자 에이전트]에서 더하기 기호(+)를 선택하여 Image Builder를 추가하고 검색합니다.

  3. 추가를 선택합니다.

다음 섹션에서는 작업 속성을 설정합니다.

Azure 구독

드롭다운 목록에서 VM Image Builder를 실행할 구독을 선택합니다. 원본 이미지가 저장되어 있고 이미지를 배포할 동일한 구독을 사용합니다. 구독 또는 리소스 그룹에 대한 VM Image Builder 기여자 액세스 권한을 부여해야 합니다.

Resource group

임시 이미지 템플릿 아티팩트가 저장될 리소스 그룹을 사용합니다. 템플릿 아티팩트를 만들 때 또 다른 임시 VM Image Builder 리소스 그룹 IT_<DestinationResourceGroup>_<TemplateName>_guid이 만들어집니다. 임시 리소스 그룹은 스크립트와 같은 이미지 메타데이터를 저장합니다. 작업이 끝나면 이미지 템플릿 아티팩트와 임시 VM Image Builder 리소스 그룹이 삭제됩니다.

위치

위치는 VM Image Builder가 실행될 지역입니다. 설정된 수의 지역만 지원됩니다. 원본 이미지가 이 위치에 있어야 합니다. 예를 들어 Azure Compute Gallery(이전에는 Shared Image Gallery)를 사용하는 경우 해당 지역에 복제본이 있어야 합니다.

관리 ID(필수)

VM Image Builder를 사용하려면 원본 사용자 지정 이미지를 읽고, Azure Storage에 연결하고, 사용자 지정 이미지를 만드는 데 사용하는 관리 ID가 필요합니다. 자세한 내용은 VM Image Builder 정보를 참조하세요.

가상 네트워크 지원

만든 VM이 특정 가상 네트워크에 있도록 구성할 수 있습니다. 작업을 구성할 때 VNet 구성(선택 사항) 입력 필드에 기존 서브넷의 리소스 ID를 입력합니다. 특정 가상 네트워크를 사용할 필요가 없는 경우 리소스 ID를 생략합니다. 자세한 내용은 Azure VM Image Builder 서비스 네트워킹 옵션을 참조하세요.

원본

원본 이미지는 지원되는 VM Image Builder 운영 체제 이미지여야 합니다. VM Image Builder가 실행 중인 지역과 동일한 지역에서 기존 사용자 지정 이미지를 선택할 수 있습니다.

  • 관리되는 이미지: 리소스 ID를 전달합니다. 다음은 그 예입니다.

    /subscriptions/<subscriptionID>/resourceGroups/<rgName>/providers/Microsoft.Compute/images/<imageName>
    
  • Compute Gallery: 이미지 버전의 리소스 ID를 전달합니다. 다음은 그 예입니다.

    /subscriptions/$subscriptionID/resourceGroups/$sigResourceGroup/providers/Microsoft.Compute/galleries/$sigName/images/$imageDefName/versions/<versionNumber>
    

    최신 Compute Gallery 버전을 받아야 하는 경우 Azure PowerShell 또는 Azure CLI 작업을 사용하여 최신 버전을 받고 DevOps 변수를 설정합니다. VM Image Builder DevOps 작업에서 이 변수를 사용합니다. 자세한 내용은 최신 이미지 버전 리소스 ID 받기의 예제를 참조하세요.

  • (Marketplace) 기본 이미지: 언제나 지원되는 최신 버전의 운영 체제를 사용하는 인기 있는 이미지의 드롭다운 목록을 사용합니다.

    기본 이미지가 목록에 없는 경우 Publisher:Offer:Sku를 사용하여 정확한 이미지를 지정할 수 있습니다.

    (선택 사항) 기본 이미지 버전: 사용할 이미지 버전을 입력할 수 있습니다. 기본 버전은 latest입니다.

사용자 지정

다음 섹션에서는 작업을 사용자 지정하는 다양한 방법을 설명합니다.

프로비저닝 프로그램

처음에는 두 가지 사용자 지정자 Shell 및 PowerShell이 지원됩니다. 인라인만 지원됩니다. 스크립트를 다운로드하려는 경우 인라인 명령을 전달하면 됩니다.

운영 체제의 경우 PowerShell 또는 Shell을 선택합니다.

Windows 업데이트 작업

Windows의 경우에만 사용자 지정이 끝날 때 작업이 Windows 업데이트를 실행합니다. 또한 필요한 재부팅을 처리합니다.

이 작업은 다음 Windows 업데이트 구성을 실행합니다.

    "type": "WindowsUpdate",
    "searchCriteria": "IsInstalled=0",
    "filters": [
        "exclude:$_.Title -like '*Preview*'",
        "include:$true"

이 작업은 미리 보기 버전이 아닌 중요한 권장 Windows 업데이트를 설치합니다.

다시 부팅 처리

DevOps 작업은 현재 Windows 빌드 다시 부팅을 지원하지 않습니다. PowerShell 코드를 사용하여 다시 부팅하려고 하면 빌드가 실패합니다. 그러나 코드를 사용하여 Linux 빌드를 다시 부팅할 수 있습니다.

빌드 경로

이 작업은 이미지에 DevOps 빌드 릴리스 아티팩트를 넣을 수 있도록 설계되었습니다. 이를 위해서는 빌드 파이프라인을 설정해야 합니다. 릴리스 파이프라인 설정에서 빌드 아티팩트의 리포지토리를 추가합니다.

릴리스 파이프라인에서 아티팩트를 추가하는 방법을 보여주는 스크린샷

빌드 경로 단추를 선택하여 이미지에 배치할 빌드 폴더를 선택합니다. VM Image Builder 작업은 그 안에 있는 모든 파일과 디렉터리를 복사합니다. 이미지가 만들어질 때 VM Image Builder는 운영 체제에 따라 다른 경로에 파일과 디렉터리를 배포합니다.

중요

리포지토리 아티팩트를 추가할 때 디렉터리 이름 앞에 밑줄 문자(_)가 추가될 수 있습니다. 밑줄은 인라인 명령 문제를 일으킬 수 있습니다. 명령에서 따옴표를 적절하게 사용해야 합니다.

다음 예제는 이것이 어떻게 작동하는지 설명합니다.

계층 구조를 보여주는 디렉터리 구조의 스크린샷

  • Windows: 파일이 C: 드라이브에 있습니다. webapp 디렉터리를 포함하는 buildArtifacts라는 디렉터리가 만들어집니다.

  • Linux: 파일이 /tmp 디렉터리에 있습니다. 모든 파일과 디렉터리를 포함하는 webapp 디렉터리가 만들어집니다. 이 디렉터리는 임시 디렉터리이므로 파일을 외부로 이동해야 합니다. 그렇지 않으면 파일이 삭제됩니다.

인라인 사용자 지정 스크립트

  • Windows: 쉼표로 구분된 PowerShell 인라인 명령을 입력할 수 있습니다. 빌드 디렉터리에서 스크립트를 실행하려는 경우 다음을 사용할 수 있습니다.

    & 'c:\buildArtifacts\webapp\webconfig.ps1'
    

    여러 스크립트를 참조하거나 더 많은 명령을 추가할 수 있습니다. 다음은 그 예입니다.

    & 'c:\buildArtifacts\webapp\webconfig.ps1'
    & 'c:\buildArtifacts\webapp\installAgent.ps1'
    
  • Linux: 빌드 아티팩트가 /tmp 디렉터리에 배치됩니다. 그러나 여러 Linux 운영 체제에서 다시 부팅할 때 /tmp 디렉터리 콘텐츠가 삭제됩니다. 이미지에 아티팩트가 존재하도록 하려면 다른 디렉터리를 만들고 아티팩트를 복사해야 합니다. 예를 들어 다음과 같은 가치를 제공해야 합니다.

    sudo mkdir /lib/buildArtifacts
    sudo cp -r "/tmp/_ImageBuilding/webapp" /lib/buildArtifacts/.
    

    /tmp 디렉터리를 사용하는 것이 괜찮으면 다음 코드를 사용하여 스크립트를 실행할 수 있습니다.

    # Grant execute permissions to run scripts
    sudo chmod +x "/tmp/_ImageBuilding/webapp/coreConfig.sh"
    echo "running script"
    sudo . "/tmp/AppsAndImageBuilderLinux/_WebApp/coreConfig.sh"
    

이미지 빌드 후 빌드 아티팩트는 어떻게 되나요?

참고

VM Image Builder는 빌드 아티팩트를 자동으로 제거하지 않습니다. 항상 코드를 사용하여 빌드 아티팩트를 제거하는 것이 좋습니다.

  • Windows: VM Image Builder는 C:\buildArtifacts 디렉터리에 파일을 배포합니다. 이 디렉터리는 지속되므로 스크립트를 실행하여 제거해야 합니다. 다음은 그 예입니다.

    # Clean up buildArtifacts directory
    Remove-Item -Path "C:\buildArtifacts\*" -Force -Recurse
    
    # Delete the buildArtifacts directory
    Remove-Item -Path "C:\buildArtifacts" -Force 
    
  • Linux: 빌드 아티팩트가 /tmp 디렉터리에 배치됩니다. 그러나 여러 Linux 운영 체제에서 다시 부팅할 때 /tmp 디렉터리 콘텐츠가 삭제됩니다. 운영 체제에서 콘텐츠를 제거할 것으로 기대하지 말고 코드를 사용하여 콘텐츠를 제거하는 것이 좋습니다. 예를 들어 다음과 같은 가치를 제공해야 합니다.

    sudo rm -R "/tmp/AppsAndImageBuilderLinux"
    

이미지 빌드의 총 길이

아직 DevOps 파이프라인 작업에서 총 길이를 변경할 수 없습니다. 기본값인 240분이 사용됩니다. buildTimeoutInMinutes를 늘리려는 경우 릴리스 파이프라인에서 Azure CLI 작업을 사용하면 됩니다. 템플릿을 복사하고 제출하도록 작업을 구성합니다. 예제 솔루션은 VM Image Builder에서 환경 변수 및 매개 변수 사용을 참조하거나 Azure PowerShell을 사용하세요.

스토리지 계정

사전 요구 사항에서 만든 스토리지 계정을 선택합니다. 스토리지 계정이 목록에 없으면 VM Image Builder에는 스토리지 계정에 대한 권한이 없는 것입니다.

빌드가 시작되면 VM Image Builder는 리포지토리의 빌드 아티팩트가 저장되는 imagebuilder-vststask라는 컨테이너를 만듭니다.

참고

각 빌드 후 스토리지 계정 또는 컨테이너를 수동으로 삭제해야 합니다.

배포

다음 세 가지 배포 유형이 지원됩니다.

관리형 이미지

  • 리소스 ID:

    /subscriptions/<subscriptionID>/resourceGroups/<rgName>/providers/Microsoft.Compute/images/<imageName>
    
  • 위치

Compute Gallery는 이미 있어야 합니다.

  • 리소스 ID:

    /subscriptions/<subscriptionID>/resourceGroups/<rgName>/providers/Microsoft.Compute/galleries/<galleryName>/images/<imageDefName>
    
  • 지역: 쉼표로 구분된 지역 목록입니다. 예: westus, eastus, centralus.

가상 하드 디스크

이 값은 전달할 수 없습니다. VM Image Builder는 vhds 컨테이너의 임시 VM Image Builder 리소스 그룹 IT_<DestinationResourceGroup>_<TemplateName>에 가상 하드 디스크 VHD를 내보냅니다. 릴리스 빌드를 시작하면 VM Image Builder가 로그를 내보냅니다. VM Image Builder는 모든 작업이 완료되면 VHD URL을 내보냅니다.

선택적 설정

VM 크기 설정을 기본값 Standard_D1_v2에서 다른 값으로 재정의할 수 있습니다. 이렇게 하여 총 사용자 지정 시간을 줄일 수 있습니다. 또는 GPU(그래픽 처리 장치), HPC(고성능 컴퓨팅) 등과 같은 특정 VM 크기를 사용하는 이미지를 만들 수 있습니다.

작업 작동 방식

릴리스를 만들면 스토리지 계정에 imagebuilder-vststask라는 컨테이너가 만들어집니다. 작업에서는 빌드 아티팩트를 압축 및 업로드하고 zip 파일에 대한 공유 액세스 서명 토큰을 만듭니다.

작업에서는 작업에 전달된 속성을 사용하여 VM Image Builder 템플릿 아티팩트를 만듭니다. 작업은 다음을 수행합니다.

  • 빌드 아티팩트 zip 파일과 기타 관련 스크립트를 다운로드합니다. 이 파일은 임시 VM Image Builder 리소스 그룹 IT_<DestinationResourceGroup>_<TemplateName>의 스토리지 계정에 저장됩니다.

  • 그리고 t_ 접두사가 붙은 템플릿과 10자리 단조 정수를 만듭니다. 템플릿은 선택한 리소스 그룹에 저장되며, 빌드 기간 동안 리소스 그룹에 있습니다.

예제 출력:

start reading task parameters...
found build at:  /home/vsts/work/r1/a/_ImageBuilding/webapp
end reading parameters
getting storage account details for aibstordot1556933914
created archive /home/vsts/work/_temp/temp_web_package_21475337782320203.zip
Source for image:  { type: 'SharedImageVersion',
  imageVersionId: '/subscriptions/<subscriptionID>/resourceGroups/<rgName>/providers/Microsoft.Compute/galleries/<galleryName>/images/<imageDefName>/versions/<imgVersionNumber>' }
template name:  t_1556938436xxx
starting put template...

이미지 빌드가 시작되면 릴리스 로그에 실행 상태가 보고됩니다.

starting run template...

이미지 빌드가 완료되면 다음 텍스트와 유사한 출력이 표시됩니다.

2019-05-06T12:49:52.0558229Z starting run template...
2019-05-06T13:36:33.8863094Z run template:  Succeeded
2019-05-06T13:36:33.8867768Z getting runOutput for  SharedImage_distribute
2019-05-06T13:36:34.6652541Z ==============================================================================
2019-05-06T13:36:34.6652925Z ## task output variables ##
2019-05-06T13:36:34.6658728Z $(imageUri) =  /subscriptions/<subscriptionID>/resourceGroups/aibwinsig/providers/Microsoft.Compute/galleries/my22stSIG/images/winWAppimages/versions/0.23760.13763
2019-05-06T13:36:34.6659989Z ==============================================================================
2019-05-06T13:36:34.6663500Z deleting template t_1557146959485...
2019-05-06T13:36:34.6673713Z deleting storage blob imagebuilder-vststask\webapp/18-1/webapp_1557146958741.zip
2019-05-06T13:36:34.9786039Z blob imagebuilder-vststask\webapp/18-1/webapp_1557146958741.zip is deleted
2019-05-06T13:38:37.4884068Z delete template:  Succeeded

이미지 템플릿과 IT_<DestinationResourceGroup>_<TemplateName>이 삭제됩니다.

$(imageUri) Azure DevOps Services(이전에는 VSTS(Visual Studio Team Services)) 변수를 가져와서 다음 작업에서 사용할 수도 있고 값을 사용하고 VM을 빌드할 수도 있습니다.

DevOps 변수 출력

다음은 원본 마켓플레이스 이미지의 게시자, 제품, SKU 및 버전입니다.

  • $(pirPublisher)
  • $(pirOffer)
  • $(pirSku)
  • $(pirVersion)

다음은 분산 이미지의 리소스 ID인 이미지 URI입니다.

  • $(imageUri)

FAQ

이미 만든 기존 이미지 템플릿을 DevOps 외부에서 사용할 수 있나요?

지금은 없습니다.

이미지 템플릿 이름을 지정할 수 있나요?

아니요. 고유 템플릿 이름이 사용되고 삭제됩니다.

VM Image Builder 작업이 실패했습니다. 이 문제를 어떻게 해결하나요?

빌드 오류가 발생하는 경우 DevOps 작업은 준비 리소스 그룹을 삭제하지 않습니다. 빌드 사용자 지정 로그가 포함된 준비 리소스 그룹에 액세스할 수 있습니다.

VM Image Builder 작업에 대한 DevOps 로그에 오류가 표시되고, 메시지에 customization.log 위치 정보가 포함됩니다. 다음은 그 예입니다.

오류에 대해 설명하고 customization.log 파일의 위치 정보를 제공하는 DevOps 작업 오류의 스크린샷

자세한 내용은 VM Image Builder 서비스 문제 해결을 참조하세요.

오류를 조사한 후에는 준비 리소스 그룹을 삭제해도 됩니다. 먼저 VM Image Builder 템플릿 리소스 아티팩트를 삭제합니다. 아티팩트에는 t_ 접두사가 붙으며, DevOps 작업 빌드 로그에서 찾을 수 있습니다.

...
Source for image:  { type: 'SharedImageVersion',
  imageVersionId: '/subscriptions/<subscriptionID>/resourceGroups/<rgName>/providers/Microsoft.Compute/galleries/<galleryName>/images/<imageDefName>/versions/<imgVersionNumber>' }
...
template name:  t_1556938436xxx
...

VM Image Builder 템플릿 리소스 아티팩트는 처음에 작업에서 지정한 리소스 그룹에 있습니다. 문제 해결이 완료되면 아티팩트를 삭제합니다. Azure Portal을 사용하여 삭제하는 경우 리소스 그룹 내에서 숨겨진 형식 표시를 선택하여 아티팩트를 표시합니다.

다음 단계

자세한 내용은 VM Image Builder 개요를 참조하세요.