iRules 101-#01-iRules简介
2020-11-06 11:10:36
CUNHUI
原文链接:https://devcentral.f5.com/s/articles/irules-101-01-introduction-to-irules
简介
iRule是一项基于F5独家TMOS架构的BIG-IP上的强大而灵活的特性。iRules为您提供了前所未有的控制,可以直接操作和管理任何IP应用流量。iRules使用易于学习的脚本语法,并允许您自定义如何拦截、检查、转换和引导入站或出站的应用流量。
在这一系列技术文章中,我们将讨论TCL语言,它的用法和控制结构以及TCL语言的iRule扩展。
iRule的构成
一个iRule由一个或多个事件声明组成,每个声明都包含了在事件发生时执行的TCL代码。首先来看一下什么是事件。
事件
事件是F5添加的TCL扩展,以便基于模块的编程。在连接进入TMOS和从另一端离开之间,有一系列的内部状态由该连接触发。这些状态中的每一个都等同于iRule语言中的事件。这些状态(例如CLIENT_ACCEPTED)可以在全局发生(意味着它们适用于所有连接,而与将哪些配置应用于虚拟服务器Virtual Server无关)。或者它们是基于特定配置的(HTTP_REQUEST,CLIENTSSL_CLIENTCERT,RTSP_RESPONSE等),这意味着它们的状态仅在将特定配置分配给虚拟服务器时才能发生。使用F5添加的“when”语句声明事件。
when EVENT_NAME {TCL-CODE}
有关可用事件的列表,请参阅https://clouddocs.f5.com/api/irules/Events.html。
基于事件驱动的关键好处是,它们允许将iRule分成逻辑块并以非串行方式执行。这意味着,只有当特定事件发生时,才执行该事件的代码。
TCL
iRules使用TCL引擎执行脚本。您可以在http://tmml.sourceforge.net/doc/tcl/index.html上找到TCL语言的参考文档。TCL语言可以分为运算符和命令。在TCL中,基本上所有内容都被视为命令。我们把这些命令归为三种类型:函数,语句和命令。
运算符
运算符对其他值进行“运算”。当比较两个值时,将使用比较运算符。除了内置的TCL运算符(==,<=,> =,...)之外,iRule中还添加了诸如"starts_with","contains"和" ends_with"之类的运算符作为常用比较运算。可以在https://clouddocs.f5.com/api/irules/Operators.html中找到iRules添加/增强的运算符的列表。
函数
函数是通常会返回值的程序命令。诸如"findclass"和"matchclass"之类的功能被用于访问数据组,而" findstr","getfield"和 substr"则被用于处理字符串。有关iRules函数的完整列表,可参阅https://clouddocs.f5.com/api/irules/Functions.html。
语句
语句是通常不返回值的命令。语句的基本功能上是“做某事”。您可以使用TCL的“if”和“ switch”语句执行条件判断,也可以使用iRules特定的语句“log”将消息记录到系统日志中,或使用“ pool”将负载平衡分配给指定的服务池(pool)。有关iRules特定语句的完整列表,请参见https://clouddocs.f5.com/api/irules/Statements.html。
命令
命令几乎是您可以在TCL中使用的所有其他控制结构。使用命令,您可以执行以下操作:获取HTTP请求的URI(HTTP::uri),或使用AES密钥加密数据(AES::encrypt)。
iRules实现中禁用了TCL语言中的多个命令。基本上,所有可能导致流量意外中断的命令(例如文件IO,套接字调用,过程等)都已删除。有关iRules禁用命令的列表,请参阅https://clouddocs.f5.com/api/irules/DisabledTclCommands.html。
除了标准的TCL命令集外,F5还添加了其他命令,这些命令在运行时是全局的(TCP::client_port,IP::addr,...)或基于特定配置的(HTTP::uri,SIP::call_id,...)。完整的命令列表可以在https://clouddocs.f5.com/api/irules/Commands.html中找到。
组合在一起
以下iRule包含几个事件,运算符,函数,语句和命令:
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响应中Content-Length头为空会怎样?
- switch语句和完整的正则表达式中的-glob有什么区别?
- 什么时候需要在函数,语句和命令周围使用方括号?
结束语
在本文中,我们介绍了iRules语言的基本组成部分。在本系列的后续文章中,我们将更深入地研究iRules的各个组成部分以及如何充分利用这些功能。
链接
TCL参考- http://tmml.sourceforge.net/doc/tcl/index.html
iRules事件- https://clouddocs.f5.com/api/irules/Events.html
iRules函数- https://clouddocs.f5.com/api/irules/Functions.html
iRules语句- https://clouddocs.f5.com/api/irules/Statements.html
iRules命令- https://clouddocs.f5.com/api/irules/Commands.html
iRules运算符-https: //clouddocs.f5.com/api/irules/Operators.html
禁用的TCL命令-https://clouddocs.f5.com/api/irules/DisabledTclCommands.html
发布评论 加入社群
相关文章

F5 ACC Chariot简介
Will Tang
2022-11-23 20:12:57 428

F5 VSC Extension简介
Will Tang
2022-07-14 14:51:10 683

iRules 101-#03-变量
CUNHUI
2020-12-29 12:22:01 843

回复评论
发布评论