본문 바로가기
software engineering/k8s

Helm - Developing Templates - Flow Control

by _블로그 2021. 2. 17.

Flow Control

다음의 control structures를 제공

  • if / else : 조건부 blocks 생성
  • with : scope 정의
  • range : for each 스타일의 loop

 

그리고 named template를 선언하거나 사용할 때 사용하는 몇가지 actions가 있음

define : 새로운 named template 선언

template : named template 가져오기

block : ?

IF/ELSE

일반적인 if else 문법의 그것. 단, 조건부가 false가 되는 조건이 조금 특별하다.

  • a boolean false
  • a numeric zero
  • an empty string
  • a nil (empty or null)
  • an empty collection

한마디로 0을 포함해 empty일 경우도 모두 false로 본다.

CONTROLLING WHITESPACE

IF/ELSE를 사용하면 해당 문법을 사용한 line이 whitespace로 붕 뜰 수 있잖아? 그걸 제거하는 방법에 대한 얘기다. 아래처럼 된다는 얘기지.

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"
  drink: {{ .Values.favorite.drink | default "tea" | quote }}
  food: {{ .Values.favorite.food | upper | quote }}
  {{if eq .Values.favorite.drink "coffee"}}
  mug: true
  {{end}}
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: telling-chimp-configmap
data:
  myvalue: "Hello World"
  drink: "coffee"
  food: "PIZZA"
--> 여기 빈 줄이 생겼다.
  mug: true

이걸 해결하려면 - 요걸 쓰면 된다. 앞에다 쓰면 앞 쪽, close directive 앞에 쓰면 뒤 쪽 whitespace를 trim 해준다.

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"
  drink: {{ .Values.favorite.drink | default "tea" | quote }}
  food: {{ .Values.favorite.food | upper | quote }}
  {{- if eq .Values.favorite.drink "coffee"}}
  mug: true
  {{- end}}

MODIFYING SCOPE USING WITH

current scope(.) 지시자를 특정 object로 설정해준다. 아래 예제는 .Values.favorites를 .으로 변경해주는 것.

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"
  {{- with .Values.favorite }}
  drink: {{ .drink | default "tea" | quote }}
  food: {{ .food | upper | quote }}
  {{- end }}

LOOPING WITH THE RANGE ACTION

아래 values.yaml의 list 데이터를 ConfigMap에 넣는 예제.

favorite:
  drink: coffee
  food: pizza
pizzaToppings:
  - mushrooms
  - cheese
  - peppers
  - onions

 

apiVersion: v1
  ...
data:
  ...
  toppings: |-
    {{- range .Values.pizzaToppings }}
    - {{ . | title | quote }}
    {{- end }}

toppings 에 |-가 보이는데 이건 yaml 파일에서 multi-line string을 정의할 때의 문법이다. 리스트를 왜 string으로? 그건 ConfigMap의 data가 key/value pairs라서 그럼. map 형태만 지원한다는 얘기. 

 

LIST

댓글