manifest 포스트-프로세서
manifest 포스트-프로세서 (manifest post-processor)
Official
Artifact BuilderId: packer.post-processor.manifest
출처: Packer 공식 문서
본문
manifest 포스트-프로세서는 Packer가 실행 중에 만드는 모든 아티팩트 목록이 담긴 JSON 파일을 작성해요. Packer 템플릿이 여러 빌드를 포함한다면, 어떤 출력 아티팩트(파일, AMI ID, Docker 컨테이너 등)가 어떤 빌드에 해당하는지 추적하는 데 도움이 돼요.
manifest 포스트-프로세서는 빌드가 완료될 때마다 호출되고 manifest 파일의 데이터를 갱신해요. 빌드는 이름과 타입으로 식별되며, 빌드 시간, 아티팩트 ID, 파일 목록을 포함해요.
Packer를 -force 플래그로 실행하면 manifest 파일이 각 Packer 실행 동안 자동으로 잘려요. 그렇지 않으면 이후 빌드가 파일에 추가돼요. 타임스탬프를 사용해서 어느 것이 최신 아티팩트인지 알 수 있어요.
manifest를 두 번 이상 지정해 각 빌드를 자신의 파일로 쓰거나, 모든 빌드를 같은 파일에 쓸 수 있어요. 단순한 빌드에는 manifest를 한 번만 지정하면 되지만(아래 참조), Docker나 Artifice 같은 다른 포스트-프로세서와 체인으로 연결할 수도 있어요.
Configuration (설정)
Optional (선택):
output(string) — 매니페스트가 이 파일에 쓰여져요. 기본값은packer-manifest.json이에요.strip_path(bool) — 경로 없이 파일 이름만 manifest 파일에 써요. 기본값은 false예요.strip_time(bool) — 출력에서build_time필드를 쓰지 않아요.custom_data(map[string]string) — 매니페스트에 추가할 임의의 데이터예요. 이는 템플릿 엔진이에요. 따라서 이 필드에 사용자 변수와 템플릿 함수를 사용할 수 있어요.
참고: 대부분의 다른 포스트-프로세서와 달리, manifest 포스트-프로세서에는 keep_input_artifact 옵션이 적용되지 않아요. 우리는 방금 기록한 파일을 삭제하는 동작을 아무도 기대하지 않으므로, manifest에서는 입력 아티팩트를 항상 유지해요.
Example Configuration (예시 구성)
manifest 포스트-프로세서를 사용하는 최소한의 방법은 다음과 같이 정의만 작성하는 거예요.
HCL2 / JSON
post-processor "manifest" {}
{
"post-processors": [
{
"type": "manifest"
}
]
}
좀 더 완전한 예시:
HCL2 / JSON
post-processor "manifest" {
output = "manifest.json"
strip_path = true
custom_data = {
my_custom_data = "example"
}
}
{
"post-processors": [
{
"type": "manifest",
"output": "manifest.json",
"strip_path": true,
"custom_data": {
"my_custom_data": "example"
}
}
]
}
예시 manifest 파일은 다음과 같아요.
{
"builds": [
{
"name": "docker",
"builder_type": "docker",
"build_time": 1507245986,
"files": [
{
"name": "packer_example",
"size": 102219776
}
],
"artifact_id": "Container",
"packer_run_uuid": "6d5d3185-fa95-44e1-8775-9e64fe2e2d8f",
"custom_data": {
"my_custom_data": "example"
}
}
],
"last_run_uuid": "6d5d3185-fa95-44e1-8775-9e64fe2e2d8f"
}
빌드를 다시 실행하면 새 빌드 아티팩트가 파일을 대체하는 대신 manifest 파일에 추가돼요. packer_run_uuid 를 사용해서 manifest에서 특정 빌드 아티팩트를 가져올 수 있어요.
위 manifest는 다음 템플릿으로 생성됐어요.
HCL2 / JSON
source "docker" "docker"{
image = "ubuntu:latest"
export_path = "packer_example"
run_command = ["-d", "-i", "-t", "--entrypoint=/bin/bash", "{{.Image}}"]
}
build {
sources = ["docker.docker"]
post-processor "manifest" {
output = "manifest.json"
strip_path = true
custom_data = {
my_custom_data = "example"
}
}
}
{
"builders": [
{
"type": "docker",
"image": "ubuntu:latest",
"export_path": "packer_example",
"run_command": ["-d", "-i", "-t", "--entrypoint=/bin/bash", "{{.Image}}"]
}
],
"post-processors": [
{
"type": "manifest",
"output": "manifest.json",
"strip_path": true,
"custom_data": {
"my_custom_data": "example"
}
}
]
}
예시 사용법:
manifest는 오래된 아티팩트를 정리하거나, 로그에 중요한 값을 출력하는 데 매우 유용할 수 있어요. 다음 예시는 JSON 출력을 파싱하는 커맨드라인 도구인 jq를 사용해서 빌드로 만든 AMI의 AWS ami-id를 찾아 echo하는 방법을 보여줘요.
#!/bin/bash
AMI_ID=$(jq -r '.builds[-1].artifact_id | split(":") | .[1]' manifest.json)
echo $AMI_ID
더 알아보기 (Learn more)
- 이 페이지는 Packer 공식 문서에서 가져왔어요.