はじめに
go templateでyamlファイルを生成するときのエラーにヤキモキしませんか?
yamlももちろんエラーは出してくれます、くれますが自分は一発で見つけられません。例えば}
が抜けてるなとかそれだけでもたまに異様にハマります。
普段あまりyamlを書かない他の言語を見ている人からするとそれくらいは流石に…と思う方もいるかもしれません。では実例を紹介します。
例えばkubernetesのdeployment.yamlとかを生成する場合について見ていきましょう。
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Values.appName }}
spec:
replicas: {{ .Values.replicas }}
selector:
matchLabels:
app: {{ .Values.appName }}
template:
metadata:
labels:
app: {{ .Values.appName }}
spec:
containers:
{{ if .Values.enableSidecar }}
- name: sidecar
image: {{ .Values.sidecarImage }}
{{ end }}
- name: main
image: {{ .Values.mainImage }
ここに以下のような値を入れて展開します。
appName: myapp
replicas: 3
enableSidecar: true
sidecarImage: "sidecar:1.0"
mainImage: "nginx:1.14.2"
おや、エラーが出ますね、見ましょう。
Error: template: deployment.tpl.yaml:18: unexpected EOF in operand
18行目に出ていますね、単純に18行目をみると image: {{ .Values.sidecarImage }}
かな?となります。でもここは間違えてないです。
いやどこやねーん!と心で叫んでしまいます。
実際にエラーが生じているのは最後の行の image: {{ .Values.mainImage }
の}
不足です。わからないですね。このような場合に関する対処を書いておきます。
対処法
理屈を理解して真面目に行数を見るのをやめる
まず初めに変えるべきは心持ちです。go templateで分岐をしているものをデバッグする際に真面目にエラー文と向き合ってはいけません。
これを知るだけで大分デバッグする時の焦る気持ちが変わります(個人の感想です)
これの原因はyamlがif分岐など動的にyamlファイルを生成することです。
エラーの出力は生成後のyamlファイルの行数であり、この行数が動的に変更されてしまうことが難読化させる一番の原因です。
この原因を踏まえて「これをすればデバッグ楽になるよ!」というほどの解決法はありませんが、何度か直面した身として幾つかの方法を提案しておきます。
ヤマを張る
元も子もないことですみません、でも割と大事な気がしてます。
大概はインデント、}
や:
の不足です。とりあえず目grepして何もないことを確認しましょう。
これはちょっとした設定を付け加えたり追加作業には効果覿面です。
条件分岐等動的な部分を固定化してみる
真面目なデバッグ方法ですが、一時的にif文などの動的に生成される部分をコメントアウトします。
# if文を一時的にコメントアウトして簡略化
containers:
# {{ if .Values.enableSidecar }}
- name: sidecar
image: {{ .Values.sidecarImage }}
# {{ end }}
- name: main
image: {{ .Values.mainImage }
これをする利点は問題が絞れることです。
-
この状態でもエラーが出る場合
この場合にもエラーが出る場合はyamlの構文ミスの可能性が高いです。
この場合、yamlの構文チェックをします。
これは例えばonline yaml parserなどにかけるとできます。
他にもこの状態であればエラー出力の場所とファイル内の場所がずれなくなるため、デバッグが容易になります。 -
この状態でエラーが出なくなる場合
これはgo templateで追加した動的生成の部分のミスの可能性が高いです。
動的生成の場所と書き方はだいぶ限られているのでコメントアウトをずらしたりして地道に原因箇所を探してみましょう。
終わりに
私もたまにめっちゃハマって苦しみます。大概しょうもないミスです。
上記内容は正直クリティカルにデバッグを短縮することができるわけではありません、それでも行数がズレるということを理解するだけで大分自分はデバッグが気持ち楽になりました。
同じように苦しんでいる人が少しでも救われることを祈ってこの記事を締めたいと思います。