Configuración y uso de variables
Primero debe crear una variable y, a continuación, asignar un valor o especificar la operación que debe realizarse en la variable. Tras realizar estas operaciones, puede utilizar la asignación como una acción directiva.
Nota: Una vez configurada, la configuración de una variable no se puede modificar ni restablecer. Si es necesario cambiar la variable, se deben eliminar la variable y todas las referencias a la variable (expresiones y asignaciones). A continuación, la variable se puede volver a agregar con una nueva configuración y se pueden volver a agregar las referencias (expresiones y asignaciones).
Para configurar variables mediante la interfaz de línea de comandos
- Crea una variable.
add ns variable <name> -type <string> [-scope global] [-ifFull ( undef | lru )] [-ifValueTooBig ( undef | truncate )] [-ifNoValue ( undef | init )] [-init <string>] [-expires <positive_integer>] [-comment <string>]
<!--NeedCopy-->
Nota: Consulte la página del manual “man add ns variable” para obtener una descripción de los parámetros del comando.
Ejemplo 1: Cree una variable ulong llamada “my_counter” e inicialícela en 1.
add ns variable my_counter –type ulong -init 1
<!--NeedCopy-->
Ejemplo 2: Crea un mapa llamado “user_privilege_map”. El mapa contendrá claves de una longitud máxima de 15 caracteres y valores de texto de una longitud máxima de 10 caracteres, con un máximo de 10000 entradas.
add ns variable user_privilege_map -type map(text(15),text(10),10000)
<!--NeedCopy-->
Nota: Si el mapa contiene 10 000 entradas no caducadas, las asignaciones de claves nuevas reutilizan una de las entradas utilizadas menos recientemente. De forma predeterminada, una expresión que intente obtener un valor para una clave inexistente inicializará un valor de texto vacío.
Asigne el valor o especifique la operación que se va a realizar en la variable. Esto se hace mediante la creación de una tarea.
add ns assignment <name> -variable <expression> [-set <expression> | -add <expression> | -sub <expression> | -append <expression> | -clear] [-comment <string>]
<!--NeedCopy-->
Nota: Se hace referencia a una variable mediante el selector de variables ($). Por lo tanto, $variable1 se usa para hacer referencia a variables de texto o ulong. Del mismo modo, $variable2 [keyexpression] se usa para hacer referencia a las variables del mapa.
Ejemplo 1: Defina una asignación denominada “inc_my_counter” que añada automáticamente 1 a la variable “my_counter”.
add ns assignment inc_my_counter -variable $my_counter -add 1
<!--NeedCopy-->
Ejemplo 2: Defina una asignación denominada “set_user_privilege” que añada a la variable “user_privilege_map” una entrada para la dirección IP del cliente con el valor devuelto por la llamada HTTP “get_user_privilege”.
add ns assignment set_user_privilege -variable $user_privilege_map[client.ip.src.typecast_text_t] -set sys.http.callout(get_user_privilege)
<!--NeedCopy-->
Nota: Si ya existe una entrada para esa clave, se reemplazará el valor. De lo contrario, se agregará una nueva entrada para la clave y el valor. Según la declaración anterior de user_privilege_map, si el mapa ya tiene 10 000 entradas, una de las entradas utilizadas menos recientemente se reutilizará para la nueva clave y el valor.
-
Invoca la asignación de variables en una directiva.
Hay dos funciones que pueden operar en variables de mapa.
-
$name.valueExists (expresión clave). Devuelve true si hay un valor en el mapa seleccionado por la expresión clave. De lo contrario, devuelve false. Esta función actualizará la información de caducidad y de LRU si la entrada del mapa existe, pero no creará una nueva entrada de mapa si el valor no existe.
-
$nombre.ValueCount. Devuelve el número de valores que contiene actualmente la variable. Es el número de entradas de un mapa. Para una variable singleton, es 0 si la variable no está inicializada o 1 en caso contrario.
Ejemplo: invoque la asignación denominada “set_user_privilege” con una directiva de compresión.
-
add cmp policy set_user_privilege_pol -rule $user_privilege_map.valueExists(client.ip.src.typecast_text_t).not -resAction set_user_privilege
<!--NeedCopy-->
Caso de uso para insertar el encabezado HTTP en el lado de la respuesta
El siguiente ejemplo muestra un ejemplo de una variable singleton.
Añada una variable única de tipo texto. Esta variable puede contener un máximo de 100 bytes de datos.
add ns variable http_req_data -type text(100) -scope transaction
<!--NeedCopy-->
Agregue una acción de asignación, que se utilizará para almacenar los datos de la solicitud HTTP en la variable.
add ns assignment set_http_req_data -variable $http_req_data -set http.req.body(100)
<!--NeedCopy-->
Agregue una acción de reescritura para insertar el encabezado HTTP, cuyo valor se obtendrá de la variable.
add rewrite action act_ins_header insert_http_header user_name $http_req_data.after_str("user_name").before_str("password")
<!--NeedCopy-->
Añada una directiva de reescritura que se evalúe en el momento de la solicitud y tome medidas de asignación para almacenar los datos. Cuando apliquemos esta directiva, realizaremos una acción de asignación y almacenaremos los datos en la variable ns (http_req_data)
add rewrite policy pol_set_variable true set_http_req_data
bind rewrite global pol_set_variable 10 -type req_dEFAULT
<!--NeedCopy-->
Agregue una directiva de reescritura que se evaluará en el tiempo de respuesta y añada un encabezado HTTP en la respuesta.
add rewrite policy pol_ins_header true act_ins_header
bind rewrite global pol_ins_header 10 -type res_dEFAULT
<!--NeedCopy-->
Acción de asignación
En un dispositivo NetScaler, se activa una acción de asignación vinculada a la directiva cuando la regla de directiva se evalúa como verdadera. La acción actualiza el valor de la variable, que se puede utilizar en las evaluaciones posteriores de las reglas de directiva. De esta forma, la misma variable se puede actualizar y utilizar para posteriores evaluaciones de directivas en la misma función. Anteriormente, el dispositivo ejecutaba las acciones de asignación solo después de evaluar todas las directivas de la función, cuando las directivas de las acciones de asignación asociadas se evaluaban como verdaderas. Por lo tanto, el valor de la variable establecido por la acción de asignación no se puede utilizar en las evaluaciones posteriores de las reglas de directiva dentro de la función.
Esta funcionalidad se puede entender mejor con un caso de uso que controle la lista de acceso para los clientes en un dispositivo NetScaler. La decisión de acceso la proporciona un servicio web independiente, y GET /client-access?<client-IP-address>
la solicitud devuelve una respuesta con “BLOQUEAR” o “PERMITIR” en el cuerpo. La llamada HTTP está configurada para incluir la dirección IP del cliente que está asociada a una solicitud entrante. Cuando el dispositivo NetScaler recibe una solicitud de un cliente, genera la solicitud de llamada y la envía al servidor de llamadas, que aloja una base de datos de direcciones IP incluidas en la lista negra y un agente de llamadas HTTP que comprueba si la dirección IP del cliente figura en la base de datos. El agente de llamadas HTTP recibe la solicitud de llamada, comprueba si la dirección IP del cliente aparece en la lista y envía una respuesta. La respuesta es un código de estado, 200, 302, junto con “BLOQUEAR” o “PERMITIR” en el cuerpo. Según el código de estado, el dispositivo realiza la evaluación de la directiva. Si la evaluación de la directiva es verdadera, la acción de asignación se activa inmediatamente y la acción establece el valor de la variable. El dispositivo usa y establece este valor de variable para la posterior evaluación de directivas en el mismo módulo.
Caso de uso para configurar la acción de asignación
Siga los pasos que se indican a continuación para configurar la acción de asignación y utilizar la variable para las directivas posteriores:
-
La decisión de acceso la proporciona un servicio web independiente, con la solicitud que devuelve una respuesta con BLOCK o ALLOW en el cuerpo.
GET /url-service>/url-allowed?<URL path>
-
Configure una variable de mapa para contener las decisiones de acceso a las URL.
add ns variable url_list_map -type 'map(text(1000),text(10),10000)'
-
Configure una llamada HTTP para enviar la solicitud de acceso al servicio web.
add policy httpCallout url_list_callout -vserver url_vs -returnType TEXT -urlStemExpr '"/url-allowed?" + HTTP.REQ.URL.PATH' -resultExpr 'HTTP.RES.BODY(10)'
-
Configure una acción de asignación para invocar la llamada a fin de obtener la decisión de acceso y asígnela a la entrada del mapa de la URL.
add ns assignment client_access_assn -variable '$client_access_map[CLIENT.IP.SRC.TYPECAST_TEXT_T]' -set SYS.HTTP_CALLOUT(client_access_callout)
-
Configure una acción de respuesta para enviar una respuesta 403 si se bloquea una solicitud de URL.
add responder action url_list_block_act respondwith '"HTTP/1.1 403 Forbidden\\r\\n\\r\\n"'
-
Configure una directiva de respuesta para configurar la entrada de mapa para la URL si aún no está configurada. Con la mejora inmediata de la acción, el valor de entrada del mapa se establece cuando se evalúa esta directiva. Antes de la mejora, la asignación no se realizaba hasta que se hubieran evaluado todas las directivas de respuesta. La decisión la proporciona un servicio web independiente.
add responder policy url_list_assn_pol '!$url_list_map.VALUEEXISTS(HTTP.REQ.URL.PATH)' url_list_assn
-
Configure una directiva de respuesta para bloquear el acceso a una URL si su valor de entrada en el mapa es BLOQUEAR. Con la mejora de la acción inmediata, la entrada de mapa establecida en la directiva anterior está disponible para su uso en esta directiva. Antes de la mejora, la entrada del mapa seguía sin estar configurada en este momento.
add responder policy client_access_block_pol '$client_access_map[CLIENT.IP.SRC.TYPECAST_TEXT_T] == "BLOCK"' client_access_block_act
-
Enlazar las directivas de respuesta al servidor virtual. Nota: No podemos vincular globalmente las directivas porque no queremos ejecutarlas para la llamada HTTP en un servidor virtual independiente.
bind lb vserver vs -policyName client_access_assn_pol -priority 10 -gotoPriorityExpression NEXT -type REQUEST
bind lb vserver vs -policyName client_access_block_pol -priority 20 -gotoPriorityExpression END -type REQUEST
Para configurar variables mediante la utilidad de configuración
- Vaya a AppExpert > Variables NSpara crear una variable.
- Vaya a AppExpert > NSAssignments para asignar valores a la variable.
- Navegue hasta el área de funciones correspondiente en la que desee configurar la asignación como una acción.