Application Delivery Management

Substitutionen

Substitutionen werden verwendet, um Kurznamen zu definieren, die komplexe Ausdrücke im StyleBook ersetzen können, wodurch das StyleBook lesbarer 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 zur Definition 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 Map 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.

substitutions:

http-port: 8181

Sie können einem Port eine mnemonische Bezeichnung 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
<!--NeedCopy-->

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")
<!--NeedCopy-->

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")
<!--NeedCopy-->

Ein weiteres nützliches Merkmal von Substitutionen sind Maps, bei denen Sie Schlüssel Werten zuordnen können. Das Folgende ist ein Beispiel für eine Map-Substitution.

substitutions:
    secure-port:
        true: int("443")
        false: int("80")
    secure-protocol:
        true: SSL
        false: HTTP
<!--NeedCopy-->

Das folgende Beispiel zeigt, wie die Maps 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
<!--NeedCopy-->

Dies bedeutet, dass, wenn der Benutzer des StyleBooks den booleschen Wert “true” für den Parameter is-secure angibt oder das entsprechende Kontrollkästchen in der NetScaler ADM GUI auswählt, die Eigenschaft servicetype dieser Komponente den Wert SSL erhält und die Eigenschaft port den Wert 443 erhält. Wenn der Benutzer jedoch “false” für diesen Parameter angibt oder das entsprechende Kontrollkästchen in der NetScaler ADM GUI deaktiviert, erhält servicetype den Wert HTTP und der Port den Wert 80.

Das folgende Beispiel zeigt, wie Substitutionen als Funktion verwendet werden. 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.

substitutions:

form-lb-name(name): $name + "-lb"

In diesem Beispiel wird eine Substitutionsfunktion “form-lb-name” definiert, die ein String-Argument namens “name” entgegennimmt und es verwendet, um einen String zu erstellen, der dem String im name-Argument “-lb” 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:

substitutions:

cspol-priority(priority): 10100 - 100 * $priority

Die Substitution cspol-priority ist eine Funktion, die ein Argument namens “priority” entgegennimmt 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)
<!--NeedCopy-->

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
<!--NeedCopy-->

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
<!--NeedCopy-->

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
<!--NeedCopy-->

Im folgenden Beispiel gibt eine Substitution sdictoflist jedoch ein Schlüssel-Wert-Paar zurück, wobei der Wert selbst eine weitere Liste ist.

  sdictoflist:
    a:
      -  1
      -  2
    b:
      -  3
      -  4
<!--NeedCopy-->

In Komponenten können diese Substitutionen in condition-, properties-, repeat- und repeat-condition-Konstrukten verwendet werden.

Das folgende Beispiel einer Komponente zeigt, wie eine Substitution zur Angabe der Eigenschaften verwendet werden kann:

    properties:
      a: $substitutions.slist
      b: $substitutions.sdict
      c: $substitutions.slistofdict
      d: $substitutions.sdictoflist
<!--NeedCopy-->

Ein Anwendungsfall für die Definition einer Substitution, deren Wert eine Liste oder ein Dictionary ist, besteht darin, wenn Sie einen Content Switching Virtual Server und mehrere Load Balancing Virtual Server konfigurieren. 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 Dictionary, um die Konfiguration zu erstellen und so zu vermeiden, dass dieselbe Konfiguration für jeden Load Balancing Virtual Server wiederholt wird.

Das folgende Beispiel zeigt die Substitution und die Komponente in den cs-lb-mon StyleBooks, um eine Konfiguration für einen Content Switching Virtual Server zu erstellen. Beim Erstellen der Eigenschaften der cs-lb-mon StyleBooks spezifiziert die komplexe Substitution “lb-properties” die Eigenschaften der Load Balancing Virtual Server, die mit dem Content Switching Virtual Server verbunden 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
<!--NeedCopy-->

Substitutions-Map

Sie können Substitutionen erstellen, die Schlüssel Werten zuordnen. Betrachten Sie zum Beispiel 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 Substitutions-Map wie folgt.

substitutions:
    port:
        HTTP: 80
        DNS: 53
        SSL: 443
<!--NeedCopy-->

In diesem Beispiel wird HTTP auf 80, DNS auf 53 und SSL auf 443 abgebildet. Um den Port eines bestimmten Protokolls abzurufen, das als Parameter gegeben 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 Map vorhanden ist, gibt der Ausdruck keinen Wert zurück.

Iterieren durch Substitutionslisten

Im folgenden Beispiel iteriert das StyleBook durch eine Substitutionsliste namens apps, um eine Reihe von lbvserver-Komponenten und deren entsprechende Dienstgruppen und gebundenen Server 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"]
<!--NeedCopy-->
Substitutionen