Helmのテンプレートで計算の関数を使っていますか?
HelmはKubernetes用のパッケージ管理ソフトウェアです。HelmはChartと呼ばれる設計図をもとに、Kubernetesのマニフェストを作成し、パッケージをインストールします。ChartはGoのテンプレートを利用していて、Sprigの関数を利用することができます。本記事ではHelmテンプレートでのSprig関数のうち、算術関数の使用例を紹介します。
TL;DR
- Sprigの算術関数ドキュメント
- 一部の関数を除き
int64
型として計算されます。 - 切り捨て、切り上げ、四捨五入の桁数調整の関数は、
float
型として扱われます。 helm install --dry-run --debug <chart>
コマンドを使うことで、Kubernetesにインストールしないで関数の結果を知ることができます。
目次
検証環境
以下の実行例の動作環境です。
$ helm version --short Client: v2.13.1+g618447c Server: v2.13.1+g618447c
事前準備
検証用のHelmチャートを作成します。
helm create
コマンドでチャートのひな形を作成します。rm
コマンドで不要なファイルを削除します。- 検証のYAMLファイルを作成します。今回はConfigMapを作成するYAMLを作成しています。
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!
Math Functions
sprigの算術関数は一部の関数を除き、
int64
型として計算されます。float
の値を入力してもint64
に変換されるので注意してください。
add
add
は、加算(足し算)を行います。2つ以上のパラメータを渡すことができます。以下の例ではパラメータを3つ渡して、3つの数値の合計を表示しています。入力値としてfloat
型の値を渡していますが、int64
型として計算されることに注意してください。
$ cat << EOF > sprig/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: mychart-configmap data: myvalue: {{ printf "%s + %s + %s = %s" .Values.myvalue1 .Values.myvalue2 .Values.myvalue3 (add .Values.myvalue1 .Values.myvalue2 .Values.myvalue3) }} int64: {{ printf "%f + %f + %f= %d" .Values.myvalue1 .Values.myvalue2 .Values.myvalue3 (add .Values.myvalue1 .Values.myvalue2 .Values.myvalue3) }} EOF $ cat << EOF > sprig/values.yaml myvalue1: 1.5 myvalue2: 2.6 myvalue3: 3.7 EOF $ helm install --dry-run --debug ./sprig ...省略... --- # Source: sprig/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: mychart-configmap data: myvalue: %!!(MISSING)s(float64=1.5) + %!!(MISSING)s(float64=2.6) + %!!(MISSING)s(float64=3.7) = %!!(MISSING)s(int64=6) int64: 1.500000 + 2.600000 + 3.700000= 6
add1
add1
は、インクリメンタル+1
を行います。
$ cat << EOF > sprig/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: mychart-configmap data: myvalue1: {{ .Values.myvalue }} myvalue2: {{ add1 .Values.myvalue }} EOF $ cat << EOF > sprig/values.yaml myvalue: 1 EOF $ helm install --dry-run --debug ./sprig ...省略... --- # Source: sprig/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: mychart-configmap data: myvalue1: 1 myvalue2: 2
sub
sub
は、2つの数の減算(引き算)を行います。add
とは異なりsub
はパラメータを2つまでしか渡せないところに注意してください。
$ cat << EOF > sprig/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: mychart-configmap data: int64: {{ printf "%f - %f= %d" .Values.myvalue1 .Values.myvalue2 (sub .Values.myvalue1 .Values.myvalue2) }} EOF $ cat << EOF > sprig/values.yaml myvalue1: 3.3 myvalue2: 2.2 EOF $ helm install --dry-run --debug ./sprig ...省略... --- # Source: sprig/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: mychart-configmap data: int64: 3.300000 - 2.200000= 1
div
div
は、除算(割り算)を行います。
$ cat << EOF > sprig/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: mychart-configmap data: int64: {{ printf "%f / %f= %d" .Values.myvalue1 .Values.myvalue2 (div .Values.myvalue1 .Values.myvalue2) }} EOF $ cat << EOF > sprig/values.yaml myvalue1: 6.3 myvalue2: 2.2 EOF $ helm install --dry-run --debug ./sprig ...省略... --- # Source: sprig/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: mychart-configmap data: int64: 6.300000 / 2.200000= 3
mod
mod
は、剰余演算(除算の余り)を行います。
$ cat << EOF > sprig/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: mychart-configmap data: int64: {{ printf "%f / %f= %d ... %d" .Values.myvalue1 .Values.myvalue2 (div .Values.myvalue1 .Values.myvalue2) (mod .Values.myvalue1 .Values.myvalue2) }} EOF $ cat << EOF > sprig/values.yaml myvalue1: 5.5 myvalue2: 2.2 EOF $ helm install --dry-run --debug ./sprig ...省略... --- # Source: sprig/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: mychart-configmap data: int64: 5.500000 / 2.200000= 2 ... 1
mul
mul
は、乗算(掛け算)を行います。2つ上のパラーメータを渡すことができます。以下の例では3つの数の乗算を行っています。
$ cat << EOF > sprig/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: mychart-configmap data: int64: {{ printf "%f * %f * %f = %d" .Values.myvalue1 .Values.myvalue2 .Values.myvalue3 (mul .Values.myvalue1 .Values.myvalue2 .Values.myvalue3) }} EOF $ cat << EOF > sprig/values.yaml myvalue1: 2.2 myvalue2: 3.3 myvalue3: 4.4 EOF $ helm install --dry-run --debug ./sprig ...省略... --- # Source: sprig/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: mychart-configmap data: int64: 2.200000 * 3.300000 * 4.400000 = 24
max
max
は、与えられた数値の中で最大のものを返します。
$ cat << EOF > sprig/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: mychart-configmap data: int64: {{ printf "%f, %f, %f: max %d" .Values.myvalue1 .Values.myvalue2 .Values.myvalue3 (max .Values.myvalue1 .Values.myvalue2 .Values.myvalue3) }} EOF $ cat << EOF > sprig/values.yaml myvalue1: 2.2 myvalue2: 3.3 myvalue3: 4.4 EOF $ helm install --dry-run --debug ./sprig ...省略... --- # Source: sprig/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: mychart-configmap data: int64: 2.200000, 3.300000, 4.400000: max 4
min
min
は、与えられた数値の中で最小のものを返します。
$ cat << EOF > sprig/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: mychart-configmap data: int64: {{ printf "%f, %f, %f: min %d" .Values.myvalue1 .Values.myvalue2 .Values.myvalue3 (min .Values.myvalue1 .Values.myvalue2 .Values.myvalue3) }} EOF $ cat << EOF > sprig/values.yaml myvalue1: 2.2 myvalue2: 3.3 myvalue3: 4.4 EOF $ helm install --dry-run --debug ./sprig ...省略... --- # Source: sprig/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: mychart-configmap data: int64: 2.200000, 3.300000, 4.400000: min 2
floor
floor
は入力されたfloat
型の数値から、小数点以下を切り捨てます。floor
の戻り値はfloat
型になります。
$ cat << EOF > sprig/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: mychart-configmap data: myvalue: {{ printf "%s -> floor: %s" .Values.myvalue1 (floor .Values.myvalue1) }} float: {{ printf "%f -> floor: %f" .Values.myvalue1 (floor .Values.myvalue1) }} EOF $ cat << EOF > sprig/values.yaml myvalue1: 12.345 EOF $ helm install --dry-run --debug ./sprig ...省略... --- # Source: sprig/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: mychart-configmap data: myvalue: %!!(MISSING)s(float64=12.345) -> floor: %!!(MISSING)s(float64=12) float: 12.345000 -> floor: 12.000000
ceil
ceil
は、入力されたfloat
型の数値から、小数点以下を切り上げます。ceil
の戻り値はfloat
型になります。
$ cat << EOF > sprig/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: mychart-configmap data: float: {{ printf "%f -> floor: %f" .Values.myvalue1 (ceil .Values.myvalue1) }} EOF $ cat << EOF > sprig/values.yaml myvalue1: 12.345 EOF $ helm install --dry-run --debug ./sprig ...省略... --- # Source: sprig/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: mychart-configmap data: float: 12.345000 -> floor: 13.000000
round
round
は、指定した値で小数部の桁数を四捨五入します。round
の戻り値はfloat
型になります。
round
には、四捨五入対象の数値と小数点以下の桁数のパラメータが必要です。以下の例では小数点以下2桁まで表示(3桁目で四捨五入)をする例です。
$ cat << EOF > sprig/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: mychart-configmap data: float: {{ printf "%f -> floor: %f" .Values.myvalue1 (round .Values.myvalue1 2) }} float: {{ printf "%f -> floor: %f" .Values.myvalue2 (round .Values.myvalue2 2) }} EOF $ cat << EOF > sprig/values.yaml myvalue1: 12.345 myvalue2: 54.321 EOF $ helm install --dry-run --debug ./sprig ...省略... --- # Source: sprig/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: mychart-configmap data: float: 12.345000 -> floor: 12.350000 float: 54.321000 -> floor: 54.320000
おわりに
本記事ではHelmテンプレートでのSprig関数のうち、算術計算の使用例を紹介しました。切り捨てや切り上げなど桁数調整の関数を除き、計算や結果はint64
型で行われることに注意してください。

投稿者プロフィール
最新の投稿
AWS2021.12.02AWS Graviton3 プロセッサを搭載した EC2 C7g インスタンスが発表されました。
セキュリティ2021.07.14ゼロデイ攻撃とは
セキュリティ2021.07.14マルウェアとは
WAF2021.07.13クロスサイトスクリプティングとは?