Aggiornamento di un deployment

Una volta eseguito il deployment, puoi aggiornarlo man mano che l'app si evolve. Puoi utilizzare la modalità Deployment Manager per aggiornare un deployment:

  • Aggiunta o rimozione di risorse al deployment
  • Aggiornamento di alcune proprietà delle risorse esistenti nel deployment

Deployment Manager utilizza le API sottostanti dei servizi Google Cloud per gestire le risorse nel deployment. Deployment Manager può aggiornare le risorse esistenti se nell'API corrispondente è presente un metodo update o patch.

Esegui il deployment della configurazione originale

In questo passaggio, esegui il deployment della configurazione che aggiornerai in un secondo momento. Vai alla cartella nel repository GitHub ed esegui il deployment della configurazione:

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 configurazione esegue il deployment di due macchine virtuali (VM) che eseguono uno script di avvio. Il modello di 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}

Apri il modello aggiornato

Ora apri il modello aggiornato:

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

nano vm-template.py

Lo script di avvio della VM nella sezione metadata del modello aggiornato è stata modificata:

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

Utilizzerai questo modello aggiornato per modificare il deployment che hai creato.

Visualizza l'anteprima dell'aggiornamento

Per visualizzare l'anteprima del deployment aggiornato, esegui il comando update con un flag --preview:

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

Esegui il commit dell'aggiornamento

Per eseguire il commit dell'aggiornamento, esegui:

gcloud deployment-manager deployments update deployment-to-update

Verificare l'aggiornamento

Per verificare se l'aggiornamento ha funzionato, devi prima riavviare le istanze per utilizzare il nuovo script di avvio. Riavvia the-first-vm:

gcloud compute instances reset the-first-vm

L'avvio del backup dell'istanza potrebbe richiedere del tempo. Attendi qualche minuto prima di confermare la modifica.

Conferma il nuovo script di avvio

  1. Ottieni l'IP esterno di the-first-vm:

    gcloud compute instances describe the-first-vm | grep "natIP"
    
  2. Copia il valore.

  3. Apri un browser e incolla l'indirizzo IP nella barra degli indirizzi per visitare il tuo in esecuzione in un'istanza Compute Engine.

    A questo punto, la pagina dovrebbe mostrare un messaggio di benvenuto "Deployment Manager ti fa una buona giornata!"

Puoi anche ripetere questi passaggi con the-second-vm e visualizzare un messaggio leggermente diverso.

Elimina il tuo deployment

Come per i passaggi precedenti, ti consigliamo di eliminare il deployment per evitare addebiti. Esegui questo comando per eliminare il deployment:

gcloud deployment-manager deployments delete deployment-to-update

Passaggi successivi

Ecco alcune aree da esplorare man mano che usi di più Deployment Manager: