only와 except 키워드

only와 except 키워드

only와 except 키워드는 Packer 빌드에서 provisioner와 post-processor를 선택적으로 실행할 수 있게 해주는 필터예요. 이 키워드는 Packer 템플릿과 Packer CLI의 플래그로 모두 사용할 수 있어요.

출처: Packer 공식 문서

본문

커맨드 라인 플래그 (Command line flags)

  • -except=foo,bar,baz — 주어진 콤마 구분 이름을 가진 빌드와 post-processor를 제외한 모든 것을 실행해요. 레거시 JSON 템플릿에서 빌드 이름은 설정 안에 특정 name 속성이 지정되지 않으면 해당 빌더의 타입(예: docker, amazon-ebs, virtualbox-iso)을 기본값으로 해요. HCL2 템플릿에서 "name"은 빌드 내 source 정의가 "name" 설정 옵션을 추가하지 않는 한 source 블록의 "name" 레이블이에요. 건너뛴 post-processor 뒤에 오는 post-processor는 실행되지 않아요. post-processor는 배열에 중첩될 수 있으므로 다른 post-processor 체인은 여전히 실행될 수 있어요. 빈 이름을 가진 post-processor는 무시돼요.
  • -only=foo,bar,baz — 주어진 콤마 구분 이름을 가진 빌드만 실행해요. 레거시 JSON 템플릿에서 빌드 이름은 설정 안에 특정 name 속성이 지정되지 않으면 해당 빌더의 타입(예: docker, amazon-ebs, virtualbox-iso)을 기본값으로 해요. HCL2 템플릿에서 "name"은 빌드 내 source 정의가 "name" 설정 옵션을 추가하지 않는 한 source 블록의 "name" 레이블이에요.

템플릿 (Templates)

특정 소스에 대해 provisioner와 post-processor를 실행하거나 건너뛰도록 only와 except 키워드를 추가할 수 있어요.

source "amazon-ebs" "first-example" {
}
source "amazon-ebs" "second-example" {
}
source "amazon-ebs" "third-example" {
}
build {
name = "my_build"
sources = [
"source.amazon-ebs.first-example",
]
source "source.amazon-ebs.second-example" {
// setting the name field allows you to rename the source only for this
// build section. To match this builder, you need to use
// second-example-local-name, not second-example
name = "second-example-local-name"
}
provisioner "shell-local" {
only   = ["amazon-ebs.first-example"]
inline = ["echo I will only run for the first example source"]
}
provisioner "shell-local" {
except = ["amazon-ebs.second-example-local-name"]
inline = ["echo I will never run for the second example source"]
}
}
build {
sources = [
"source.amazon-ebs.third-example",
]
}
# this file will result in Packer creating three builds named:
#  my_build.amazon-ebs.first-example
#  my_build.amazon-ebs.second-example
#  amazon-ebs.third-example

참고로 CLI 인자는 위의 설정을 사용해 glob 연산자와 함께 사용할 수 있어요.

  • packer build -only 'my_build.*' dir: my_build라는 이름의 블록에 있는 빌드만 실행해요.
  • packer build -only '*.amazon-ebs.*' dir: amazon-ebs 타입의 소스가 있는 빌드만 실행해요.
  • packer build -only '*.second-example-local-name' dir: 그 특정 이름의 빌드만 실행해요.

참고: CLI에서 only와 except는 빌드 이름(예: my_build.amazon-ebs.first-example)과 일치하지만, provisioner에서는 소스 이름(예: amazon-ebs.third-example)과 일치해요.