Actualiza una implementación

Después de tener una implementación, puedes actualizarla a medida que tu aplicación evoluciona. Puedes usar Deployment Manager para actualizar una implementación de las siguientes maneras:

  • Agregar o quitar recursos a la implementación
  • Actualizar algunas propiedades de recursos existentes en tu implementación

Deployment Manager usa las API subyacentes de los servicios de Google Cloud para administrar recursos en tu implementación. Deployment Manager puede actualizar recursos existentes si hay un método update o patch en la API correspondiente.

Implementa la configuración original

En este paso, implementa la configuración que actualizarás más adelante. Navega a la carpeta en el repositorio de GitHub y, luego, implementa la configuración:

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

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

La configuración implementa dos máquinas virtuales (VM) que ejecutan una secuencia de comandos de inicio. Esta es la plantilla de la 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 with environment variables and startup script."""

COMPUTE_URL_BASE = 'https://www.googleapis.com/compute/v1/'

def GenerateConfig(context):
  """Creates the virtual machine."""

  resources = [{
      'name': context.env['name'],
      'type': 'compute.v1.instance',
      'properties': {
          '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'])
              }
          }],
          'networkInterfaces': [{
              'network': '$(ref.' + context.properties['network']
                         + '.selfLink)',
              'accessConfigs': [{
                  'name': 'External NAT',
                  'type': 'ONE_TO_ONE_NAT'
              }]
          }],
          'metadata': {
              'items': [{
                  'key': 'startup-script',
                  'value': ''.join(['#!/bin/bash\n',
                                    'python -m SimpleHTTPServer 80'])
              }]
          }
      }
  }]
  return {'resources': resources}

Abre la plantilla actualizada

Ahora, abre la plantilla actualizada:

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

nano vm-template.py

En la plantilla actualizada, en la sección metadata, se cambió la secuencia de comandos de inicio de la 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 with environment variables and startup script."""

COMPUTE_URL_BASE = 'https://www.googleapis.com/compute/v1/'

def GenerateConfig(context):
  """Creates the virtual machine."""

  resources = [{
      'name': context.env['name'],
      'type': 'compute.v1.instance',
      'properties': {
          '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'])
              }
          }],
          'networkInterfaces': [{
              'network': '$(ref.' + context.properties['network']
                         + '.selfLink)',
              'accessConfigs': [{
                  'name': 'External NAT',
                  'type': 'ONE_TO_ONE_NAT'
              }]
          }],
          'metadata': {
              'items': [{
                  'key': 'startup-script',
                  'value': ''.join(['#!/bin/bash\n',
                                    'INSTANCE=$(curl http://metadata.google.',
                                    'internal/computeMetadata/v1/instance/',
                                    'hostname -H "Metadata-Flavor: Google")\n',
                                    'echo "<html><header><title>Hello from ',
                                    'Deployment Manager!</title></header>',
                                    '<body><h2>Hello from $INSTANCE</h2><p>',
                                    'Deployment Manager bids you good day!</p>',
                                    '</body></html>" > index.html\n',
                                    'python -m SimpleHTTPServer 80\n'])
              }]
          }
      }
  }]
  return {'resources': resources}

Usarás esta plantilla actualizada para cambiar la implementación que creaste.

Vista previa de la actualización

Para obtener una vista previa de la implementación actualizada, ejecuta el comando update con una marca --preview:

gcloud deployment-manager deployments update deployment-to-update --config config-with-many-templates.yaml --preview

Confirma la actualización

Para confirmar la actualización, ejecuta este comando:

gcloud deployment-manager deployments update deployment-to-update

Verifica la actualización

A fin de verificar si la actualización funcionó, primero debes reiniciar las instancias para usar la secuencia de comandos de inicio nueva. Reinicia the-first-vm:

gcloud compute instances reset the-first-vm

Es posible que la instancia tarde un tiempo en volver a iniciarse. Espera uno minutos antes de confirmar los cambios.

Confirma la secuencia de comandos de inicio nueva

  1. Obtén la IP externa de the-first-vm:

    gcloud compute instances describe the-first-vm | grep "natIP"
    
  2. Copia el valor.

  3. Abre un navegador y pega la dirección IP en la barra de direcciones para visitar tu instancia.

    Ahora, la página debería mostrar un mensaje de bienvenida que diga “¡Deployment Manager le desea un buen día!”

También puedes repetir estos pasos con the-second-vm y ver un mensaje un poco diferente.

Borra tu implementación

Al igual que con los pasos anteriores, te recomendamos que borres la implementación para evitar cargos. Ejecuta el siguiente comando para borrar la implementación:

gcloud deployment-manager deployments delete deployment-to-update

¿Qué sigue?

Estas son algunas áreas que debes explorar a medida que usas Deployment Manager: