Vorlage erstellen

Sie können jederzeit eine Bereitstellung mithilfe einer Konfiguration erstellen, aber wenn Sie komplexere Konfigurationen erstellen, sollten Sie aufgrund der höheren Flexibilität und Robustheit der Konfigurationen Vorlagen erstellen und nutzen.

Eine Vorlage ist eine separate Datei von Ihrer Konfiguration, die eine Reihe von Ressourcen definiert. Sie importieren eine Vorlage in Ihre Konfiguration und Deployment Manager expandiert die Vorlage und setzt die Inhalte inline während der Bereitstellung. Dadurch erhalten Sie eine sauberere, einfachere Konfigurationsdatei. Sie können eine Vorlage ebenso verwenden wie einen Ressourcentyp, nachdem sie importiert wurde.

Eine Vorlage kann andere Vorlagen verwenden und Deployment Manager expandiert Vorlagen rekursiv, wenn sie in einer Konfiguration verwendet werden, sodass das Endresultat nach der Expansion der Vorlagen so ist, als hätten Sie die Konfiguration ohne Vorlagen geschrieben. Beispielsweise könnte eine Konfiguration mit Vorlagen so aussehen:

imports:
- path: vm-template.jinja

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

Nachdem Deployment Manager die Vorlagen expandiert, sieht die volle Konfiguration, ohne zusätzliche Arbeit für Sie, so aus:

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

Als nächstes erstellen Sie eine Vorlage aus dem Inhalt der Konfiguration, die Sie in Schritt 2 (Konfiguration erstellen) erstellt haben. Dann importieren und verwenden Sie die Vorlage in Ihrer Konfiguration, um eine neue Bereitstellung zu erstellen.

Am Ende enthält Ihre neue Bereitstellung die gleichen Ressourcen wie Ihre erste Bereitstellung, aber die Konfigurationsdatei ist deutlich einfacher.

Jinja2- oder Python-Vorlagen schreiben

Sie können Vorlagen wahlweise in Python oder Jinja2 schreiben. Python-Vorlagen sind leistungsstark und geben Ihnen die Möglichkeit, Vorlagen programmatisch zu erstellen und zu verwalten. Wenn Sie mit Python vertraut sind, verwenden Sie Python für Ihre Vorlagen.

Jinja2 ist eine einfachere, aber weniger leistungsstarke Programmiersprache für Vorlagen, die die gleiche Syntax wie YAML verwendet. Wenn Sie nicht mit Python vertraut sind oder nur einfache Vorlagen schreiben wollen, ohne sich mit Python auseinanderzusetzen, verwenden Sie Jinja2. Im Übrigen behandelt diese Anleitung Beispiele sowohl für Jinja als auch für Python.

Python-Vorlagen

Wenn Sie sich dazu entscheiden, Vorlagen in Python zu schreiben, gibt es zwei Voraussetzungen für Python-Vorlagen:

  • Die Vorlage muss eine Methode mit dem Namen GenerateConfig() oder generate_config() definieren. Wenn Sie beide Methodennamen in der gleichen Vorlage verwenden, hat die Methode generate_config() Vorrang.

  • Diese Methode muss eine gültige YAML-Konfiguration zurückgeben.

Ansonsten können Sie den Inhalt Ihrer Vorlage selbst bestimmen. Beispiele für die Methoden, mit denen Sie eine Python-Vorlage schreiben können, finden Sie unter Grundlegende Vorlage erstellen.

Erste Vorlage erstellen

Erstellen Sie eine Kopie der Ressourcendefinition, die Sie in Schritt 4 (Referenzen verwenden) erstellt haben, in einer neuen Datei namens vm-template.[jinja|py]. Wählen Sie die passende Dateiendung für Jinja- oder Python-Vorlagen. Denken Sie daran, [MY_PROJECT] durch Ihre eigene Projekt-ID zu ersetzen:

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}

Eine zweite Vorlage erstellen

Erstellen Sie eine Datei mit dem Namen vm-template-2.[jinja|py] und fügen Sie die folgenden Inhalte hinzu. Denken Sie daran, [MY_PROJECT] durch Ihre eigene Projekt-ID zu ersetzen:

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}

Ihre Vorlagen importieren

Rufen Sie nochmal Ihre Vorlage, two-vms.yaml, auf. Importieren Sie am Anfang Ihrer Datei Ihre Vorlage, indem Sie den String imports gefolgt von dem relativen Pfad zur Vorlagendatei hinzufügen. Ersetzen Sie dann die Eigenschaften Ihrer Ressourcen durch den Namen der Vorlage.

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

Namen für Ressourcen

Wenn Sie eine Vorlage verwenden, werden die Namen Ihrer Ressourcen nicht mit dem Namen in der Konfigurationsdatei definiert, sondern mit dem Feld name in der Vorlage.

In diesem Fall werden die VM-Instanzen beispielsweise mit den Namen in den von Ihnen definierten Vorlagen erstellt, “the-first-vm” und “the-second-vm”. Die Werte "vm-1" und "vm-2", die in der Konfiguration definiert sind, werden verwendet, um einer Instantiierung der Vorlage einen Namen zu geben. Sie sind keine Namen für Ressourcen, es sei denn Sie entscheiden sich dazu, Umgebungsvariablen zu verwenden, um zwei gleiche Namen festzulegen.

Ihre Konfiguration speichern und bereitstellen!

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

Ihre Bereitstellung anzeigen lassen

gcloud deployment-manager deployments describe deployment-with-templates

Sie können das Manifest der Bereitstellung verwenden, um die ursprüngliche Konfiguration mit den Vorlagen und der expandierten Konfiguration mit den Inhalten der Vorlagen zu sehen. Denken Sie daran, dass Sie ein Manifest abrufen, indem Sie den Wert manifest-TIMESTAMP aus der obigen Ausgabe abrufen und ihn dann in dem folgenden Befehl angeben:

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

Sehr gut. Sie haben eine Bereitstellung mithilfe einer Vorlage erstellt. Sehen Sie sich als nächstes an, wie Sie Konfigurationen mit Ihren Vorlagen erstellen, die andere Vorlagen aufrufen.

Ihre 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 das Löschen dieser Bereitstellung werden alle Ressourcen in dieser Bereitstellung ebenfalls gelöscht. Wenn Sie die Bereitstellung nicht löschen, können Probleme mit späteren Beispielen auftreten.

So löschen Sie diese Bereitstellung:

gcloud deployment-manager deployments delete deployment-with-templates

Nächster Schritt: Mehrere Vorlagen verwenden

Verwandte Themen

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

Feedback geben zu...

Cloud Deployment Manager-Dokumentation