iRules 101 - #1 - iRules的介绍
介绍
iRule是F5 BIG-IP设备提供的功能强大的灵活特性,它是基于F5独一无二的TMOS架构。iRule将给你带来无与伦比的对流量的直接操控和对任意IP应用流量的管理。iRules使用的是简单易用的脚本语法,可以让你自定义如何截取,检查,转换和引导inbound和oubound的应用流量。
在后面的系列章节中,我们将探讨TCL语言,包括它的用法和架构,以及iRule对TCL语言的扩展。
iRule的组成部分
iRule包含一个或者多个事件申明,以及在事件被触发时所执行TCL的代码。首先,让我们了解一下事件是什么。
事件
事件是TCL编程语言的扩展, F5利用事件来实现TCL语言编程设计的模块化。在一个CONNECTION流入TMOS,并从另一端流出的这过程中,这个CONNECTION会历经一系列的内部状态,每个状态都对应与iRule语言的一个事件。这些事件,例如CLIENT_ACCEPTED是全局触发的 (意味着无论virtual servers应用哪个profile, 所有的连接都会触发这个事件),有的是基于某个profile而触发的, 例如HTTP_REQUEST, CLIENTSSL_CLIENTCERT, RTSP_RESPONSE 。(意味着只有当virtual servers应用特定的profile,才会触发这些事件)。通过F5附加的when语句来申明事件。
when EVENT_NAME { TCL-CODE }
关于可用的事件列表,请参考iRule Events on CloudDocs。
事件的主要优点是它将iRules分割成逻辑的块,并且以非串行的方式执行。这意味这当一个事件被触发时,只执行那个事件对应的代码。
TCL
iRules运用TCL运行引擎执行脚本逻辑。 TCL语言的相关文档请参考
http://tmml.sourceforge.net/doc/tcl/index.html. TCL语言可以被分解成操作符和命令。TCL语言的一切本质上都可以看作是命令。我们把各种不同的命令划分成3种类型:函数,操作命令和命令。
操作符
操作符是个令牌用来“操作”其他的值。你可以运用操作符来对两个值进行比较。除了TCL内置的操作符(==, <=, >=, ...) iRules还添加了像"starts_with", "contains", 和 "ends_with"这样的操作符对比较进行辅助。你可以在这里”IRules Functions wiki document”查看到完整的F5增加的操作符列表。
函数
函数是个功能命令,通常情况下,它会返回一个值。 像"findclass" 和"matchclass"这样的函数帮助数据组访问;而"findstr", "getfield", 和"substr"这样的函数则用于处理字符串。你可以在”iRules functions wiki document”中查看全部的F5增加的函数。
语句
语句是种典型的没有返回值的命令。基本上,语句的作用是”做点什么事情”。你可以利用TCL的" if" and "switch"语句来执行条件判断,或者,你可以应用iRules专有的语句”log”记录信息到系统日志里,或者用”pool’根据负载均衡得出的结果将流量分配到特定的服务器中。你可以在iRules Statements on Cloud Docs.中查看所有的iRules专有的操作命令。
命令
命令差不多是可以在TCL语言中使用的所有其他的可用控制架构。使用命令,你可以实现像获取http 请求的URI(HTTP::uri),或者用AES key (AES::encrypt)封装数据这样的操作。你可以在iRules Commands on Cloud Docs.中查看扩展命令列表。
在irules语言实现中,TCL语言的一些命令被禁用了。基本上,TCL语言中任何会造成不希望发生的中断流量的TCL命令(file IO, Socket calls, procedures, ...)都被移除了。你可以在这里查看不可用的命令列表。
除了标准的TCL命令,F5还增加了一些附加的命令,这些命令有全局范围内的,如(TCP::client_port, IP::addr, ...),还有基于某个特定profile的,如(HTTP::uri, SIP::call_id, ...).你可以在command section of the iRules on Cloud Docs.中查看所有的命令列表。
把所有的内容放在一起
以下的iRules包含了很多事件,操作符,函数,语句和命令。
when HTTP_REQUEST {
if { [HTTP::uri] starts_with "/foobar" } {
switch -glob [HTTP::uri] {
"*[0-9].jpg" { pool numbers_pool }
default {
if { [string length [substr [HTTP::uri] 0 "?"]] > 0 } {
HTTP::respond 200 content
"<html><head><title>Where's the number?</title></head></body><h1>Where's the number?</h1></body></html>"
}
}
}
}
}
when HTTP_RESPONSE {
if { [HTTP::header Content-Length] > 100 } {
log local0. "too much data requested."
drop
}
}
if { [HTTP::uri] starts_with "/foobar" } {
switch -glob [HTTP::uri] {
"*[0-9].jpg" { pool numbers_pool }
default {
if { [string length [substr [HTTP::uri] 0 "?"]] > 0 } {
HTTP::respond 200 content
"<html><head><title>Where's the number?</title></head></body><h1>Where's the number?</h1></body></html>"
}
}
}
}
}
when HTTP_RESPONSE {
if { [HTTP::header Content-Length] > 100 } {
log local0. "too much data requested."
drop
}
}
问题:
你能指出所有的操作符,函数,语句和命令吗?
在switch的语句中,"default"是什么意思。
在HTTP Response中,Content-Length header如果是空,将会发生什么?
-glob在switch的操作命令中,和在正则表达式中有什么区别?
在函数,语句和命令中,什么时候需要用大括号?
结论
在这篇文章中,我们详细的描述了iRules语言的基本组成部分。在这个系列中的以后的文章中,我们将深入分析iRules的不同的组成部分,以及如何正确的使用这些特点。
相关连接
iRules 事件 - https://clouddocs.f5.com/api/irules/Events.html
iRules 操作符 - https://clouddocs.f5.com/api/irules/Operators.html
Published Feb 02, 2009
Version 1.0ltwagnon
Ret. Employee
Joined May 15, 2019
ltwagnon
Ret. Employee
Joined May 15, 2019
No CommentsBe the first to comment
Help guide the future of your DevCentral Community!
What tools do you use to collaborate? (1min - anonymous)