templatefile 함수

templatefile 함수

templatefile 함수는 주어진 경로의 파일을 읽고, 제공된 템플릿 변수 세트를 사용해 그 내용을 템플릿으로 렌더링해요.

출처: Packer 공식 문서

본문

templatefile(path, vars)

templatefile 함수로 템플릿을 만들 때는 .pkrtpl.hcl 파일 확장자를 사용하는 걸 권장해요. Packer는 HCL 템플릿을 파일과 템플릿의 조합으로 취급해요. 그래서 HCL 템플릿 파일은 .pkr.hcl 확장자의 템플릿보다 약간 다른 기능 세트를 가져요. .pkr.hcl 확장자를 사용하면 문법 하이라이터가 여러분의 파일을 제대로 이해할 수도 있게 돼요.

템플릿 문법은 ${ ... }로 구분되는 보간 시퀀스를 포함해, 메인 HCL2 언어의 문자열 템플릿과 동일해요. 이 함수는 그저 더 긴 템플릿 시퀀스를 가독성을 위해 별도의 파일로 분리할 수 있게 해 줄 뿐이에요.

"vars" 인자는 맵이어야 해요. 템플릿 파일 안에서 맵의 각 키가 보간을 위한 변수로 사용할 수 있어요. 템플릿은 Packer에서 사용 가능한 다른 어떤 함수도 사용할 수 있지만, templatefile에 대한 재귀 호출은 허용되지 않아요. 변수 이름은 각각 문자로 시작하고, 그 뒤에 0개 이상의 문자, 숫자, 또는 밑줄이 와야 해요.

HCL2의 문자열은 유니코드 문자들의 시퀀스이므로, 이 함수는 파일 내용을 UTF-8 인코딩 텍스트로 해석하고 결과 유니코드 문자들을 반환해요. 파일에 잘못된 UTF-8 시퀀스가 있으면 이 함수는 오류를 발생시켜요.

이 함수는 실행 시작 시점에 디스크에 이미 존재하는 파일에만 사용할 수 있어요.

예시 (Examples)

Lists (리스트)

다음 내용을 가진 backends.tpl 템플릿 파일이 있다고 해 볼게요.

%{ for addr in ip_addrs ~}
backend ${addr}:${port}
%{ endfor ~}

templatefile 함수는 템플릿을 이렇게 렌더링해요.

> templatefile("${path.root}/backends.tmpl", { port = 8080, ip_addrs = ["10.0.0.1", "10.0.0.2"] })
backend 10.0.0.1:8080
backend 10.0.0.2:8080

Maps (맵)

다음 내용을 가진 config.tmpl 템플릿 파일이 있다고 해 볼게요.

%{ for config_key, config_value in config }
set ${config_key} = ${config_value}
%{ endfor ~}

templatefile 함수는 템플릿을 이렇게 렌더링해요.

> templatefile(
               "${path.root}/config.tmpl",
               {
                 config = {
                   "x"   = "y"
                   "foo" = "bar"
                   "key" = "value"
                 }
               }
              )
set foo = bar
set key = value
set x = y

템플릿에서 JSON 또는 YAML 생성하기

생성하려는 문자열이 JSON이나 YAML 문법이라면, 많은 개별 보간 시퀀스와 지시어를 사용해 올바르게 해석될 유효한 JSON이나 YAML을 생성하는 템플릿을 작성하는 것은 까다롭고 지루할 때가 많아요.

대신, 다음 예시처럼 일반 표현식 문법으로 인코딩할 값을 지정하면서 jsonencode 또는 yamlencode에 대한 단일 보간 호출로만 구성된 템플릿을 작성할 수 있어요.

${jsonencode({
  "backends": [for addr in ip_addrs : "${addr}:${port}"],
})}
${yamlencode({
  "backends": [for addr in ip_addrs : "${addr}:${port}"],
})}

이전 섹션의 backends.tmpl 예시와 같은 입력을 주면, 이스케이프나 구분자를 수동으로 처리할 필요 없이 주어진 데이터 구조의 유효한 JSON 또는 YAML 표현이 생성돼요. 위 마지막 예시에서 ip_addrs의 요소를 기반으로 한 반복은 템플릿 지시어 대신 for 표현식을 사용해 이루어져요.

{"backends":["10.0.0.1:8080","10.0.0.2:8080"]}

결과 템플릿이 작다면, 메인 설정 파일에 jsonencode나 yamlencode 호출을 인라인으로 작성하고 별도의 템플릿 파일을 만들지 않을 수도 있어요.

locals {
  backend_config_json = jsonencode({
    "backends": [for addr in ip_addrs : "${addr}:${port}"],
  })
}

자세한 내용은 jsonencode와 yamlencode에 대한 메인 문서를 참고하세요.

  • file은 주어진 경로의 파일 내용을 읽어요.
  • fileexists는 주어진 경로에 파일이 존재하는지 결정해요.

더 알아보기 (Learn more)