Utilizzo di riferimenti

Quando definisci le proprietà per la configurazione o i modelli, puoi utilizzare i 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 template di istanza dello stesso deployment, anziché digitare esplicitamente il link completo per il template di istanza, puoi utilizzare un riferimento con la sintassi $(ref.instance-template.selfLink).

Con i riferimenti puoi:

  • Accedere alle proprietà che non vengono definite fino alla creazione della 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 recupera l'indirizzo IP esterno quando è disponibile.

  • Rendere le configurazioni o i modelli più facili da leggere e risolvere. Ad esempio, se devi configurare più regole di forwarding, devi anche specificare una rete da utilizzare. Anziché 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 della configurazione, il riferimento semplifica l'individuazione della rete utilizzata nella regola di forwarding.

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 alcuni riferimenti non vengono risolti correttamente, il deployment non riesce.

Puoi utilizzare i riferimenti sia nelle configurazioni sia 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 dei modelli, l'intero riferimento deve essere preceduto da un simbolo $ e racchiuso tra 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.

Di seguito sono riportati 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 che utilizza 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 che utilizza 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