Utilizzo di riferimenti

Quando definisci le proprietà per la configurazione o i modelli, puoi utilizzare riferenze 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é la risorsa non viene creata. Ad esempio, quando definisci una macchina virtuale nella configurazione, non ne conosci ancora l'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 e la risoluzione dei problemi delle configurazioni o dei 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 consente di identificare più facilmente la rete utilizzata nella regola di forwarding.

Quando crei un riferimento a una risorsa, crei anche una dipendenza tra le risorse. Ad esempio, considera lo snippet seguente, 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 i riferimenti non vengono risolti correttamente, il deployment non va a buon fine.

Puoi utilizzare i riferimenti sia nelle configurazioni sia nei modelli.

Prima di iniziare

Fare riferimenti nei file di configurazione

Dichiara i riferimenti nella configurazione utilizzando il seguente formato:

$(ref.RESOURCE_NAME.PROPERTY)

L'esempio seguente crea una rete e poi due istanza che utilizzano i 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 istanza e il riferimento viene risolto in selfLink della risorsa di rete.

Fare riferimenti nei modelli

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

$(ref.RESOURCE_NAME.PROPERTY)

Puoi combinare i riferimenti con altre funzionalità, 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.

Ecco 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 un array

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

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

    network: $(ref.{{ NETWORK_NAME }}.selfLink)
    
  • Riferimento in outputs

      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à modello

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

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

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

Passaggi successivi