10.7. テンプレートの記述
アプリケーションの全オブジェクトを簡単に再作成するために、新規テンプレートを定義できます。テンプレートでは、作成するオブジェクトと、これらのオブジェクトの作成をガイドするメタデータを定義します。
例10.2 単純なテンプレートオブジェクト定義 (YAML)
10.7.1. 説明 リンクのコピーリンクがクリップボードにコピーされました!
テンプレートの説明では、テンプレートの内容に関する情報を提供でき、Web コンソールでの検索時に役立ちます。テンプレート名以外のメタデータは任意ですが、使用できると便利です。メタデータには、一般的な説明などの情報以外にタグのセットも含まれます。便利なタグにはテンプレートで使用する言語名などがあります (例: java、php、ruby )。
例10.3 テンプレート記述メタデータ
- 1
- テンプレートの一意の名前。
- 2
- ユーザーインターフェースで利用できるように、ユーザーに分かりやすく、簡単な名前。
- 3
- テンプレートの説明。デプロイされる内容、デプロイ前に知っておく必要のある注意点をユーザーができるように詳細を追加します。README など、追加情報へのリンクも追加できます。パラグラフを作成するには、改行を追加できます。
- 4
- 追加の説明。たとえば、サービスカタログに表示されます。
- 5
- 検索およびグループ化を実行するためにテンプレートに関連付けられるタグ。指定のカタログカテゴリーの 1 つに含まれるように、タグを追加します。コンソールの定数ファイルの
CATALOG_CATEGORIES
でid
およびcategoryAliases
を参照してください。 - 6
- 7
- テンプレートを提供する人または組織の名前
- 8
- テンプレートに関する他のドキュメントを参照する URL
- 9
- テンプレートに関するサポートを取得できる URL
- 10
- テンプレートがインスタンス化された時に表示される説明メッセージ。このフィールドで、新規作成されたリソースの使用方法をユーザーに通知します。生成された認証情報や他のパラメーターを出力に追加できるように、メッセージの表示前にパラメーターの置換が行われます。ユーザーが従うべき次の手順が記載されたドキュメントへのリンクを追加してください。
10.7.2. ラベル リンクのコピーリンクがクリップボードにコピーされました!
テンプレートには、ラベルのセットを追加できます。これらのラベルは、テンプレートがインスタンス化される時に作成されるオブジェクトごとに追加します。このようにラベルを定義すると、特定のテンプレートから作成された全オブジェクトの検索、管理が簡単になります。
10.7.3. パラメーター リンクのコピーリンクがクリップボードにコピーされました!
パラメーターにより、テンプレートがインスタンス化される時に値を生成するか、ユーザーが値を指定できるようになります。パラメーターが参照されると、値が置換されます。参照は、オブジェクト一覧フィールドであればどこでも定義できます。これは、無作為にパスワードを作成したり、テンプレートのカスタマイズに必要なユーザー固有の値やホスト名を指定したりできるので便利です。 パラメーターは、2 種類の方法で参照可能です。
- 文字列の値として、テンプレートの文字列フィールドに ${PARAMETER_NAME} の形式で配置する
- json/yaml の値として、テンプレートのフィールドに ${{PARAMETER_NAME}} の形式で配置する
${PARAMETER_NAME} 構文を使用すると、複数のパラメーター参照を 1 つのフィールドに統合でき、"http://${PARAMETER_1}${PARAMETER_2}" などのように、参照を固定データ内に埋め込むことができます。どちらのパラメーター値も置換されて、引用された文字列が最終的な値になります。
${{PARAMETER_NAME}} 構文のみを使用する場合は、単一のパラメーター参照のみが許可され、先頭文字や終了文字は使用できません。結果の値は、置換後に結果が有効な json オブジェクトの場合は引用されません。結果が有効な json 値でない場合に、結果の値は引用され、標準の文字列として処理されます。
単一のパラメーターは、テンプレート内で複数回参照でき、1 つのテンプレート内で両方の置換構文を使用して参照することができます。
デフォルト値を指定でき、ユーザーが別の値を指定していない場合に使用されます。
例10.5 デフォルト値として明示的な値の設定
parameters: - name: USERNAME description: "The user name for Joe" value: joe
parameters:
- name: USERNAME
description: "The user name for Joe"
value: joe
パラメーター値は、パラメーター定義に指定したルールを基に生成することも可能です。
例10.6 パラメーター値の生成
parameters: - name: PASSWORD description: "The random user password" generate: expression from: "[a-zA-Z0-9]{12}"
parameters:
- name: PASSWORD
description: "The random user password"
generate: expression
from: "[a-zA-Z0-9]{12}"
上記の例では、処理後に、大文字、小文字、数字すべてを含む 12 文字長のパスワードが無作為に作成されます。
利用可能な構文は、完全な正規表現構文ではありません。ただし、\w
、\d
、および \a
修飾子を使用できます。
-
[\w]{10}
は、10 桁の英字、数字、およびアンダースコアを生成します。これは PCRE 標準に準拠し、[a-zA-Z0-9_]{10}
に相当します。 -
[\d]{10}
は 10 桁の数字を生成します。これは[0-9]{10}
に相当します。 -
[\a]{10}
は 10 桁の英字を生成します。これは[a-zA-Z]{10}
に相当します。
以下は、パラメーター定義と参照を含む完全なテンプレートの例です。
例10.7 パラメーター定義と参照を含む完全なテンプレート
- 1
- この値は、テンプレートがインスタンス化された時点で
SOURCE_REPOSITORY_URL
パラメーターに置き換えられます。 - 2
- この値は、テンプレートがインスタンス化された時点で、
REPLICA_COUNT
パラメーターの引用なしの値に置き換えられます。 - 3
- パラメーター名。この値は、テンプレート内でパラメーターを参照するのに使用します。
- 4
- 分かりやすいパラメーターの名前。これは、ユーザーに表示されます。
- 5
- パラメーターの説明。期待値に対する制約など、パラメーターの目的を詳細にわたり説明します。説明には、コンソールのテキスト標準に従い、完結した文章を使用するようにしてください。表示名と同じ内容を使用しないでください。
- 6
- テンプレートをインスタンス化する時に、ユーザーにより値が上書きされない場合に使用されるパラメーターのデフォルト値。パスワードなどのデフォルト値の使用を避けるようにしてください。 シークレットと組み合わせた生成パラメーターを使用するようにしてください。
- 7
- このパラメーターが必須であることを示します。つまり、ユーザーは空の値で上書きできません。パラメーターでデフォルト値または生成値が指定されていない場合には、ユーザーは値を指定する必要があります。
- 8
- 値が生成されるパラメーター
- 9
- ジェネレーターへの入力。この場合、ジェネレーターは、大文字、小文字を含む 40 桁の英数字の値を生成します。
- 10
- パラメーターはテンプレートメッセージに含めることができます。これにより、生成された値がユーザーに通知されます。
10.7.4. オブジェクト一覧 リンクのコピーリンクがクリップボードにコピーされました!
テンプレートの主な部分は、テンプレートがインスタンス化される時に作成されるオブジェクトの一覧です。これには、BuildConfig
、 DeploymentConfig
、Service
など、有効な API オブジェクトを使用できます。オブジェクトは、ここで定義された通りに作成され、パラメーターの値は作成前に置換されます。これらの定義は、以前に定義したパラメーターを参照できます。
- 1
Service
の定義。 このテンプレートにより作成されます。
オブジェクト定義のメタデータに namespace
フィールドの固定値が含まれる場合、フィールドはテンプレートのインスタンス化の際に定義から取り除かれます。namespace
フィールドにパラメーター参照が含まれる場合には、通常のパラメーター置換が行われ、パラメーター置換が値を解決した namespace で、オブジェクトが作成されます。 この際、ユーザーは対象の namespace でオブジェクトを作成するパーミッションがあることが前提です。
10.7.5. バインド可能なテンプレートの作成 リンクのコピーリンクがクリップボードにコピーされました!
テンプレートサービスブローカーは、認識されているテンプレートオブジェクトごとに、カタログ内にサービスを 1 つ公開します。デフォルトでは、これらのサービスはそれぞれ「バインド可能」として公開され、エンドユーザーがプロビジョニングしたサービスに対してバインドできるようにします。
テンプレートの作成者は、template.openshift.io/bindable: "false"
のアノテーションをテンプレートに追加して、エンドユーザーが、指定のテンプレートからプロビジョニングされるサービスをバインドできないようにできます。
10.7.6. オブジェクトフィールドの公開 リンクのコピーリンクがクリップボードにコピーされました!
テンプレートの作成者は、テンプレートに含まれる特定のオブジェクトのフィールドを公開すべきかどうかを指定できます。テンプレートサービスのブローカーは、ConfigMap、Secret、Service、Route オブジェクトに公開されたフィールドを認識し、ユーザーがブローカーでバックされているサービスをバンドした場合に公開されたフィールドの値を返します。
オブジェクトのフィールドを 1 つまたは複数公開するには、テンプレート内のオブジェクトに、プレフィックスが template.openshift.io/expose-
または template.openshift.io/base64-expose-
のアノテーションを追加します。
各アノテーションキーは、bind
応答のキーになるように、プレフィックスが削除されてパススルーされます。
各アノテーションの値は Kubernetes JSONPath 式の値であり、バインド時に解決され、bind
応答で返される値が含まれるオブジェクトフィールドを指定します。
Bind
応答のキー/値のペアは、環境変数として、システムの他の場所で使用できます。そのため、アノテーションキーでプレフィックスを取り除いた値を有効な環境変数名として使用することが推奨されます。先頭にA-Z
、a-z
またはアンダースコアを指定して、その後に、ゼロか、他の文字 A-Z
、a-z
、0-9
またはアンダースコアを指定してください。
template.openshift.io/expose-
アノテーションを使用して、文字列としてフィールドの値を返します。これは、任意のバイナリーデータを処理しませんが、使用すると便利です。バイナリーデータを返す場合には、バイナリーデータを返す前にデータのエンコードに base64b を使用するのではなく、template.openshift.io/base64-expose-
アノテーションを使用します。
バックスラッシュでエスケープしない限り、Kubernetes の JSONPath 実装は表現内のどの場所に使用されていても、.
、@
などはメタ文字として解釈されます。そのため、たとえば、my.key
という名前の ConfigMap
のデータを参照するには、JSONPath 式は {.data['my\.key']}
とする必要があります。JSONPath 式が YAML でどのように記述されているかによって、"{.data['my\\.key']}"
などのように、追加でバックスラッシュが必要になる場合があります。
以下は、公開されるさまざまなオブジェクトのフィールドの例です。
上記の部分的なテンプレートでの bind
操作に対する応答例は以下のようになります。
10.7.7. テンプレートの準備ができるまで待機 リンクのコピーリンクがクリップボードにコピーされました!
テンプレートの作成者は、テンプレート内の特定のオブジェクトがサービスカタログ、Template Service Broker または TemplateInstance API によるテンプレートのインスタンス化が完了したとされるまで待機する必要があるかを指定できます。
この機能を使用するには、テンプレート内の Build
、BuildConfig
、Deployment
、DeploymentConfig
、Job
または StatefulSet
のオブジェクト 1 つ以上に、次のアノテーションでマークを付けてください。
"template.alpha.openshift.io/wait-for-ready": "true"
"template.alpha.openshift.io/wait-for-ready": "true"
テンプレートのインスタンス化は、アノテーションのマークが付けられたすべてのオブジェクトが準備できたと報告されるまで、完了しません。同様に、アノテーションが付けられたオブジェクトが失敗したと報告されるか、固定タイムアウトである 1 時間以内にテンプレートの準備が整わなかった場合に、テンプレートのインスタンス化は失敗します。
インスタンス化の目的で、各オブジェクトの種類の準備状態および失敗は以下のように定義されます。
種類 | 準備状態 (Readines) | 失敗 (Failure) |
---|---|---|
| オブジェクトが Complete (完了) フェーズを報告する | オブジェクトが Canceled (キャンセル)、Error (エラー)、または Failed (失敗) を報告する |
| 関連付けられた最新のビルドオブジェクトが Complete (完了) フェーズを報告する | 関連付けられた最新のビルドオブジェクトが Canceled (キャンセル)、Error (エラー)、または Failed (失敗) を報告する |
| オブジェクトが新しい ReplicaSet やデプロイメントが利用可能であることを報告する (これはオブジェクトに定義された readiness プローブに従います) | オブジェクトで、Progressing (進捗中) の状態が false であると報告される |
| オブジェクトが新しい ReplicaController やデプロイメントが利用可能であると報告する (これはオブジェクトに定義された readiness プローブに従います) | オブジェクトで、Progressing (進捗中) の状態が false であると報告される |
| オブジェクトが完了 (completion) を報告する | オブジェクトが 1 つ以上の失敗が発生したことを報告する |
| オブジェクトがすべてのレプリカが準備状態にあることを報告する (これはオブジェクトに定義された readiness プローブに従います) | 該当なし |
以下は、テンプレートサンプルを一部抜粋したものです。この例では、wait-for-ready
アノテーションが使用されています。他のサンプルは、OpenShift クイックスタートテンプレートにあります。
10.7.8. その他の推奨事項 リンクのコピーリンクがクリップボードにコピーされました!
10.7.9. 既存オブジェクトからのテンプレートの作成 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Online Starter から OpenShift Online Pro にアップグレードする場合、oc export all
を使用してすべての既存オブジェクトをエクスポートします。OpenShift Online Pro は、オブジェクトごとのリソース移行をサポートしません。
テンプレートをゼロから作成するのではなく、プロジェクトから既存のオブジェクトをテンプレート形式でエクスポートして、パラメーターおよび他のカスタマイズを追加して、テンプレート形式を変更することができます。プロジェクトのオブジェクトをテンプレート形式でエクスポートするには、以下を実行します。
oc export all --as-template=<template_name> > <template_filename>
$ oc export all --as-template=<template_name> > <template_filename>
all
ではなく、特定のリソースタイプや複数のリソースを置き換えることも可能です。他の例については、oc export -h
を実行します。
以下は、oc export all
に含まれるオブジェクトタイプです。
- BuildConfig
- Build
- DeploymentConfig
- ImageStream
- Pod
- ReplicationController
- Route
- Service