Usar referencias

Cuando defina las propiedades de su configuración o plantillas, puede usar referencias a las propiedades de otros recursos en lugar de proporcionar valores directamente. Por ejemplo, si quieres crear un gestor de grupos de instancias que use una plantilla de instancia de la misma implementación, en lugar de escribir explícitamente el enlace completo de la plantilla de instancia, puedes usar una referencia con la sintaxis $(ref.instance-template.selfLink).

Con las referencias, puedes hacer lo siguiente:

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

  • Facilita la lectura y la resolución de problemas de tus configuraciones o plantillas. Por ejemplo, si necesitas configurar varias reglas de reenvío, también debes especificar una red que se vaya a usar. En lugar de proporcionar un enlace a la red para cada regla de reenvío, puede crear una referencia a la propiedad selfLink de la red con la siguiente sintaxis:

    $(ref.network-name.selfLink)
    

    Si necesitas solucionar problemas con tu configuración, la referencia te ayudará a saber qué red se está usando 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, en el que sandbox-vm usa 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 despliegues esta configuración, Deployment Manager creará network-a antes de sandbox-vm para que se pueda resolver la referencia. Si alguna referencia no se resuelve correctamente, la implementación fallará.

Puedes usar referencias tanto en configuraciones como en plantillas.

Antes de empezar

Crear referencias en archivos de configuración

Declara las referencias en tu configuración con el siguiente formato:

$(ref.RESOURCE_NAME.PROPERTY)

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

$(ref.a-new-network.selfLink)
# 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-11
    networkInterfaces:
    # The resource's "network value" has been replaced with a
    # reference to the new network's "selfLink" property. The network 
    # resource has been added to the end of this file.
    - 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-11
    networkInterfaces:
    # As in the resource above, the "network" value has been replaced with 
    # the new network's "selfLink" property. 
    - network: $(ref.a-new-network.selfLink)
      accessConfigs:
      - name: External NAT
        type: ONE_TO_ONE_NAT
# The following network is a new resource added to the "two-vms.yaml" file.
- name: a-new-network
  type: compute.v1.network
  properties:
    routingConfig:
      routingMode: REGIONAL
    autoCreateSubnetworks: true

Cuando despliegues esta configuración, la red se creará antes que las dos instancias y la referencia se resolverá en el selfLink del recurso de red.

Hacer referencias en plantillas

En los archivos de plantilla, toda la referencia debe ir precedida de un $ y, a continuación, incluirse entre paréntesis:

$(ref.RESOURCE_NAME.PROPERTY)

Puedes combinar referencias con otras funciones, como propiedades de plantilla y variables de entorno. Para asegurarse de que Deployment Manager analiza la referencia correctamente, es importante recordar que debe mantener toda la cadena de referencia entre paréntesis.

Estos son algunos ejemplos de cómo declarar referencias en tus plantillas:

Jinja

  • Referencia que incluye una variable de entorno

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

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

    network: $(ref.{{ properties["network"] }}.selfLink)
    
  • Referencia mediante 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 de entorno

    'network': '$(ref.' + context.env['deployment'] + '-network.selfLink)'
    
  • Referencia a un valor de una matriz

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

    'network': '$(ref.' + context.properties['network'] + '.selfLink)'
    
  • Referencia mediante 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'}]
    

Siguientes pasos