テンプレートを作成する

デプロイは構成を使用していつでも作成できますが、複雑な構成を作成する場合はテンプレートを作成して使用し、より柔軟かつ堅牢な構成にする必要があります。

テンプレートは、構成とは別のファイルで、リソースのセットを定義するものです。テンプレートを構成にインポートすると、Deployment Manager がデプロイ時にテンプレートを展開して内容をインライン化するので、構成ファイルをすっきりとシンプルに保つことができます。インポートされたテンプレートは、リソースタイプを使用するのと同じように使用できます。

テンプレートから他のテンプレートを使用することができます。構成内で他のテンプレートが使用されていると Deployment Manager は再帰的にテンプレートを展開するので、最終的にはテンプレートを使用しないで構成を書いたのと同様の結果が得られます。たとえば、テンプレートを使用した構成は次のようになります。

imports:
- path: vm-template.jinja

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

Deployment Manager がテンプレートを展開すると、構成全体は次のようになります。このとき、何も手を加える必要はありません。

resources:
- name: vm-instance
  type: compute.v1.instance
  properties:
    disks:
    - deviceName: boot
      type: PERSISTENT
      boot: true
      autoDelete: true
      initializeParams:
        sourceImage: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/family/debian-8
    machineType: https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-f/machineTypes/f1-micro
    networkInterfaces:
    - network: $(ref.a-new-network.selfLink)
      accessConfigs:
      - name: External NAT
        type: ONE_TO_ONE_NAT
    zone: us-central1-f

次に、ステップ 2 の構成を作成するで作成した構成の内容からテンプレートを作成します。その後、構成の中でそのテンプレートをインポートして使用し、新しいデプロイを作成します。

結局、新しいデプロイの内容は最初のデプロイと同じリソースになりますが、構成ファイルはかなりシンプルになります。

Jinja2 または Python でテンプレートを書く

テンプレートは Python か Jinja2 で書くことができます。Python によるテンプレートはより強力で、テンプレートをプログラム的に作成したり管理したりできます。Python に慣れているなら、Python でテンプレートを作成してください。

Jinja2 は、よりシンプルですがそれほど強力ではないテンプレート言語で、YAML と同じ構文を使用します。Python に詳しくないか、Python を使うまでもなくシンプルなテンプレートを書きたい場合には、Jinja2 を使用してください。このガイドでは、これ以降、Jinja と Python の両方で例を掲載します。

Python テンプレート

Python でテンプレートを書く場合には、2 つだけ要件があります。

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

  • このメソッドは有効な YAML 構成を返す必要があります。

これ以外の点では、テンプレートの内容を任意に生成できます。Python テンプレートの作成に使用可能なメソッドの例については、基本テンプレートの作成をご覧ください。

最初のテンプレートを作成する

ステップ 4 参照を使用するで作成したリソース定義を vm-template.[jinja|py] という新しいファイルにコピーします。Jinja と Python のどちらのテンプレートにするかに応じて、適切なファイル拡張子を選択します。 [MY_PROJECT] は、使用するプロジェクト ID に置き換えてください。

Jinja

{#
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: the-first-vm
  type: compute.v1.instance
  properties:
    zone: us-central1-f
    machineType: https://www.googleapis.com/compute/v1/projects/[MY_PROJECT]/zones/us-central1-f/machineTypes/f1-micro
    disks:
    - deviceName: boot
      type: PERSISTENT
      boot: true
      autoDelete: true
      initializeParams:
        sourceImage: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/family/debian-8
    networkInterfaces:
    - network: $(ref.a-new-network.selfLink)
      accessConfigs:
      - name: External NAT
        type: ONE_TO_ONE_NAT

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.

"""Creates the virtual machine."""

COMPUTE_URL_BASE = 'https://www.googleapis.com/compute/v1/'

def GenerateConfig(unused_context):
  """Creates the first virtual machine."""

  resources = [{
      'name': 'the-first-vm',
      'type': 'compute.v1.instance',
      'properties': {
          'zone': 'us-central1-f',
          'machineType': ''.join([COMPUTE_URL_BASE, 'projects/[MY_PROJECT]',
                                  '/zones/us-central1-f/',
                                  'machineTypes/f1-micro']),
          'disks': [{
              'deviceName': 'boot',
              'type': 'PERSISTENT',
              'boot': True,
              'autoDelete': True,
              'initializeParams': {
                  'sourceImage': ''.join([COMPUTE_URL_BASE, 'projects/',
                                          'debian-cloud/global/',
                                          'images/family/debian-8'])
              }
          }],
          'networkInterfaces': [{
              'network': '$(ref.a-new-network.selfLink)',
              'accessConfigs': [{
                  'name': 'External NAT',
                  'type': 'ONE_TO_ONE_NAT'
              }]
          }]
      }
  }]
  return {'resources': resources}

2 つ目のテンプレートを作成する

vm-template-2.[jinja|py] という名前のファイルを作成して、次の内容を記述します。 [MY_PROJECT] は、使用するプロジェクト ID に置き換えてください。

Jinja

{#
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: the-second-vm
  type: compute.v1.instance
  properties:
    zone: us-central1-f
    machineType: https://www.googleapis.com/compute/v1/projects/[MY_PROJECT]/zones/us-central1-f/machineTypes/g1-small
    disks:
    - deviceName: boot
      type: PERSISTENT
      boot: true
      autoDelete: true
      initializeParams:
        sourceImage: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/family/debian-8
    networkInterfaces:
    - network: $(ref.a-new-network.selfLink)
      accessConfigs:
      - name: External NAT
        type: ONE_TO_ONE_NAT

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.

"""Creates the virtual machine."""

COMPUTE_URL_BASE = 'https://www.googleapis.com/compute/v1/'

def GenerateConfig(unused_context):
  """Creates the second virtual machine."""

  resources = [{
      'name': 'the-second-vm',
      'type': 'compute.v1.instance',
      'properties': {
          'zone': 'us-central1-f',
          'machineType': ''.join([COMPUTE_URL_BASE, 'projects/[MY_PROJECT]',
                                  '/zones/us-central1-f/',
                                  'machineTypes/g1-small']),
          'disks': [{
              'deviceName': 'boot',
              'type': 'PERSISTENT',
              'boot': True,
              'autoDelete': True,
              'initializeParams': {
                  'sourceImage': ''.join([COMPUTE_URL_BASE, 'projects/',
                                          'debian-cloud/global',
                                          '/images/family/debian-8'])
              }
          }],
          'networkInterfaces': [{
              'network': '$(ref.a-new-network.selfLink)',
              'accessConfigs': [{
                  'name': 'External NAT',
                  'type': 'ONE_TO_ONE_NAT'
              }]
          }]
      }
  }]
  return {'resources': resources}

テンプレートをインポートする

もう一度、構成 two-vms.yaml を開きます。ファイルの先頭でテンプレートをインポートするために、imports 文字列を記入し、その後にテンプレート ファイルの相対パスを指定します。そして、リソースのプロパティをテンプレートの名前に置き換えます。

Jinja

# 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.

imports:
- path: vm-template.jinja
- path: vm-template-2.jinja

resources:
- name: vm-1
  type: vm-template.jinja
- name: vm-2
  type: vm-template-2.jinja
- name: a-new-network
  type: compute.v1.network
  properties:
    IPv4Range: 10.0.0.1/16

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.

imports:
- path: vm-template.py
- path: vm-template-2.py

resources:
- name: vm-1
  type: vm-template.py
- name: vm-2
  type: vm-template-2.py
- name: a-new-network
  type: compute.v1.network
  properties:
    IPv4Range: 10.0.0.1/16

リソース名

テンプレートを使用する場合、リソース名はテンプレート内の name フィールドで定義します。構成ファイル内の名前ではありません。

たとえばこの場合、仮想マシンのインスタンスは、作成したテンプレート内の名前である “the-first-vm” と “the-second-vm” を使用して作成されます。構成の中で定義されている値 “vm-1” と "vm-2" はテンプレートのインスタンス化の名前に使用されますが、環境変数を使用して両方の名前を同一にするように設定しない限り、リソース名にはなりません。

構成を保存してデプロイする

gcloud deployment-manager deployments create deployment-with-templates --config two-vms.yaml

作成したデプロイを表示する

gcloud deployment-manager deployments describe deployment-with-templates

デプロイのマニフェストで、テンプレートを含んだ元の構成とテンプレートの内容を含んだ展開された構成を見ることができます。マニフェストを取得するには、上記の出力から manifest-TIMESTAMP の値をコピーして、次のコマンドの中で使用します。

gcloud deployment-manager manifests describe manifest-TIMESTAMP --deployment deployment-with-templates

これで、テンプレートを使用してデプロイを作成できました。次は、他のテンプレートを呼び出すテンプレートを使用した構成の作成方法を説明します。

デプロイを削除する

Compute Engine のリソースには費用が発生します。このデプロイは後のステップでは不要なので削除することをおすすめします。このデプロイを削除すると、その中にあるリソースもすべて削除されます。このデプロイを残したままにすると、以降の例と衝突を起こします。

デプロイを削除するには:

gcloud deployment-manager deployments delete deployment-with-templates

次へ: 複数のテンプレートを使用する

関連トピック

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Cloud Deployment Manager のドキュメント