Usa referencias

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

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 usar 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 usará. 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 con la siguiente sintaxis:

    $(ref.network-name.selfLink)
    

    Si necesitas solucionar problemas de configuración, la referencia permite saber con mayor facilidad qué red se usa 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 implementas esta configuración, Deployment Manager crea network-a antes de sandbox-vm para que la referencia pueda resolverse. 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.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 implementas esta configuración, la red se crea antes de las dos instancias y la referencia se resuelve en el 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 de entorno. Para asegurarte de que Deployment Manager analiza la referencia de manera correcta, es importante recordar mantener toda la string de referencia entre 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'}]
    

¿Qué sigue?