JSON 템플릿 설정 참조

JSON 템플릿 설정 참조 (JSON templates configuration reference)

이 주제에서는 Packer용 JSON 템플릿을 만들기 위한 참조 정보를 제공해요.

참고: 이 페이지는 옛 스타일의 JSON Packer 템플릿에 대한 내용이에요. JSON 템플릿은 여전히 Packer 코어에서 지원되지만, Packer 코어에 추가된 새 기능은 JSON 템플릿에는 구현되지 않을 수 있어요. Packer를 최대한 잘 사용하려면 편한 때에 HCL 템플릿으로 전환하는 것을 권장해요. 템플릿 업그레이드를 돕기 위해 hcl2_upgrade 명령을 작성해 두었어요.

출처: Packer 공식 문서

본문

소개 (Introduction)

Packer 템플릿을 JSON 파일로 만들어 Packer의 다양한 구성 요소를 설정해서 하나 이상의 머신 이미지를 만들 수 있어요. 템플릿은 이식 가능하고 정적이며, 사람과 컴퓨터 모두가 읽고 쓸 수 있어요. Packer CLI를 사용해 템플릿에 설명된 빌드를 실행해 결과 머신 이미지를 만들 수 있어요.

JSON 템플릿 구조 (JSON Template Structure)

템플릿은 Packer의 다양한 구성 요소를 설정하는 키 집합을 가진 JSON 객체예요. 템플릿 안에서 사용 가능한 키는 아래에 나열돼요. 각 키와 함께 필수인지 선택적인지도 표시돼 있어요.

  • builders (필수) — 이 템플릿에 대해 머신 이미지를 만드는 데 사용될 빌더를 정의하고 각 빌더를 설정하는 하나 이상의 객체 배열이에요. 빌더를 정의하고 설정하는 방법에 대한 자세한 내용은 템플릿의 "configuring builders" 하위 섹션을 읽어보세요.
  • description (선택) — 템플릿이 무엇을 하는지에 대한 설명을 제공하는 문자열이에요. 이 출력은 inspect 명령에서만 사용돼요.
  • min_packer_version (선택) — 템플릿을 파싱하는 데 필요한 최소 Packer 버전을 가진 문자열이에요. 템플릿에 적절한 Packer 버전이 사용되도록 보장하는 데 사용할 수 있어요. Packer가 packer fix와의 하위 호환성을 유지하므로 최대 버전은 지정할 수 없어요.
  • post-processors (선택) — 빌드된 이미지에 대해 수행할 다양한 post-processing 단계를 정의하는 하나 이상의 객체 배열이에요. 지정하지 않으면 post-processing이 수행되지 않아요. post-processor가 무엇을 하고 어떻게 정의되는지에 대한 자세한 내용은 템플릿의 "configuring post-processors" 하위 섹션을 읽어보세요.
  • provisioners (선택) — 각 빌더가 만든 머신에 소프트웨어를 설치하고 설정하는 데 사용될 provisioner를 정의하는 하나 이상의 객체 배열이에요. 지정하지 않으면 provisioner가 실행되지 않아요. provisioner를 정의하고 설정하는 방법에 대한 자세한 내용은 템플릿의 "configuring provisioners" 하위 섹션을 읽어보세요.
  • variables (선택) — 템플릿에 포함된 사용자 변수를 정의하는 하나 이상의 키/값 문자열 객체예요. 지정하지 않으면 변수가 정의되지 않아요. 사용자 변수를 정의하고 사용하는 방법에 대한 자세한 내용은 템플릿의 "user variables" 하위 섹션을 읽어보세요.

주석 (Comments)

JSON은 주석을 지원하지 않으며, Packer는 알 수 없는 키를 검증 오류로 보고해요. 템플릿에 주석을 달고 싶다면 루트 레벨 키에 언더스코어를 접두어로 붙일 수 있어요. 예:

{
"_comment": "This is a comment",
"builders": [{}]
}

중요: 루트 레벨 키만 언더스코어 접두어를 붙일 수 있어요. builders, provisioners 등 안의 키는 여전히 검증 오류를 일으켜요.

참고: Packer는 버전 1.6.0부터 HCL2를 지원해요. HashiCorp Configuration Language는 템플릿 파일 어디에서나 주석을 지원해요. 주석이 중요하다면 packer hcl2_upgrade 명령을 사용해 JSON 템플릿을 HCL2로 업그레이드하는 것을 고려해 보세요.

HCL로 업그레이드할 준비가 안 됐다면 한 가지 해결 방법은 packer build를 실행하기 전에 jq를 사용해 Packer 템플릿에서 지원되지 않는 주석을 제거하는 것이에요. 예를 들어 commented_template.json이라는 파일이 있다고 해볼게요.

{
"_comment": ["this is", "a multi-line", "comment"],
"builders": [
{
"_comment": "this is a comment inside a builder",
"type": "null",
"communicator": "none"
}
],
"_comment": "this is a root level comment",
"provisioners": [
{
"_comment": "this is a different comment",
"type": "shell",
"_comment": "this is yet another comment",
"inline": ["echo hellooooo"]
}
]
}

다음 jq 명령을 사용하면:

$ jq 'walk(if type == "object" then del(._comment) else . end)' commented_template.json > uncommented_template.json

이 도구는 다음 내용이 담긴 새 파일을 만들어요.

{
"builders": [
{
"type": "null",
"communicator": "none"
}
],
"provisioners": [
{
"type": "shell",
"inline": ["echo hellooooo"]
}
]
}

주석이 제거된 파일을 얻으면 평소처럼 packer build를 호출할 수 있어요.

설치된 jq에 walk 함수가 없어서 다음과 같은 오류가 나온다면,

jq: error: walk/1 is not defined at <top-level>,

~/.jq 파일을 만들어 walk 함수를 직접 추가할 수 있어요.

예시 템플릿 (Example Template)

아래는 packer build로 호출할 수 있는 기본 템플릿의 예시예요. AWS에 인스턴스를 만들고, 실행 중이 되면 스크립트를 복사한 다음 SSH로 그 스크립트를 실행할 거예요.

참고: 이 예시는 Amazon Web Services 계정이 필요해요. 실제 빌드가 진행되려면 제공해야 하는 여러 파라미터가 있어요. 자세한 내용은 Amazon builder 문서를 참고하세요.

{
"builders": [
{
"type": "amazon-ebs",
"access_key": "...",
"secret_key": "...",
"region": "us-east-1",
"source_ami": "ami-fce3c696",
"instance_type": "t2.micro",
"ssh_username": "ubuntu",
"ami_name": "packer {{timestamp}}"
}
],
"provisioners": [
{
"type": "shell",
"script": "setup_things.sh"
}
]
}