Informationen durch Ausgaben bereitstellen

Wenn Sie eine Bereitstellung erstellen, möchten Sie möglicherweise die wichtigsten Eigenschaften Ihrer Konfigurationen oder Vorlagen für andere Vorlagen oder Nutzer zugänglich machen. Angenommen, Sie möchten die IP-Adresse einer Datenbank, die in einer Vorlage erstellt wurde, bereitstellen, sodass Nutzer einfach auf die IP verweisen können, wenn sie ihre eigenen Vorlagen erstellen.

Sie können den Abschnitt Ausgabe in Ihrer Vorlage oder Konfiguration verwenden, um eine Liste von Schlüssel/Wert-Paaren zu definieren, die Nutzer aufrufen können. Im Abschnitt "Ausgabe" definieren Sie beliebige Schlüssel und legen den Wert der Schlüssel auf eine Referenz, ein Vorlagenattribut oder eine Umgebungsvariable fest. Nutzer können die Ausgaben dann dazu verwenden, auf die Schlüsselinformationen zu den Ressourcen zuzugreifen, die von der Vorlage erstellt wurden. Beispiel: Sie können eine Ausgabe namens databaseIP deklarieren, die auf die IP-Adresse einer Instanz verweist, die eine Datenbank hostet. Die Nutzer können dann in anderen Vorlagen derselben Bereitstellung auf diese Ausgabe verweisen.

Vorbereitung

Beispiel

Hier eine Beispielvorlage mit Ausgaben:

mongodb.jinja
{% set MASTER = env["name"] + "-" + env["deployment"] + "-mongodb" %}
resources:
- name: {{ MASTER }}
  type: instance
  ...
outputs:
- name: databaseIp
  value: $(ref.{{ MASTER }}.network[0].ip)  # Treated as a string during expansion
- name: databasePort
  value: 88

Der Bereich "Ausgaben" bestimmt zwei Eigenschaften: databaseIp und databasePort. databaseIp nutzt einen Verweis, der auf die Netzwerk-IP-Adresse der Master-Ressource aufgelöst wird, während databasePort ein statischer Wert ist. In einer weiteren Vorlage können Sie mongodb.jinja importieren, die Vorlage als Typ verwenden und die Ausgaben aufrufen. Beispiel:

imports:
- path: example/path/to/mongodb.jinja
  name: mongodb.jinja

resources:
- name: my_mongo
  type: mongodb.jinja
  properties:
    size: 100

- name: my_instance
  type: compute.v1.instance
  properties:
    …
    databaseIp: $(ref.my_mongo.databaseIp)
    databasePort: $(ref.my_mongo.port)

Ausgabe deklarieren

Sie können eine Ausgabe entweder in einer Vorlage oder einer Konfiguration deklarieren, indem Sie einen Bereich outputs: auf der Ebene des Bereichs resources: definieren. Ausgabe-Schlüssel müssen innerhalb der Vorlage oder Konfiguration eindeutig sein.

Ein beispielhafter Bereich outputs: könnte so aussehen:

...
outputs:
- name: databaseIp
  value: $(ref.my-first-vm.networkInterfaces[0].accessConfigs[0].natIp)
- name: machineType
  value: {{ properties['machineType'] }}
- name: databasePort
  value: 88

So könnten die Ausgaben in einer vollständigen Vorlage aussehen:

{#
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: my-first-vm
  type: compute.v1.instance
  properties:
    zone: us-central1-a
    machineType: zones/us-central1-a/machineTypes/{{ properties['machineType'] }}
    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

# Declare outputs here
outputs:
- name: databaseIp
  value: $(ref.my-first-vm.networkInterfaces[0].accessConfigs[0].natIP)
- name: machineType
  value: {{ properties['machineType'] }}
- name: databasePort
  value: 88

Mögliche Ausgabewerte sind:

Ausgaben von Vorlagen verwenden

Wenn Sie eine Ausgabe verwenden möchten, die in einer Vorlage definiert wurde, importieren und verwenden Sie die Vorlage, die diese Ausgabe als Typ enthält. Beispiel: Damit Sie die in einer Vorlage namens template_with_outputs.jinja definierten Ausgaben verwenden können, importieren Sie die Vorlage und erstellen damit eine Ressource.

# 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: template_with_outputs.jinja
  name: template.jinja

resources:
- name: my-first-vm
  type: template.jinja
  properties:
    machineType: n1-standard-1

outputs:
- name: databaseIp
  value: $(ref.my-first-vm.databaseIp)
- name: machineType
  value: $(ref.my-first-vm.machineType)
- name: databasePort
  value: $(ref.my-first-vm.databasePort)

Verwenden Sie das folgende Format, um eine Ausgabe aufzurufen:

$(ref.RESOURCE.OUTPUT)
  • RESOURCE ist der Name der Ressource, die von der Vorlage erstellt wurde. Im Beispiel oben ist dies my-first-vm.

  • OUTPUT ist die in der Vorlage angegebene Ausgabe. Im Beispiel oben wäre das databaseIp und databasePort. Dies ist die gleiche Syntax, mit der Sie Referenzen deklarieren. Sie können auch Listenelemente referenzieren, zum Beispiel: $ref.template.property[0].

Wenn Sie die Konfiguration bereitstellen, wird in Deployment Manager die gesamte Konfiguration eingeblendet. Anschließend werden die Referenzen auf Ausgaben durch die Ausgabewerte ersetzt.

Ausgaben in Schemas beschreiben

Für Vorlagen, die begleitende Schemas haben, können Sie Ausgabeeigenschaften detaillierter angeben. Deployment Manager verschafft sich keine Informationen in dem Bereich "Ausgaben" und validiert diese nicht, kann aber dabei helfen, dass dieser Bereich mehr Informationen über relevante Ausgaben liefert, damit Nutzer Ihre Vorlagen besser verwenden können.

Geben Sie in Ihrer Schemadatei einen Bereich "Ausgaben" an, der zur Ausgabe in Ihrer Vorlage passt. Beispiel:

...
outputs:
  properties:
  - databaseIp:
    description: Reference to ip address of your new cluster
    type: string
  - databasePort:
    description: Port to talk on
    type: integer

Nutzer können auf Ihre Schemadatei verweisen, um die Nutzung und den Typ der Ausgaben zu verstehen.

Endgültige Ausgabewerte anzeigen

Nachdem Sie Ihre Vorlagen, die Ausgaben verwenden, bereitstellen, sehen Sie sich die endgültigen Ausgabewerte an, indem Sie sich das Konfigurationslayout der Bereitstellung anzeigen lassen. Die endgültigen Ausgabewerte sind an der Eigenschaft finalValue erkennbar. Alle Ausgabewerte sind in diesem Feld enthalten, einschließlich den Ausgabewerten von übernommenen Vorlagen. Beispiel:

layout: |
  resources:
  - name: vm_template
    outputs:
    - finalValue: 104.197.69.69
      name: databaseIp
      value: $(ref.vm-test.networkInterfaces[0].accessConfigs[0].natIP)
    properties:
      zone: us-central1-a
    resources:
    - name: datadisk-example-instance
      type: compute.v1.disk
    - name: vm-test
      type: compute.v1.instance
    type: vm_template.jinja
name: manifest-1455057116997

Zirkuläre Abhängigkeiten vermeiden

Seien Sie sorgfältig, wenn Sie Vorlagen erstellen, bei denen zwei oder mehr Ressourcen gegenseitig von Ausgaben abhängig sind. Deployment Manager verhindert diese Struktur nicht, aber wenn die Ausgaben eine zirkuläre Abhängigkeit verursachen, wird die Bereitstellung nicht erfolgreich implementiert. Beispielsweise wird der folgende Auszug von Deployment Manager akzeptiert, aber wenn die Inhalte der Vorlagen zirkuläre Abhängigkeiten verursachen, würde die Bereitstellung fehlschlagen:

resources:
- name: frontend
  type: frontend.jinja
  properties:
    ip: $(ref.backend.ip)
- name: backend
  type: backend.jinja
  properties:
    ip: $(ref.frontend.ip)

Als Beispiel einer zirkulären Abhängigkeit, bei der die Bereitstellung fehlschlägt, nehmen wir an, dass sowohl frontend.jinja und backend.jinja so aussehen:

resources:
- name: {{ env['name'] }}
  type: compute.v1.instance
  properties:
    zone: us-central1-f
    ...
    networkInterfaces:
    - network: global/networks/default
      accessConfigs:
      - name: External NAT
        type: ONE_TO_ONE_NAT
    metadata:
      items:
      - key: startup-script
        value: |
          #!/bin/bash
          export IP={{ properties["ip"] }}
      ...

outputs:
- name: ip
  value: $(ref.{{ env['name'] }}.networkInterfaces[0]accessConfigs[0].natIP)

Denken Sie daran, dass beide Ressourcen die IP-Ausgabe-Eigenschaft der entgegengesetzten Ressource verwendet haben:

resources:
- name: frontend
  type: frontend.jinja
  properties:
    ip: $(ref.backend.ip)
- name: backend
  type: backend.jinja
  properties:
    ip: $(ref.frontend.ip)

Aber es können keine IP-Werte eingestellt werden, da beide Eigenschaften auf die Existenz der anderen Ressource angewiesen sind und eine zirkuläre Abhängigkeit erzeugen. Hier ist die gleiche vollständig expandierte Vorlage:

resources:
- name: frontend
  type: compute.v1.instance
  properties:
    zone: us-central1-f
    ...
    networkInterfaces:
    - network: global/networks/default
      accessConfigs:
      - name: External NAT
        type: ONE_TO_ONE_NAT
    metadata:
      items:
      - key: startup-script
        value: |
          #!/bin/bash
          export IP=$(ref.backend.networkInterfaces[0]accessConfigs[0].natIp)
- name: backend
  type: compute.v1.instance
  properties:
    zone: us-central1-f
    ...
    networkInterfaces:
    - network: global/networks/default
      accessConfigs:
      - name: External NAT
        type: ONE_TO_ONE_NAT
    metadata:
      items:
      - key: startup-script
        value: |
          #!/bin/bash
          export IP=$(ref.frontend.networkInterfaces[0]accessConfigs[0].natIp)

Deployment Manager gibt einen Fehler zurück, wenn Sie versuchen, die Konfiguration auszuführen:

 code: u'CONDITION_NOT_MET'
 message: u'A dependency cycle was found amongst backend, frontend.'>]>

Die Vorlage würde jedoch funktionieren, wenn:

  1. frontend.jinja zwei VM-Instanzen, vm-1 and vm-2, erstellen würde.
  2. backend.jinja vm-3 and vm-4 erstellen würde.
  3. vm-1 ihre externe IP als Ausgabe freigibt und vm-4 diese Ausgabe verwendet.
  4. vm-3 eine externe IP als Ausgabe freigibt und vm-2 diese Ausgabe verwendet.

Weitere Informationen

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

Feedback geben zu...

Cloud Deployment Manager-Dokumentation