Forum Discussion
direct traffic based on information from the XML request
Dear All,
I need a solution on IRULE for example to solve the following scenario:
I have 10 servers that will receive XML requests. the unique ID in each XML request will be a number such as:
965123239490
now I want to direct the traffic depends on the last digit on that number. So, the traffic in "if else" style will be as follow:
{ if request ends with digit 0 in the number --> send it to server 1 in case server 1 down --> send it to server 2 } if request ends with digit 1 in the number --> send it to server 2 in case server 2 down --> send it to server 3 } if request ends with digit 2 in the number --> send it to server 3 in case server 3 down --> send it to server 4 }
etc.....
appreciate your support on how to get this down using F5 LB.
Thanks in advance. Mohamed.
27 Replies
- Al-Mutlaq_21911
Nimbostratus
Thanks a lot, it's working perfectly except the default not yet working..
i have put the the default as per below: default { pool $default_pool member 172.24.248.85 8080 }
we are almost there :) appreciate your support.
- Al-Mutlaq_21911
Nimbostratus
any idea?
BR,
- Stanislas_Piro2
Cumulonimbus
In the irule, if the MSISDN is not in query string and content type is not XML, the member is not defined in the irule... the request is load balanced on on of pool members...
I added a else condition in the HTTP_REQUEST event.
when CLIENT_ACCEPTED { set default_pool [LB::server pool] } HTTP_REQUEST { set msisdn [URI::decode [URI::query [HTTP::uri] msisdn]] if {[string length $msisdn] } { switch -glob $msisdn { "*0" { if { [LB::status pool $default_pool member 172.24.248.85 8580] eq "up" } { pool $default_pool member 172.24.248.85 8580 } else { pool $default_pool member 172.24.248.85 8680 } } "*1" { if { [LB::status pool $default_pool member 172.24.248.85 8680] eq "up" } { pool $default_pool member 172.24.248.85 8580 } else { pool $default_pool member 172.24.248.85 8680 } } default { pool $default_pool member 172.24.248.85 8080 } } } elseif { [HTTP::header Content-Type] contains "xml" } { HTTP::collect [HTTP::header Content-Length] } else { pool $default_pool member 172.24.248.85 8080 } } when HTTP_REQUEST_DATA { set msisdn [string trim [findstr [HTTP::payload] "" 8 ""]] switch -glob $msisdn { "*0" { if { [LB::status pool $default_pool member 172.24.248.85 8580] eq "up" } { pool $default_pool member 172.24.248.85 8580 } else { pool $default_pool member 172.24.248.85 8680 } } "*1" { if { [LB::status pool $default_pool member 172.24.248.85 8680] eq "up" } { pool $default_pool member 172.24.248.85 8580 } else { pool $default_pool member 172.24.248.85 8680 } } default { pool $default_pool member 172.24.248.85 8080 } } } - Al-Mutlaq_21911
Nimbostratus
Hi Currently am interested only on HTTP request, but still it's not going to default in case both members down
- Al-Mutlaq_21911
Nimbostratus
when CLIENT_ACCEPTED { set default_pool [LB::server pool] } when HTTP_REQUEST { set msisdn [URI::decode [URI::query [HTTP::uri] msisdn]] if {[string length $msisdn] } { switch -glob $msisdn { "*0" { if { [LB::status pool $default_pool member 172.24.248.85 8080] eq "up" } { pool $default_pool member 172.24.248.85 8080 } else { pool $default_pool member 172.24.248.85 8180 } } "*1" { if { [LB::status pool $default_pool member 172.24.248.85 8180] eq "up" } { pool $default_pool member 172.24.248.85 8180 } else { pool $default_pool member 172.24.248.85 8080 } } "*2" { if { [LB::status pool $default_pool member 172.24.248.85 8280] eq "up" } { pool $default_pool member 172.24.248.85 8280 } else { pool $default_pool member 172.24.248.85 8380 } } "*3" { if { [LB::status pool $default_pool member 172.24.248.85 8380] eq "up" } { pool $default_pool member 172.24.248.85 8380 } else { pool $default_pool member 172.24.248.85 8280 } } "*4" { if { [LB::status pool $default_pool member 172.24.248.85 8480] eq "up" } { pool $default_pool member 172.24.248.85 8480 } else { pool $default_pool member 172.24.248.85 8580 } } "*5" { if { [LB::status pool $default_pool member 172.24.248.85 8580] eq "up" } { pool $default_pool member 172.24.248.85 8580 } else { pool $default_pool member 172.24.248.85 8480 } } "*6" { if { [LB::status pool $default_pool member 172.24.248.85 8680] eq "up" } { pool $default_pool member 172.24.248.85 8680 } else { pool $default_pool member 172.24.248.85 8780 } } "*7" { if { [LB::status pool $default_pool member 172.24.248.85 8780] eq "up" } { pool $default_pool member 172.24.248.85 8780 } else { pool $default_pool member 172.24.248.85 8680 } } "*8" { if { [LB::status pool $default_pool member 172.24.248.85 8880] eq "up" } { pool $default_pool member 172.24.248.85 8880 } else { pool $default_pool member 172.24.248.85 8980 } } "*9" { if { [LB::status pool $default_pool member 172.24.248.85 8980] eq "up" } { pool $default_pool member 172.24.248.85 8980 } else { pool $default_pool member 172.24.248.85 8880 } } default { pool $default_pool member 172.24.248.85 8080 } } } }
- Stanislas_Piro2
Cumulonimbus
try something like that:
when CLIENT_ACCEPTED { set default_pool [LB::server pool] } when HTTP_REQUEST { set msisdn [URI::decode [URI::query [HTTP::uri] msisdn]] if {[string length $msisdn] } { switch -glob $msisdn { "*0" { set ports {8080 8180 8280 8380 8480 8580 8680 8780 8880 8980}} "*1" { set ports {8180 8080 8380 8280 8580 8480 8780 8680 8980 8880}} "*2" { set ports {8280 8380 8480 8580 8680 8780 8880 8980 8080 8180}} "*3" { set ports {8380 8280 8580 8480 8780 8680 8980 8880 8180 8080}} "*4" { set ports {8480 8580 8680 8780 8880 8980 8080 8180 8280 8380}} "*5" { set ports {8580 8480 8780 8680 8980 8880 8180 8080 8380 8280}} "*6" { set ports {8680 8780 8880 8980 8080 8180 8280 8380 8480 8580}} "*7" { set ports {8780 8680 8980 8880 8180 8080 8380 8280 8580 8480}} "*8" { set ports {8880 8980 8080 8180 8280 8380 8480 8580 8680 8780}} "*9" { set ports {8980 8880 8080 8180 8280 8380 8480 8580 8680 8780}} default { set ports {8080 8180 8080 8180 8480 8580 8680 8780 8880 8980}} } } else {set ports {8080 8180 8280 8380 8480 8580 8680 8780 8880 8980}} foreach port $ports { if { [LB::status pool $default_pool member 172.24.248.85 $port] eq "up" } { pool $default_pool member 172.24.248.85 $port break } } } - Al-Mutlaq_21911
Nimbostratus
Hi,
all traffics rejects with this IRULE!!
- Stanislas_Piro2
Cumulonimbus
Do you have any tcl error in local traffic logs? - Al-Mutlaq_21911
Nimbostratus
Mon Dec 21 06:34:05 AST 2015 sdprm1tp1lb01 mcpd[1029] 01070638 Pool member 172.24.248.85:8280 monitor status down. Mon Dec 21 06:34:05 AST 2015 sdprm1tp1lb01 mcpd[1029] 01070638 Pool member 172.24.248.85:8280 monitor status down. Mon Dec 21 06:34:06 AST 2015 sdprm1tp1lb01 mcpd[1029] 01070638 Pool member 172.24.248.85:8680 monitor status down. Mon Dec 21 06:34:06 AST 2015 sdprm1tp1lb01 mcpd[1029] 01070638 Pool member 172.24.248.85:8680 monitor status down. Mon Dec 21 06:34:08 AST 2015 sdprm1tp1lb01 mcpd[1029] 01070638 Pool member 172.24.248.85:8080 monitor status down. Mon Dec 21 06:34:08 AST 2015 sdprm1tp1lb01 mcpd[1029] 01070638 Pool member 172.24.248.85:8080 monitor status down. Mon Dec 21 06:45:41 AST 2015 sdprm1tp1lb01 mcpd[1029] 01070638 Pool member 172.24.248.85:8280 monitor status up. Mon Dec 21 06:45:41 AST 2015 sdprm1tp1lb01 mcpd[1029] 01070638 Pool member 172.24.248.85:8280 monitor status up. Mon Dec 21 06:45:41 AST 2015 sdprm1tp1lb01 mcpd[1029] 01070638 Pool member 172.24.248.85:8180 monitor status up. Mon Dec 21 06:45:41 AST 2015 sdprm1tp1lb01 mcpd[1029] 01070638 Pool member 172.24.248.85:8180 monitor status up. Mon Dec 21 06:45:42 AST 2015 sdprm1tp1lb01 mcpd[1029] 01070638 Pool member 172.24.248.85:8080 monitor status up. Mon Dec 21 06:45:42 AST 2015 sdprm1tp1lb01 mcpd[1029] 01070638 Pool member 172.24.248.85:8080 monitor status up. Mon Dec 21 06:48:48 AST 2015 sdprm1tp1lb01 mcpd[1029] 01070151 Rule [MSISDN] error: line 80: [undefined procedure: default] [default { pool $default_pool member 172.24.248.85 8080 }] Mon Dec 21 07:02:26 AST 2015 sdprm1tp1lb01 mcpd[1029] 01070638 Pool member 172.24.248.85:8680 monitor status up. Mon Dec 21 07:02:26 AST 2015 sdprm1tp1lb01 mcpd[1029] 01070638 Pool member 172.24.248.85:8680 monitor status up. Mon Dec 21 07:02:27 AST 2015 sdprm1tp1lb01 mcpd[1029] 01070638 Pool member 172.24.248.85:8580 monitor status up. Mon Dec 21 07:02:27 AST 2015 sdprm1tp1lb01 mcpd[1029] 01070638 Pool member 172.24.248.85:8580 monitor status up. Mon Dec 21 07:27:46 AST 2015 sdprm1tp1lb01 mcpd[1029] 01070638 Pool member 172.24.248.85:8280 monitor status down. Mon Dec 21 07:27:46 AST 2015 sdprm1tp1lb01 mcpd[1029] 01070638 Pool member 172.24.248.85:8280 monitor status down. Mon Dec 21 07:27:47 AST 2015 sdprm1tp1lb01 mcpd[1029] 01070638 Pool member 172.24.248.85:8680 monitor status down. Mon Dec 21 07:27:47 AST 2015 sdprm1tp1lb01 mcpd[1029] 01070638 Pool member 172.24.248.85:8680 monitor status down. Mon Dec 21 07:27:47 AST 2015 sdprm1tp1lb01 mcpd[1029] 01070638 Pool member 172.24.248.85:8180 monitor status down. Mon Dec 21 07:27:47 AST 2015 sdprm1tp1lb01 mcpd[1029] 01070638 Pool member 172.24.248.85:8180 monitor status down. Mon Dec 21 07:27:48 AST 2015 sdprm1tp1lb01 mcpd[1029] 01070638 Pool member 172.24.248.85:8580 monitor status down. Mon Dec 21 07:27:48 AST 2015 sdprm1tp1lb01 mcpd[1029] 01070638 Pool member 172.24.248.85:8580 monitor status down. Mon Dec 21 07:27:48 AST 2015 sdprm1tp1lb01 mcpd[1029] 01070638 Pool member 172.24.248.85:8080 monitor status down. Mon Dec 21 07:27:48 AST 2015 sdprm1tp1lb01 mcpd[1029] 01070638 Pool member 172.24.248.85:8080 monitor status down. Mon Dec 21 07:32:53 AST 2015 sdprm1tp1lb01 mcpd[1029] 01070638 Pool member 172.24.248.85:8080 monitor status up. Mon Dec 21 07:32:53 AST 2015 sdprm1tp1lb01 mcpd[1029] 01070638 Pool member 172.24.248.85:8080 monitor status up. Mon Dec 21 07:51:37 AST 2015 sdprm1tp1lb01 mcpd[1029] 01070151 Rule [MSISDN] error: line 81: [undefined procedure: else] [else] Mon Dec 21 09:53:21 AST 2015 tmm tmm[954] 01220001 TCL error: Rule MSISDN HTTP_REQUEST - cant read ports: no such variable while executing set $ports {8880 8980 8080 8180 8280 8380 8480 8580 8680 8780} *8 arm line 1 invoked from within switch -glob $msisdn { *0 { set $ports {8080 8180 8280 8380 8480 8580 8680 8780 8880 8980}} *1 { set $ports {8180 8080 838... Mon Dec 21 09:53:22 AST 2015 tmm tmm[954] 01220001 TCL error: Rule MSISDN HTTP_REQUEST - cant read ports: no such variable while executing set $ports {8880 8980 8080 8180 8280 8380 8480 8580 8680 8780} *8 arm line 1 invoked from within switch -glob $msisdn { *0 { set $ports {8080 8180 8280 8380 8480 8580 8680 8780 8880 8980}} *1 { set $ports {8180 8080 838... Mon Dec 21 09:53:27 AST 2015 tmm tmm[954] 01220001 TCL error: Rule MSISDN HTTP_REQUEST - cant read ports: no such variable while executing set $ports {8080 8180 8280 8380 8480 8580 8680 8780 8880 8980} *0 arm line 1 invoked from within switch -glob $msisdn { *0 { set $ports {8080 8180 8280 8380 8480 8580 8680 8780 8880 8980}} *1 { set $ports {8180 8080 838... Mon Dec 21 09:53:29 AST 2015 tmm tmm[954] 01220001 TCL error: Rule MSISDN HTTP_REQUEST - cant read ports: no such variable while executing set $ports {8080 8180 8280 8380 8480 8580 8680 8780 8880 8980} *0 arm line 1 invoked from within switch -glob $msisdn { *0 { set $ports {8080 8180 8280 8380 8480 8580 8680 8780 8880 8980}} *1 { set $ports {8180 8080 838... Mon Dec 21 09:55:08 AST 2015 tmm tmm[954] 01220001 TCL error: Rule MSISDN HTTP_REQUEST - cant read ports: no such variable while executing set $ports {8080 8180 8280 8380 8480 8580 8680 8780 8880 8980} *0 arm line 1 invoked from within switch -glob $msisdn { *0 { set $ports {8080 8180 8280 8380 8480 8580 8680 8780 8880 8980}} *1 { set $ports {8180 8080 838... - Stanislas_Piro2
Cumulonimbus
I corrected the irule... there was a $ in the set command...
- Stanislas_Piro2
Cumulonimbus
I don't understand what is wrong on the updated irule...
I tested it successfully...
Can you try this irule and update with the last /var/log/ltm lines...
when CLIENT_ACCEPTED { set default_pool [LB::server pool] } when HTTP_REQUEST { set msisdn [URI::decode [URI::query [HTTP::uri] msisdn]] if {[string length $msisdn] } { switch -glob $msisdn { "*0" { set ports {8080 8180 8280 8380 8480 8580 8680 8780 8880 8980}} "*1" { set ports {8180 8080 8380 8280 8580 8480 8780 8680 8980 8880}} "*2" { set ports {8280 8380 8480 8580 8680 8780 8880 8980 8080 8180}} "*3" { set ports {8380 8280 8580 8480 8780 8680 8980 8880 8180 8080}} "*4" { set ports {8480 8580 8680 8780 8880 8980 8080 8180 8280 8380}} "*5" { set ports {8580 8480 8780 8680 8980 8880 8180 8080 8380 8280}} "*6" { set ports {8680 8780 8880 8980 8080 8180 8280 8380 8480 8580}} "*7" { set ports {8780 8680 8980 8880 8180 8080 8380 8280 8580 8480}} "*8" { set ports {8880 8980 8080 8180 8280 8380 8480 8580 8680 8780}} "*9" { set ports {8980 8880 8080 8180 8280 8380 8480 8580 8680 8780}} default { set ports {8080 8180 8080 8180 8480 8580 8680 8780 8880 8980}} } } else {set ports {8080 8180 8280 8380 8480 8580 8680 8780 8880 8980}} foreach port $ports { if { [LB::status pool $default_pool member 172.24.248.85 $port] eq "up" } { pool $default_pool member 172.24.248.85 $port log local0. "id: $msisdn\tselected port: $port" break } } }The expected behavior of this irule is to assign pool member port based on the ports list assigned per msisdn parameter.
- Stanislas_Piro2
Cumulonimbus
Ok,
the issue is because you stripped one part of the irule. if the irule use only query parameter, you can remove the
... I answered this issue previously before you remove the XML part by adding a else statementif {[string length $msisdn] } {
.} else { pool $default_pool member 172.24.248.85 8080 }The irule become:
when CLIENT_ACCEPTED { set default_pool [LB::server pool] } when HTTP_REQUEST { set msisdn [URI::decode [URI::query [HTTP::uri] msisdn]] switch -glob $msisdn { "*0" { if { [LB::status pool $default_pool member 172.24.248.85 8080] eq "up" } { pool $default_pool member 172.24.248.85 8080 } else { pool $default_pool member 172.24.248.85 8180 } } "*1" { if { [LB::status pool $default_pool member 172.24.248.85 8180] eq "up" } { pool $default_pool member 172.24.248.85 8180 } else { pool $default_pool member 172.24.248.85 8080 } } "*2" { if { [LB::status pool $default_pool member 172.24.248.85 8280] eq "up" } { pool $default_pool member 172.24.248.85 8280 } else { pool $default_pool member 172.24.248.85 8380 } } "*3" { if { [LB::status pool $default_pool member 172.24.248.85 8380] eq "up" } { pool $default_pool member 172.24.248.85 8380 } else { pool $default_pool member 172.24.248.85 8280 } } "*4" { if { [LB::status pool $default_pool member 172.24.248.85 8480] eq "up" } { pool $default_pool member 172.24.248.85 8480 } else { pool $default_pool member 172.24.248.85 8580 } } "*5" { if { [LB::status pool $default_pool member 172.24.248.85 8580] eq "up" } { pool $default_pool member 172.24.248.85 8580 } else { pool $default_pool member 172.24.248.85 8480 } } "*6" { if { [LB::status pool $default_pool member 172.24.248.85 8680] eq "up" } { pool $default_pool member 172.24.248.85 8680 } else { pool $default_pool member 172.24.248.85 8780 } } "*7" { if { [LB::status pool $default_pool member 172.24.248.85 8780] eq "up" } { pool $default_pool member 172.24.248.85 8780 } else { pool $default_pool member 172.24.248.85 8680 } } "*8" { if { [LB::status pool $default_pool member 172.24.248.85 8880] eq "up" } { pool $default_pool member 172.24.248.85 8880 } else { pool $default_pool member 172.24.248.85 8980 } } "*9" { if { [LB::status pool $default_pool member 172.24.248.85 8980] eq "up" } { pool $default_pool member 172.24.248.85 8980 } else { pool $default_pool member 172.24.248.85 8880 } } default { pool $default_pool member 172.24.248.85 8080 } } }But you can look at my previous irule assigning a list of pool members and not only 2...
- Al-Mutlaq_21911
Nimbostratus
no actually, the expected is: send to port 8080 if it is up, else, it send to port 8180, else pool member 8080 regardless it's up or down.
another example: send to port 8980 if it is up, else, it send to port 8880, else 8080
so 8080 will be always my default
- Stanislas_Piro2
Cumulonimbus
You can try this:
The pool member 8080 is assigned at the beginning... if msisdn is present and pool members are up, the pool member is changed.
when CLIENT_ACCEPTED { set default_pool [LB::server pool] } when HTTP_REQUEST { pool $default_pool member 172.24.248.85 8080 set msisdn [URI::decode [URI::query [HTTP::uri] msisdn]] switch -glob $msisdn { "*0" { set ports {8080 8180}} "*1" { set ports {8180 8080}} "*2" { set ports {8280 8380}} "*3" { set ports {8380 8280}} "*4" { set ports {8480 8580}} "*5" { set ports {8580 8480}} "*6" { set ports {8680 8780}} "*7" { set ports {8780 8680}} "*8" { set ports {8880 8980}} "*9" { set ports {8980 8880}} default { set ports {8080 8180}} } foreach port $ports { if { [LB::status pool $default_pool member 172.24.248.85 $port] eq "up" } { pool $default_pool member 172.24.248.85 $port break } } }
Help guide the future of your DevCentral Community!
What tools do you use to collaborate? (1min - anonymous)Recent Discussions
Related Content
* Getting Started on DevCentral
* Community Guidelines
* Community Terms of Use / EULA
* Community Ranking Explained
* Community Resources
* Contact the DevCentral Team
* Update MFA on account.f5.com
