Vorlageneigenschaften festlegen und Umgebungsvariablen verwenden

Vorlagen unterstützen auch die Verwendung von benutzerdefinierten Vorlageneigenschaften und vordefinierten Umgebungsvariablen, sodass Sie Vorlagen in mehreren Zonen, Regionen oder sogar Projekten wiederverwenden können.

Beispielsweise können Sie ein beliebiges Vorlagenattribut angeben, anstatt einen bestimmten Zonenwert in Ihrer Vorlage zu programmieren. Jedes Mal, wenn Sie die Vorlage verwenden, fügen Sie die Vorlage ein und geben einen Wert für die Zone in der obersten Ebene der Konfiguration an.

Bestimmen Sie eine beliebige Vorlageneigenschaft in Ihren Vorlagen mit dieser Syntax:

Jinja

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

Python

context.properties["property-name"]

Beispielsweise legt die folgende Vorlage die folgenden Eigenschaften für die Vorlage fest: zone, machineType und network.

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}

Dann würden Sie den Wert dieser Vorlageneigenschaft auf der obersten Ebene der Konfiguration oder der in der übergeordneten Vorlage festlegen:

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

Sie können, zusätzlich zu den Eigenschaften der Vorlage, auch Umgebungsvariablen referenzieren, in denen bereits spezifische Informationen über Ihre Bereitstellung enthalten sind. Zu den gültigen Umgebungsvariablen zählen der Name der Bereitstellung, die Projekt-ID, die name-Eigenschaft Ihrer Ressource und der Typ der Konfiguration. Mehr Details über jede Umgebungsvariable erfahren Sie in der Dokumentation Umgebungsvariablen.

Sie können mit dieser Syntax eine Umgebungsvariable referenzieren:

Jinja

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

Python

context.env['variable-name']

Die folgende Vorlage nutzt beispielsweise die Umgebungsvariablen name und project.

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}

Lassen Sie uns Ihre Vorlagen umwandeln, um die Vorteile von Vorlageneigenschaften und Umgebungsvariablen zu nutzen.

Datei "vm-template.jinja" bearbeiten

Öffnen Sie Ihre vm-template-Datei und ersetzen Sie die folgenden Teile der Datei durch die geeigneten Vorlageneigenschaften und Umgebungsvariablen.

  1. Ersetzen Sie the-first-vm durch:

    Jinja

    {{ env["name"] }}
    

    Python

    context.env['name']
    

  2. Ersetzen Sie jede Ihrer Projekt-IDs so durch eine Variable:

    Jinja

    {{ env["project"] }}
    

    Python

    context.env['project']
    

  3. Ersetzen Sie als nächstes die Zone. Ersetzen Sie us-central1-f überall durch:

    Jinja

    {{ properties["zone"] }}
    

    Python

    context.properties['zone']
    

  4. Ersetzen Sie f1-micro durch:

    Jinja

    {{ properties["machineType"] }}
    

    Python

    context.properties["machineType"]
    

  5. Ersetzen Sie $(ref.a-new-network.selfLink) durch:

    Jinja

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

    Python

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

Vergewissern Sie sich zur Plausibilitätsprüfung, dass Ihre vm-template.jinja-Datei so aussieht:

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}

Vorlage "network-template.jinja" bearbeiten

Bearbeiten Sie die Datei network-template.jinja und ersetzen Sie a-new-network durch:

Jinja

{{ env["name"] }}

Python

context.env['name']

Ihr Netzwerk sollte als Plausibilitätsprüfung so aussehen:

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}

Speichern Sie die Änderungen.

Vorlage "firewall-template.jinja" bearbeiten

  1. Ersetzen Sie den Namen der Firewall:

    Jinja

    {{ env["name"] }}
    

    Python

    context.env['name']
    

  2. Ersetzen Sie $(ref.a-new-network.selfLink) durch:

    Jinja

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

    Python

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

Ihre Firewallvorlage sollte zur Prüfung der Plausibilität so aussehen:

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}

Speichern Sie die Änderungen.

Vorlage "compute-engine-template.jinja" bearbeiten

Aktualisieren Sie compute-engine-template.[jinja|py] mit der vm-template.[jinja|py]-Vorlage, sodass sie neue Namen für VM-Instanzen beinhaltet. Beachten Sie, dass Sie vm-template-2.jinja vollständig entfernt haben, wodurch alle dynamischen Eigenschaften innerhalb einer einzelnen Vorlage, die Sie wiederverwenden können, vereinfacht werden.

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}

Da Sie die Umgebungsvariable name in der grundlegenden Vorlage hinzugefügt haben, benennt Deployment Manager die Ressourcen mithilfe des Namens, der in der übergeordneten Vorlage definiert ist (die Vorlage, die die grundlegende Vorlage aufruft). Die übergeordnete Vorlage wäre in diesem Fall compute-engine-template.[jinja|py], also wären die Namen der VM-Instanzen the-first-vm und the-second-vm. Sie müssen Ihre Projektvariable nicht definieren, da Deployment Manager sie automatisch als Umgebungsvariable erkennt und den Wert automatisch einträgt.

Obwohl compute-engine-template.[jinja|py] jetzt länger und etwas komplexer ist, ist sie auch wesentlich dynamischer. Mit einer Kombination aus Vorlage und Umgebungsvariablen können Sie diese Vorlage wiederverwenden, um einen vollständigen Compute Engine-Cluster zu erzeugen, bei dem Maschinentypen, Zonenspezifikationen und Netzwerknamen bei jeder Wiederverwendung angepasst werden. Dadurch entfällt das Erstellen von mehreren Kopien der gleichen Konfiguration für Bereitstellungen mit der gleichen Einrichtung.

Konfigurationsdatei aktualisieren

Bearbeiten Sie als nächstes Ihre Konfigurationsdatei, config-with-many-templates.yaml, und entfernen Sie die Zeile, wegen der vm-template-2.[jinja|py] importiert wird, sodass ihre Konfiguration so aussieht:

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

Speichern Sie Ihre Änderungen und stellen Sie, wenn Sie wollen, Ihre Konfiguration erneut bereit, um zu bestätigen, dass die Variablen funktionieren.

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

Lassen Sie uns jetzt darüber sprechen, wie Sie Metadaten und Startskripte zu Ihrer Vorlage hinzufügen.

Bereitstellung löschen

Compute Engine-Ressourcen verursachen Kosten, also sollten Sie diese Bereitstellung löschen, da Sie für die weiteren Schritte nicht mehr gebraucht wird. Durch Löschen dieser Bereitstellung werden alle Ressourcen in dieser Bereitstellung ebenfalls gelöscht. Wenn Sie die Bereitstellung nicht löschen, entstehen Konflikte mit späteren Beispielen.

So löschen Sie diese Bereitstellung:

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

Nächster Schritt: Metadaten und Startskripte festlegen

Verwandte Themen

Hat Ihnen diese Seite weitergeholfen? Teilen Sie uns Ihr Feedback mit:

Feedback geben zu...

Cloud Deployment Manager-Dokumentation