3.3.3.6. 用法示例
以下是基于 HAProxy 模板文件的简单模板:
从注释开始:
{{/*
Here is a small example of how to work with templates
taken from the HAProxy template file.
*/}}
{{/*
Here is a small example of how to work with templates
taken from the HAProxy template file.
*/}}
模板可以创建任意数量的输出文件。使用定义结构来创建输出文件。文件名指定为要定义的参数,定义块内直到匹配端的所有内容都会被写入为该文件的内容。
{{ define "/var/lib/haproxy/conf/haproxy.config" }}
global
{{ end }}
{{ 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 }}
{{ with (env "ROUTER_SYSLOG_ADDRESS" "") }}
log {{.}} {{env "ROUTER_LOG_FACILITY" "local1"}} {{env "ROUTER_LOG_LEVEL" "warning"}}
{{ end }}
env 函数提取环境变量的值。如果未定义环境变量或 nil,则返回第二个参数。
通过,使用 将 块中的 "."(dot)值设置为作为使用 的参数提供的任何值。with 操作测试点为 nil。如果没有 nil,则会处理到最后。在上面,假设 ROUTER_SYSLOG_ADDRESS 包含 /var/log/msg、ROUTER_LOG_FACILITY 未定义,并且 ROUTER_LOG_LEVEL 包含 info。以下命令将复制到输出文件中:
log /var/log/msg local1 info
log /var/log/msg local1 info
每个接受的路由最终都会在配置文件中生成行。使用 范围 来进入接受的路由:
{{ range $cfgIdx, $cfg := .State }}
backend be_http_{{$cfgIdx}}
{{end}}
{{ range $cfgIdx, $cfg := .State }}
backend be_http_{{$cfgIdx}}
{{end}}
.State 是 ServiceAliasConfig 的映射,其中键是路由名称. 范围 步骤通过映射,每个传递都使用 键 设置 $cfgIdx,并将 $cfg 设置为指向描述路由的 ServiceAliasConfig。如果有两个路由名为 myroute 和 heroute,则上述命令会将以下内容复制到输出文件中:
backend be_http_myroute backend be_http_hisroute
backend be_http_myroute
backend be_http_hisroute
Route Annotations、$cfg.Annotations 也是注解名称作为键的映射,内容字符串作为值。路由可以根据需要拥有更多注解,其使用由模板作者定义。用户将注解代码到路由中,模板作者则自定义 HAProxy 模板来处理注解。
常见用法是索引注解以获取值。
{{$balanceAlgo := index $cfg.Annotations "haproxy.router.openshift.io/balance"}}
{{$balanceAlgo := index $cfg.Annotations "haproxy.router.openshift.io/balance"}}
索引提取给定注解的值(若有)。因此,$balanceAlgo 将包含与注解或 nil 关联的字符串。如上所示,您可以测试非空字符串,并使用 with 结构对其执行操作。
{{ with $balanceAlgo }}
balance $balanceAlgo
{{ end }}
{{ with $balanceAlgo }}
balance $balanceAlgo
{{ end }}
此处,如果 $balanceAlgo 不是 nil,平衡 $balanceAlgo 将复制到输出文件中。
在第二个示例中,您想要根据注释中设置的超时值设置服务器超时。
$value := index $cfg.Annotations "haproxy.router.openshift.io/timeout"
$value := index $cfg.Annotations "haproxy.router.openshift.io/timeout"
现在 $value 会被评估,以确保它包含正确构建的字符串。matchPattern 函数接受正则表达式,如果参数满足表达式要求,则返回 true。
matchPattern "[1-9][0-9]*(us\|ms\|s\|m\|h\|d)?" $value
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 }}
{{if (matchPattern "[1-9][0-9]*(us\|ms\|s\|m\|h\|d)?" $value) }}
timeout server {{$value}}
{{ end }}
它还可用于匹配令牌:
matchPattern "roundrobin|leastconn|source" $balanceAlgo
matchPattern "roundrobin|leastconn|source" $balanceAlgo
另外,也可以使用 matchValues 来匹配令牌:
matchValues $balanceAlgo "roundrobin" "leastconn" "source"
matchValues $balanceAlgo "roundrobin" "leastconn" "source"