介绍
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 wiki document
事件的主要优点是它将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 wiki document.中查看所有的iRules专有的操作命令。
命令
命令差不多是可以在TCL语言中使用的所有其他的可用控制架构。使用命令,你可以实现像获取http 请求的URI(HTTP::uri),或者用AES key (AES::encrypt)封装数据这样的操作。你可以在iRules Commands wiki document.中查看扩展命令列表。
 
在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 wiki.中查看所有的命令列表。
 
把所有的内容放在一起
 
以下的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
 }
}

 

 

问题:
 
你能指出所有的操作符,函数,语句和命令吗?
在switch的语句中,"default"是什么意思。
在HTTP Response中,Content-Length header如果是空,将会发生什么?
-glob在switch的操作命令中,和在正则表达式中有什么区别?
在函数,语句和命令中,什么时候需要用大括号?
 
结论
 
在这篇文章中,我们详细的描述了iRules语言的基本组成部分。在这个系列中的以后的文章中,我们将深入分析iRules的不同的组成部分,以及如何正确的使用这些特点。
 
相关连接