Helm Templating 을 하다 보면, 값에 들어가 있는 따옴표를 그대로 보존해야 하는 상황이 발생한다. 다음과 같은 경우엔 어떻게 할 것인가?
kind: Secret
spec:
data:
password: {{ .Values.password }}
helm template mychart --set password="my'password" # 성공
helm template mychart --set password="my\"'password" # YAML parse error
helm template mychart --set password='my"password' # YAML parse error
>-
사용하기
처음으로 할 일은 spec.data.password
을 다음과 같이 >
(angle bracket, greater-than-sign 이라고 부르더라) 와 -
의 조합으로 바꾸는 것이다.
password: >-
{{ .Values.password }}
이게 뭔가요? 이건 Helm Template Engine 기술이 아니라 YAML 테크닉의 일종이고, 문자열 보존을 위한 목적도 아니다. Helm 문서1를 먼저 보면,
Sometimes you want to represent a string in your YAML with multiple lines, but want it to be treated as one long line when it is interpreted. This is called “folding”. To declare a folded block, use
>
.YAML에서 문자열을 여러 줄로 표현하고 싶지만, 하나의 긴 줄로 나타내고 싶을 때가 있습니다. 이것을 “접기(folding)“라고 부르죠. 접혀야 할 블록을 선언하려면,
>
를 사용하세요.
더 정확한 설명을 해 주는 YAML Multiline 문서2를 요약해 보면,
- Block 을 유지하려면
|
, 한 줄로 접으려면>
- Block 마지막에 줄바꿈을 넣는 것이 기본값, 넣지 않으려면
-
를 붙이고, 모든 줄바꿈을 유지하려면 (|
일 때만)+
를 붙인다.
그래서 >
만 사용하면 줄바꿈이 들어간 값을 얻기 때문에, 정확히 우리가 원하는 것은 아니다. >-
를 써야 한다.
예제 적용하기
앞서 helm template
결과는 다음과 같이 나오는데,
# helm template mychart --set password="my\"'password"
---
kind: Secret
spec:
data:
password: >-
my"'password
# helm template mychart --set password='my"password'
kind: Secret
spec:
data:
password: >-
my"password
# helm template mychart --set password="my'password"
kind: Secret
spec:
data:
password: >-
my'password
어? spec.data.password
에 여전히 >-
가 남아있고, 값 앞에 줄바꿈도 되어 있는데 읽으면 이상한거 아니예요? 그렇지 않다.
mikefarah/yq3을 사용해서 쿼리해 보면 정상적으로 나오는 것을 확인할 수 있다.
helm template mychart --set password="my\"password" | yq '.spec.data.password' -r
my"password
helm template mychart --set password="my\"'password" | yq '.spec.data.password' -r
my"'password
helm template mychart --set password='my"password' | yq '.spec.data.password' -r
my"password