3.3.3.6. 使用例
以下で HAProxy テンプレートファイルに基づく単純なテンプレートを示します。
以下のコメントで開始します。
{{/* Here is a small example of how to work with templates taken from the HAProxy template file. */}}
テンプレートは任意の数の出力ファイルを作成できます。define コンストラクトを使用して出力ファイルを作成します。ファイル名は定義する引数として指定され、define ブロック内の一致する終了部分までのすべての情報がそのファイルの内容として書き込まれます。
{{ define "/var/lib/haproxy/conf/haproxy.config" }} global {{ end }}
上記は global
を /var/lib/haproxy/conf/haproxy.config ファイルにコピーし、ファイルを閉じます。
ロギングを環境変数に基づいてセットアップします。
{{ with (env "ROUTER_SYSLOG_ADDRESS" "") }} log {{.}} {{env "ROUTER_LOG_FACILITY" "local1"}} {{env "ROUTER_LOG_LEVEL" "warning"}} {{ end }}
env
関数は、環境変数の値を抽出します。環境変数が定義されていないか、または nil
の場合、2 つ目の引数が返されます。
with コンストラクトは with ブロック内の "." (ドット) の値を with に引数として提供される値に設定します。with
アクションは Dot で nil
をテストします。nil
ではない場合、その句は end
(終了部分) まで処理されます。上記では、ROUTER_SYSLOG_ADDRESS
に /var/log/msg が含まれ、ROUTER_LOG_FACILITY
が定義されておらず、ROUTER_LOG_LEVEL
に info
が含まれていると想定しています。以下が出力ファイルにコピーされます。
log /var/log/msg local1 info
許可された各ルートは設定ファイルの行を生成します。range
を使用して、許可されたルートを確認します。
{{ range $cfgIdx, $cfg := .State }} backend be_http_{{$cfgIdx}} {{end}}
.State
は ServiceAliasConfig
のマップです。ここでは、キーはルート名です。range
はマップを通じて、パスするたびに key
を使用して $cfgIdx
を設定し、 $cfg
がルートを記述する ServiceAliasConfig
をポイントするよう設定します。myroute
と hisroute
という 2 つのルートがある場合、上記により以下が出力ファイルにコピーされます。
backend be_http_myroute backend be_http_hisroute
ルートアノテーション $cfg.Annotations
もマップであり、アノテーション名がキーとなり、コンテンツの文字列が値になっています。ルートは必要な数だけアノテーションを持つことができ、テンプレートの作成者が使用方法を定義します。ユーザーはアノテーションをルートにコード化し、テンプレート作成者は HAProxy テンプレートをカスタマイズしてそのアノテーションを処理できるようにします。
通常はアノテーションをインデックス化して値を取得します。
{{$balanceAlgo := index $cfg.Annotations "haproxy.router.openshift.io/balance"}}
インデックスは指定されたアノテーションの値を抽出します。そのため、$balanceAlgo
はアノテーションまたは nil
に関連付けられた文字列が含まれます。上記のように、nil
以外の文字列についてテストし、with
コンストラクトを使用して影響を確認することができます。
{{ with $balanceAlgo }} balance $balanceAlgo {{ end }}
$balanceAlgo
が nil
でない場合、balance $balanceAlgo
は出力ファイルにコピーされます。
2 つ目の例では、アノテーションのタイムアウト値の設定に基づいてサーバータイムアウトを設定します。
$value := index $cfg.Annotations "haproxy.router.openshift.io/timeout"
$value
を評価して、適切に作成された文字列が含まれていることを確認できます。matchPattern
関数は正規表現を受け入れ、引数が表現を満たしていれば true
を返します。
matchPattern "[1-9][0-9]*(us\|ms\|s\|m\|h\|d)?" $value
これにより 5000ms
を受け入れますが、7y
は受け取りません。この結果はテストで使用できます。
{{if (matchPattern "[1-9][0-9]*(us\|ms\|s\|m\|h\|d)?" $value) }} timeout server {{$value}} {{ end }}
これを使用してトークンに一致させることもできます。
matchPattern "roundrobin|leastconn|source" $balanceAlgo
または、matchValues
を使用してトークンと一致させることもできます。
matchValues $balanceAlgo "roundrobin" "leastconn" "source"