弘协网络 | F5技术交流

iRules 101-#03-变量

2020-12-29 12:22:01

CUNHUI

原文链接https://devcentral.f5.com/s/articles/irules-101-03-variables


设置,取消设置和操作变量

iRules 在大多数情况下使用标准的 TCL 变量,因此,在 TCL 中设置、取消设置、计算和影响变量的大多数命令仍然适用。无论您创建的是哪种类型的数据结构(变量),其中许多命令都是相同的,并且它们的命名和行为都是直接的。例如,要设置(或创建)变量,只需使用命令set

即使在设置更复杂的结构并用不同类型的数据(静态或动态)填充它们时,也可以使用相同的命令。再举几个例子:


既然您知道了如何设置变量,接下来你应该学习的是一旦你处理完它,如何删除它,尽管 iRules 在清除垃圾方面很不错,但以后会有更多的内容。要删除已经创建的变量,只需使用unset 命令,如下所示:

这个特定的命令也可以接受多个参数。例如,要删除上面设置的所有基本变量,可以使用:

既然您可以设置和删除变量,您还能对它们做些什么有趣的事情呢?我的意思是,我们都知道它们是用来代替 pool log 等命令中的静态数据的,但是您还有哪些命令可以用来影响内存中已经存在的变量呢?真正的答案是“很多!”,这里有一些有趣的命令。

append
append 用于将数据附加到已经存在的变量中(注意:如果变量不存在,也将创建该变量)



concat
concat 命令将所有作为参数提供的值连接到一个列表中,以空格隔开:



incr
通过使用 incr 命令,可以将变量的值增加1 (如果没有提供值),或者增加所需的值:



变量范围(局部变量与全局变量)

就变量的构造和交互而言,标准TCLiRules最大的区别之一是,在iRules中,实际上只有两个命名空间-局部和全局。所有“普通”变量都在局部范围内。这意味着它们是基于链接的。如果在iRule中设置了变量,它将在该连接的周期内保持存在,并在链接被删除的时候被删除。这通常只是一个请求/响应对,但可能跨越多个请求/响应,具体取决于协议、设置等。这些变量是最有效、最安全的,也是我们98%的时候使用和建议使用的变量。

那么,您要问的是,其他2%是什么?全局变量。iRule中的全局变量的设置方式大致相同,可以像上面演示中的“normal”(局部)变量一样受相同命令的影响,但有一个关键区别:全局变量与会话无关,而是与TMM实例相关。这意味着您不仅可以跨事件,还可以跨连接访问gobal变量中包含的数据。这可能是不必要的,也可能是绝对需要的,具体取决于您要完成的任务(例如,需要跨链接扩展计数器以实现速率限制过滤器之类的功能)。

由于某些原因,我们倾向于仅在绝对需要全局变量时才使用它们。首先是效率,其次是易用性。由于每次连接后TMM都无法很好地删除这些变量,因此您突然不得不担心变量的范围和管理,而不仅仅是设置和忘记。这不是一项艰巨的任务,但是每当您最终使用全局变量时,都应牢记一些事情。如果您设置了它,那么最好也有一个计划来取消它。如果您有多个VIP/或规则访问单个变量,则尤其如此,因为在更新或取消设置变量之前,最后设置的任何值都将保持不变,这在某些情况下可能会导致意外行为甚至错误。

最后,您如何知道哪个变量是哪个?幸运的是,这很容易。全局变量在变量名之前用双冒号定义和表示,例如:: myGlobal。您可以在iRule中轻松发现它们,因为以这种方式将以双冒号开头的任何变量都视为全局变量,因此在看到set :: r [expr rand()] set r [expr rand()] 时不应有任何混淆。只有在RULE_INIT事件中设置变量时,这种情况才会变得有些混乱。在此事件下设置的所有变量都被视为全局变量,因此请记住这一点。但是,同样的命令可以用于局部变量或全局变量,所以请注意。

有关所讨论的命令的更多信息,请参见:

要查看可用的TCL命令列表,查看您可以对变量/使用变量执行哪些有趣的操作,请参阅:

发布评论 加入社群

发布评论

相关文章

F5 VSC Extension简介

Will Tang

2022-07-14 14:51:10 144

iRules 101-#01-iRules简介

CUNHUI

2020-11-06 11:10:36 1356

Login

手机号
验证码
© 2019 F5 Networks, Inc. 版权所有。京ICP备16013763号-1