Crear una plantilla

Puedes crear una implementación mediante una configuración en cualquier momento, pero, a medida que creas configuraciones más complejas, deberás crear y utilizar plantillas para configuraciones más sólidas y flexibles.

Una plantilla es un archivo separado de tu configuración que define un conjunto de recursos. Tú importas una plantilla en la configuración y Deployment Manager la expande y alinea el contenido durante la implementación, y obtienes así un archivo de configuración más simple y claro. Después de importar la plantilla, puedes utilizarla de la misma manera que usas un tipo de recurso.

Una plantilla puede utilizar otras plantillas y Deployment Manager expande de forma recurrente plantillas cuando se las utiliza en una configuración, por lo que el resultado final tras la expansión de las plantillas sería como si hubieras escrito la configuración sin ellas. Por ejemplo, una configuración con plantillas podría verse de esta manera:

imports:
- path: vm-template.jinja

resources:
- name: vm-instance
  type: vm-template.jinja

Una vez que Deployment Manager expande las plantillas, la configuración completa se ve de la siguiente manera, sin ningún trabajo adicional de tu parte:

resources:
- name: vm-instance
  type: compute.v1.instance
  properties:
    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
    machineType: https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-f/machineTypes/f1-micro
    networkInterfaces:
    - network: $(ref.a-new-network.selfLink)
      accessConfigs:
      - name: External NAT
        type: ONE_TO_ONE_NAT
    zone: us-central1-f

A continuación, con la configuración que creaste en el paso dos, Crea una configuración y crearás una plantilla a partir de ese contenido. Entonces, importarás y utilizarás la plantilla en tu configuración a fin de crear una nueva implementación.

Al final, tu nueva implementación contiene los mismos recursos que la primera, pero el archivo de configuración será mucho más simple.

Escribir plantillas de Jinja2 o Python

Puedes escribir plantillas y puedes elegir entre Python 2.7 y Jinja2. Las plantillas de Python son más potentes y te dan la opción de crear o administrar tus plantillas de manera programática. Si estás familiarizado con Python, utilízalo para tus plantillas.

Jinja2 es un lenguaje de plantillas más simple, pero menos potente, que utiliza la misma sintaxis que YAML. Si no estás familiarizado con Python o si deseas escribir plantillas simples sin utilizar Python, usa Jinja2. El resto de esta guía ofrece ejemplos tanto en Jinja como en Python.

Plantillas de Python

Si eliges escribir plantillas en Python, estas deben cumplir los siguientes requisitos:

  • La plantilla escribirse en Python 2.7.

  • La plantilla debe definir un método llamado GenerateConfig() o generate_config(). Si utilizas ambos nombres de métodos en la misma plantilla, el método generate_config() tendrá prioridad.

  • El método debe mostrar un diccionario de Python.

Aparte de eso, puedes decidir sobre el contenido que generarás para tu plantilla. A fin de conocer ejemplos de los métodos que puedes utilizar para escribir una plantilla de Python, consulta Crear una plantilla básica.

Crea tu primera plantilla

Copia la definición de recursos que creaste en el paso cuatro, Utiliza las referencias, en un nuevo campo llamado vm-template.[jinja|py]. Elige la extensión adecuada del archivo, o si deseas utilizar plantillas de Jinja o Python. Recuerda reemplaza [MY_PROJECT] con el ID de tu proyecto:

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: 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:
    - network: $(ref.a-new-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(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-9'])
              }
          }],
          'networkInterfaces': [{
              'network': '$(ref.a-new-network.selfLink)',
              'accessConfigs': [{
                  'name': 'External NAT',
                  'type': 'ONE_TO_ONE_NAT'
              }]
          }]
      }
  }]
  return {'resources': resources}

Crea una segunda entidad

Crea un archivo llamado vm-template-2.[jinja|py] y agrega el siguiente contenido. Recuerda reemplaza [MY_PROJECT] con el ID de tu proyecto:

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: 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:
    - network: $(ref.a-new-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(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-9'])
              }
          }],
          'networkInterfaces': [{
              'network': '$(ref.a-new-network.selfLink)',
              'accessConfigs': [{
                  'name': 'External NAT',
                  'type': 'ONE_TO_ONE_NAT'
              }]
          }]
      }
  }]
  return {'resources': resources}

Importa tus plantillas

Vuelve a tu configuración, two-vms.yaml. En la parte superior del archivo, importa tu plantilla; para eso, agrega la string imports, seguida de la ruta relativa al archivo de la plantilla. Luego, reemplaza las propiedades de tus recursos con el nombre de la plantilla.

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

resources:
- name: vm-1
  type: vm-template.jinja
- name: vm-2
  type: vm-template-2.jinja
- name: a-new-network
  type: compute.v1.network
  properties:
    IPv4Range: 10.0.0.0/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.

imports:
- path: vm-template.py
- path: vm-template-2.py

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:
    IPv4Range: 10.0.0.0/16

Nombres de recursos

Cuando utilizas una plantilla, los nombres del recurso se definen mediante el campo name que se proporciona en la plantilla, no el nombre en el archivo de configuración.

Por ejemplo, en este caso las instancias de la máquina virtual se crean mediante los nombres en las plantillas que creaste, "the-first-vm" y "the-second-vm". Los valores "vm-1" y "vm-2", definidos en la configuración, se utilizan para nombrar una instalación de la plantilla, pero no son nombres de recursos, a menos que decidas utilizar variables de entorno para establecer que ambos nombres sean iguales.

Guarda tu configuración e impleméntala

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

Ve tu implementación

gcloud deployment-manager deployments describe deployment-with-templates

Además, puedes utilizar el manifiesto de la implementación a fin de ver la configuración original con las plantillas y la configuración expandida, que incluye el contenido de las plantillas. Recuerda que, para obtener un manifiesto, debes tomar el valor manifest-TIMESTAMP desde el resultado anterior y proporcionarlo en el siguiente comando:

gcloud deployment-manager manifests describe manifest-TIMESTAMP --deployment deployment-with-templates

Excelente, creaste una implementación mediante una plantilla. Ahora, aprende a crear configuraciones con plantillas que llaman a otras plantillas.

Borra tu implementación

Los recursos de Compute Engine generan cambios, por lo que deberías borrar esta implementación si ya no es necesaria para futuros pasos. Si borras la implementación, también se borran todos los recursos que hay en ella. Si dejas la implementación, tendrás problemas con los ejemplos futuros.

Para borrar esta implementación:

gcloud deployment-manager deployments delete deployment-with-templates

A continuación: Usar plantillas múltiples

Temas relacionados

¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...

Documentación de Cloud Deployment Manager