1.2.2. 模板功能
使用 {{hub … hub}} 分隔符或受管集群上的 {{ … }} 分隔符引用 Kubernetes 资源,如特定于资源和通用的模板功能。为方便起见,您可以使用特定于资源的功能,并使资源内容更易于访问。
1.2.2.1. 模板功能描述 复制链接链接已复制到粘贴板!
如果您使用通用的函数 lookup,它更为高级,请熟悉正在查找的资源的 YAML 结构。除了这些功能外,实用程序功能(如 base64enc、base64dec、indent、autoindent、toInt、toBool 等等)。
要将模板符合 YAML 语法,您必须使用引号或块字符(| 或 > )在策略资源中将模板定义为字符串。这会导致解析的模板值也是字符串。要覆盖此功能,请使用 toInt 或 toBool 作为模板中的最终功能,以启动进一步处理,强制将值解释为整数或布尔值。
继续阅读以查看支持的一些自定义模板功能的描述和示例:
1.2.2.1.1. fromSecret 复制链接链接已复制到粘贴板!
fromSecret 功能返回 secret 中给定 data 键的值。查看该功能的以下语法:
func fromSecret (ns string, secretName string, datakey string) (dataValue string, err error)
使用此功能时,请输入 Kubernetes Secret 资源的命名空间、名称和数据键。在 hub 集群模板中使用函数时,您必须使用用于策略的同一命名空间。如需了解更多详细信息,请参阅模板处理。
查看在目标集群上强制执行 Secret 资源的以下配置策略。
apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
name: demo-fromsecret
spec:
object-templates:
- objectDefinition:
apiVersion: v1
kind: Secret
metadata:
name: demosecret
namespace: test
type: Opaque
data:
USER_NAME: YWRtaW4=
PASSWORD: '{{ fromSecret "default" "localsecret" "PASSWORD" }}'
重要: 当您添加多行字符串值时,证书始终会在模板管道末尾添加 | toRawJson | toLiteral 语法来处理换行符。例如,如果您要从 Secret 资源复制证书并将其包含在 ConfigMap 资源中,则模板管道可能类似如下:
ca.crt: '{{ fromSecret "openshift-config" "ca-config-map-secret" "ca.crt" | base64dec | toRawJson | toLiteral }}'
-
toRawJson模板函数将输入值转换为 JSON 字符串,其中新行转义不会影响 YAML 结构。 -
toLiteral模板函数从输出中删除外部单引号。例如,当对键处理模板时:'{{ 'hello\nworld' | toRawJson }}'模板管道,输出为key: '"hello\nworld"'。键的输出:"{{ 'hello\nworld' | toRawJson | toLiteral }}'template pipeline iskey: "hello\nworld".
1.2.2.1.2. fromConfigmap 复制链接链接已复制到粘贴板!
fromConfigMap 功能返回 ConfigMap 中给定 data 键的值。使用此功能时,请输入 Kubernetes ConfigMap 资源的命名空间、名称和数据键。您必须使用 hub 集群模板中的功能用于策略的同一命名空间。如需了解更多详细信息,请参阅模板处理。
查看该功能的以下语法:
func fromConfigMap (ns string, configmapName string, datakey string) (dataValue string, err Error)
查看在目标受管集群中强制执行 Kubernetes 资源的以下配置策略。
apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
name: demo-fromcm-lookup
spec:
object-templates:
- objectDefinition:
...
data:
app-name: sampleApp
app-description: "this is a sample app"
log-file: '{{ fromConfigMap "default" "logs-config" "log-file" }}'
log-level: '{{ fromConfigMap "default" "logs-config" "log-level" }}'
1.2.2.1.3. fromClusterClaim 复制链接链接已复制到粘贴板!
fromClusterClaim 功能返回 ClusterClaim 资源中的 Spec.Value 的值。查看该功能的以下语法:
func fromClusterClaim (clusterclaimName string) (dataValue string, err Error)
查看在目标受管集群上强制执行 Kubernetes 资源的配置策略示例。
apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
name: demo-clusterclaims
spec:
object-templates:
- objectDefinition:
...
data:
platform: '{{ fromClusterClaim "platform.open-cluster-management.io" }}'
product: '{{ fromClusterClaim "product.open-cluster-management.io" }}'
version: '{{ fromClusterClaim "version.openshift.io" }}'
1.2.2.1.4. lookup 复制链接链接已复制到粘贴板!
lookup 功能将 Kubernetes 资源作为 JSON 兼容映射返回。使用此功能时,输入 Kubernetes 资源的 API 版本、类型、命名空间、名称和可选标签选择器。您必须在 hub 集群模板中使用与策略相同的命名空间。如需了解更多详细信息,请参阅模板处理。
如果请求的资源不存在,则返回空映射。如果资源不存在,并且值提供给另一个模板功能,您可能会得到以下错误: invalid value; expected string。
注: 使用默认 模板功能,因此为后续模板功能提供了正确的类型。请参阅 Sprig 开源 部分。
查看该功能的以下语法:
func lookup (apiversion string, kind string, namespace string, name string, labelselector ...string) (value string, err Error)
有关标签选择器示例,请参阅 Kubernetes 标签和选择器 文档的额外资源部分。查看在目标受管集群上强制执行 Kubernetes 资源的配置策略示例。
apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
name: demo-lookup
spec:
object-templates:
- objectDefinition:
...
data:
app-name: sampleApp
app-description: "this is a sample app"
metrics-url: >-
http://{{ (lookup "v1" "Service" "default" "metrics").spec.clusterIP }}:8080
1.2.2.1.5. base64enc 复制链接链接已复制到粘贴板!
base64enc 功能返回以 base64 编码的输入 data string 值。使用这个功能时,输入字符串值。查看该功能的以下语法:
func base64enc (data string) (enc-data string)
查看以下使用 base64enc 功能的配置策略示例:
apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
name: demo-fromsecret
spec:
object-templates:
- objectDefinition:
...
data:
USER_NAME: >-
{{ fromConfigMap "default" "myconfigmap" "admin-user" | base64enc }}
1.2.2.1.6. base64dec 复制链接链接已复制到粘贴板!
base64dec 功能返回一个以 base64 解码的输入的 enc-data string 值。使用这个功能时,输入字符串值。查看该功能的以下语法:
func base64dec (enc-data string) (data string)
查看以下使用 base64enc 功能的配置策略示例:
apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
name: demo-fromsecret
spec:
object-templates:
- objectDefinition:
...
data:
app-name: >-
{{ ( lookup "v1" "Secret" "testns" "mytestsecret") .data.appname ) | base64dec }}
1.2.2.1.7. indent 复制链接链接已复制到粘贴板!
indent 功能会返回经过 padded 的 data string。使用这个功能时,输入带有特定空格数的数据字符串。查看该功能的以下语法:
func indent (spaces int, data string) (padded-data string)
查看以下使用 indent 功能的配置策略示例:
apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
spec:
object-templates:
- objectDefinition:
...
data:
Ca-cert: >-
{{ ( index ( lookup "v1" "Secret" "default" "mycert-tls" ).data "ca.pem" ) | base64dec | indent 4 }}
1.2.2.1.8. autoindent 复制链接链接已复制到粘贴板!
autoindent 函数的作用类似于 indent 函数,它根据模板前面的空格数自动决定前导空格的数量。
查看以下使用 autoindent 函数的配置策略示例:
apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
name: demo-fromsecret
spec:
object-templates:
- objectDefinition:
...
data:
Ca-cert: >-
{{ ( index ( lookup "v1" "Secret" "default" "mycert-tls" ).data "ca.pem" ) | base64dec | autoindent }}
1.2.2.1.9. toInt 复制链接链接已复制到粘贴板!
toInt 函数处理并返回输入值的整数值。另外,如果这是模板中的最后一个功能,也会进一步处理源内容。这是为了确保该值由 YAML 解释为整数。使用这个功能时,输入需要转换为整数的数据。查看该功能的以下语法:
func toInt (input interface{}) (output int)
查看以下使用 toInt 功能的配置策略示例:
apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
name: demo-template-function
spec:
object-templates:
- objectDefinition:
...
spec:
vlanid: >-
{{ (fromConfigMap "site-config" "site1" "vlan") | toInt }}
1.2.2.1.10. tobool 复制链接链接已复制到粘贴板!
toBool 函数将输入字符串转换为布尔值,并返回布尔值。另外,如果这是模板中的最后一个功能,也会进一步处理源内容。这是为了确保该值被 YAML 解释为布尔值。使用此功能时,请输入需要转换为布尔值的字符串数据。查看该功能的以下语法:
func toBool (input string) (output bool)
查看以下使用 toBool 函数的配置策略示例:
apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
name: demo-template-function
spec:
object-templates:
- objectDefinition:
...
spec:
enabled: >-
{{ (fromConfigMap "site-config" "site1" "enabled") | toBool }}
1.2.2.1.11. fromYaml 复制链接链接已复制到粘贴板!
fromYaml或fromYAML函数将 YAML 字符串解析为 Golang 对象。您可以将此功能与具有 YAML 字符串值的ConfigMap资源一起使用。
apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
name: demo-template-function
spec:
object-templates:
- objectDefinition:
...
spec:
replicas: >-
{{ (fromConfigMap "default" "app-config" "config.yaml") | fromYaml | index "replicas" }}
1.2.2.1.12. toYaml 复制链接链接已复制到粘贴板!
toYaml或toYAML函数将 Golang 对象解析为 YAML 字符串。为了使多行结果正确缩进,必须将输出传递给自动缩进或缩进函数。
apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
name: demo-template-function
spec:
object-templates:
- objectDefinition:
...
data:
config.yaml: |
{{ dict "key1" "value1" "key2" "value2" | toYaml | autoindent }}
1.2.2.1.13. 保护 复制链接链接已复制到粘贴板!
通过 protect 功能,您可以在 hub 集群策略模板中对字符串进行加密。评估策略时,它将在受管集群上自动解密。查看以下使用 protect 功能的配置策略示例:
apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
name: demo-template-function
spec:
object-templates:
- objectDefinition:
...
spec:
enabled: >-
{{hub (lookup "v1" "Secret" "default" "my-hub-secret").data.message | protect hub}}
在前面的 YAML 示例中,定义了使用 lookup 功能的现有 hub 集群策略模板。在受管集群命名空间中的复制策略上,值可能类似以下语法 :$ocm_encrypted:okrrBqt72oI+3WT/0vxeI3vGa+wpLD7Z0ZxFMLvL204=
使用的每个加密算法是 256 位密钥的 AES-CBC。对于每个受管集群,每个加密密钥都需要是唯一的,每 30 天自动轮转。
这样可确保您的解密的值永不会存储在受管集群的策略中。
要强制立即轮转,在 hub 集群上删除 policy-encryption-key Secret 上的 policy.open-cluster-management.io/last-rotated 注解。然后,会重新处理策略以使用新的加密密钥。
1.2.2.1.14. toLiteral 复制链接链接已复制到粘贴板!
toLiteral 函数会在处理模板字符串后删除任何引号。您可以使用此功能将 JSON 字符串从 ConfigMap 字段转换为清单中的 JSON 值。运行以下功能从 key 参数值中删除引号:
key: '{{ "[\"10.10.10.10\", \"1.1.1.1\"]" | toLiteral }}'
使用 toLiteral 功能后,会显示以下更新:
key: ["10.10.10.10", "1.1.1.1"]
1.2.2.1.15. copySecretData 复制链接链接已复制到粘贴板!
copySecretData 功能复制指定 secret 的所有数据内容。查看以下函数示例:
...
objectDefinition:
apiVersion: v1
kind: Secret
metadata:
name: my-secret-copy
data: '{{ copySecretData "default" "my-secret" }}'
1.2.2.1.16. copyConfigMapData 复制链接链接已复制到粘贴板!
copyConfigMapData 功能复制指定 ConfigMap 的所有 data 内容。查看以下函数示例:
...
objectDefinition:
apiVersion: v1
kind: ConfigMap
metadata:
name: my-secret-copy
data: '{{ copyConfigMapData "default" "my-configmap" }}'
1.2.2.1.17. getNodesWithExactRoles 复制链接链接已复制到粘贴板!
getNodesWithExactRoles 函数返回一个节点列表,它只具有您指定的角色,并忽略具有除 node-role.kubernetes.io/worker 角色以外的任何其他角色的节点。查看以下示例功能,您可以在其中选择 "infra" 节点并忽略存储节点:
...
objectDefinition:
apiVersion: v1
kind: ConfigMap
metadata:
name: my-configmap
data:
infraNode: |
{{- range $i,$nd := (getNodesWithExactRoles "infra").items }}
node{{ $i }}: {{ $nd.metadata.name }}
{{- end }}
replicas: {{ len ((getNodesWithExactRoles "infra").items) | toInt }}
1.2.2.1.18. hasNodesWithExactRoles 复制链接链接已复制到粘贴板!
如果集群只包含您指定的角色的节点,则 hasNodesWithExactRoles 功能会返回 true 值,并忽略具有任何额外角色的节点,node-role.kubernetes.io/worker 角色除外。查看以下函数示例:
...
objectDefinition:
apiVersion: v1
kind: ConfigMap
metadata:
name: my-configmap
data:
key: '{{ hasNodesWithExactRoles "infra" }}'
1.2.2.1.19. skipObject 复制链接链接已复制到粘贴板!
skipObject 功能仅适用于 ConfigurationPolicy 资源的受管集群模板。在 Go 模板信号中随时调用 {{ skipObject }},以跳过该策略的特定对象。当您将 skipObject 与 objectSelector 搭配使用时,您可以根据名称进一步过滤对象。您可以在条件中单独调用skipObject或使用可选布尔参数调用它。
查看以下示例,它选择具有标签 foo: bar 的对象,但跳过名称为 suffix -prod 的对象:
...
objectSelector:
matchExpressions:
- key: foo
operator: In
values:
- bar
objectDefinition:
apiVersion: v1
kind: ConfigMap
data:
key: '{{ skipObject (hasSuffix "-prod" .ObjectName) }}{{ hasNodesWithExactRoles "infra" }}'
1.2.2.1.20. Sprig 开源 复制链接链接已复制到粘贴板!
另外,Red Hat Advanced Cluster Management 还支持 sprig 开源项目中包含的以下模板功能:
| Sprig 库 | Functions |
|---|---|
| 加密和安全 |
|
| Date |
|
| default |
列出的 |
| 字典和字典 |
|
| 编码 |
|
| 流量控制 |
|
| 整数数数 |
|
| 整数片段 |
直到 , |
| 列表 |
|
| 字符串列表。 |
|
| 字符串 |
|
| 版本比较 |
|