Définir des propriétés de modèle et utiliser des variables d'environnement

Les modèles permettent également l'utilisation de propriétés de modèles personnalisées et de variables d'environnement prédéfinies afin que vous puissiez les réutiliser dans plusieurs zones, régions ou même projets.

Par exemple, vous pouvez définir une propriété de modèle arbitraire plutôt que de coder en dur une valeur de zone spécifique dans votre modèle. Chaque fois que vous utilisez le modèle, vous devez l'inclure et fournir une valeur pour la zone dans la configuration de premier niveau.

Définissez une propriété de modèle arbitraire en ajoutant cette syntaxe à vos modèles :

Jinja

{{ properties["property-name"] }}

Python

context.properties["property-name"]

Par exemple, le modèle ci-dessous définit les propriétés suivantes : zone, machineType et network :

Jinja

resources:
- name: 'example'
  type: compute.v1.instance
  properties:
    zone: {{ properties["zone"] }}
    machineType: https://www.googleapis.com/compute/v1/projects/my-project/zones/{{ properties["zone"] }}/machineTypes/{{ properties["machineType"] }}
    disks:
    - deviceName: boot
      type: PERSISTENT
      boot: true
      autoDelete: true
      initializeParams:
        sourceImage: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/family/debian-8
    networkInterfaces:
    - network: $(ref.{{ properties["network"] }}.selfLink)
      accessConfigs:
      - name: External NAT
        type: ONE_TO_ONE_NAT

Python

"""Creates the virtual machine."""

def GenerateConfig(context):
  """Creates the virtual machine with environment variables."""

  resources = [{
      'name': 'example',
      'type': 'compute.v1.instance',
      'properties': {
          'zone': context.properties['zone'],
          'machineType': ''.join(['https://www.googleapis.com/compute/v1/',
                                  'projects/my-project/zones/',
                                  context.properties['zone'], '/machineTypes/',
                                  context.properties['machineType']]),
          'disks': [{
              'deviceName': 'boot',
              'type': 'PERSISTENT',
              'boot': True,
              'autoDelete': True,
              'initializeParams': {
                  'sourceImage': ''.join(['https://www.googleapis.com/compute/v1/', 'projects/',
                                          'debian-cloud/global/',
                                          'images/family/debian-8'])
              }
          }],
          'networkInterfaces': [{
              'network': '$(ref.' + context.properties['network']
                         + '.selfLink)',
              'accessConfigs': [{
                  'name': 'External NAT',
                  'type': 'ONE_TO_ONE_NAT'
              }]
          }]
      }
  }]
  return {'resources': resources}

Vous devez ensuite définir la valeur de cette propriété de modèle dans la configuration de premier niveau ou dans le modèle parent :

resources:
- name: the-first-vm
  type: vm-template.jinja
  properties:
    machineType: f1-micro # Sets the 'machineType' template property
    zone: us-central1-f # Sets the 'zone' template property
    network: example-network # Sets the 'network' template property
- name: the-second-vm
  ...

En plus des propriétés de modèle, vous pouvez également faire référence à des variables d'environnement qui sont déjà renseignées avec des informations spécifiques à votre déploiement. Les variables d'environnement valides incluent le nom du déploiement, l'ID du projet, la propriété de nom de la ressource et le type de configuration. Pour en savoir plus sur chaque variable d'environnement, consultez la documentation Variables d'environnement.

Vous pouvez faire référence à une variable d'environnement à l'aide de la syntaxe suivante :

Jinja

{{ env["variable-name"] }}

Python

context.env['variable-name']

Par exemple, le modèle suivant utilise les variables d'environnement name et project.

Jinja

{#
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: {{ env["name"] }}
  type: compute.v1.instance
  properties:
    zone: {{ properties["zone"] }}
    machineType: https://www.googleapis.com/compute/v1/projects/{{ env["project"] }}/zones/{{ properties["zone"] }}/machineTypes/{{ properties["machineType"] }}
    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:
    - network: $(ref.{{ properties["network"] }}.selfLink)
      accessConfigs:
      - name: External NAT
        type: ONE_TO_ONE_NAT

Python

# 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.

"""Creates the virtual machine."""

COMPUTE_URL_BASE = 'https://www.googleapis.com/compute/v1/'

def GenerateConfig(context):
  """Creates the virtual machine with environment variables."""

  resources = [{
      'name': context.env['name'],
      'type': 'compute.v1.instance',
      'properties': {
          'zone': context.properties['zone'],
          'machineType': ''.join([COMPUTE_URL_BASE, 'projects/',
                                  context.env['project'], '/zones/',
                                  context.properties['zone'], '/machineTypes/',
                                  context.properties['machineType']]),
          'disks': [{
              'deviceName': 'boot',
              'type': 'PERSISTENT',
              'boot': True,
              'autoDelete': True,
              'initializeParams': {
                  'sourceImage': ''.join([COMPUTE_URL_BASE, 'projects/',
                                          'debian-cloud/global/',
                                          'images/family/debian-9'])
              }
          }],
          'networkInterfaces': [{
              'network': '$(ref.' + context.properties['network']
                         + '.selfLink)',
              'accessConfigs': [{
                  'name': 'External NAT',
                  'type': 'ONE_TO_ONE_NAT'
              }]
          }]
      }
  }]
  return {'resources': resources}

Transformons les modèles dont vous disposez pour tirer parti des propriétés de modèle et des variables d'environnement.

Modifier le fichier "vm-template.jinja"

Ouvrez le fichier vm-template, puis remplacez les éléments suivants par les propriétés de modèle et les variables d'environnement appropriées.

  1. Remplacez the-first-vm par :

    Jinja

    {{env["name"] }}
    

    Python

    context.env['name']
    

  2. Remplacez toutes les occurrences de votre ID de projet par une variable, comme suit :

    Jinja

    {{ env["project"] }}
    

    Python

    context.env['project']
    

  3. Remplacez ensuite la zone. Remplacez toutes les occurrences de us-central1-f par :

    Jinja

    {{ properties["zone"] }}
    

    Python

    context.properties['zone']
    

  4. Remplacer f1-micro par :

    Jinja

    {{ properties["machineType"] }}
    

    Python

    context.properties["machineType"]
    

  5. Remplacez $(ref.a-new-network.selfLink) par :

    Jinja

    $(ref.{{ properties["network"] }}.selfLink)
    

    Python

    '$(ref.' + context.properties['network'] + '.selfLink)'
    

Afin de contrôler l'intégrité du fichier vm-template.jinja, vérifiez qu'il ressemble à l'exemple suivant :

Jinja

{#
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: {{ env["name"] }}
  type: compute.v1.instance
  properties:
    zone: {{ properties["zone"] }}
    machineType: https://www.googleapis.com/compute/v1/projects/{{ env["project"] }}/zones/{{ properties["zone"] }}/machineTypes/{{ properties["machineType"] }}
    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:
    - network: $(ref.{{ properties["network"] }}.selfLink)
      accessConfigs:
      - name: External NAT
        type: ONE_TO_ONE_NAT

Python

# 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.

"""Creates the virtual machine."""

COMPUTE_URL_BASE = 'https://www.googleapis.com/compute/v1/'

def GenerateConfig(context):
  """Creates the virtual machine with environment variables."""

  resources = [{
      'name': context.env['name'],
      'type': 'compute.v1.instance',
      'properties': {
          'zone': context.properties['zone'],
          'machineType': ''.join([COMPUTE_URL_BASE, 'projects/',
                                  context.env['project'], '/zones/',
                                  context.properties['zone'], '/machineTypes/',
                                  context.properties['machineType']]),
          'disks': [{
              'deviceName': 'boot',
              'type': 'PERSISTENT',
              'boot': True,
              'autoDelete': True,
              'initializeParams': {
                  'sourceImage': ''.join([COMPUTE_URL_BASE, 'projects/',
                                          'debian-cloud/global/',
                                          'images/family/debian-9'])
              }
          }],
          'networkInterfaces': [{
              'network': '$(ref.' + context.properties['network']
                         + '.selfLink)',
              'accessConfigs': [{
                  'name': 'External NAT',
                  'type': 'ONE_TO_ONE_NAT'
              }]
          }]
      }
  }]
  return {'resources': resources}

Modifier le modèle "network-template.jinja"

Modifiez le fichier network-template.jinja en remplaçant a-new-network par :

Jinja

{{ env["name"] }}

Python

context.env['name']

Afin de contrôler l'intégrité du modèle de réseau, vérifiez qu'il ressemble à l'exemple suivant :

Jinja

{#
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: {{ env["name"] }}
  type: compute.v1.network
  properties:
    IPv4Range: 10.0.0.1/16

Python

# 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.

"""Creates the network."""

def GenerateConfig(context):
  """Creates the network with environment variables."""

  resources = [{
      'name': context.env['name'],
      'type': 'compute.v1.network',
      'properties': {
          'IPv4Range': '10.0.0.1/16'
      }
  }]
  return {'resources': resources}

Enregistrez les modifications.

Modifier le modèle "firewall-template.jinja"

  1. Remplacez le nom du pare-feu par :

    Jinja

    {{ env["name"] }}
    

    Python

    context.env['name']
    

  2. Remplacez $(ref.a-new-network.selfLink) par :

    Jinja

    $(ref.{{ properties["network"] }}.selfLink)
    

    Python

    '$(ref.' + context.properties['network'] + '.selfLink)'
    

Afin de contrôler l'intégrité du modèle de pare-feu, vérifiez qu'il ressemble à l'exemple suivant :

Jinja

{#
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: {{ env["name"] }}
  type: compute.v1.firewall
  properties:
    network: $(ref.{{ properties["network"] }}.selfLink)
    sourceRanges: ["0.0.0.0/0"]
    allowed:
    - IPProtocol: TCP
      ports: ["80"]

Python

Enregistrez les modifications.

Modifier le modèle "compute-engine-template.jinja"

Mettez à jour le modèle compute-engine-template.[jinja|py] pour qu'il contienne les nouveaux noms d'instances de machines virtuelles à l'aide du modèle vm-template.[jinja|py]. Notez que vous avez complètement supprimé vm-template-2.jinja et regroupé toutes les propriétés dynamiques dans un seul modèle que vous pouvez réutiliser.

Jinja

{#
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.
#}

{% set  NETWORK_NAME = "once-upon-a-custom-network" %}

resources:
- name: the-first-vm
  type: vm-template.jinja
  properties:
    machineType: f1-micro
    zone: us-central1-f
    network: {{ NETWORK_NAME }}
- name: the-second-vm
  type: vm-template.jinja
  properties:
    machineType: g1-small
    zone: us-central1-f
    network: {{ NETWORK_NAME }}
- name: {{ NETWORK_NAME }}
  type: network-template.jinja
- name: {{ NETWORK_NAME }}-firewall
  type: firewall-template.jinja
  properties:
    network: {{ NETWORK_NAME }}

Python

# 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.

"""Creates the Compute Engine."""

NETWORK_NAME = 'once-upon-a-custom-network'

def GenerateConfig(unused_context):
  """Creates the Compute Engine with multiple templates."""

  resources = [{
      'name': 'the-first-vm',
      'type': 'vm-template.py',
      'properties': {
          'machineType': 'f1-micro',
          'zone': 'us-central1-f',
          'network': NETWORK_NAME
      }
  }, {
      'name': 'the-second-vm',
      'type': 'vm-template.py',
      'properties': {
          'machineType': 'f1-micro',
          'zone': 'us-central1-f',
          'network': NETWORK_NAME
      }
  }, {
      'name': NETWORK_NAME,
      'type': 'network-template.py'
  }, {
      'name': NETWORK_NAME + '-firewall',
      'type': 'firewall-template.py',
      'properties': {
          'network': NETWORK_NAME
      }
  }]
  return {'resources': resources}

Comme vous avez ajouté la variable d'environnement name au modèle de base, Deployment Manager attribue aux ressources le nom défini dans le modèle parent (le modèle appelant le modèle de base). Dans ce cas, le modèle parent serait compute-engine-template.[jinja|py] pour que le nom des instances de machines virtuelles soient the-first-vm et the-second-vm. Vous n'avez pas besoin de définir la variable de projet, car Deployment Manager la reconnaît automatiquement en tant que variable d'environnement et renseigne automatiquement sa valeur.

Bien que le modèle compute-engine-template.[jinja|py] soit maintenant plus long et un peu plus complexe, il est aussi beaucoup plus dynamique. En utilisant une combinaison de propriétés et de variables d'environnement, vous pouvez réutiliser ce modèle pour créer un cluster Compute Engine complet en personnalisant le type de machine, la zone et le nom du réseau chaque fois que vous réutilisez le modèle. Cela vous évite de créer plusieurs versions de la même configuration pour différents déploiements.

Mettre à jour le fichier de configuration

Modifiez ensuite le fichier de configuration config-with-many-templates.yaml et supprimez la ligne d'importation vm-template-2.[jinja|py] pour que la configuration ressemble à l'exemple suivant :

Jinja

# 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.

imports:
- path: vm-template.jinja
- path: network-template.jinja
- path: firewall-template.jinja
- path: compute-engine-template.jinja

resources:
- name: compute-engine-setup
  type: compute-engine-template.jinja

Python

# 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.

imports:
- path: vm-template.py
- path: network-template.py
- path: firewall-template.py
- path: compute-engine-template.py

resources:
- name: compute-engine-setup
  type: compute-engine-template.py

Enregistrez les modifications. Si vous le souhaitez, vous pouvez redéployer la configuration pour vérifier le bon fonctionnement des variables.

gcloud deployment-manager deployments create deployment-with-many-templates --config config-with-many-templates.yaml

Nous verrons ensuite comment ajouter des métadonnées et des scripts de démarrage à votre modèle.

Supprimer le déploiement

Les ressources Compute Engine entraînent des frais. Vous devez donc supprimer ce déploiement, car vous n'en aurez plus besoin pour les prochaines étapes. La suppression du déploiement supprime également toutes les ressources qui y sont associées. Si vous ne supprimez pas le déploiement, vous risquez de rencontrer des conflits avec les exemples ultérieurs.

Pour supprimer le déploiement, exécutez la commande suivante :

gcloud deployment-manager deployments delete deployment-with-many-templates

Étape suivante : Définir des métadonnées et des scripts de démarrage

Articles associés

Cette page vous a-t-elle été utile ? Évaluez-la :

Envoyer des commentaires concernant…

Documentation Cloud Deployment Manager