Substitutions
Les substitutions sont utilisées pour définir des noms abrégés qui peuvent remplacer des expressions complexes dans le StyleBook, rendant ainsi le StyleBook plus lisible.
Les substitutions sont également utiles lorsque la même expression ou valeur est utilisée de manière répétée dans le StyleBook, par exemple, une valeur constante. L’utilisation d’un nom de substitution pour un paramètre vous permet de mettre à jour uniquement la valeur de substitution au lieu de mettre à jour toutes les occurrences du paramètre dans le StyleBook, ce qui pourrait être source d’erreurs.
Les substitutions sont également utilisées pour définir des correspondances entre des valeurs.
Chaque substitution de la liste est composée d’une clé et d’une valeur. La valeur peut être une valeur simple, une expression, une fonction ou une carte.
Dans l’exemple suivant, deux substitutions sont définies. La première est http-port qui peut être utilisée comme raccourci pour 8181. En utilisant une substitution, vous pouvez y faire référence dans le reste du StyleBook en tant que $substitutions.http-port au lieu de 8181.
substitutions :
http-port: 8181
Vous pouvez spécifier un nom mnémonique pour un numéro de port et définir ce numéro de port à un seul endroit dans le StyleBook, quel que soit le nombre de fois où il est utilisé. Si vous souhaitez modifier le numéro de port en 8080, vous pouvez le modifier dans la section de substitution, et le changement prendra effet partout où le nom mnémonique http-port est utilisé.
L’exemple suivant montre comment une substitution est utilisée dans un composant.
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-->
Une substitution peut également être une expression complexe. L’exemple suivant montre comment deux substitutions utilisent des expressions.
substitutions:
app-rule: HTTP.REQ.HEADER("X-Test-Application").EXISTS
app-name: str("acme-") + $parameters.name + str("-app")
<!--NeedCopy-->
Une expression de substitution peut également utiliser des expressions de substitution existantes, comme le montre l’exemple suivant.
substitutions:
http-port: 8181
app-name: str("acme-") + $parameters.name + str($substitutions.http-port) + str("-app")
<!--NeedCopy-->
Une autre fonctionnalité utile des substitutions est la possibilité de créer des cartes, où vous pouvez associer des clés à des valeurs. Voici un exemple de substitution de carte.
substitutions:
secure-port:
true: int("443")
false: int("80")
secure-protocol:
true: SSL
false: HTTP
<!--NeedCopy-->
L’exemple suivant montre comment utiliser les cartes secure-port et secure-protocol.
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-->
Cela implique que si l’utilisateur du StyleBook spécifie la valeur booléenne « true » pour le paramètre is-secure, ou coche la case correspondant à ce paramètre dans l’interface graphique de NetScaler Console, la propriété servicetype de ce composant se voit attribuer la valeur SSL, et la propriété port se voit attribuer la valeur 443. Cependant, si l’utilisateur spécifie « false » pour ce paramètre ou décoche la case correspondante dans l’interface graphique de NetScaler Console, servicetype se voit attribuer la valeur HTTP et le port se voit attribuer la valeur 80.
L’exemple suivant montre comment utiliser les substitutions comme fonction. Une fonction de substitution peut prendre un ou plusieurs arguments. Les arguments peuvent être de type simple, par exemple, chaîne de caractères, nombre, adresse IP, booléen et d’autres types.
substitutions :
form-lb-name(name): $name + “-lb”
Dans cet exemple, une fonction de substitution « form-lb-name » est définie. Elle prend un argument de type chaîne de caractères appelé « name » et l’utilise pour créer une chaîne qui ajoute le suffixe « -lb » à la chaîne de l’argument name. Une expression utilisant cette fonction de substitution s’écrit comme suit :
$substitutions.form-lb-name("my")
Elle renvoie my-lb.
Considérez un autre exemple :
substitutions :
cspol-priority(priority): 10100 - 100 * $priority
La substitution cspol-priority est une fonction qui prend un argument appelé « priority » et l’utilise pour calculer une valeur. Dans le reste du StyleBook, cette substitution est présentée comme suit :
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-->
Une substitution peut également être composée d’une clé et d’une valeur. La valeur peut être une valeur simple, une expression, une fonction, une carte, une liste ou un dictionnaire.
Voici un exemple de substitution appelée slist dont la valeur est une liste :
substitutions:
slist:
- a
- b
- c
<!--NeedCopy-->
La valeur d’une substitution peut également être un dictionnaire de paires clé-valeur, comme le montre l’exemple suivant d’une substitution appelée sdict ci-dessous :
substitutions:
sdict:
a: 1
b: 2
c: 3
<!--NeedCopy-->
Vous pouvez créer des attributs plus complexes en combinant les listes et les dictionnaires. Par exemple, une substitution appelée slistofdict renvoie une liste de paires clé-valeur.
slistofdict:
-
a: $parameters.cs1.lb1.port
b: $parameters.cs1.lb2.port
-
a: $parameters.cs2.lb1.port
b: $parameters.cs2.lb2.port
<!--NeedCopy-->
Mais, dans l’exemple suivant, une substitution sdictoflist renvoie une paire clé-valeur, où la valeur elle-même est une autre liste.
sdictoflist:
a:
- 1
- 2
b:
- 3
- 4
<!--NeedCopy-->
Dans les composants, ces substitutions peuvent être utilisées dans les constructions condition, properties, repeat et repeat-condition.
L’exemple de composant suivant montre comment une substitution peut être utilisée pour spécifier les propriétés :
properties:
a: $substitutions.slist
b: $substitutions.sdict
c: $substitutions.slistofdict
d: $substitutions.sdictoflist
<!--NeedCopy-->
Un cas d’utilisation pour la définition d’une substitution dont la valeur est une liste ou un dictionnaire est lorsque vous configurez un serveur virtuel de commutation de contenu et plusieurs serveurs virtuels d’équilibrage de charge. Étant donné que tous les serveurs virtuels d’équilibrage de charge liés au même serveur virtuel de commutation de contenu peuvent avoir une configuration identique, utilisez une liste et un dictionnaire de substitution pour construire la configuration afin d’éviter de répéter la même configuration pour chaque serveur virtuel d’équilibrage de charge.
L’exemple suivant montre la substitution et le composant dans les StyleBooks cs-lb-mon pour créer une configuration de serveur virtuel de commutation de contenu. Lors de la construction des propriétés des StyleBooks cs-lb-mon, la substitution complexe « lb-properties » spécifie les propriétés des serveurs virtuels d’équilibrage de charge associés au serveur virtuel de commutation de contenu. La substitution « lb-properties » est une fonction qui prend le nom, le type de service, l’adresse IP virtuelle, le port et les serveurs comme paramètres et génère une paire clé-valeur comme valeur. Dans le composant cs-pools, vous pouvez attribuer la valeur de cette substitution au paramètre lb-pool pour chaque pool.
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-->
Carte de substitution
Vous pouvez créer des substitutions qui associent des clés à des valeurs. Par exemple, considérez un scénario où vous souhaitez définir le port par défaut (valeur) à utiliser pour chaque protocole (clé). Pour cette tâche, écrivez une carte de substitution comme suit.
substitutions:
port:
HTTP: 80
DNS: 53
SSL: 443
<!--NeedCopy-->
Dans cet exemple, HTTP est mappé à 80, DNS à 53 et SSL à 443. Pour récupérer le port d’un certain protocole donné en paramètre, utilisez l’expression
$substitutions.port[$parameters.protocol]
L’expression renvoie une valeur basée sur le protocole spécifié par l’utilisateur.
- Si la clé est HTTP, l’expression renvoie 80
- Si la clé est DNS, l’expression renvoie 53
- Si la clé est SSL, l’expression renvoie 443
- Si la clé n’est pas présente dans la carte, l’expression ne renvoie aucune valeur
Itérer sur les listes de substitution
Dans l’exemple suivant, le StyleBook itère sur une liste de substitution appelée apps pour créer un ensemble de composants lbvserver et leurs groupes de services et serveurs liés correspondants.
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-->