Sustituciones
Las sustituciones se utilizan para definir nombres abreviados que pueden reemplazar expresiones complejas en el StyleBook, lo que hace que el StyleBook sea más legible.
Las sustituciones también son útiles cuando la misma expresión o valor se usa repetidamente en el StyleBook, por ejemplo, un valor constante. El uso de un nombre de sustitución para un parámetro permite actualizar solo el valor de sustitución en lugar de actualizar todas las apariciones del parámetro en el StyleBook, que podrían generar errores.
Las sustituciones también se utilizan para definir asignaciones entre valores como se describe en ejemplos más adelante en este documento.
Cada sustitución de la lista se compone de una clave y un valor. El valor puede ser un valor simple, una expresión, una función o un mapa.
En el siguiente ejemplo, se definen dos sustituciones. El primero es http-port
que se puede usar como taquigrafía para 8181. Al usar una sustitución, puede referirse a esto en el resto del StyleBook como $substitutions.http-port en lugar de 8181.
sustituciones:
http-port: 8181
Esto le permite especificar un nombre mnemónico para un número de puerto y definir este número de puerto en un solo lugar en el StyleBook, independientemente del número de veces que se utilice. Si quiere modificar el número de puerto a 8080, puede modificarlo en la sección de sustitución, y el cambio surte efecto dondequiera que http-port
se utilice el nombre mnemónico. En el ejemplo siguiente se muestra cómo se utiliza una sustitución en un componente.
components:
-
name: my-lbvserver-comp
type: ns::lbvserver
properties:
name: $parameters.name + "-lb"
servicetype: HTTP
ipv46: $parameters.ip
port: $substitutions.http-port
lbmethod: $parameters.lb-alg
<!--NeedCopy-->
Una sustitución también puede ser una expresión compleja. El siguiente ejemplo muestra cómo dos sustituciones utilizan expresiones.
substitutions:
app-rule: HTTP.REQ.HEADER("X-Test-Application").EXISTS
app-name: str("acme-") + $parameters.name + str("-app")
<!--NeedCopy-->
Una expresión de sustitución también puede utilizar expresiones de sustitución existentes, como se muestra en el siguiente ejemplo.
substitutions:
http-port: 8181
app-name: str("acme-") + $parameters.name + str($substitutions.http-port) + str("-app")
<!--NeedCopy-->
Otra función útil de las sustituciones son los mapas, donde puede asignar claves a valores. El siguiente es un ejemplo de sustitución de mapas.
substitutions:
secure-port:
true: int("443")
false: int("80")
secure-protocol:
true: SSL
false: HTTP
<!--NeedCopy-->
En el ejemplo siguiente se muestra cómo utilizar los mapas de puerto seguro y protocolo seguro.
components:
-
name: my-lbvserver-comp
type: ns::lbvserver
properties:
name: $parameters.name + "-lb"
servicetype: $substitutions.secure-protocol[$parameters.is-secure]
ipv46: $parameters.ip
port: $substitutions.secure-port[$parameters.is-secure]
lbmethod: $parameters.lb-alg
<!--NeedCopy-->
En este caso, si el usuario del StyleBook especifica el valor booleano «true» para el parámetro is-secure
o selecciona la casilla correspondiente a este parámetro en la GUI de NetScaler Console, a servicetype
la propiedad de este componente se le asigna el valor SSL y a la propiedad del puerto el valor 443. Sin embargo, si el usuario especifica «false» para este parámetro o desmarca la casilla correspondiente en la GUI de NetScaler Console, a servicetype
la propiedad se le asigna el valor HTTP y al puerto se le asigna el valor 80.
En el ejemplo siguiente se muestra cómo utilizar sustituciones como función. Una función de sustitución puede tomar uno o más argumentos. Los argumentos pueden ser de tipo simple, por ejemplo, string ipaddress
, number, booleano y otros tipos.
sustituciones:
form-lb-name (nombre): $nombre+ “-lb”
En este ejemplo, definimos una función de sustitución “form-lb-name” que toma un argumento de cadena llamado “name” y lo usa para crear una cadena con el sufijo “-lb” en la cadena del argumento name. Una expresión mediante esta función de sustitución se puede escribir como:
$substitutions.form-lb-name("my")
Devuelve my-lb
Considere otro ejemplo:
sustituciones:
cspol-priority(priority): 10100 - 100 * $priority
La sustitución cspol-priority
es una función que toma un argumento llamado prioridad y lo utiliza para calcular un valor. En el resto del StyleBook, esta sustitución se puede utilizar como se muestra en el siguiente ejemplo:
components:
-
name: cspolicy-binding-comp
type: ns::csvserver_cspolicy_binding
condition: not $parameters.is-default
properties:
name: $parameters.csvserver-name
policyname: $components.cspolicy-comp.properties.policyname
priority: $substitutions.cspol-priority($parameters.pool.priority)
<!--NeedCopy-->
A continuación se muestra un ejemplo de una sustitución llamada slist
cuyo valor es una lista:
substitutions:
slist:
- a
- b
- c
<!--NeedCopy-->
El valor de una sustitución también puede ser un diccionario de pares clave-valor como se ve en el siguiente ejemplo de una sustitución llamada sdict
a continuación:
substitutions:
sdict:
a: 1
b: 2
c: 3
<!--NeedCopy-->
Puede crear atributos más complejos combinando listas y diccionarios. Por ejemplo, una sustitución llamada slistofdict
devuelve una lista de pares clave-valor.
slistofdict:
-
a: $parameters.cs1.lb1.port
b: $parameters.cs1.lb2.port
-
a: $parameters.cs2.lb1.port
b: $parameters.cs2.lb2.port
<!--NeedCopy-->
Pero, en el siguiente ejemplo, una sustitución sdictoflist
devuelve un par clave-valor, donde el valor en sí es otra lista.
sdictoflist:
a:
- 1
- 2
b:
- 3
- 4
<!--NeedCopy-->
En los componentes, estas sustituciones se pueden utilizar en construcciones de condición, propiedades, repetición, repetición de condición.
El siguiente ejemplo de un componente muestra cómo se puede utilizar una sustitución para especificar las propiedades:
properties:
a: $substitutions.slist
b: $substitutions.sdict
c: $substitutions.slistofdict
d: $substitutions.sdictoflist
<!--NeedCopy-->
Un caso de uso para definir una sustitución cuyo valor es una lista o un diccionario es cuando está configurando un servidor virtual de conmutación de contenido y varios servidores virtuales de equilibrio de carga. Dado que todos los servidores virtuales lb vinculados al mismo servidor virtual cs pueden tener una configuración idéntica, puede utilizar la lista de sustitución y el diccionario para crear esta configuración para evitar repetir esa configuración para cada servidor virtual lb.
En el siguiente ejemplo se muestra la sustitución y el componente de cs-lb-mon
StyleBooks para crear una configuración de servidor virtual de conmutación de contenido. Al construir las propiedades de cs-lb-mon
StyleBooks, la sustitución compleja «lb-properties» especifica las propiedades de los servidores virtuales lb asociados con el servidor virtual cs. La sustitución de “lb-properties” es una función que toma el nombre, el tipo de servicio, la dirección IP virtual, el puerto y los servidores como parámetros y genera un par clave-valor como valor. En cs-pools
componente, asignamos el valor de esta sustitución a un parámetro lb-pool para cada grupo.
substitutions:
cs-port[]:
true: int("80")
false: int("443")
lb-properties(name, servicetype, vip, port, servers):
lb-appname: $name
lb-service-type: $servicetype
lb-virtual-ip: $vip
lb-virtual-port: $port
svc-servers: $servers
svc-service-type: $servicetype
monitors:
-
monitorname: $name
type: PING
interval: $parameters.monitor-interval
interval_units: SEC
retries: 3
components:
-
name: cs-pools
type: stlb::cs-lb-mon
description: | Updates the cs-lb-mon configuration with the different pools provided. Each pool with rule result in a dummy LB vserver, cs action, cs policy, and csvserver_cspolicy_binding configuration.
condition: $parameters.server-pools
repeat: $parameters.server-pools
repeat-item: pool
repeat-condition: $pool.rule
repeat-index: ndx
properties:
appname: $parameters.appname + "-cs"
cs-virtual-ip: $parameters.vip
cs-virtual-port: $substitutions.cs-port($parameters.protocol == "HTTP")
cs-service-type: $parameters.protocol
pools:
-
lb-pool: $substitutions.lb-properties($pool.pool-name, "HTTP", "0.0.0.0", 0, $pool.servers)
rule: $pool.rule
priority: $ndx + 1
<!--NeedCopy-->
Mapa de sustituciones
Puede crear sustituciones que asignen las claves a los valores. Por ejemplo, considere un caso en el que quiera definir el puerto predeterminado (valor) que se utilizará para cada protocolo (clave). Para esta tarea, escriba un mapa de sustitución de la siguiente manera.
substitutions:
port:
HTTP: 80
DNS: 53
SSL: 443
<!--NeedCopy-->
En este ejemplo, HTTP se asigna a 80, DNS a 53 y SSL se asigna a 443. Para recuperar el puerto de un protocolo determinado que se da como parámetro, utilice la expresión
$substitutions.port[$parameters.protocol]
La expresión devuelve un valor basado en el protocolo especificado por el usuario.
- Si la clave es HTTP, la expresión devuelve 80
- Si la clave es DNS, la expresión devuelve 53
- Si la clave es SSL, la expresión devuelve 443
- Si la clave no está presente en el mapa, la expresión no devuelve ningún valor
Repite las listas de sustituciones
En el siguiente ejemplo, el StyleBook recorre una lista de sustituciones llamada apps
para crear un conjunto de componentes de lbvserver y sus grupos de servicios y servidores enlazados correspondientes.
substitutions:
apps:
-
name: lb1
vip: 1.2.3.4
vport: 80
protocol: HTTP
servers:
-
ip: 10.8.11.11
port: 8080
-
ip: 10.8.11.12
port: 8080
-
name: lb2
vip: 1.2.3.5
vport: 81
protocol: HTTP
servers:
-
ip: 10.9.11.28
port: 8080
-
ip: 10.9.11.29
port: 8181
components:
-
name: lbvserver-comp
type: ns::lbvserver
repeat: $substitutions.apps
repeat-item: app
properties:
name: $app["name"]
ipv46: $app["vip"]
port: $app["vport"]
servicetype: $app["protocol"]
components:
-
name: servicegroup-comp
type: ns::servicegroup
properties:
servicegroupname: $parent.properties.name + "-svg"
servicetype: HTTP
components:
-
name: servers-comp
type: ns::server
repeat: $app["servers"]
repeat-item: server
properties:
name: $server["ip"]
ipaddress: $server["ip"]
components:
-
name: servicegroup-servicegroupmember-binding-comp
type: ns::servicegroup_servicegroupmember_binding
properties:
servicegroupname: $parent.parent.properties.servicegroupname
servername: $parent.properties.name
port: $server["port"]
<!--NeedCopy-->