Utiliser des références

Lorsque vous définissez les propriétés de votre configuration ou de vos modèles, vous pouvez utiliser des références aux propriétés d'autres ressources au lieu de fournir directement des valeurs. Par exemple, si vous souhaitez créer un gestionnaire de groupe d'instances utilisant un modèle d'instance du même déploiement, vous pouvez utiliser une référence avec la syntaxe $(ref.instance-template.selfLink) au lieu de saisir explicitement le lien complet d'accès au modèle d'instance.

Les références vous permettent d'effectuer les actions suivantes :

  • Accéder aux propriétés non définies jusqu'à la création de la ressource. Par exemple, lorsque vous définissez une machine virtuelle dans votre configuration, vous ne connaissez pas encore son adresse IP. Vous pouvez cependant utiliser une référence à cette adresse IP. Lorsque vous déployez votre configuration, la VM est d'abord créée, puis Deployment Manager obtient l'adresse IP externe lorsque celle-ci est disponible.

  • Rendre vos configurations ou vos modèles plus faciles à lire et à dépanner. Par exemple, si vous devez configurer plusieurs règles de transfert, vous devez également spécifier un réseau à utiliser. Au lieu de fournir un lien d'accès au réseau pour chaque règle de transfert, vous pouvez créer une référence à la propriété selfLink du réseau en utilisant la syntaxe suivante :

    $(ref.network-name.selfLink)
    

    Si vous devez résoudre des problèmes de configuration, la référence permet d'identifier facilement le réseau utilisé dans la règle de transfert.

Lorsque vous créez une référence à une ressource, vous créez également une dépendance entre les ressources. Par exemple, considérons l'extrait suivant, où sandbox-vm utilise une référence à network-a :

resources:
- name: sandbox-vm
  type: compute.v1.instance
  properties:
    network: $(ref.network-a.selfLink)
    ...
...
- name: network-a
  type: compute.v1.network
  properties:
    ...

Lorsque vous déployez cette configuration, Deployment Manager crée network-a avant sandbox-vm afin que la référence puisse être résolue. Si des références ne sont pas correctement résolues, le déploiement échoue.

Vous pouvez utiliser des références dans les configurations et les modèles.

Avant de commencer

Ajouter des références dans les fichiers de configuration

Vous pouvez ajouter des références dans les fichiers de configuration à l'aide du format suivant :

$(ref.RESOURCE_NAME.PROPERTY)

L'exemple ci-dessous crée un réseau, puis deux instances qui utilisent des références au nouveau réseau. Dans cet exemple, la référence est :

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

Lorsque vous déployez cette configuration, le réseau est créé avant les deux instances, et la référence renvoie au selfLink de la ressource réseau.

Ajouter des références dans les modèles

Dans les fichiers de modèle, l'ensemble de la référence doit être précédé du symbole $ et être mis entre parenthèses :

$(ref.RESOURCE_NAME.PROPERTY)

Vous pouvez combiner des références avec d'autres fonctionnalités telles que des propriétés de modèle et des variables d'environnement. Pour vous assurer que Deployment Manager analyse correctement la référence, il est important de garder votre chaîne de référence dans son intégralité entre parenthèses.

Voici quelques exemples de déclaration de références dans des modèles :

Jinja

  • Référence qui inclut une variable d'environnement

    network: $(ref.{{ env["deployment"] }}-network.selfLink)
    
  • Référence à une valeur dans un tableau

    subnetwork: $(ref.{{ env["deployment"] }}-vm.networkInterfaces[2].subnetwork)
    
  • Référence qui inclut une propriété de modèle

    network: $(ref.{{ properties["network"] }}.selfLink)
    
  • Référence utilisant un paramètre Jinja

    network: $(ref.{{ NETWORK_NAME }}.selfLink)
    
  • Référence en sortie

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

Python

  • Référence qui inclut une variable d'environnement

    'network': '$(ref.' + context.env['deployment'] + '-network.selfLink)'
    
  • Référence à une valeur dans un tableau

    'subnetwork': '$(ref.' + context.env['deployment'] + '-vm.networkInterfaces[2].subnetwork)'
    
  • Référence qui inclut une propriété de modèle

    'network': '$(ref.' + context.properties['network'] + '.selfLink)'
    
  • Référence utilisant un paramètre Python

    'value': '$(ref.' + base_name + '.networkInterfaces[0].networkIP)'
    
  • Référence en sortie

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

Étape suivante