[Helm入門] Templateで使える関数の実行例 ~ 文字列操作編 ~

HelmはKubernetes用のパッケージ管理ソフトウェアです。HelmはChartと呼ばれる設計図もとに、Kubernetesのマニフェストを作成し、パッケージをインストールします。ChartはGoのテンプレートを利用していて、Sprigの関数を利用することができます。本記事ではHelmテンプレートでのSprig関数のうち、文字列操作の使用例を紹介します。

TL;DR

目次

検証環境

以下の実行例の動作環境です。

$ helm version --short
Client: v2.13.1+g618447c
Server: v2.13.1+g618447c

事前準備

検証用のHelmチャートを作成します。

  1. helm createコマンドでチャートのひな形を作成します。
  2. rmコマンドで不要なファイルを削除します。
  3. 検証のYAMLファイルを作成します。今回はConfigMapを作成するYAMLを作成しています。
  4. helm install --dry-run --debugコマンドで実行確認をします。--dry-run オプションを利用することで、Kuernetes上にConfigMapのリソースをインストールしないで、実行結果の確認を行うことができます。
$ helm create sprig
$ rm -rf sprig/templates/*
$ rm -rf sprig/values.yaml
$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue: {{ .Values.myvalue }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue: Hello World!
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue: Hello World!

String Functions

trim

trimは、文字列の左右の空白を取り除きます。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: {{ .Values.myvalue }}
  myvalue2: {{ trim .Values.myvalue }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue: "  Hello World!  "
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1:   Hello World!
  myvalue2: Hello World!

trimAll

trimAllは、文字列の前または後ろから指定した文字を削除します。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: {{ .Values.myvalue }}
  myvalue2: {{ trimAll "He" .Values.myvalue }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue: Hello World! He
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: Hello World! He
  myvalue2: llo World!

trimSuffix

trimSuffixは文字列から指定したサフィックスを取り除きます。サフィックスとは、文字列の末尾に付けられた接尾辞のことです。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: {{ .Values.myvalue }}
  myvalue2: {{ trimSuffix "He" .Values.myvalue }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue: Hello World! He
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: Hello World! He
  myvalue2: Hello World!

trimPrefix

trimPrefixは文字列から指定したプレフィックスを取り除きます。プレフィックスとは、文字列の先頭に付けられた接頭辞のことです。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: {{ .Values.myvalue }}
  myvalue2: {{ trimPrefix "He" .Values.myvalue }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue: Hello World! He
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: Hello World! He
  myvalue2: llo World! He

upper

upperは文字列を大文字に変換します。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: {{ .Values.myvalue }}
  myvalue2: {{ upper .Values.myvalue }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue: Hello World! He
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: Hello World! He
  myvalue2: HELLO WORLD! HE

lower

lowerは、文字列を小文字に変換します。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: {{ .Values.myvalue }}
  myvalue2: {{ lower .Values.myvalue }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue: Hello World! He
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: Hello World! He
  myvalue2: hello world! he

title

titleは、単語の先頭を大文字に変換します。以下の実行例ではlowerで小文字に変換した文字列をパイプでtitleに渡しています。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: {{ lower .Values.myvalue }}
  myvalue2: {{ lower .Values.myvalue | title }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue: Hello World! He
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: hello world! he
  myvalue2: Hello World! He

untitle

untitleは、単語の先頭を小文字に変換します。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: {{ .Values.myvalue }}
  myvalue2: {{ untitle .Values.myvalue }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue: Hello World! He
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: Hello World! He
  myvalue2: hello world! he

repeat

repeatは、指定した回数分の文字列を繰り返します。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: {{ .Values.myvalue }}
  myvalue2: {{ repeat 3 .Values.myvalue }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue: Hello
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: Hello
  myvalue2: HelloHelloHello

substr

substrは、文字列の切り取りを行います。切り取りの開始と終了の位置を指定します。文字列の先頭は0から始まります。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: {{ .Values.myvalue }}
  myvalue2: {{ substr 1 4 .Values.myvalue }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue: Hello World! He
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: Hello World! He
  myvalue2: ell

nospace

nospaceは、文字列から空白を取り除きます。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: {{ .Values.myvalue }}
  myvalue2: {{ nospace .Values.myvalue }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue: "  Hello World! He  !"
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1:   Hello World! He  !
  myvalue2: HelloWorld!He!

trunc

truncは指定した長さに文字列を切り詰めます。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: {{ .Values.myvalue }}
  myvalue2: {{ trunc 7 .Values.myvalue }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue: Hello World! He
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: Hello World! He
  myvalue2: Hello W

abbrev

abbrevは、指定した長さに文字を切り詰めます。切り詰めた文字列の最後の3文字は3点リーダ(…)で表示されます。3点リーダの3文字も切り詰める文字列長に含まれることに注意してください。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: {{ .Values.myvalue }}
  myvalue2: {{ abbrev 7 .Values.myvalue }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue: Hello World! He
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: Hello World! He
  myvalue2: Hell...

abbrevboth

abbrevbothは、指定した開始位置から指定した長さに文字を切り詰めます。切り詰めた文字列の先頭と末尾の3文字は3点リーダ(…)で表示されます。3点リーダの6文字(先頭3文字、末尾3文字)も切り詰める文字列長に含まれることに注意してください。パラメータとして切り取りの開始位置と切り取る長さの指定が必要です。文字列の開始位置の先頭は、0から始まります。

切り取りの開始位置、切り取りの長さ、文字列の長さによって、先頭の3点リーダが表示されない場合もあります。詳しくはソースを参照してください。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: {{ .Values.myvalue }}
  myvalue2: {{ abbrevboth 5 10 .Values.myvalue }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue: Hello World! He
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: Hello World! He
  myvalue2: ... Wor...

initials

initialsは、単語の先頭文字だけをつなぎ合わせます。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: {{ .Values.myvalue }}
  myvalue2: {{ initials .Values.myvalue }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue: Hello World! He
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: Hello World! He
  myvalue2: HWH

randAlphaNum

randAlphaNumは、ランダムなアルファベットと数字の組み合わせ[0-9a-zA-Z]を生成します。パスワードなどでランダムな文字列が必要な場合などに利用できます。パラメータとして生成する文字列の長さを指定します。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: {{ randAlphaNum 10 }}
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: iniU8NyicW

randAlpha

randAlphaは、ランダムなアルファベットの組み合わせ[a-zA-Z]を生成します。パスワードなどでランダムな文字列が必要な場合などに利用できます。パラメータとして生成する文字列の長さを指定します。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: {{ randAlpha 10 }}
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: TvFoPpJDSU

randNumeric

randNumericは、ランダムな数字の組み合わせ[0-9]を生成します。パスワードなどでランダムな文字列が必要な場合などに利用できます。パラメータとして生成する文字列の長さを指定します。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: {{ randNumeric 10 }}
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: 7046061521

randAscii

ranAsciiは、ランダムな印刷可能なASCII文字の組み合わせを生成します。パスワードなどでランダムな文字列が必要な場合などに利用できます。パラメータとして生成する文字列の長さを指定します。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: {{ randAscii 10 }}
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: iAWhI}{#_f

wrap

wrapは、指定した長さで文字列の折り返しを行います。単語の途中での折り返しは行われません。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: |
        {{ .Values.myvalue }}
  myvalue2: |
        {{ wrap 5 .Values.myvalue }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue: Hello World! He
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: |
Hello Wor ldddd! He
  myvalue2: |
Hello
Wor
ldddd!
He

warpWith

wrapWithは折り返しを改行(\n)ではなく、指定した文字列で行います。

wrapは、改行(\n)で折り返しを行います。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: |
        {{ .Values.myvalue }}
  myvalue2: |
        {{ wrapWith 5 "@" .Values.myvalue }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue: Hello World! He
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: |
Hello World! He
  myvalue2: |
Hello@World@! He

contains

containsは、文字列に指定の文字列が含まれているかを確認します。含まれている場合はtrue、含まれていない場合はfalseとなります。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: {{ contains "Hello" .Values.myvalue }}
  myvalue2: {{ contains "Hoge" .Values.myvalue }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue: Hello World! He
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: true
  myvalue2: false

hasPrefix

hasPrefixは、指定した文字列がプレフィックスであるかを確認します。プレフィックスとは、文字列の先頭に付けられた接頭辞のことです。

プレフィックスが含まれている場合はtrue、含まれていない場合はfalseを返します。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: {{ hasPrefix "He" .Values.myvalue }}
  myvalue2: {{ hasPrefix "Ho" .Values.myvalue }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue: Hello World! He
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: true
  myvalue2: false

hasSuffix

hasSuffixは、指定した文字列がサフィックスであるかを確認します。サフィックスとは、文字列の末尾に付けられた接尾辞のことです。

サフィックスが含まれている場合はtrue、含まれていない場合はfalseを返します。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: {{ hasSuffix "He" .Values.myvalue }}
  myvalue2: {{ hasSuffix "Ho" .Values.myvalue }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue: Hello World! He
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: true
  myvalue2: false

quote

quoteは、文字列をダブルクォーテーション(")で囲みます。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: {{  .Values.myvalue }}
  myvalue2: {{ quote .Values.myvalue }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue: Hello World! He
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: Hello World! He
  myvalue2: "Hello World! He"

squote

squoteは、文字列をシングルクォーテーション(')で囲みます。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: {{  .Values.myvalue }}
  myvalue2: {{ squote .Values.myvalue }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue: Hello World! He
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: Hello World! He
  myvalue2: 'Hello World! He'

cat

catは、複数の文字列を1つのスペースでつなぎます。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: {{  cat .Values.myvalue1 .Values.myvalue2 }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue1: Hello
myvalue2: World
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: Hello World

indent

indentは、指定した長さで文字列をインデントします。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: {{ .Values.myvalue }}
  myvalue2: {{ indent 4 .Values.myvalue }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue: Hello World!
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: Hello World!
  myvalue2:     Hello World!

nindent

nindentは、指定した長さで文字列をインデントします。インデントの前に改行が行われます。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: {{ .Values.myvalue }}
  myvalue2: {{ nindent 4 .Values.myvalue }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue: Hello World!
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: Hello World!
  myvalue2:
    Hello World!

replace

replaceは、指定した文字列で置き換えを行います。パラメータとして置換前と置換後の文字列を指定します。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: {{ .Values.myvalue }}
  myvalue2: {{ replace "He" "xx" .Values.myvalue }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue: Hello World! He
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: Hello World! He
  myvalue2: xxllo World! xx

plural

pluralは、複数形の置き換えを行います。パラメータとして単体形および複数形の文字列を指定します。入力値が1の場合は単体系、1以外の場合は、複数形の文字列を表示します。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: {{ len .Values.myvalue1 | plural "one" "many" }}
  myvalue2: {{ len .Values.myvalue2 | plural "one" "many" }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue1: a
myvalue2: ab
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: one
  myvalue2: many

snakecase

snakecaseは、文字列をキャメルケースをスネークケースに変換します。キャメルケースは単語の先頭を大文字で表記し、複数の単語をつなぎ合わせる方法です。スネークケースは単語の区切りとしてアンダースコア(_)を利用します。

  • キャメルケース:camelCase
  • スネークケース:snake_case
$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: {{ .Values.myvalue }}
  myvalue2: {{ snakecase .Values.myvalue }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue: camelCase
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: camelCase
  myvalue2: camel_case

camelcase

camelcaseは、スネークケースをキャメルケースに変換します。キャメルケースは単語の先頭を大文字で表記し、複数の単語をつなぎ合わせる方法です。スネークケースは単語の区切りとしてアンダースコア(_)を利用します。

  • キャメルケース:camelCase
  • スネークケース:snake_case
$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: {{ .Values.myvalue }}
  myvalue2: {{ camelcase .Values.myvalue }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue: snake_case
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: snake_case
  myvalue2: SnakeCase

kebabcase

kebabcaseは、キャメルケースをケバブケースに変更します。キャメルケースは単語の先頭を大文字で表記し、複数の単語をつなぎ合わせる方法です。ケバブケースは単語の区切りとしてハイフン(-)を利用します。

  • キャメルケース:camelCase
  • ケバブケース:kebab-case
$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: {{ .Values.myvalue }}
  myvalue2: {{ kebabcase .Values.myvalue }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue: kebabCase
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: kebabCase
  myvalue2: kebab-case

swapcase

swapcaseは大文字を小文字に、小文字を大文字に変換します。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: {{ .Values.myvalue }}
  myvalue2: {{ swapcase .Values.myvalue }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue: Hello worlD! aBcD A.A.b.b
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: Hello worlD! aBcD A.A.b.b
  myvalue2: hELLO WORLd! AbCd a.a.B.B

shuffle

shuffleは、文字列をランダムに並び替えます。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: {{ .Values.myvalue }}
  myvalue2: {{ shuffle .Values.myvalue }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue: Hello world!
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: Hello world!
  myvalue2: !rlwHlodloe

regexMatch

regexMatchは、指定した正規表現に適合した場合にtrueを返します。適合しなかった場合はfalseを返します。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: {{ .Values.myvalue }}
  myvalue2: {{ regexMatch "^[A-Z]" .Values.myvalue }}
  myvalue3: {{ regexMatch "^[0-9]" .Values.myvalue }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue: Hello world!
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: Hello world!
  myvalue2: true
  myvalue3: false

regexFindAll

regexFindAllは、文字列から正規表現に適合した部分を切り出して表示します。パラメータの最後に切り出す文字列の数を指定します。-1を指定した場合、適合したすべての文字列を表示します。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: {{ .Values.myvalue }}
  myvalue2: {{ regexFindAll "[A-Z][a-z]" .Values.myvalue 1 }}
  myvalue3: {{ regexFindAll "[A-Z][a-z]" .Values.myvalue -1 }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue: Hello World!
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: Hello World!
  myvalue2: [He]
  myvalue3: [He Wo]

regexFind

regexFindは、文字列から正規表現に適合した最初の部分を切り出して表示します。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: {{ .Values.myvalue }}
  myvalue2: {{ regexFind "[a-z][a-z]" .Values.myvalue }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue: Hello World!
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: Hello World!
  myvalue2: el

regexReplaceAll

regexReplaceAllは、文字列から正規表現に適合した部分を、指定した文字列ですべて置換します。キャプチャ()および$によるキャプチャの参照も利用できます。

$で参照を行う場合、\$とエスケープをしてください。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: {{ .Values.myvalue }}
  myvalue2: {{ regexReplaceAll "([A-Z][a-z])" .Values.myvalue "-\\$1-" }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue: Hello World!
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: Hello World!
  myvalue2: -He-llo -Wo-rld!

regexReplaceAllLiteral

regexReplaceAllLiteralは、文字列から正規表現に適合した部分を、指定した文字列ですべて置換します。変数がリテラルとして扱われるため、変数の展開は行われません。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: {{ .Values.myvalue }}
  myvalue2: {{ regexReplaceAllLiteral "([A-Z][a-z])" .Values.myvalue "-\\$1-" }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue: Hello World!
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: Hello World!
  myvalue2: -$1-llo -$1-rld!

regexSplit

regexSplitは、文字列を正規表現で適合した部分で分割して表示します。正規表現に適合した部分は削除されます。パラメータの最後に、分割して表示する数を指定します。-1を指定することで、適合するすべての結果を返します。-1以外を指定した場合、最後の文字列に未分割の文字列がすべて含まれて表示されます。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: {{ .Values.myvalue }}
  myvalue2: {{ regexSplit "l+" .Values.myvalue 2 }}
  myvalue3: {{ regexSplit "l+" .Values.myvalue -1 }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue: Hello World!
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: Hello World!
  myvalue2: [He o World!]
  myvalue3: [He o Wor d!]

さいごに

本記事ではHelmテンプレートでのSprig関数のうち、文字列操作の使用例を紹介しました。Helmのテンプレートでは、indentquoteがよく使われます。また条件判断などでregexMatchなどの正規表現も便利に使えます。文字列操作関数を有効に使って、汎用性の高いHelmチャートを簡単に作っていきましょう。

EasyDoggie

投稿者プロフィール

石川 淳
スカイアーチネットワークスで、新しいサービスの企画を行っています。
元SIer、元スマフォ向けゲームインフラの経験を生かして、新しいサービスをリリースしていきます。現在企画中のサービスはこちら。
https://github.com/easydoggie
コメントを頂けると嬉しいです。

ABOUTこの記事をかいた人

スカイアーチネットワークスで、新しいサービスの企画を行っています。 元SIer、元スマフォ向けゲームインフラの経験を生かして、新しいサービスをリリースしていきます。現在企画中のサービスはこちら。 https://github.com/easydoggie コメントを頂けると嬉しいです。