Comprendre les modèles réutilisables

Lors du développement d'une application, vous aurez très probablement besoin d'architectures complexes. Pour simplifier le dépannage et la réplication de votre déploiement, nous vous recommandons de diviser votre configuration en modèles.

Un modèle est un fichier distinct qui définit un ensemble de ressources. Vous pouvez réutiliser des modèles pour différents déploiements, ce qui permet de garantir la cohérence des déploiements complexes.

Vous pouvez utiliser Python ou Jinja2 afin de créer des modèles pour Deployment Manager. Nous vous recommandons d'utiliser des modèles Python, car Python offre une plus grande flexibilité et davantage de fonctionnalités lors de l'évolution de votre application.

Modèles Python

Si vous choisissez d'écrire des modèles en Python, ceux-ci doivent répondre à ces exigences :

  • Le modèle doit être écrit en Python 3.x.

  • Le modèle doit définir une méthode appelée GenerateConfig(context) ou generate_config(context). Si vous utilisez les deux noms de méthode dans le même modèle, la méthode generate_config() prévaut.

    L'objet context contient des métadonnées relatives au déploiement et à votre environnement, telles que le nom du déploiement, le projet en cours, etc. Vous utiliserez ces variables spécifiques au déploiement dans les étapes ultérieures.

  • La méthode doit renvoyer un dictionnaire Python.

Examiner des exemples de modèles

Dans le dépôt des exemples, ouvrez vm-template.py :

cd deploymentmanager-samples/examples/v2/step_by_step_guide/step5_create_a_template/python

nano vm-template.py  # use your preferred text editor

Ce modèle définit la première machine virtuelle (VM) à partir des exemples précédents :

# 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(unused_context):
  """Creates the first virtual machine."""

  resources = [{
      'name': 'the-first-vm',
      'type': 'compute.v1.instance',
      'properties': {
          'zone': 'us-central1-f',
          'machineType': ''.join([COMPUTE_URL_BASE, 'projects/MY_PROJECT',
                                  '/zones/us-central1-f/',
                                  'machineTypes/f1-micro']),
          'disks': [{
              'deviceName': 'boot',
              'type': 'PERSISTENT',
              'boot': True,
              'autoDelete': True,
              'initializeParams': {
                  'sourceImage': ''.join([COMPUTE_URL_BASE, 'projects/',
                                          'debian-cloud/global/',
                                          'images/family/debian-11'])
              }
          }],
          'networkInterfaces': [{
              'network': '$(ref.a-new-network.selfLink)',
              'accessConfigs': [{
                  'name': 'External NAT',
                  'type': 'ONE_TO_ONE_NAT'
              }]
          }]
      }
  }]
  return {'resources': resources}

Ouvrez le deuxième modèle, vm-template-2.py, qui définit la deuxième VM :

# 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(unused_context):
  """Creates the second virtual machine."""

  resources = [{
      'name': 'the-second-vm',
      'type': 'compute.v1.instance',
      'properties': {
          'zone': 'us-central1-f',
          'machineType': ''.join([COMPUTE_URL_BASE, 'projects/MY_PROJECT',
                                  '/zones/us-central1-f/',
                                  'machineTypes/g1-small']),
          'disks': [{
              'deviceName': 'boot',
              'type': 'PERSISTENT',
              'boot': True,
              'autoDelete': True,
              'initializeParams': {
                  'sourceImage': ''.join([COMPUTE_URL_BASE, 'projects/',
                                          'debian-cloud/global',
                                          '/images/family/debian-11'])
              }
          }],
          'networkInterfaces': [{
              'network': '$(ref.a-new-network.selfLink)',
              'accessConfigs': [{
                  'name': 'External NAT',
                  'type': 'ONE_TO_ONE_NAT'
              }]
          }]
      }
  }]
  return {'resources': resources}

Dans les deux modèles, remplacez MY_PROJECT par l'ID de votre projet.

Importer des modèles

Après avoir créé des modèles, vous devez les importer dans votre configuration. Ouvrez le nouveau fichier two-vms.yaml :

cd deploymentmanager-samples/examples/v2/step_by_step_guide/step5_create_a_template/python

nano two-vms.yaml  # use your preferred text editor

Ce fichier de configuration comporte une nouvelle section imports qui appelle les deux modèles de VM, vm-template.py et vm-template-2.py :

# 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: vm-template-2.py

# In the resources section below, the properties of the resources are replaced
# with the names of the templates.
resources:
- name: vm-1
  type: vm-template.py
- name: vm-2
  type: vm-template-2.py
- name: a-new-network
  type: compute.v1.network
  properties:
    routingConfig:
      routingMode: REGIONAL
    autoCreateSubnetworks: true

Remarque sur les noms de ressources

Lorsque vous utilisez un modèle, vos noms de ressources sont définis à l'aide du champ name fourni dans le modèle, et non du nom du fichier de configuration.

Par exemple, dans ce cas, les instances de machine virtuelle sont créées à l'aide des noms fournis dans les modèles (the-first-vm et the-second-vm). Les valeurs vm-1 et vm-2, définies dans la configuration, sont utilisées pour nommer une instanciation du modèle, mais ne sont pas des noms de ressources.

Enregistrer et déployer votre configuration

Pour déployer la configuration, exécutez la commande suivante :

gcloud deployment-manager deployments create deployment-with-templates --config two-vms.yaml

Pour afficher votre déploiement, exécutez la commande suivante :

gcloud deployment-manager deployments describe deployment-with-templates

Utiliser plusieurs modèles en prévision de changements ultérieurs

À l'étape suivante, vous combinez des modèles de sorte que votre configuration n'appelle qu'un seul modèle pour déployer toutes vos ressources.

Supprimer le déploiement

Avant de continuer, nous vous recommandons de supprimer le déploiement afin d'éviter les frais. Ce déploiement n'est pas nécessaire pour l'étape suivante. Exécutez la commande suivante pour supprimer le déploiement :

gcloud deployment-manager deployments delete deployment-with-templates