テンプレート プロパティの設定と環境変数の使用

テンプレートはカスタム テンプレートのプロパティや定義済み環境変数の使用もサポートしているので、複数のゾーンやリージョン、さらにはプロジェクトにわたってテンプレートを再利用できます。

たとえば、テンプレートに特定のゾーン値をコードで指定する代わりに、任意のテンプレートのプロパティを宣言できます。テンプレートを使用する場合は、常にそのテンプレートを含めて、構成の最上位に値を設定します。

次の構文を使用して、テンプレートに任意のテンプレートのプロパティを宣言します。

Jinja

{{ properties["property-name"] }}

Python

context.properties["property-name"]

たとえば、以下のテンプレートには、zonemachineTypenetwork のテンプレートのプロパティが設定されます。

Jinja

resources:
- name: 'example'
  type: compute.v1.instance
  properties:
    zone: {{ properties["zone"] }}
    machineType: https://www.googleapis.com/compute/v1/projects/my-project/zones/{{ properties["zone"] }}/machineTypes/{{ properties["machineType"] }}
    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.{{ properties["network"] }}.selfLink)
      accessConfigs:
      - name: External NAT
        type: ONE_TO_ONE_NAT

Python

"""Creates the virtual machine."""

def GenerateConfig(context):
  """Creates the virtual machine with environment variables."""

  resources = [{
      'name': 'example',
      'type': 'compute.v1.instance',
      'properties': {
          'zone': context.properties['zone'],
          'machineType': ''.join(['https://www.googleapis.com/compute/v1/',
                                  'projects/my-project/zones/',
                                  context.properties['zone'], '/machineTypes/',
                                  context.properties['machineType']]),
          'disks': [{
              'deviceName': 'boot',
              'type': 'PERSISTENT',
              'boot': True,
              'autoDelete': True,
              'initializeParams': {
                  'sourceImage': ''.join(['https://www.googleapis.com/compute/v1/', 'projects/',
                                          'debian-cloud/global/',
                                          'images/family/debian-8'])
              }
          }],
          'networkInterfaces': [{
              'network': '$(ref.' + context.properties['network']
                         + '.selfLink)',
              'accessConfigs': [{
                  'name': 'External NAT',
                  'type': 'ONE_TO_ONE_NAT'
              }]
          }]
      }
  }]
  return {'resources': resources}

ここで、設定の最上位の階層このテンプレートのプロパティの値、または親テンプレートを設定します。

resources:
- name: the-first-vm
  type: vm-template.jinja
  properties:
    machineType: f1-micro # Sets the 'machineType' template property
    zone: us-central1-f # Sets the 'zone' template property
    network: example-network # Sets the 'network' template property
- name: the-second-vm
  ...

テンプレートのプロパティの他に、デプロイに応じた特定の情報が事前入力された環境変数を参照することもできます。有効な環境変数には、デプロイ名、プロジェクト ID、使用するリソースの name プロパティ、使用する設定のタイプなどがあります。それぞれの環境変数については、環境変数ドキュメントをお読みください。

環境変数を参照するには、次の構文を使用できます。

Jinja

{{ env["variable-name"] }}

Python

context.env['variable-name']

たとえば、次のテンプレートでは nameproject の環境変数が使用されています。

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: {{ env["name"] }}
  type: compute.v1.instance
  properties:
    zone: {{ properties["zone"] }}
    machineType: https://www.googleapis.com/compute/v1/projects/{{ env["project"] }}/zones/{{ properties["zone"] }}/machineTypes/{{ properties["machineType"] }}
    disks:
    - deviceName: boot
      type: PERSISTENT
      boot: true
      autoDelete: true
      initializeParams:
        sourceImage: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/family/debian-9
    networkInterfaces:
    - network: $(ref.{{ properties["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(context):
  """Creates the virtual machine with environment variables."""

  resources = [{
      'name': context.env['name'],
      'type': 'compute.v1.instance',
      'properties': {
          'zone': context.properties['zone'],
          'machineType': ''.join([COMPUTE_URL_BASE, 'projects/',
                                  context.env['project'], '/zones/',
                                  context.properties['zone'], '/machineTypes/',
                                  context.properties['machineType']]),
          'disks': [{
              'deviceName': 'boot',
              'type': 'PERSISTENT',
              'boot': True,
              'autoDelete': True,
              'initializeParams': {
                  'sourceImage': ''.join([COMPUTE_URL_BASE, 'projects/',
                                          'debian-cloud/global/',
                                          'images/family/debian-9'])
              }
          }],
          'networkInterfaces': [{
              'network': '$(ref.' + context.properties['network']
                         + '.selfLink)',
              'accessConfigs': [{
                  'name': 'External NAT',
                  'type': 'ONE_TO_ONE_NAT'
              }]
          }]
      }
  }]
  return {'resources': resources}

テンプレートのプロパティと環境変数を利用してテンプレートを変換してみましょう。

vm-template.jinja ファイルを編集する

vm-template ファイルを開き、ファイルの以下の部分を、適切なテンプレートのプロパティと環境変数に置き換えます。

  1. the-first-vm の部分を次で置き換えます。

    Jinja

    {{ env["name"] }}
    

    Python

    context.env['name']
    

  2. プロジェクト ID が使用されている部分すべてを、たとえば次のように変数で置き換えます。

    Jinja

    {{ env["project"] }}
    

    Python

    context.env['project']
    

  3. 次にゾーンを置き換えます。us-central1-f の部分すべてを次で置き換えます。

    Jinja

    {{ properties["zone"] }}
    

    Python

    context.properties['zone']
    

  4. f1-micro の部分を次で置き換えます。

    Jinja

    {{ properties["machineType"] }}
    

    Python

    context.properties["machineType"]
    

  5. $(ref.a-new-network.selfLink) の部分を次で置き換えます。

    Jinja

    $(ref.{{ properties["network"] }}.selfLink)
    

    Python

    '$(ref.' + context.properties['network'] + '.selfLink)'
    

念のため、vm-template.jinja ファイルが次のようになっていることを確認してください。

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: {{ env["name"] }}
  type: compute.v1.instance
  properties:
    zone: {{ properties["zone"] }}
    machineType: https://www.googleapis.com/compute/v1/projects/{{ env["project"] }}/zones/{{ properties["zone"] }}/machineTypes/{{ properties["machineType"] }}
    disks:
    - deviceName: boot
      type: PERSISTENT
      boot: true
      autoDelete: true
      initializeParams:
        sourceImage: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/family/debian-9
    networkInterfaces:
    - network: $(ref.{{ properties["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(context):
  """Creates the virtual machine with environment variables."""

  resources = [{
      'name': context.env['name'],
      'type': 'compute.v1.instance',
      'properties': {
          'zone': context.properties['zone'],
          'machineType': ''.join([COMPUTE_URL_BASE, 'projects/',
                                  context.env['project'], '/zones/',
                                  context.properties['zone'], '/machineTypes/',
                                  context.properties['machineType']]),
          'disks': [{
              'deviceName': 'boot',
              'type': 'PERSISTENT',
              'boot': True,
              'autoDelete': True,
              'initializeParams': {
                  'sourceImage': ''.join([COMPUTE_URL_BASE, 'projects/',
                                          'debian-cloud/global/',
                                          'images/family/debian-9'])
              }
          }],
          'networkInterfaces': [{
              'network': '$(ref.' + context.properties['network']
                         + '.selfLink)',
              'accessConfigs': [{
                  'name': 'External NAT',
                  'type': 'ONE_TO_ONE_NAT'
              }]
          }]
      }
  }]
  return {'resources': resources}

network-template.jinja テンプレートを編集する

network-template.jinja ファイルを編集して、a-new-network を次で置き換えます。

Jinja

{{ env["name"] }}

Python

context.env['name']

念のため、ネットワーク テンプレートの全体を確認してください。

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: {{ env["name"] }}
  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.

"""Creates the network."""

def GenerateConfig(context):
  """Creates the network with environment variables."""

  resources = [{
      'name': context.env['name'],
      'type': 'compute.v1.network',
      'properties': {
          'IPv4Range': '10.0.0.1/16'
      }
  }]
  return {'resources': resources}

変更を保存します。

firewall-template.jinja テンプレートを編集する

  1. ファイアウォール名を次で置き換えます。

    Jinja

    {{ env["name"] }}
    

    Python

    context.env['name']
    

  2. $(ref.a-new-network.selfLink) の部分を次で置き換えます。

    Jinja

    $(ref.{{ properties["network"] }}.selfLink)
    

    Python

    '$(ref.' + context.properties['network'] + '.selfLink)'
    

念のため、ファイアウォール テンプレートの全体を確認してください。

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: {{ env["name"] }}
  type: compute.v1.firewall
  properties:
    network: $(ref.{{ properties["network"] }}.selfLink)
    sourceRanges: ["0.0.0.0/0"]
    allowed:
    - IPProtocol: TCP
      ports: ["80"]

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 firewall."""

def GenerateConfig(context):
  """Creates the firewall with environment variables."""

  resources = [{
      'name': context.env['name'],
      'type': 'compute.v1.firewall',
      'properties': {
          'network': '$(ref.' + context.properties['network'] + '.selfLink)',
          'sourceRanges': ['0.0.0.0/0'],
          'allowed': [{
              'IPProtocol': 'TCP',
              'ports': [80]
          }]
      }
  }]
  return {'resources': resources}

変更を保存します。

compute-engine-template.jinja テンプレートを編集する

vm-template.[jinja|py] テンプレートを使用して、新しい仮想マシン インスタンスの名前が入るように、compute-engine-template.[jinja|py] を変更します。vm-template-2.jinja を完全に削除し、再利用可能な単一のテンプレート内にすべての動的なプロパティを入れて、単純化していることに注意してください。

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

{% set  NETWORK_NAME = "once-upon-a-custom-network" %}

resources:
- name: the-first-vm
  type: vm-template.jinja
  properties:
    machineType: f1-micro
    zone: us-central1-f
    network: {{ NETWORK_NAME }}
- name: the-second-vm
  type: vm-template.jinja
  properties:
    machineType: g1-small
    zone: us-central1-f
    network: {{ NETWORK_NAME }}
- name: {{ NETWORK_NAME }}
  type: network-template.jinja
- name: {{ NETWORK_NAME }}-firewall
  type: firewall-template.jinja
  properties:
    network: {{ NETWORK_NAME }}

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 Compute Engine."""

NETWORK_NAME = 'once-upon-a-custom-network'

def GenerateConfig(unused_context):
  """Creates the Compute Engine with multiple templates."""

  resources = [{
      'name': 'the-first-vm',
      'type': 'vm-template.py',
      'properties': {
          'machineType': 'f1-micro',
          'zone': 'us-central1-f',
          'network': NETWORK_NAME
      }
  }, {
      'name': 'the-second-vm',
      'type': 'vm-template.py',
      'properties': {
          'machineType': 'f1-micro',
          'zone': 'us-central1-f',
          'network': NETWORK_NAME
      }
  }, {
      'name': NETWORK_NAME,
      'type': 'network-template.py'
  }, {
      'name': NETWORK_NAME + '-firewall',
      'type': 'firewall-template.py',
      'properties': {
          'network': NETWORK_NAME
      }
  }]
  return {'resources': resources}

ベース テンプレート内に name 環境変数を追加したので、Deployment Manager は、親テンプレート(ベース テンプレートを呼び出すテンプレート)で定義された名前を使用してリソースに名前を付けます。この場合の親テンプレートは compute-engine-template.[jinja|py] なので、仮想マシン インスタンスの名前は the-first-vmthe-second-vm になります。project 変数を定義する必要はなく、Deployment Manager が自動的にそれを環境変数として認識し、値を自動的に設定します。

compute-engine-template.[jinja|py] は長くなり、少々複雑になりましたが、ずっと動的にもなっています。テンプレートと環境変数を組み合わせてこのテンプレートを再利用すれば、完結した Compute Engine クラスタを作成して、テンプレートごとにマシンタイプやゾーン指定、ネットワーク名をカスタマイズできます。これにより、同じ設定の各デプロイのために、同じ構成のコピーを複数作成する必要がなくなります。

設定ファイルを更新する

次に、設定ファイル config-with-many-templates.yaml を編集して、vm-template-2.[jinja|py] をインポートしている行を削除します。設定は次のようになります。

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: network-template.jinja
- path: firewall-template.jinja
- path: compute-engine-template.jinja

resources:
- name: compute-engine-setup
  type: compute-engine-template.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.

imports:
- path: vm-template.py
- path: network-template.py
- path: firewall-template.py
- path: compute-engine-template.py

resources:
- name: compute-engine-setup
  type: compute-engine-template.py

変更を保存します。必要に応じて、設定を再度デプロイして、変数が機能していることを確認できます。

gcloud deployment-manager deployments create deployment-with-many-templates --config config-with-many-templates.yaml

次に、メタデータと起動スクリプトをテンプレートに追加する方法を説明しましょう。

デプロイを削除する

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

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

gcloud deployment-manager deployments delete deployment-with-many-templates

次へ: メタデータと起動スクリプトを設定する

関連トピック

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

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

Cloud Deployment Manager のドキュメント