Establecer propiedades de plantillas y usar variables de entorno

Una de las ventajas de usar plantillas para tu implementación es la posibilidad de crear y definir propiedades personalizadas, lo que te permite reutilizar plantillas en zonas, regiones y proyectos.

Las propiedades de plantilla son variables arbitrarias. Cualquier archivo de configuración o de plantilla puede proporcionar un valor para una propiedad de plantilla sin modificar la plantilla. Por lo tanto, puede cambiar el valor de una propiedad en varias configuraciones sin modificar la plantilla en sí.

Para hacer referencia a un valor arbitrario, usa esta sintaxis en una plantilla:

context.properties["property-name"]

Además de las propiedades de la plantilla, también puede usar variables de entorno específicas de su implementación, que se rellenan automáticamente con información sobre la implementación. Puedes usar variables de entorno en las plantillas para obtener información única sobre tu implementación.

Para llamar a una variable de entorno, usa esta sintaxis:

context.env['variable-name']

Las variables de entorno válidas incluyen el nombre de la implementación, el ID del proyecto, la propiedad name del recurso y el tipo de configuración. Más información sobre las variables de entorno

Propiedades de plantilla y variables de entorno en una plantilla

En este paso, vm-template.py muestra las ventajas de las propiedades de las plantillas y las variables de entorno. Abre vm-template.py:

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

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

Varias partes de la plantilla se han sustituido por propiedades de plantilla y variables de entorno. Por ejemplo, el ID del proyecto se sustituye por context.env[project], por lo que no tienes que sustituirlo manualmente en tus plantillas.

Los comentarios del archivo describen otros cambios en la plantilla.

# 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 = [{
      # `the-first-vm` is replaced with `context.env[`name`]`
      'name': context.env['name'],
      'type': 'compute.v1.instance',
      'properties': {
          # All occurrences of `us-central1-f` are replaced with
          # `context.properties[`zone`]. 
          # All occurrences of the project ID are replaced with 
          # `context.env[`project`]`.
          # `f1-micro` is replaced with `context.properties["machineType"].  
          '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-11'])
              }
          }],
          # `$(ref.a-new-network.selfLink)` is replaced with 
          # `$(ref.` + context.properties[`network`] + `selfLink)`.
          'networkInterfaces': [{
              'network': '$(ref.' + context.properties['network']
                         + '.selfLink)',
              'accessConfigs': [{
                  'name': 'External NAT',
                  'type': 'ONE_TO_ONE_NAT'
              }]
          }]
      }
  }]
  return {'resources': resources}

Del mismo modo, network-template.py y firewall-template.py usan el nombre de la implementación en su definición llamando a context.env['name'].

Implementar la configuración

Para ver el archivo de configuración de esta implementación, ejecuta el siguiente comando:

nano config-with-many-templates.yaml

Guarda los cambios y vuelve a implementar la configuración para confirmar que las variables funcionan.

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

Eliminar el despliegue

Te recomendamos que elimines la implementación para evitar que se te apliquen cargos. No necesitas esta implementación para el siguiente paso. Ejecuta el siguiente comando para eliminar la implementación:

gcloud deployment-manager deployments delete deployment-with-template-properties

De cara al futuro: secuencias de comandos auxiliares

A continuación, descubre las secuencias de comandos auxiliares para realizar tareas repetitivas de forma eficiente.