Aggiornamento di un deployment

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

  • Aggiunta o rimozione di risorse dal 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 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

Nel modello aggiornato, nella sezione metadata, lo script di avvio della VM è stato modificato:

# 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 è andato a buon fine, 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 l'istanza.

    Nella pagina dovrebbe essere visualizzato un messaggio di benvenuto che dice "Deployment Manager ti dà il benvenuto".

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

Eliminare il 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 utilizzi Deployment Manager: