Utilizzo di riferimenti

Quando definisci le proprietà per la configurazione o i modelli, puoi utilizzare riferimenti alle proprietà di altre risorse anziché fornire direttamente i valori. Ad esempio, se vuoi creare un gestore di gruppi di istanze che utilizza un modello di istanza dello stesso deployment, anziché digitare esplicitamente il link completo per il modello di istanza, puoi utilizzare un riferimento con la sintassi $(ref.instance-template.selfLink).

Con i riferimenti puoi:

  • Accedi alle proprietà che non sono definite finché non viene creata la risorsa. Ad esempio, quando definisci una macchina virtuale nella configurazione, non conosci ancora il suo indirizzo IP. Tuttavia, puoi comunque utilizzare un riferimento all'indirizzo IP. Quando esegui il deployment della configurazione, viene creata prima la VM e Deployment Manager ottiene l'indirizzo IP esterno quando è disponibile.

  • Rendi più facili da leggere e risolvere i problemi relativi a configurazioni o modelli. Ad esempio, se devi configurare più regole di inoltro, devi anche specificare una rete da utilizzare. Invece di fornire un link alla rete per ogni regola di forwarding, puoi creare un riferimento alla proprietà selfLink della rete utilizzando la seguente sintassi:

    $(ref.network-name.selfLink)
    

    Se devi risolvere i problemi di configurazione, il riferimento semplifica l'identificazione della rete utilizzata nellaregola di forwardingo.

Quando crei un riferimento a una risorsa, crei anche una dipendenza tra le risorse. Ad esempio, considera il seguente snippet, in cui sandbox-vm utilizza un riferimento 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:
    ...

Quando esegui il deployment di questa configurazione, Deployment Manager crea network-a prima di sandbox-vm, in modo che il riferimento possa essere risolto. Se uno dei riferimenti non viene risolto correttamente, il deployment non va a buon fine.

Puoi utilizzare i riferimenti sia nelle configurazioni che nei modelli.

Prima di iniziare

Creare riferimenti nei file di configurazione

Dichiara i riferimenti nella configurazione utilizzando il seguente formato:

$(ref.RESOURCE_NAME.PROPERTY)

L'esempio seguente crea una rete, quindi crea due istanze che utilizzano riferimenti alla rete appena creata. In questo esempio, il riferimento è:

$(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

Quando esegui il deployment di questa configurazione, la rete viene creata prima delle due istanze e il riferimento viene risolto in selfLink della risorsa di rete.

Creare riferimenti nei modelli

Nei file modello, l'intero riferimento deve essere preceduto da $ e poi contenuto all'interno di una serie di parentesi:

$(ref.RESOURCE_NAME.PROPERTY)

Puoi combinare i riferimenti con altre funzionalità come le proprietà dei modelli e le variabili di ambiente. Per assicurarti che Deployment Manager analizzi correttamente il riferimento, è importante ricordare di mantenere l'intera stringa di riferimento tra parentesi.

Ecco alcuni esempi di dichiarazione di riferimenti nei modelli:

Jinja

  • Riferimento che include una variabile di ambiente

    network: $(ref.{{ env["deployment"] }}-network.selfLink)
    
  • Riferimento a un valore in un array

    subnetwork: $(ref.{{ env["deployment"] }}-vm.networkInterfaces[2].subnetwork)
    
  • Riferimento che include una proprietà del modello

    network: $(ref.{{ properties["network"] }}.selfLink)
    
  • Riferimento tramite un parametro Jinja

    network: $(ref.{{ NETWORK_NAME }}.selfLink)
    
  • Riferimento negli output

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

Python

  • Riferimento che include una variabile di ambiente

    'network': '$(ref.' + context.env['deployment'] + '-network.selfLink)'
    
  • Riferimento a un valore in un array

    'subnetwork': '$(ref.' + context.env['deployment'] + '-vm.networkInterfaces[2].subnetwork)'
    
  • Riferimento che include una proprietà del modello

    'network': '$(ref.' + context.properties['network'] + '.selfLink)'
    
  • Riferimento utilizzando un parametro Python

    'value': '$(ref.' + base_name + '.networkInterfaces[0].networkIP)'
    
  • Riferimento negli output

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

Passaggi successivi