Aggiornamento di un deployment

Dopo aver eseguito un deployment, puoi aggiornarlo man mano che l'app si evolve. Puoi utilizzare Deployment Manager per aggiornare un deployment in questo modo:

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

Deployment Manager usa le API sottostanti dei servizi Google Cloud per gestire le risorse del deployment. Deployment Manager può aggiornare le risorse esistenti se esiste un metodo update o patch nell'API corrispondente.

Esegui il deployment della configurazione originale

In questo passaggio, esegui il deployment della configurazione che aggiorneremo in seguito. 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

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

Verifica 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 un paio di minuti 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.

    La pagina ora dovrebbe mostrare un messaggio di benvenuto che dice "Deployment Manager dice che è una buona giornata!".

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

Elimina 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 quando usi Deployment Manager: