f5 LTM irule - 可以在irule

时间:2016-02-09 22:24:48

标签: f5 irule

我需要为许多类似的环境设置配置。每个都将具有遵循模式的不同主机名,例如env1,env2等。

我可以使用每个环境的池和一个带有irule的虚拟服务器,该服务器根据主机名选择池。

我更喜欢的是根据请求的主机名动态生成和选择池名称,而不是列出switch语句中的每个池。维护和自动处理新环境更容易。

代码可能如下所示:

when HTTP_REQUEST {
  pool [string tolower [HTTP:host]]
}

并且每个池名称与主机名匹配。

这可能吗?或者有更好的方法吗?

修改

我扩展了主机名池选择。我现在正在尝试包含端口号。新规则如下:

when HTTP_REQUEST {
  set lb_port "[LB::server port]"
  set hostname "[string tolower [getfield [HTTP::host] : 1]]"
  log local0.info "Pool name $hostname-$lb_port-pool"
  pool "$hostname-$lb_port-pool"

}

这是有效的,但我在日志中看到没有这样的池错误,因为不知何故,端口0请求进入池中。它似乎是第一个请求,后面是合法端口的请求。

Wed Feb 17 20:39:14 EST 2016    info    tmm tmm[6519]       Rule /Common/one-auto-pool-select-by-hostname-port <HTTP_REQUEST>: Pool name my.example.com-80-pool
Wed Feb 17 20:39:14 EST 2016    err tmm1    tmm[6519]   01220001    TCL error: /Common/one-auto-pool-select-by-hostname-port <HTTP_REQUEST> - no such pool: my.example.com-0-pool (line 1) invoked from within "pool "$hostname-$lb_port-pool""
Wed Feb 17 20:39:14 EST 2016    info    tmm1    tmm[6519]       Rule /Common/one-auto-pool-select-by-hostname-port <HTTP_REQUEST>: Pool name my.example.com-0-pool

导致端口0请求的原因是什么?有没有解决方法?例如我可以测试端口0并选择默认端口或忽略它吗?

ONE MORE EDIT

重建虚拟服务器,现在错误已经消失。重建VS只是为了重命名它。我很确定我重新设置了完全相同的设置。

2 个答案:

答案 0 :(得分:2)

是的,您可以在字符串中指定池名称。只要你有一个同名的游泳池,你所拥有的就会奏效。虽然它没有显示以这种方式执行此操作的示例,但您还可以查看pool上的DevCentral维基页面以获取更多信息。

另外,在我的环境中,我通常会创建带有后缀when HTTP_REQUEST { pool "[string tolower [HTTP::host]]_pool" } 的池,以便在查看配置文件时将它们与其他对象区分开来。所以在我的iRules中,我会做这样的事情(基本上是同样的事情):

<!-- Route each tag to the appropiate channel -->
<int-xml:xpath-router id="router" input-channel="routerChannel" evaluate-as-string="true">
    <int-xml:xpath-expression expression="concat(name(./node()), 'Channel')" />
</int-xml:xpath-router>

答案 1 :(得分:1)

迈克尔提到的简单案例有效。如果存在端口,我建议删除端口值:

when HTTP_REQUEST {
    pool "pool_[string tolower [getfield [HTTP::host] : 1]]_[LB::server port]"
}

请记住,客户端可能会发送部分主机名。如果DNS搜索路径设置为example.org,则客户端可能会命中映射到shared/的{​​{1}},但是HTTP :: host标头将仅包含shared.example.org。某些API库可能会在默认端口上附加端口号。简单的代码可能不会发送Host标头。恶意代码可能会发送完全伪造的Host标头。您可以使用shared捕获这些情况。

您还可以使用数据组将主机名映射到池。这允许多个主机使用同一池。示例代码:

catch

通过在数据组中包含单独的条目,这允许when HTTP_REQUEST { set host [string tolower [getfield [HTTP::host] ":" 1]] if { $host == "" } { # if there's no Host header, pull from virtual server name # we use: pool_<virtualserver>_PROTOCOL set host [getfield [virtual name] _ 2] } elseif { not ($host contains ".") } { # if Host header does not contain a dot, assume example.org set host $host.example.org } set pool [class match -value $host[HTTP::uri] starts_with dg_shared.example.org] if { $pool ne ""} { set matched [class match -name $host[HTTP::uri] starts_with dg_shared.example.org] set log(matched) $matched set log(pool) $pool if { [catch { pool $pool } ] } { set log(reason) "Failed to Connect to Pool" call hsllog log call errorpage 404 $log(reason) "https://[HTTP::host][HTTP::uri]" log } } else { call errorpage 404 "No Pool Found" "https://[HTTP::host][HTTP::uri]" log } } when SERVER_CONNECTED { if {!($pool ends_with "_HTTPS") } { SSL::disable serverside } } host.example.org/path1host.example.org处于不同的池中。我没有在此处包括host.example.org/path2hsllog进程。他们转储日志数组以及其他传递的参数。

然后,我们对未以_HTTPS结尾的池禁用服务器端ssl。

注意:与动态生成的池名称一样,BIG-IP UI不会在数据组内部查找池引用,因此该界面将允许您在未使用池的情况下删除其中一个池。

我们使用BigIPReport来标识孤立池: https://devcentral.f5.com/s/articles/bigip-report