Usar referencias

Cuando defines las propiedades para la configuración o las plantillas, puedes usar referencias a las propiedades de otros recursos en lugar de proporcionar valores de manera directa. Por ejemplo, si deseas crear un administrador de grupos de instancias que utilice una plantilla de instancias de la misma implementación, en lugar de escribir explícitamente el vínculo completo para la plantilla de instancias, puedes utilizar una referencia con la sintaxis $(ref.instance-template.selfLink).

Con referencias, puedes:

  • Acceder a propiedades que no se definen hasta que se crea el recurso. Por ejemplo, cuando defines una máquina virtual en la configuración, aún no conoces su dirección IP. Sin embargo, todavía puedes utilizar una referencia a la dirección IP. Cuando implementas la configuración, primero se crea la VM, y Deployment Manager obtiene la dirección IP externa cuando está disponible.

  • Haz que la lectura y la solución de problemas de las configuraciones o las plantillas sean más fáciles. Por ejemplo, si necesitas configurar varias reglas de reenvío, también debes especificar la red que se utilizará. En lugar de proporcionar un vínculo a la red para cada regla de reenvío, puedes crear una referencia a la propiedad selfLink de la red mediante la siguiente sintaxis:

    $(ref.network-name.selfLink)

    Si necesitas solucionar problemas de configuración, la referencia permite saber con mayor facilidad qué red se está utilizando en la regla de reenvío.

Cuando creas una referencia a un recurso, también creas una dependencia entre recursos. Por ejemplo, considera el siguiente fragmento, donde sandbox-vm utiliza una referencia a network-a:

resources:
- name: sandbox-vm
  type: compute.v1.instance
  properties:
    network: $(ref.network-a.selfLink)
    ...
...
- name: network-a
  type: compute.v1.network
  properties:
    ...

Cuando implementas esta configuración, Deployment Manager crea network-a antes de que sandbox-vm, a fin de que se pueda resolver la referencia. Si las referencias no se resuelven de manera correcta, se produce un error en la implementación.

Puedes utilizar referencias en configuraciones y plantillas.

Antes de comenzar

Establecer referencias en los archivos de configuración

Anuncia las referencias en la configuración con el uso del siguiente formato:

$(ref.RESOURCE_NAME.PROPERTY)

En el siguiente ejemplo se crea una red y, a continuación, se crean dos instancias que utilizan referencias a la red recién creada. En este ejemplo, la referencia es:

$(ref.my-network.selfLink)
# Copyright 2016 Google Inc. All rights reserved.#NOTYPO
#
# 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-9
    networkInterfaces:
    - network: $(ref.a-new-network.selfLink)
      accessConfigs:
      - name: External NAT
        type: ONE_TO_ONE_NAT
- 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-9
    networkInterfaces:
    - network: $(ref.a-new-network.selfLink)
      accessConfigs:
      - name: External NAT
        type: ONE_TO_ONE_NAT
- name: a-new-network
  type: compute.v1.network
  properties:
    IPv4Range: 10.0.0.0/16

Cuando implementas esta configuración, la red se crea antes de las dos instancias, y la referencia se resuelve en selfLink del recurso de red.

Establecer referencias en las plantillas

En los archivos de plantilla, toda la referencia debe ir precedida por $ y, a continuación, debe estar dentro de un conjunto de paréntesis:

$(ref.RESOURCE_NAME.PROPERTY)

Puedes combinar referencias con otras características como propiedades de plantilla y variables del entorno. A fin de garantizar que Deployment Manager analice la referencia de manera correcta, es importante recordar que se debe mantener toda la string de referencia dentro del paréntesis.

Estos son algunos ejemplos sobre el anuncio de referencias en las plantillas:

Jinja

  • Referencia que incluye una variable del entorno

    network: $(ref.{{ env["deployment"] }}-network.selfLink)
  • Referencia a un valor en un arreglo

    subnetwork: $(ref.{{ env["deployment"] }}-vm.networkInterfaces[2].subnetwork)
  • Referencia que incluye una propiedad de una plantilla

    network: $(ref.{{ properties["network"] }}.selfLink)
  • Referencia con el uso de un parámetro de Jinja

    network: $(ref.{{ NETWORK_NAME }}.selfLink)
  • Referencia en salidas

    outputs:

    • name: UrlToService value: http://$(ref.{{ env["deployment"] }}-network.networkInterfaces[0].accessConfigs[0].natIp):8080/

Python

  • Referencia que incluye una variable del entorno

    'network': '$(ref.' + context.env['deployment'] + '-network.selfLink)',
  • Referencia a un valor en un arreglo

    'subnetwork': '$(ref.' + context.env['deployment'] + '-vm.networkInterfaces[2].subnetwork)'
  • Referencia que incluye una propiedad de una plantilla

    'network': '$(ref.' + context.properties['network'] + '.selfLink)',
  • Referencia con el uso de un parámetro de Python

    'value': '$(ref.' + base_name + '.networkInterfaces[0].networkIP)'
  • Referencia en salidas

    outputs = [{'name': 'UrlToService',
                'value': '$(ref.' + context.env['deployment'] + '-network.networkInterfaces[0].accessConfigs[0].natIP):8080'}]

Pasos siguientes

¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...

Cloud Deployment Manager Documentation