Usar varias plantillas

Ahora, crea una plantilla que importe otra plantilla. En este ejemplo se deconstruye aún más la configuración que creaste originalmente (two-vms.yaml) y creas una plantilla para una red y para una regla de firewall a fin de permitir el tráfico entrante en el puerto 80.

Luego, trasladarás toda la implementación a una sola plantilla combinada; cuando finalices esta página, tu configuración solo necesitará llamar a una sola plantilla para crear una implementación con todos esos recursos.

Crea una plantilla para una red

Crea un nuevo archivo de plantilla llamado network-template.[jinja|py] con la siguiente defunción de red:

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

"""Creates the network."""

def GenerateConfig(unused_context):
  """Creates the network."""

  resources = [{
      'name': 'a-new-network',
      'type': 'compute.v1.network',
      'properties': {
          'IPv4Range': '10.0.0.0/16'
      }
  }]
  return {'resources': resources}

Crea una plantilla para un firewall

Crea una plantilla para una nueva regla de firewall que permita el tráfico de TCP desde el puerto 80. Denomina al archivo firewall-template.[jinja|py]:

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

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 firewall."""

def GenerateConfig(unused_context):
  """Creates the firewall."""

  resources = [{
      'name': 'a-firewall-rule',
      'type': 'compute.v1.firewall',
      'properties': {
          'network': '$(ref.a-new-network.selfLink)',
          'sourceRanges': ['0.0.0.0/0'],
          'allowed': [{
              'IPProtocol': 'TCP',
              'ports': [80]
          }]
      }
  }]
  return {'resources': resources}

Ten en cuenta que las plantillas también puede utilizar referencias; mientras la configuración final contenga una red llamada a-new-network, las referencias serán válidas.

Crea una plantilla que utilice las plantillas de red, firewall y máquina virtual

Crea un archivo denominado compute-engine-template.[jinja|py]. Agrega lo siguiente al archivo. Los nombres de recursos siguientes son arbitrarios, ya que Deployment Manager nombra los recursos en función de los nombres en las plantillas base.

Esta plantilla utiliza vm-template.[jinja|py] y vm-template-2.[jinja|py], que deberías haber creado en el paso anterior. Caso contrario, completa el Paso 5: Crea una plantilla antes de continuar.

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: vm-1
  type: vm-template.jinja
- name: vm-2
  type: vm-template-2.jinja
- name: network-1
  type: network-template.jinja
- name: firewall-1
  type: firewall-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.

"""Creates the Compute Engine."""

def GenerateConfig(unused_context):
  """Creates the Compute Engine with network and firewall."""

  resources = [{
      'name': 'vm-1',
      'type': 'vm-template.py'
  }, {
      'name': 'vm-2',
      'type': 'vm-template-2.py'
  }, {
      'name': 'network-1',
      'type': 'network-template.py'
  }, {
      'name': 'firewall-1',
      'type': 'firewall-template.py'
  }]
  return {'resources': resources}

Crea la configuración

Crea una configuración que utilice las plantillas que acabas de crear. Crea un archivo llamado config-with-many-templates.yaml y agrega el siguiente contenido a la configuración:

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
- 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: vm-template-2.py
- path: network-template.py
- path: firewall-template.py
- path: compute-engine-template.py

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

Ten en cuenta que, si bien la configuración no llamó directamente a otras plantillas, debes importarlas igualmente con el archivo compute-engine-template.jinja. Esto se debe a que el archivo compute-engine-template.jinja depende del resto de las plantillas para ser válido.

Además, no se utiliza aquí, pero puedes nombrar tus importaciones con un campo opcional name, que se aplica como el nombre de la plantilla y se utiliza como el tipo de recurso en el resto del archivo. El archivo name es útil cuando tienes una plantilla almacenada en un directorio distinto que el archivo actual y no quieres tener que incluir la ruta de acceso completa como nombre de la plantilla. Por ejemplo:

imports:
- path: a/path/to/templates/vm-template.jinja
  name: a-vm-template.jinja

Esto te permite utilizar a-vm-template.jinja como el tipo, en vez de la ruta completa:

resources:
- name: this-is-just-an-example
  type: a-vm-template.jinja

Guarda tu configuración y luego impleméntala

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

Ve tu implementación

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

También puedes ver una lista de tus recursos mediante la API de Compute Engine a fin de confirmar que los recursos existan:

Para obtener información sobre las instancias:

gcloud compute instances list # List instances
gcloud compute instances describe the-first-vm

Para obtener información sobre la red:

gcloud compute networks list # List networks
gcloud compute networks describe a-new-network

Para obtener información sobre la regla de firewall:

gcloud compute firewall-rules list # List firewall rules

A continuación, reemplacemos algunos de las partes más rígidas de las plantillas con plantillas personalizadas y variables de entorno.

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-many-templates

A continuación: Usar plantillas y variables de entorno

Temas relacionados

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

Enviar comentarios sobre...

Documentación de Cloud Deployment Manager