Actualizar un despliegue

Una vez que tengas una implementación, podrás actualizarla a medida que evolucione tu aplicación. Puedes usar Deployment Manager para actualizar un despliegue de las siguientes formas:

  • Añadir o quitar recursos de la implementación
  • Actualizar algunas propiedades de los recursos de la implementación

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

Implementar la configuración original

En este paso, implementa la configuración que actualizarás más adelante. Ve a la carpeta del repositorio de GitHub e 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 (VMs) que ejecutan una secuencia de comandos de inicio. La plantilla de VM es:

# 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}

Abrir 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 ha cambiado 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á esta plantilla actualizada para cambiar la implementación que ha creado.

Ver la actualización

Para previsualizar la implementación actualizada, ejecuta el comando update con la marca --preview:

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

Confirmar la actualización

Para confirmar la actualización, ejecuta el siguiente comando:

gcloud deployment-manager deployments update deployment-to-update

Verificar la actualización

Para comprobar si la actualización ha funcionado, primero debes reiniciar las instancias para usar la nueva secuencia de comandos de inicio. Reiniciar the-first-vm:

gcloud compute instances reset the-first-vm

La instancia puede tardar un poco en volver a iniciarse. Espera un par de minutos antes de confirmar el cambio.

Confirma la nueva secuencia de comandos de inicio

  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.

    En la página debería aparecer un mensaje de bienvenida que diga "¡Deployment Manager te desea un buen día!".

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

Eliminar una implementación

Al igual que en los pasos anteriores, te recomendamos que elimines la implementación para evitar que se te apliquen cargos. Ejecuta el siguiente comando para eliminar la implementación:

gcloud deployment-manager deployments delete deployment-to-update

Siguientes pasos

A continuación, se indican algunas áreas que puede explorar a medida que use más Deployment Manager: