实例角色
在 NetScaler Application Delivery Management (ADM) 中,可能存在这样一种情况:您必须为单个应用程序配置多个 NetScaler 实例,但每个 ADC 实例都需要部署不同的配置。此类情况的一个示例是默认的 Microsoft Skype for Business StyleBook。
StyleBook 目前支持创建配置包并将相同的配置应用于多个 NetScaler 实例。这种所有 ADC 实例上的配置都相同的情况,可以称为对称配置。
现在,借助 StyleBook 的“实例角色”功能,您可以创建非对称配置,即一个可应用于多个 ADC 实例,但在不同 ADC 实例上具有不同配置的配置包。
当使用具有实例角色功能的 StyleBook 创建配置包时,配置包中的每个 ADC 实例都可以分配一个不同的角色。此角色决定了 ADC 实例将接收的配置包的配置对象。
注意事项:
-
StyleBook 中的实例角色集在创建 StyleBook 时定义。
-
在创建或更新配置包时,角色会分配给特定的 ADC 实例。
目标角色部分
StyleBook 中引入了一个名为“target-roles”的新部分,其中声明了 StyleBook 支持的所有角色。
此部分通常放置在 StyleBook 的“import-StyleBooks”部分之后,以及参数部分之前。
在以下 StyleBook 示例中,“target-roles”部分中定义了两个角色 - A 和 B。
target-roles:
-
name: A
name: B
min-targets: 2
max-targets: 5
您可以看到角色 B 还定义了两个可选的子属性:min-targets 和 max-targets。
尽管这两个子属性是可选的,但 min-targets 指定了在从此 StyleBook 创建配置包时应分配此角色的最小强制 ADC 实例数,而 max-targets 指定了在从此 StyleBook 创建配置包时可分配此角色的最大 ADC 实例数。
如果未指定这些子属性,则可以为该角色配置的 ADC 实例数量没有限制。如果 min-targets = 0,则与该角色关联的配置是可选的;如果 min-targets = 1,则该配置是强制性的,并且至少需要为该角色配置一个 ADC 实例。
角色“default”
除了显式定义的角色之外,所有 StyleBook 都具有一个隐式角色,该角色称为默认角色。此角色可以像 StyleBook 中的任何其他角色一样使用。创建配置包时,如果未为 ADC 实例分配特定角色,则该实例将隐式分配给“default”角色。该实例现在将接收由具有“default”角色的组件生成的任何配置对象。
具有角色的组件
定义了 StyleBook 可以支持的角色(包括“default”角色)后,这些角色可以在 StyleBook 的组件部分中使用。如果您希望组件仅部署在扮演特定角色的 ADC 实例上,那么您可以将 roles 属性指定为组件的一部分,如以下组件示例所示:
-
name: C1
type: ns::lbvserver
roles:
- A
properties:
name: lb1
servicetype: HTTP
ipv46: 1.1.1.1
port: 80
在上面的示例中,该组件生成一个“lbvserver”,该“lbvserver”将部署在扮演角色 A 的实例上。请注意,组件的 roles 属性是一个列表,并且一个组件可以分配多个角色。这些角色将在 StyleBook 的“target-roles”部分中声明。
注意:如果 StyleBook 中的组件未指定角色属性,则该组件生成的配置对象将在所有 NetScaler 实例上创建,无论其角色如何。您可以有效地使用此功能来创建可应用于配置包所有实例的配置对象。
假设有一个 StyleBook 定义了两个角色 - A 和 B,并且包含四个组件。
-
组件 C1 具有角色 A 和 B
-
组件 C2 具有角色 B
-
组件 C3 未定义任何角色
-
组件 C4 具有“default”角色
此 StyleBook 的组件部分如下所示:
components:
-
name: C1
type: ns::lbvserver
roles:
- A
- B
properties:
name: lb1
servicetype: HTTP
ipv46: 1.1.1.1
port: 80
-
name: C2
type: ns::lbvserver
roles:
- B
properties:
name: lb2
servicetype: HTTP
ipv46: 12.12.12.12
port: 80
-
name: C3
type: ns::lbvserver
properties:
name: lb3
servicetype: HTTP
ipv46: 13.13.13.13
port: 80
-
name: C4
type: ns::lbvserver
roles:
- default
properties:
name: lb4
servicetype: HTTP
ipv46: 14.14.14.14
port: 80
请注意,组件 C3 未定义角色,这意味着该组件将部署在所有实例上,无论其角色如何。另一方面,组件 C4 具有“default”角色,这意味着它将应用于未分配显式角色的任何实例。
现在,假设您想使用此 StyleBook 创建一个配置包,并将其部署到五个 ADC 实例上。在此阶段,您可以按以下方式为实例分配角色:
-
角色 A 分配给实例 T1、T2、T3 和 T4
-
角色 B 分配给实例 T2、T3 和 T4
-
实例 T5 未分配任何角色
下图总结了角色分配,并显示了每个 ADC 实例将接收的最终配置:
请注意,组件 C3 部署在所有实例上,无论角色如何,因为此组件没有角色属性。
您还可以使用“试运行”功能,在创建配置包时查看并验证角色的正确分配以及将在每个 ADC 实例上创建的配置对象。
构建您的 StyleBook
StyleBook “demo-target-roles” 的完整内容如下所示:
---
name: demo-target-roles
namespace: com.example.stylebooks
version: "1.2"
schema-version: "1.0"
import-stylebooks:
-
namespace: netscaler.nitro.config
prefix: ns
version: "10.5"
parameters:
-
name: appname
type: string
required: true
key: true
target-roles:
-
name: A
-
name: B
min-targets: 2
max-targets: 5
components:
-
name: C1
type: ns::lbvserver
roles:
- A
- B
properties:
name: lb1
servicetype: HTTP
ipv46: 1.1.1.1
port: 80
-
name: C2
type: ns::lbvserver
roles:
- B
properties:
name: lb2
servicetype: HTTP
ipv46: 12.12.12.12
port: 80
-
name: C3
type: ns::lbvserver
properties:
name: lb3
servicetype: HTTP
ipv46: 13.13.13.13
port: 80
-
name: C4
type: ns::lbvserver
roles:
- default
properties:
name: lb4
servicetype: HTTP
ipv46: 14.14.14.14
port: 80
下图显示了为示例配置包创建的对象:
使用 API
使用 REST API 时,您可以在创建或更新配置包时为每个 ADC 实例指定角色,如下所示。在“targets”块中,指定要部署各个组件的特定 NetScaler 实例的 UUID。
"targets": [
{
"id": "<ADC-UUID>",
"roles": ["A"]
},
]
一个完整的 REST API 示例供您参考。
POST /
<ADM-IP>/stylebook/nitro/v1/config/stylebooks/com.example.stylebooks/1.2/demo-target-roles/configpacks
{
"configpack": {
"parameters": {
"appname": "app1"
},
"targets": [
{
"id": "f53c35c3-a6bc-4619-b4b4-ad7ab6a94ddb",
"roles": ["A"]
},
{
"id": "c08caa1c-1011-48aa-b8c7-9aed1cd38ed0",
"roles": ["A", "B"]
},
{
"id": "88ac90cb-a5cb-445b-8617-f83d0ef6174e",
"roles": ["A", "B"]
},
{
"id": "bf7b0f74-7a83-4856-86f4-dcc951d3141e",
"roles": ["A", "B"]
},
{
"id": "fa5d97ab-ca29-4adf-b451-06e7a234e3da",
"roles": ["default"]
}
]
}
}