Packer 커맨드 개요

Packer 커맨드 개요

Packer는 커맨드 라인 인터페이스로 제어해요. Packer와의 모든 상호작용은 packer 도구를 통해 이루어지죠. 다른 많은 CLI 도구와 마찬가지로 packer 도구는 실행할 서브커맨드를 받고, 그 서브커맨드에는 추가 옵션도 달릴 수 있어요. 서브커맨드는 packer SUBCOMMAND 형태로 실행하는데, 여기서 "SUBCOMMAND"가 실제로 실행하고 싶은 명령이에요.

packer를 인자 없이 실행하면 사용 가능한 모든 서브커맨드와 그 기능에 대한 간단한 요약이 담긴 help가 표시돼요. 여기에 더해 특정 서브커맨드에 대한 더 자세한 도움말을 보려면 아무 packer 명령에 -h 플래그를 붙여 실행하면 돼요. 문서에는 각 서브커맨드에 대한 정보가 담겨 있답니다.

출처: Packer 공식 문서

본문

머신리더블 출력 (Machine-Readable Output)

기본적으로 Packer의 출력은 사람이 읽기 매우 편해요. Packer를 쓰기 좋게 만들기 위해 보기 좋은 포맷, 간격, 색상을 사용하거든요. 하지만 Packer는 자동화를 염두에 두고 만들어졌어요. 그래서 완전히 머신리더블한 출력 설정을 지원해서, 자동화된 환경에서도 Packer를 쓸 수 있게 해줘요.

머신리더블 출력 포맷은 Unix 도구를 염두에 두고 만들어졌기 때문에 awk/sed/grep 등과 궁합이 좋아요. 새 포맷을 배울 필요 없이 이미 익숙한 인터페이스를 제공하죠.

머신리더블 출력 활성화하기

머신리더블 출력 포맷은 아무 packer 명령에 -machine-readable 플래그를 넘기면 활성화돼요. 이렇게 하면 즉시 stdout의 모든 출력이 머신리더블 형식이 돼요. 로깅(logging)이 켜져 있다면 계속 stderr로 출력돼요. 출력 예시는 아래와 같아요.

$ packer -machine-readable version
1498365963,,version,1.0.2
1498365963,,version-prelease,
1498365963,,version-commit,3ead2750b+CHANGES
1498365963,,ui,say,Packer v1.0.2

포맷에 대한 자세한 내용은 나중에 다룰게요. 하지만 보다시피 출력이 즉시 머신 친화적으로 바뀌는 걸 확인할 수 있어요. 다른 명령에도 -machine-readable 플래그를 붙여서 한번 실행해 보세요!

-machine-readable 플래그는 자동화된 환경을 위해 설계됐고, 대화형(interactive) 환경을 위해 설계된 -debug 플래그와는 상호 배타적이에요.

머신리더블 출력 포맷

머신리더블 포맷은 줄(line) 단위의 콤마(comma) 구분 텍스트 포맷이에요. 그래서 Ruby나 Python 같은 완전한 프로그래밍 언어뿐 아니라 awk나 grep 같은 표준 Unix 도구로도 파싱하기가 더 편하죠.

포맷은 다음과 같아요.

timestamp,target,type,data...

각 구성 요소를 설명하면:

  • timestamp는 메시지가 출력된 UTC 기준 Unix 타임스탬프예요.
  • target은 packer build를 호출할 때 비어 있거나 amazon-ebs 같은 개별 빌드 이름이 될 수 있어요. 빌드가 진행 중일 때는 보통 비어 있고, 특정 빌드의 아티팩트를 가리킬 때는 빌드 이름을 가져요.
  • type은 출력되는 머신리더블 메시지의 타입이에요. 가장 흔한 두 타입은 ui와 artifact예요.
  • data는 앞선 type과 연관된 0개 이상의 콤마 구분 값이에요. 이 데이터의 정확한 개수와 의미는 타입에 따라 달라져서, 완전히 이해하려면 해당 타입과 관련된 문서를 읽어야 해요.

포맷 안에서 데이터에 콤마가 포함되면 %!(PACKER_COMMA)로 대체돼요. 이는 \`` 같은 이스케이프 문자보다 awk같은 도구에 더 친화적이기 때문에 선호돼요. 포맷 안의 줄바꿈은 각각의 표준 이스케이프 시퀀스로 대체돼요. 줄바꿈은 출력 안에서 리터럴\n이 되고, 캐리지 리턴은 리터럴 \r`이 돼요.

머신리더블 메시지 타입

머신리더블 출력에서 볼 수 있는 타입의 (완전하지 않은) 목록이에요. packer build를 실행할 때 보게 될 타입들:

  • ui: 제공되는 정보가 사람이 읽을 수 있는 문자열, 즉 머신리더블 모드가 아니어도 stdout으로 보내질 문자열이라는 뜻이에요. 이 타입과 연관된 "data" 서브타입은 세 가지예요.
    • say: 머신리더블이 아닌 포맷에서는 굵게 표시돼요. 보통 빌드 과정에서 새 단계가 시작된다는 알림에 사용돼요.
    • message: 가장 흔히 쓰이는 메시지 타입으로, 빌드 과정 중 기본적인 업데이트에 사용돼요.
    • error: 오류용으로 예약돼 있어요.
  • artifact-count: 특정 빌드가 몇 개의 아티팩트를 만들어냈는지 알려주는 데이터 타입이에요.
  • artifact: Packer가 빌드 중 무엇을 만들었는지에 대한 정보를 알려주는 데이터 타입이에요. 출력 예시는 timestamp, buildname, artifact, artifact_number, key, value 패턴을 따르는데, key와 value가 아티팩트에 대한 정보를 담아요.

예를 들어:

1539967803,,ui,say,\n==> Builds finished. The artifacts of successful builds are:
1539967803,amazon-ebs,artifact-count,2
1539967803,amazon-ebs,artifact,0,builder-id,mitchellh.amazonebs
1539967803,amazon-ebs,artifact,0,id,eu-west-1:ami-04d23aca8bdd36e30
1539967803,amazon-ebs,artifact,0,string,AMIs were created:\neu-west-1: ami-04d23aca8bdd36e30\n
1539967803,amazon-ebs,artifact,0,files-count,0
1539967803,amazon-ebs,artifact,0,end
1539967803,,ui,say,--> amazon-ebs: AMIs were created:\neu-west-1: ami-04d23aca8bdd36e30\n
1539967803,amazon-ebs,artifact,1,builder-id,
1539967803,amazon-ebs,artifact,1,id,
1539967803,amazon-ebs,artifact,1,string,
1539967803,amazon-ebs,artifact,1,files-count,0
2018/10/19 09:50:03 waiting for all plugin processes to complete...
1539967803,amazon-ebs,artifact,1,end

packer version을 실행할 때 보게 될 타입들:

  • version: 실행 중인 Packer의 버전이에요.
  • version-prerelease: 데이터가 prerelease 버전이면 dev를 담고, 그렇지 않으면 비어 있어요.
  • version-commit: 현재 Packer 브랜치가 위치한 커밋의 git 해시예요. Packer 개발자에게 가장 유용해요.

자동완성 (Autocompletion)

packer 명령은 옵트인(opt-in) 서브커맨드 자동완성을 지원하는데, packer -autocomplete-install로 셸에서 활성화할 수 있어요. 활성화한 뒤 새 셸을 열면 이 기능을 사용할 수 있어요.

예를 들어 각 프롬프트 줄 끝에 탭을 입력한다고 가정해 볼게요.

$ packer p
plugin  build
$ packer build -
-color             -debug             -except            -force             -machine-readable  -on-error          -only              -parallel          -timestamp          -var               -var-file