Substitutionen
Substitutionen werden verwendet, um Kurznamen zu definieren, die komplexe Ausdrücke im StyleBook ersetzen können, wodurch das StyleBook besser lesbar wird.
Substitutionen sind auch nützlich, wenn derselbe Ausdruck oder Wert wiederholt im StyleBook verwendet wird, zum Beispiel ein konstanter Wert. Die Verwendung eines Substitutionsnamens für einen Parameter ermöglicht es Ihnen, nur den Substitutionswert zu aktualisieren, anstatt alle Vorkommen des Parameters im StyleBook zu aktualisieren, was fehleranfällig sein könnte.
Substitutionen werden auch zum Definieren von Zuordnungen zwischen Werten verwendet.
Jede Substitution in der Liste besteht aus einem Schlüssel und einem Wert. Der Wert kann ein einfacher Wert, ein Ausdruck, eine Funktion oder eine Zuordnung sein.
Im folgenden Beispiel werden zwei Substitutionen definiert. Die erste ist
http-port, die als Kurzform für 8181 verwendet werden kann. Durch die Verwendung einer Substitution können Sie im restlichen StyleBook darauf als $substitutions.http-port anstelle von 8181 verweisen.
Substitutionen:
http-port: 8181
Sie können einer Portnummer einen mnemonischen Namen zuweisen und diese Portnummer an einer Stelle im StyleBook definieren, unabhängig davon, wie oft sie verwendet wird. Wenn Sie die Portnummer auf 8080 ändern möchten, können Sie dies im Substitutionsabschnitt tun, und die Änderung wird überall dort wirksam, wo der mnemonische Name
http-port verwendet wird.
Das folgende Beispiel zeigt, wie eine Substitution in einer Komponente verwendet wird.
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
Eine Substitution kann auch ein komplexer Ausdruck sein. Das folgende Beispiel zeigt, wie zwei Substitutionen Ausdrücke verwenden.
substitutions:
app-rule: HTTP.REQ.HEADER("X-Test-Application").EXISTS
app-name: str("acme-") + $parameters.name + str("-app")
Ein Substitutionsausdruck kann auch bestehende Substitutionsausdrücke verwenden, wie im folgenden Beispiel gezeigt.
substitutions:
http-port: 8181
app-name: str("acme-") + $parameters.name + str($substitutions.http-port) + str("-app")
Ein weiteres nützliches Merkmal von Substitutionen sind Zuordnungen (Maps), bei denen Sie Schlüssel Werten zuordnen können. Das Folgende ist ein Beispiel für eine Zuordnungs-Substitution.
substitutions:
secure-port:
true: int("443")
false: int("80")
secure-protocol:
true: SSL
false: HTTP
Das folgende Beispiel zeigt, wie die Zuordnungen secure-port und secure-protocol verwendet werden.
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
Dies bedeutet, dass, wenn der Benutzer des StyleBooks den booleschen Wert „true“ für den Parameter is-secure angibt oder das entsprechende Kontrollkästchen für diesen Parameter in der NetScaler ADM GUI auswählt, der
servicetype-Eigenschaft dieser Komponente der Wert SSL zugewiesen wird und der port-Eigenschaft der Wert 443 zugewiesen wird. Wenn der Benutzer jedoch „false“ für diesen Parameter angibt oder das entsprechende Kontrollkästchen in der NetScaler ADM GUI deaktiviert, wird servicetype der Wert HTTP zugewiesen und dem Port der Wert 80 zugewiesen.
Das folgende Beispiel zeigt, wie man Substitutionen als Funktion verwendet. Eine Substitutionsfunktion kann ein oder mehrere Argumente annehmen. Argumente können von einfachem Typ sein, zum Beispiel String, Zahl, IP-Adresse, Boolean und andere Typen.
Substitutionen:
form-lb-name(name): $name + "-lb"
In diesem Beispiel wird eine Substitutionsfunktion „form-lb-name“ definiert, die ein String-Argument namens „name“ **** annimmt und es verwendet, um einen String zu erstellen, der „-lb“ an den String im Argument „name“ anhängt. Ein Ausdruck, der diese Substitutionsfunktion verwendet, wird wie folgt geschrieben:
$substitutions.form-lb-name("my")
Es gibt
my-lb zurück.
Betrachten Sie ein weiteres Beispiel:
Substitutionen:
cspol-priority(priority): 10100 - 100 * $priority
Die Substitution
cspol-priority ist eine Funktion, die ein Argument namens „priority“ annimmt und es zur Berechnung eines Wertes verwendet. Im restlichen StyleBook wird diese Substitution wie folgt dargestellt:
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)
Eine Substitution kann auch aus einem Schlüssel und einem Wert bestehen. Der Wert kann ein einfacher Wert, ein Ausdruck, eine Funktion, eine Map, eine Liste oder ein Dictionary sein.
Das Folgende ist ein Beispiel für eine Substitution namens
slist, deren Wert eine Liste ist:
substitutions:
slist:
- a
- b
- c
Der Wert einer Substitution kann auch ein Dictionary von Schlüssel-Wert-Paaren sein, wie im folgenden Beispiel einer Substitution namens
sdict gezeigt:
substitutions:
sdict:
a: 1
b: 2
c: 3
Sie können komplexere Attribute erstellen, indem Sie Listen und Dictionaries kombinieren. Zum Beispiel gibt eine Substitution namens
slistofdict eine Liste von Schlüssel-Wert-Paaren zurück.
slistofdict:
-
a: $parameters.cs1.lb1.port
b: $parameters.cs1.lb2.port
-
a: $parameters.cs2.lb1.port
b: $parameters.cs2.lb2.port
Im folgenden Beispiel gibt jedoch eine Substitution
sdictoflist ein Schlüssel-Wert-Paar zurück, wobei der Wert selbst eine weitere Liste ist.
sdictoflist:
a:
- 1
- 2
b:
- 3
- 4
In Komponenten können diese Substitutionen in Bedingungs-, Eigenschaften-, Wiederholungs- und Wiederholungsbedingungskonstrukten verwendet werden.
Das folgende Beispiel einer Komponente zeigt, wie eine Substitution verwendet werden kann, um die Eigenschaften anzugeben:
properties:
a: $substitutions.slist
b: $substitutions.sdict
c: $substitutions.slistofdict
d: $substitutions.sdictoflist
Ein Anwendungsfall für die Definition einer Substitution, deren Wert eine Liste oder ein Wörterbuch ist, ist die Konfiguration eines Content Switching Virtual Servers und mehrerer Load Balancing Virtual Server. Da alle Load Balancing Virtual Server, die an denselben Content Switching Virtual Server gebunden sind, eine identische Konfiguration haben könnten, verwenden Sie eine Substitutionsliste und ein Wörterbuch, um die Konfiguration zu erstellen und so die Wiederholung derselben Konfiguration für jeden Load Balancing Virtual Server zu vermeiden.
Das folgende Beispiel zeigt die Substitution und die Komponente in den
cs-lb-mon StyleBooks, um eine Content Switching Virtual Server-Konfiguration zu erstellen. Beim Erstellen der Eigenschaften der cs-lb-mon StyleBooks gibt die komplexe Substitution „lb-properties“ die Eigenschaften der Load Balancing Virtual Server an, die dem Content Switching Virtual Server zugeordnet sind. Die Substitution „lb-properties“ ist eine Funktion, die den Namen, den Diensttyp, die virtuelle IP-Adresse, den Port und die Server als Parameter entgegennimmt und ein Schlüssel-Wert-Paar als Wert generiert. In der cs-pools Komponente können Sie den Wert dieser Substitution dem lb-pool Parameter für jeden Pool zuweisen.
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
Substitutionszuordnung
Sie können Substitutionen erstellen, die Schlüssel Werten zuordnen. Betrachten Sie beispielsweise ein Szenario, in dem Sie den Standardport (Wert) definieren möchten, der für jedes Protokoll (Schlüssel) verwendet werden soll. Für diese Aufgabe schreiben Sie eine Substitutionszuordnung wie folgt.
substitutions:
port:
HTTP: 80
DNS: 53
SSL: 443
In diesem Beispiel ist HTTP 80 zugeordnet, DNS ist 53 zugeordnet und SSL ist 443 zugeordnet. Um den Port eines bestimmten Protokolls abzurufen, das als Parameter angegeben ist, verwenden Sie den Ausdruck
$substitutions.port\[$parameters.protocol\]
Der Ausdruck gibt einen Wert basierend auf dem vom Benutzer angegebenen Protokoll zurück.
-
Wenn der Schlüssel HTTP ist, gibt der Ausdruck 80 zurück
-
Wenn der Schlüssel DNS ist, gibt der Ausdruck 53 zurück
-
Wenn der Schlüssel SSL ist, gibt der Ausdruck 443 zurück
-
Wenn der Schlüssel nicht in der Zuordnung vorhanden ist, gibt der Ausdruck keinen Wert zurück
Durch Substitutionslisten iterieren
Im folgenden Beispiel iteriert das StyleBook durch eine Substitutionsliste namens
apps, um einen Satz von lbvserver Komponenten und deren entsprechenden Dienstgruppen und gebundenen Servern zu erstellen.
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"]