Utilizzo di riferimenti

Quando definisci le proprietà per la configurazione o i modelli, puoi utilizzare references 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, invece di 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:

  • Proprietà di accesso che non sono definite fino alla creazione della risorsa. Ad esempio, quando definisci una macchina virtuale nella tua 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.

  • Semplifica la lettura delle configurazioni o dei modelli e la risoluzione dei problemi. Ad esempio, se devi configurare più regole di forwarding, devi specificare anche 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 di configurazione, il riferimento semplifica l'individuazione della rete utilizzata nella regola di forwarding.

Quando crei un riferimento a una risorsa, viene creata anche una dipendenza tra le risorse. Ad esempio, considera il seguente snippet, dove sandbox-vm usa 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 del giorno sandbox-vm, in modo che il riferimento possa essere risolto. Se i riferimenti non si risolvono correttamente, il deployment non va a buon fine.

Puoi utilizzare i riferimenti sia nelle configurazioni che nei modelli.

Prima di iniziare

Riferimenti nei file di configurazione

Dichiara i riferimenti nella tua configurazione nel formato seguente:

$(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 si risolve in selfLink della risorsa di rete.

Creazione di riferimenti nei modelli

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

$(ref.RESOURCE_NAME.PROPERTY)

Puoi combinare i riferimenti con altre caratteristiche, come le proprietà del modello 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 dei riferimenti nei modelli:

Jinja

  • Riferimento che include una variabile di ambiente

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

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

    network: $(ref.{{ properties["network"] }}.selfLink)
    
  • Riferimento utilizzando 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 una matrice

    'subnetwork': '$(ref.' + context.env['deployment'] + '-vm.networkInterfaces[2].subnetwork)'
    
  • Riferimento che include una proprietà 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