HCL2와 JSON 템플릿의 차이점

HCL2와 JSON 템플릿의 차이점 (Differences between HCL2 and JSON templates)

이 문서는 JSON 템플릿과 HCL2 템플릿의 차이점을 설명해요. JSON 템플릿을 HCL2로 변환하면 빌더, 프로비저너, 포스트-프로세서 동작에 어떤 영향이 있는지도 다루어요.

출처: Packer 공식 문서

본문

Introduction (소개)

Packer는 JSON 또는 HCL2 템플릿을 사용해서 하나 이상의 아티팩트에 대한 빌드를 조율해요.

레거시 JSON 템플릿에서는 이미지를 빌드하기 위해 일련의 빌더, 프로비저너, 포스트-프로세서를 선언해요.

HCL2 템플릿에서는 source를 통해 빌더를 지정하고 이를 build 블록에 모을 수 있어요.

기존 JSON 템플릿을 HCL2로 변환할 때는 packer hcl2_upgrade 커맨드를 사용할 수 있어요. 사용법에 대한 자세한 내용은 hcl2_upgrade 페이지를 참고하세요.

Builders (빌더)

빌더는 플랫폼에 특화된 구성 요소예요. 이들의 역할은 구성 템플릿에서 최종 이미지를 빌드할 수 있게 해 주는 단계의 토대를 마련하는 거예요.

JSON

JSON에서는 builders 속성이 빌더가 이미지를 빌드하기 위해 어떻게 호출될지 선언해요.

{
  "builders": [
    {
      "type": "null",
      "name": "test",
      "communicator": "none"
    }
  ]
}

HCL2

HCL2에서는 빌더가 source 블록을 통해 선언돼요. 소스만으로는 충분하지 않고 build 블록에서 호출되어야 해요. build 블록은 빈 이미지에서 완성된 이미지로 가기 위한 모든 단계(즉 source, provisioners, post-processors)의 컨테이너 역할을 해요.

source "null" "test" {
  communicator = "none"
}

build {
  sources = ["null.test"]
}

Provisioners (프로비저너)

프로비저너는 빌드 중인 머신 이미지의 상태를 수정하는 구성 요소예요. 패키지 설치, 원격 파일 시스템에 데이터 쓰기, 원격 커맨드 실행 등에 사용할 수 있어요. JSON과 HCL 템플릿 양쪽에서 정의할 수 있어요.

JSON

JSON 템플릿에서 프로비저너는 템플릿 최상위에서, 빌드 중인 이미지를 프로비저닝하기 위해 순차적으로 호출되는 구성 요소 배열로 선언돼요. 이것들은 템플릿에 정의된 모든 빌더에 적용돼요.

{
  "builders": [
    {
      "type": "null",
      "name": "test",
      "communicator": "none"
    }
  ],
  "provisioners": [
    {
      "type": "shell-local",
      "inline": ["echo test"]
    }
  ]
}

HCL2

HCL2에서는 프로비저너가 build 블록에서 선언되며, 이 build 블록의 일부로 호출되는 소스에만 적용돼요. 이 덕분에 여러 build 블록을 선언할 수 있고, 각각 고유한 프로비저너 집합을 가지며, 그 결과 여러 개의 서로 다른 빌드가 병렬로 실행돼요.

source "null" "test" {
  communicator = "none"
}

build {
  sources = ["null.test"]

  provisioner "shell-local" {
    inline = ["echo test"]
  }
}

Post-processors (포스트-프로세서)

포스트-프로세서는 이미지가 만들어진 후 호출되는 구성 요소예요. 이들의 역할은 빌더나 다른 포스트-프로세서가 만든 아티팩트를 소비해서, 그로부터 새 아티팩트를 만드는 거예요.

JSON

프로비저너와 마찬가지로, JSON 템플릿에서 포스트-프로세서는 빌드가 프로비저닝을 마친 후 순차적으로 호출되며, 템플릿의 "post-processors" 아래에 선언돼요.

{
  "builders": [
    {
      "type": "null",
      "name": "test",
      "communicator": "none"
    }
  ],
  "provisioners": [
    {
      "type": "shell-local",
      "inline": ["echo test"]
    }
  ],
  "post-processors": [
    {
      "type": "manifest"
    }
  ]
}

HCL2

HCL2에서는 프로비저너와 마찬가지로 포스트-프로세서도 build 블록의 일부이며, 프로비저너와 동일한 규칙이 적용돼요.

source "null" "test" {
  communicator = "none"
}

build {
  sources = ["null.test"]

  provisioner "shell-local" {
    inline = ["echo test"]
  }

  post-processor "manifest" {}
}

더 알아보기 (Learn more)