1.2.2. 模板功能


使用 {{hub …​ hub}} 分隔符或受管集群上的 {{ …​ }} 分隔符引用 Kubernetes 资源,如特定于资源和通用的模板功能。为方便起见,您可以使用特定于资源的功能,并使资源内容更易于访问。

1.2.2.1. 模板功能描述

如果您使用通用的函数 lookup,它更为高级,请熟悉正在查找的资源的 YAML 结构。除了这些功能外,实用程序功能(如 base64encbase64decindentautoindenttoInttoBool 等等)。

要将模板符合 YAML 语法,您必须使用引号或块字符(| 或 > )在策略资源中将模板定义为字符串。这会导致解析的模板值也是字符串。要覆盖此功能,请使用 toInttoBool 作为模板中的最终功能,以启动进一步处理,强制将值解释为整数或布尔值。

继续阅读以查看支持的一些自定义模板功能的描述和示例:

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 
1

      metadata:
        name: demosecret
        namespace: test
      type: Opaque
      data: 
2

        USER_NAME: YWRtaW4=
        PASSWORD: '{{ fromSecret "default" "localsecret" "PASSWORD" }}' 
3
1
如果目标集群上不存在 Kubernetes Secret 资源,则会出现策略违反的情况。如果目标集群上不存在 data 键,则该值将变为空字符串。
2
当您将 fromSecret 功能与 hub 集群模板搭配使用时,输出会自动使用 protect 功能加密,以保护到受管集群的值。
3
PASSWORD data 键的值是引用目标集群上 secret 的模板:

重要: 当您添加多行字符串值时,证书始终会在模板管道末尾添加 | 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 is key: "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: 
1

        app-name: sampleApp
        app-description: "this is a sample app"
        log-file: '{{ fromConfigMap "default" "logs-config" "log-file" }}' 
2

        log-level: '{{ fromConfigMap "default" "logs-config" "log-level" }}' 
3
1
如果目标集群上不存在 data 键,则该值将变为空字符串。
2
log-file 模板值从 default 命名空间中的 logs-config ConfigMap 检索 log-file data 键的值。
3
log-level 模板值从 default 命名空间中的 logs-config ConfigMap 检索 log-level data 键的值。
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 
1

spec:
  object-templates:
  - objectDefinition:
      ...
      data: 
2

        platform: '{{ fromClusterClaim "platform.open-cluster-management.io" }}' 
3

        product: '{{ fromClusterClaim "product.open-cluster-management.io" }}'
        version: '{{ fromClusterClaim "version.openshift.io" }}'
1
使用此功能时,输入 Kubernetes ClusterClaim 资源的名称。如果 ClusterClaim 资源不存在,您会收到策略违反情况。
2
配置值可以设置为 key-value 属性。
3
platform 数据键的值是一个模板,它检索 platform.open-cluster-management.io 集群声明的值。同样,它从 ClusterClaim 获取产品和版本的值:
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: 
1

        app-name: sampleApp
        app-description: "this is a sample app"
        metrics-url: >- 
2

          http://{{ (lookup "v1" "Service" "default" "metrics").spec.clusterIP }}:8080
1
配置值可以设置为 key-value 属性。
2
metrics-url 数据键的值是一个模板,它从 default 命名空间中获取 v1/Service Kubernetes metrics 资源,并设置为查询的资源中的 Spec.ClusterIP 的值:
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

fromYamlfromYAML函数将 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

toYamltoYAML函数将 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
1
注:当您将此功能与 hub 集群模板搭配使用时,输出会使用 保护功能 自动加密。
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 }},以跳过该策略的特定对象。当您将 skipObjectobjectSelector 搭配使用时,您可以根据名称进一步过滤对象。您可以在条件中单独调用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 开源项目中包含的以下模板功能:

Expand
表 1.5. 支持的社区 Sprig 功能表
Sprig 库Functions

加密和安全

htpasswd

Date

date,mustToDate,now,toDate

default

默认fromJsonmustFromJson三元toJsontoRawJsonmustToRawJson

列出的Json函数也别名为等效的大写JSON函数。

字典和字典

dictdiggethasKeykeysmergemustMergesetunsetvalues

编码

b64dec , b64enc

流量控制

fail

整数数数

添加,mul,div,round,sub

整数片段

直到 , until Step,

列表

追加列表必须追加必须有必须前置必须切片前置切片

字符串列表。

concat, join, sortAlpha, split, splitn, splitList

字符串

catcontainshasPrefixhasSuffixlowermustRegexFindmustRegexFindAllmustRegexMatchquoteregexFindregexFindAllregexMatchregexQuoteMetareplacesubstrtrimtrimAlltruncupper

版本比较

semver,semverCompare

Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

关于红帽文档

Legal Notice

Theme

© 2026 Red Hat
返回顶部