Configurar propiedades de la plantilla y usar variables del entorno

Una ventaja de usar plantillas para tu implementación es la capacidad de crear y definir propiedades personalizadas, que te permiten volver a usar plantillas en zonas, regiones y proyectos.

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

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 puedes usar variables de entorno específicas para tu implementación, que se propagan con anterioridad con información sobre la implementación. Puedes usar variables de entorno en plantillas para obtener información única sobre su implementación.

Llamas a una variable de entorno con esta sintaxis:

context.env['variable-name']

Entre las variables de entorno válidas, se incluyen el nombre de la implementación, el ID del proyecto, la propiedad del nombre de tu recurso y el tipo de configuración. Obtén más información sobre las variables de entorno.

Propiedades de la plantilla y variables de entorno en una plantilla

En este paso, vm-template.py muestra los beneficios de las propiedades de la plantilla y las variables de entorno. Abrir 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

Se reemplazaron varias partes de la plantilla por propiedades de la plantilla y variables de entorno. Por ejemplo, el ID del proyecto se reemplaza por context.env[project], por lo que no tienes que reemplazar de forma manual el ID del proyecto en tus plantillas.

En los comentarios en el archivo, se 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}

De manera similar, network-template.py y firewall-template.py usan el nombre de la implementación en su definición, mediante una llamada a context.env['name'].

Implementa 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

Borrar tu implementación

Te recomendamos borrar la implementación para evitar cambios. No necesitas esta implementación para el siguiente paso. Ejecuta el siguiente comando para borrar la implementación:

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

De cara al futuro: secuencias de comandos auxiliares

Luego, aprende sobre las secuencias de comandos auxiliares para realizar tareas recurrentes de manera eficiente.