基本テンプレートの作成

簡単なワークロードの場合、基本的な構成ファイルで十分ですが、より複雑なアーキテクチャや再利用を行う構成の場合、構成を複数のテンプレートに分割することができます。

テンプレートは、構成でタイプとしてインポートされ、使用される個別のファイルです。テンプレートは、構成で必要な数だけ使用できます。

テンプレートを使用すると、構成をさまざまな部分に分割し、別のデプロイで再利用できます。テンプレートは、必要に応じて汎用化することも、特化することもできます。テンプレートを使えば、動的な構成やテンプレート ファイルを作成するときに、テンプレート プロパティ、環境変数、モジュール、他のテンプレート機能などを利用できます。

独自のデプロイで使用できるテンプレートの例については、Deployment Manager GitHub リポジトリをご覧ください。

始める前に

テンプレートの構文

テンプレートは、Jinja 2.10.x または Python 3.x で記述します。 YAML 構文により対応しているのは Jinja です。YAML に慣れている場合には、テンプレートを Jinja で作成するほうが簡単です。

テンプレート ファイルは Python で記述することもできます。Python を使用すると、テンプレートの一部を自動的に作成できます。たとえば、Python ライブラリを使用して、テンプレート定義をフォーマットできます。Python に慣れている場合には、こちらの方法のほうが簡単です。

Deployment Manager は、Jinja と Python の両方のテンプレートを受け入れます。同じ構成に両方の言語のテンプレートをインポートできます。

基本テンプレートの作成

テンプレートは、Jinja または Python のいずれかで作成したファイルです。たとえば、次の構成ファイルについて考えてみます。

# Copyright 2016 Google Inc. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

resources:
- name: vm-created-by-deployment-manager
  type: compute.v1.instance
  properties:
    zone: us-central1-a
    machineType: zones/us-central1-a/machineTypes/n1-standard-1
    disks:
    - deviceName: boot
      type: PERSISTENT
      boot: true
      autoDelete: true
      initializeParams:
        sourceImage: projects/debian-cloud/global/images/family/debian-11
    networkInterfaces:
    - network: global/networks/default

この構成は有効ですが、個別のテンプレート ファイルに分割して再利用できるようにしておくと、構成をさらに簡素化できます。上の構成に基づいてテンプレートを作成するには、該当するリソースのセクションを抽出して新しい Jinja または Python ファイルを作成します。

次のスニペットは、デプロイを簡略化できるテンプレートのセクションを示しています。テンプレート全体を表示するには、[GitHub で表示]をクリックします。

Jinja

- name: vm-template
  type: compute.v1.instance
  properties:
    zone: us-central1-a
    machineType: zones/us-central1-a/machineTypes/n1-standard-1
    disks:
    - deviceName: boot
      type: PERSISTENT
      boot: true
      autoDelete: true
      initializeParams:
        sourceImage: projects/debian-cloud/global/images/family/debian-11
    networkInterfaces:
    - network: global/networks/default

Python

Python テンプレートは、次の要件を満たす必要があります。

  • テンプレートには、GenerateConfig(context) または generate_config(context) という名前のメソッドを定義する必要があります。同じテンプレート内で両方のメソッド名を使用する場合、generate_config() メソッドが優先されます。

    context オブジェクトには、デプロイと環境に関するメタデータ(デプロイ名、現在のプロジェクトなど)が含まれています。詳しくは、デプロイメント固有の環境変数の使用をご覧ください。

  • メソッドで Python 辞書を返す必要があります。

この条件を満たしていない場合、自身でテンプレートのコンテンツを生成する必要があります。

resources.append({
    'name': 'vm-template',
    'type': 'compute.v1.instance',
    'properties': {
        'zone': 'us-central1-a',
        'machineType': 'zones/us-central1-a/machineTypes/n1-standard-1',
        'disks': [{
            'deviceName': 'boot',
            'type': 'PERSISTENT',
            'boot': True,
            'autoDelete': True,
            'initializeParams': {
                'sourceImage':
                    'projects/debian-cloud/global/images/family/debian-11'
            }
        }],
        'networkInterfaces': [{
            'network': 'global/networks/default'
        }]
    }
})

Python の完全なサンプルについては、Deployment Manager の GitHub リポジトリを参照してください。

テンプレートのインポート

テンプレートを作成したら、構成ファイルにインポートして使用します。テンプレートをインポートするには、構成に imports セクションを追加し、その後に現在のディレクトリからの相対パスまたは絶対パスを続けます。たとえば、前のステップの仮想マシン用のテンプレートをインポートするには、構成の先頭に次の行を追加します。

imports:
  - path: path/to/my_vm_template.jinja

ファイルパスが長い場合、ファイルのエイリアスとして name プロパティを使用できます。あとでテンプレートを参照するときに、この名前を使用できます。名前を設定しない場合には、path を使用してテンプレートを参照します。

imports:
  - path: path/to/my_vm_template.jinja
    name: my_renamed_template.jinja

テンプレートが Jinja か Python かにかかわらず、複数のテンプレートを混在させることができます。また、一致させることもできます。

imports:
  - path: path/to/my_vm_template.jinja
    name: my_renamed_template.jinja
  - path: special_vm.py

テンプレートに別のテンプレートと依存関係がある場合には、依存するテンプレートも構成にインポートします。

imports:
  - path: path/to/my_vm_template.jinja
  - path: special_vm.py
  - path: base_vm.jinja

テキスト ファイルをインポートしてコンテンツをインラインに挿入することもできます。たとえば、次の文字列を含む resource_type.txt という名前のファイルを作成します。

compute.v1.instance

これを構成にインポートし、コンテンツをインラインに挿入します。

imports:
- path: resource_type.txt

resources:
- name: my-vm
  type: {{ imports["resource_type.txt"] }} # Resolves to "compute.v1.instance"
  properties:
    zone: us-central1-a
    machineType: zones/us-central1-a/machineTypes/f1-micro
    disks:
    - deviceName: boot
      type: PERSISTENT
      boot: true
      autoDelete: true
      initializeParams:
        sourceImage: projects/debian-cloud/global/images/family/debian-9
    networkInterfaces:
    - network: global/networks/default
      accessConfigs:
      - name: External NAT
        type: ONE_TO_ONE_NAT

テンプレートのデプロイ

テンプレートをインポートしたら、それを構成のタイプとして使用します。

Jinja

imports:
- path: vm-template.jinja

resources:
- name: my-vm
  type: vm-template.jinja

Python

imports:
- path: vm-template.py

resources:
- name: my-vm
  type: vm-template.py

テンプレートの名前を設定していない場合には、テンプレート パスでテンプレートを呼び出します。

imports:
- path: path/to/my_vm_template.jinja

resources:
- name: my-first-virtual-machine
  type: path/to/my_vm_template.jinja

コマンドライン ツールを使用したテンプレートの直接デプロイ

Deployment Manager には、最上位構成ファイルを作成する代わりに、Google Cloud CLI でテンプレートを直接デプロイする機能があります。

たとえば、次のリクエストでは vm-template.jinja というテンプレートをデプロイします。

gcloud deployment-manager deployments create a-single-vm --template vm-template.jinja

また、テンプレートにテンプレート プロパティがある場合、コマンドラインで --properties フラグを使用してプロパティを設定することもできます。

gcloud deployment-manager deployments create my-igm \
    --template vm-template.jinja \
    --properties zone:us-central1-a

注意すべき点:

  • すべての値は YAML 値として解析されます。たとえば、version: 3 は整数として渡されます。文字列として指定するには、version: \'3\' のように値を一重引用符で囲んでエスケープします。

  • ブール値では大文字と小文字は区別されません。TRUEtrueTrue は同じ値として処理されます。

  • テンプレートで定義されたすべての必須プロパティを渡す必要があります。プロパティのサブセットだけを渡すことはできません。特定のプロパティにデフォルト値がある場合は、コマンドラインでそのプロパティを省略できます。

複数のプロパティを指定するには、キー値のペアをカンマ区切りで指定します。ペアは任意の順序で指定できます。次に例を示します。

gcloud deployment-manager deployments create my-igm 
--template vm-template.jinja
--properties zone:us-central1-a,machineType:n1-standard-1,image:debian-9

このコマンドを実行すると、Deployment Manager は指定されたテンプレートを使用してデプロイを作成します。Google Cloud Console または gcloud CLI を使用して、デプロイが作成されたことを確認できます。デプロイの表示については、マニフェストの表示をご覧ください。

次のステップ