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)
- 이 페이지는 Packer 공식 문서에서 가져왔어요.