Configurar metadatos y usar secuencias de comandos de inicio

Cuando implementas configuraciones más complejas, es posible que tengas decenas, cientos o incluso miles de instancias de máquinas virtuales. Si estás familiarizado con Compute Engine, es probable que desees utilizar las secuencias de comandos de inicio para ayudar a instalar o configurar las instancias de forma automática.

Con el uso de Deployment Manager, puedes ejecutar las mismas secuencias de comandos de inicio o agregar metadatos a las instancias de máquinas virtuales de tu implementación si especificas los metadatos en tu plantilla o configuración.

Para agregar metadatos o secuencias de comandos de inicio a la plantilla, agrega la propiedad metadata y los valores y las claves de metadatos correspondientes. Por ejemplo, para especificar una secuencia de comandos de inicio, la clave de metadatos debe ser startup-script y el valor sería el contenido de la secuencia de comandos de inicio.

Una plantilla con una secuencia de comandos de inicio se ve de la siguiente manera:

resources:
- name: my-first-vm-template
  type: compute.v1.instance
  properties:
   zone: us-central1-f
   machineType:
   ...[snip]...
   metadata:
     items:
     - key: startup-script
       value: "STARTUP-SCRIPT-CONTENTS"

Agreguemos una secuencia de comandos de inicio simple a la plantilla que inicia un servidor HTTP. Al final, deberías poder visitar el servidor que se ejecuta en la instancia de máquina virtual.

Edita el archivo de plantilla de VM

Agrega los siguientes campos al archivo vm-template.[jinja|py], en la sección properties:

Jinja

metadata:
  items:
  - key: startup-script
    value: |
      #!/bin/bash
      sudo python -m SimpleHTTPServer 80

Python

'metadata': {
  'items': [{
      'key': 'startup-script',
      'value': ''.join(['#!/bin/bash\n',
                        'python -m SimpleHTTPServer 80'])
  }]
 }

La plantilla debería verse de la siguiente manera:

Jinja

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

resources:
- name: {{ env["name"] }}
  type: compute.v1.instance
  properties:
    zone: {{ properties["zone"] }}
    machineType: https://www.googleapis.com/compute/v1/projects/{{ env["project"] }}/zones/{{ properties["zone"] }}/machineTypes/{{ properties["machineType"] }}
    disks:
    - deviceName: boot
      type: PERSISTENT
      boot: true
      autoDelete: true
      initializeParams:
        sourceImage: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/family/debian-9
    networkInterfaces:
    - network: $(ref.{{ properties["network"] }}.selfLink)
      accessConfigs:
      - name: External NAT
        type: ONE_TO_ONE_NAT
    metadata:
      items:
      - key: startup-script
        value: |
          #!/bin/bash
          python -m SimpleHTTPServer 80

Python

# 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-9'])
              }
          }],
          '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}

Guarda los cambios.

Vuelve a implementar la configuración

gcloud deployment-manager deployments create deployment-with-startup-script --config config-with-many-templates.yaml

Prueba la 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 natIP.

  3. Abre el navegador y pega la dirección IP en la barra de direcciones.

Si se lo realiza de manera correcta, deberías ver una lista de directorios con los archivos en la máquina virtual.

Para obtener más información sobre las secuencias de comandos de inicio, lee la documentación Secuencias de comandos de inicio.

No borres la implementación

A diferencia de todas las otras secciones de esta guía, conserva esta implementación porque la necesitarás para el próximo paso.

Siguiente: Actualiza una implementación

Temas relacionados

¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...

Documentación de Cloud Deployment Manager