1.2.2. テンプレート関数
{{hub … hub}} 区切り文字を使用してハブクラスター上のリソース固有および汎用テンプレート関数などの Kubernetes リソースを参照するか、{{ … }} 区切り文字を使用してマネージドクラスター上の Kubernetes リソースを参照します。利便性を高め、リソースのコンテンツへのアクセス性を高めるために、リソース固有の関数を使用できます。
1.2.2.1. テンプレート関数の説明 リンクのコピーリンクがクリップボードにコピーされました!
より高度な汎用関数 lookup を使用する場合は、検索されるリソースの YAML 構造をよく理解してください。これらの関数に加えて、base64enc、base64dec、indent、autoindent、toInt、toBool などのユーティリティー関数も使用できます。
テンプレートを YAML 構文に準拠させるには、ポリシーリソース内のテンプレートを引用符またはブロック文字 (| または >) を使用して文字列として定義する必要があります。これにより、解決済みのテンプレート値も文字列になります。これをオーバーライドするには、テンプレートの最後の関数として toInt または toBool を使用して、値をそれぞれ整数またはブール値として強制的に解釈するさらなる処理を開始します。
サポート対象のカスタムテンプレート関数の説明と例を確認するには、以下を参照してください。
1.2.2.1.1. fromSecret リンクのコピーリンクがクリップボードにコピーされました!
fromSecret 関数は、シークレット内にある指定のデータキーの値を返します。関数は、以下の構文を確認してください。
func fromSecret (ns string, secretName string, datakey string) (dataValue string, err error)
この関数を使用するには、Kubernetes Secret リソースの namespace、名前、およびデータキーを入力します。ハブクラスターテンプレートの関数を使用する場合は、ポリシーに使用されるのと同じ namespace を使用する必要があります。詳細は、Template processing を参照してください。
以下で、ターゲットクラスターで 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テンプレート関数は、YAML 構造に影響を与えないように改行をエスケープした入力値を JSON 文字列に変換します。 -
toLiteralテンプレート関数は、出力から外側の単一引用符を削除します。たとえば、テンプレートがkey: '{{ 'hello\nworld' | toRawJson }}'テンプレートパイプラインに対して処理されると、出力はkey: '"hello\nworld"'になります。key: '{{ 'hello\nworld' | toRawJson | toLiteral }}'テンプレートパイプラインの出力は、key: "hello\nworld"です。
1.2.2.1.2. fromConfigmap リンクのコピーリンクがクリップボードにコピーされました!
fromConfigMap 関数は、config map 内にある指定のデータキーの値を返します。この関数を使用するには、Kubernetes ConfigMap リソースの namespace、名前、およびデータキーを入力します。ハブクラスターテンプレートの関数を使用するポリシーに使用されるのと同じ namespace を使用する必要があります。詳細は、Template processing を参照してください。
関数は、以下の構文を確認してください。
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. lookupClusterClaim リンクのコピーリンクがクリップボードにコピーされました!
lookupClusterClaim 関数は fromClusterClaim 関数に似ています。唯一の違いは、lookupClusterClaim 関数が ClusterClaim リソースを見つけられない場合、lookupClusterClaim は空の文字列を返すことです。好みのテンプレート関数を使用して、応答が空の文字列であることを検出し、出力を調整できます。たとえば、ClusterClaim が存在しない場合は、デフォルト値を定義したり、オブジェクトをスキップしたりできます。
以下で、ターゲットのマネージドクラスターで Kubernetes リソースを有効にする設定ポリシーの例を確認してください。
apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
name: demo-clusterclaims
spec:
object-templates:
- objectDefinition:
...
kind: ConfigMap
data:
something: '{{ default "empty" (lookupClusterClaim "possibly.nonexistent") }}'
- 1
possibly.nonexistentClusterClaimが見つかった場合、その値が ConfigMap で使用されます。ClusterClaimが存在しない場合は、代わりに Sprig によって提供されるdefault関数を通じてemptyが使用されます。
1.2.2.1.5. lookup リンクのコピーリンクがクリップボードにコピーされました!
lookup 関数は、JSON と互換性のあるマップとして Kubernetes リソースを返します。この関数を使用する場合は、Kubernetes リソースの API バージョン、種類、namespace、名前、およびオプションのラベルセレクターを入力します。ハブクラスターテンプレート内のポリシーに使用されるものと同じ namespace を使用する必要があります。詳細は、Template processing を参照してください。
要求されたリソースが存在しない場合は、空のマップが返されます。リソースが存在せず、値が別のテンプレート関数に提供されている場合は、エラー invalid value; expected string が発生する可能性があります。
注記: default テンプレート関数を使用して、後のテンプレート関数に正しい型が提供されるようにします。Sprig open source セクションを参照してください。
関数は、以下の構文を確認してください。
func lookup (apiversion string, kind string, namespace string, name string, labelselector ...string) (value string, err Error)
ラベルセレクターの例は、Additional resources セクションにある Kubernetes labels and selectors ドキュメントへのリファレンスを参照してください。以下で、ターゲットのマネージドクラスターで 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.6. base64enc リンクのコピーリンクがクリップボードにコピーされました!
base64enc 関数は、入力 data string を base64 でエンコードされた値で返します。この関数を使用する場合は、文字列値を入力します。関数は、以下の構文を確認してください。
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.7. base64dec リンクのコピーリンクがクリップボードにコピーされました!
base64dec 関数は、入力 enc-data string を base64 デコードされた値で返します。この関数を使用する場合は、文字列値を入力します。関数は、以下の構文を確認してください。
func base64dec (enc-data string) (data string)
以下は、base64dec 関数を使用する設定ポリシーの例になります。
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.8. indent リンクのコピーリンクがクリップボードにコピーされました!
indent 関数により、パディングされた 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.9. 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.10. 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.11. 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.12. 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.13. toYaml リンクのコピーリンクがクリップボードにコピーされました!
toYaml または toYAML 関数は、Golang オブジェクトを YAML 文字列にパースします。複数行の結果を適切にインデントするには、出力を autoindent 関数または indent 関数のいずれかに渡す必要があります。
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.14. protect リンクのコピーリンクがクリップボードにコピーされました!
protect 機能により、ハブクラスターポリシーテンプレートで文字列を暗号化できます。これは、ポリシーの評価時にマネージドクラスターで自動的に復号化されます。以下は、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 関数を使用するために定義した既存のハブクラスターポリシーテンプレートがあります。マネージドクラスターの namespace に複製されたポリシーでは、値は $ocm_encrypted:okrrBqt72oI+3WT/0vxeI3vGa+wpLD7Z0ZxFMLvL204= のようになります。
それぞれの暗号化アルゴリズムは、256 ビットキーを使用した AES-CBC です。各暗号化キーはマネージドクラスターごとに一意で、30 日ごとに自動的にローテーションされます。
これにより、復号化された値がマネージドクラスターのポリシーに保存されることはありません。
即時のローテーションを強制するには、ハブクラスターのマネージドクラスター namespace の policy-encryption-key Secret で policy.open-cluster-management.io/last-rotated アノテーションを削除します。その後、ポリシーが再処理され、新しい暗号化キーが使用されます。
1.2.2.1.15. toLiteral リンクのコピーリンクがクリップボードにコピーされました!
toLiteral 関数は、処理後にテンプレート文字列を囲む引用符をすべて削除します。この関数を使用して、JSON 文字列を config map フィールドからマニフェストの 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.16. copySecretData リンクのコピーリンクがクリップボードにコピーされました!
copySecretData 関数は、指定されたシークレットのすべての data コンテンツをコピーします。次の関数のサンプルを確認してください。
...
objectDefinition:
apiVersion: v1
kind: Secret
metadata:
name: my-secret-copy
data: '{{ copySecretData "default" "my-secret" }}'
1.2.2.1.17. copyConfigMapData リンクのコピーリンクがクリップボードにコピーされました!
copyConfigMapData 関数は、指定された config map のすべての data コンテンツをコピーします。次の関数のサンプルを確認してください。
...
objectDefinition:
apiVersion: v1
kind: ConfigMap
metadata:
name: my-secret-copy
data: '{{ copyConfigMapData "default" "my-configmap" }}'
1.2.2.1.18. 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.19. 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.20. skipObject リンクのコピーリンクがクリップボードにコピーされました!
skipObject 関数は、ConfigurationPolicy リソース内のマネージドクラスターテンプレートでのみ使用できます。Go テンプレート内で任意の時点で {{ skipObject }} を呼び出すと、ポリシーの特定のオブジェクトをスキップするように指示されます。skipObject を objectSelector とともに使用すると、名前で選択したオブジェクトをさらにフィルタリングできます。条件文内で skipObject を単独で呼び出すことも、オプションのブール引数を使用して呼び出すこともできます。
次の例を参照してください。この例では、foo: bar というラベルを持つオブジェクトが選択されますが、名前に -prod という接尾辞が付いているオブジェクトはスキップされます。
...
object-templates:
- 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.21. Sprig オープンソース リンクのコピーリンクがクリップボードにコピーされました!
Red Hat Advanced Cluster Management は、sprig オープンソースプロジェクトのほとんどのテンプレート機能 (env と expandenv は除く) をサポートしています。次の表を参照します。
| Sprig ライブラリー | 関数 |
|---|---|
| Cryptographic and security |
|
| Date |
|
| Default |
リストされている |
| Dictionaries and dict |
|
| Encoding |
|
| Flow control |
|
| Integer math |
|
| Integer slice |
|
| Lists |
|
| String lists |
|
| Strings |
|
| Version comparison |
|