Ejecuta secuencias de comandos de inicio

Compute Engine te permite crear y ejecutar tus propias secuencias de comandos de inicio en las máquinas virtuales (VM) para realizar tareas automatizadas cada vez que se inicia tu instancia. Con las secuencias de comandos de inicio, se pueden realizar acciones como instalar software, realizar actualizaciones, activar servicios y cualquier otra tarea definida en la secuencia de comandos.

Por ejemplo, una secuencia de comandos de inicio simple con la que se instala y, luego, se inicia un servidor Apache puede verse así:

#! /bin/bash
apt update
apt install -y apache2
cat <<EOF > /var/www/html/index.html
<html><body><h1>Hello World</h1>
<p>This page was created from a simple startup script!</p>
</body></html>
EOF

Una secuencia de comandos de inicio se especifica mediante el servidor de metadatos, mediante claves de metadatos de la secuencia de comandos de inicio. Puedes usar la herramienta de línea de comandos de gcloud, la API o Google Cloud Console para proporcionar una secuencia de comandos de inicio.

Antes de comenzar

Permisos necesarios para esta tarea

Para realizar esta tarea, debes tener los siguientes permisos:

Ejecución de la secuencia de comandos de inicio

La instancia siempre ejecuta secuencias de comandos de inicio como raíz cuando la red está disponible.

Cualquier tipo de archivo puede ser una secuencia de comandos de inicio. Si hay una secuencia de comandos de inicio presente, Compute Engine hará lo siguiente:

  1. Copiar la secuencia de comandos de inicio en un archivo local en la instancia
  2. Establecer permisos en el archivo para hacerlo ejecutable
  3. Ejecutar el archivo

Podrías, por ejemplo, proporcionar una secuencia de comandos de Python, en lugar de una de Bash. Ten en cuenta que Compute Engine ejecutará la secuencia de comandos de forma literal, sin importar el tipo de secuencia de comandos.

Para ejecutar una secuencia de comandos que no sea de Bash, agrega una línea shebang (una línea que comience con #!) en la parte superior del archivo. Esto le indica al sistema operativo qué intérprete debe usar. Por ejemplo, si usas una secuencia de comandos de Python, puedes agregar la siguiente línea shebang:

#! /usr/bin/python

Usa una secuencia de comandos de inicio local

Una secuencia de comandos de inicio local es una secuencia de comandos ubicada en tu computadora local. Para usar una secuencia de comandos de inicio local, pasa un archivo de secuencia de comandos de inicio local a la instancia o proporciona el contenido de una secuencia de comandos de inicio al servidor de metadatos de forma directa. En los ejemplos de las siguientes subsecciones, se muestra cómo agregar metadatos de secuencia de comandos de inicio desde un archivo local o por entrada directa.

Las secuencias de comandos de inicio locales están sujetas al límite de longitud del valor de metadatos de 256 KB. Si tu secuencia de comandos de inicio excede este límite, no podrás cargarla de forma local. En cambio, guarda tu archivo en Cloud Storage y especifica la URL de la secuencia de comandos en el momento de creación de la instancia. Consulta la página sobre cómo usar una secuencia de comandos de inicio almacenada en Cloud Storage para obtener más información.

Proporciona un archivo de secuencia de comandos de inicio

Solo puedes pasar un archivo de secuencia de comandos de inicio local con la herramienta de línea de comandos de gcloud. Incluye la marca --metadata-from-file seguida de un par de claves de metadatos, startup-script=path-to-file, y reemplaza path-to-file por una ruta de acceso relativa a la secuencia de comandos de inicio:

gcloud compute instances create example-instance \
    --metadata-from-file startup-script=examples/scripts/install.sh

Proporciona contenido de secuencia de comandos de inicio de forma directa

Como alternativa, puedes usar Console, la herramienta de línea de comandos de gcloud o la API para escribir o pegar el contenido de tu secuencia de comandos de inicio de forma directa.

Console

En Cloud Console, especifica una secuencia de comandos de inicio de forma directa en la sección Secuencia de comandos de inicio:

  1. En Cloud Console ve a la página Instancias de VM.

    Ir a la página Instancias de VM

  2. Haz clic en Crear instancia.
  3. En la página Crear una instancia nueva, completa las propiedades que quieras para tu instancia. Para opciones de configuración avanzadas, expande la sección Administración, seguridad, discos, herramientas de redes, usuario único.
  4. En la sección Automatización, proporciona el contenido de tu secuencia de comandos de inicio en Secuencia de comandos de inicio.

    Captura de pantalla de la configuración de la secuencia de comandos de inicio en Cloud Console

  5. Haz clic en Crear para crear la instancia.

gcloud

Con la herramienta de línea de comandos de gcloud, especifica la marca --metadata para proporcionar el contenido de tu secuencia de comandos de inicio mediante el par clave-valor startup-script=contents y reemplaza contents por el contenido de tu secuencia de comandos de inicio.

Por ejemplo, el siguiente comando crea una instancia que, durante el inicio, realiza algunas actualizaciones del sistema, instala Apache y, también, inicia una sola página web. Puedes ejecutar este comando y, luego, visitar la dirección IP externa de la instancia para ver el contenido de la página index.html.

En una computadora de escritorio Linux, ejecuta el comando de la siguiente manera:

gcloud compute instances create example-instance --tags http-server \
--metadata startup-script='#! /bin/bash
# Installs apache and a custom homepage
sudo su -
apt update
apt install -y apache2
cat <<EOF > /var/www/html/index.html
<html><body><h1>Hello World</h1>
<p>This page was created from a simple start up script!</p>
</body></html>
EOF'

Si usas una computadora de escritorio Windows, puedes ejecutar este comando en una terminal cmd:

gcloud compute instances create example-instance --tags http-server --metadata startup-script="
apt update;
apt install -y apache2;
echo \"This page was created from a simple start up script!\" ^> /var/www/html/index.html"

Del mismo modo, si estás usando PowerShell, puedes ejecutar este comando con el marcador --% para pasar el comando exacto a la herramienta gcloud:

gcloud --% compute instances create example-instance --tags http-server --metadata startup-script="
apt update;
apt install -y apache2;
echo \"This page was created from a simple start up script!\" ^> /var/www/html/index.html"

API

En la API proporciona una secuencia de comandos de inicio como parte de la propiedad de los metadatos de tu solicitud, con startup-script como la clave de metadatos:

POST https://compute.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/instances

{
  ...
  "metadata": {
    "items": [
      {
       "key": "startup-script",
       "value": "#! /bin/bash\n\n# Installs apache and a custom homepage\napt update\napt install -y apache2\ncat <<EOF > /var/www/html/index.html\n<html><body><h1>Hello World</h1>\n<p>This page was created from a simple start up script!</p>\n</body></html>"
      }
    ]
  }
  ...
}

Proporciona una secuencia de comandos de inicio para instancias de Windows

Puedes ejecutar secuencias de comandos de inicio en instancias de Windows con claves de metadatos específicas de Windows. Elige cualquiera de las claves de metadatos especializadas que se enumeran en la siguiente tabla. Cada clave de metadatos debe coincidir con el tipo de secuencia de comandos que deseas ejecutar. También puedes especificar varias secuencias de comandos si pasas diferentes claves de metadatos a tu instancia. Solo puedes especificar cada clave de metadatos una vez para cada instancia de VM.

Si necesitas ejecutar manualmente las secuencias de comandos de inicio en una instancia de VM después de que esta se inició, un administrador podrá hacerlo con el siguiente comando:

C:\Program Files\Google\Compute Engine\metadata_scripts\run_startup_scripts.cmd

En la siguiente tabla, se muestran los tipos de secuencias de comandos de inicio compatibles, cuándo se ejecutan y qué clave de metadatos usar para especificar la secuencia de comandos. Para obtener información sobre cómo usar estas claves de metadatos, consulta la página Usa una secuencia de comandos de inicio local. Ten en cuenta que estas secuencias de comandos solo se ejecutan si preparas tu imagen con el comando GCESysprep.

Tipo de secuencia de comandos Se ejecuta:
  • Durante GCESysprep 2
  • Antes del inicio
Se ejecuta:
  • Después de que se completa GCESysprep 2
  • En cada inicio posterior
Secuencia de comandos de inicio url Clave de metadatos:
sysprep-specialize-script-url
Clave de metadatos:
windows-startup-script-url
Secuencia de comandos de inicio cmd Clave de metadatos:
sysprep-specialize-script-cmd
Clave de metadatos:
windows-startup-script-cmd
Secuencia de comandos de inicio bat Clave de metadatos:
sysprep-specialize-script-bat
Clave de metadatos:
windows-startup-script-bat
Secuencia de comandos de inicio ps11 Clave de metadatos:
sysprep-specialize-script-ps1
Clave de metadatos:
windows-startup-script-ps1

Proporciona una secuencia de comandos de inicio almacenada en Cloud Storage

Puedes almacenar tu secuencia de comandos en Cloud Storage y proporcionar la URL a la secuencia de comandos cuando creas tu instancia. Esto te permite acceder a tu secuencia de comandos de inicio desde cualquier lugar y, también, omite el límite del servidor de metadatos.

Establece permisos de acceso a tu secuencia de comandos

Antes de poder usar una secuencia de comandos de inicio desde Cloud Storage, debes tener permiso para acceder a la secuencia de comandos. Comprueba la configuración de control de acceso en el depósito y en el archivo para asegurarte de tener permiso.

Según la configuración predeterminada, si eres propietario o editor de un proyecto, deberías poder acceder a los archivos del mismo proyecto, a menos que haya controles de acceso explícitos que no lo permitan.

Proporciona una secuencia de comandos de inicio

  1. Crea un depósito. Puedes crear un depósito nuevo o usar uno existente. Para obtener instrucciones sobre cómo crear un depósito nuevo, consulta Crea un depósito en Google Cloud Console o Crear un depósito en gsutil.
  2. Sube el archivo al depósito. Sigue las instrucciones para usar gsutil o Cloud Console a fin de subir un objeto.
  3. Proporciona la URL al archivo de la secuencia de comandos de inicio cuando crees una instancia nueva.

    Console

    1. En Google Cloud Console, ve a la página Instancias de VM.

      Ir a la página Instancias de VM

    2. Haz clic en Crear instancia.
    3. En la página Crear una instancia nueva, completa las propiedades que quieras para tu instancia.
    4. En la sección Identidad y acceso a la API, selecciona una cuenta de servicio que tenga acceso para leer tu archivo de secuencia de comandos de inicio en Cloud Storage. Por ejemplo, la cuenta de servicio debería tener la función de visualizador de objetos de almacenamiento.
    5. Expande la sección Administración, seguridad, discos, redes, usuario único.
    6. En la sección Metadatos, proporciona startup-script-url como clave de metadatos.
    7. En el cuadro Valor, ingresa una URL para el archivo de secuencia de comandos de inicio, ya sea en formato gs://[BUCKET]/[FILE] o https://storage.googleapis.com/[BUCKET]/[FILE].
      1. Haz clic en Crear para crear la instancia.

    gcloud

    Con la herramienta de línea de comandos gcloud, crea una instancia con las marcas --scopes y --metadata, y especifica la clave startup-script-url. La marca --scopes le da a la máquina virtual acceso a Cloud Storage para descargar la secuencia de comandos de inicio. Puedes proporcionar la URL de Cloud Storage a la secuencia de comandos en el formato gs://bucket/file o https://storage.googleapis.com/bucket/file.

    gcloud compute instances create example-instance --scopes storage-ro \
        --metadata startup-script-url=gs://bucket/startupscript.sh
    

    API

    En la API proporciona una secuencia de comandos de inicio como parte de la propiedad de metadatos de tu solicitud, con startup-script-url como la clave de los metadatos. Proporciona también una lista de scopes, con un alcance de Cloud Storage para que la máquina virtual pueda acceder al archivo de la secuencia de comandos de inicio:

    POST https://compute.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/instances
    
    {
      ...
      "serviceAccounts": [
        {
          "email": "default",
          "scopes": [
            "https://www.googleapis.com/auth/devstorage.read_only"
          ]
        }
      ],
      "metadata": {
        "items": [
          {
           "key": "startup-script-url",
           "value": "gs://bucket/myfile"
          }
        ]
      },
      "tags": {
        "items": []
      },
      "machineType": "zones/us-central1-a/machineTypes/n1-standard-1",
      "name": "example-instance"
    }
    

    Windows

    Con la herramienta de línea de comandos gcloud, crea una instancia con las marcas --scopes y --metadata, y especifica la clave windows-startup-script-url. La marca --scopes le da acceso a Cloud Storage a la máquina virtual para descargar la secuencia de comandos de inicio. Puedes proporcionar la URL de Cloud Storage a la secuencia de comandos en el formato gs://bucket/file o https://storage.googleapis.com/bucket/file.

    gcloud compute instances create example-windows-instance --scopes storage-ro \
        --metadata windows-startup-script-url=gs://bucket/startupscript.ps1
    

Aplica una secuencia de comandos de inicio a instancias en ejecución

Si tienes una instancia en ejecución, agrega una secuencia de comandos de inicio a la instancia, y la próxima vez que se reinicie, se ejecutará la secuencia de comandos de inicio. La secuencia de comandos de inicio también se ejecutará en todos los reinicios posteriores.

Sigue estas instrucciones para configurar una secuencia de comandos de inicio en una instancia en ejecución.

Console

  1. En Google Cloud Console, ve a la página Instancias de VM.

    Ir a la página Instancias de VM

  2. Haz clic en la instancia para la que deseas agregar una secuencia de comandos de inicio. Se mostrará la página de detalles de la instancia.
  3. En la página de detalles de la instancia, completa los siguientes pasos:

    1. Haz clic en el botón Editar en la parte superior de la página.
    2. En Metadatos personalizados, haz clic en Agregar elemento.
    3. Agrega tu secuencia de comandos de inicio con una de las siguientes claves:

      • startup-script: con esta clave, puedes proporcionar el contenido de la secuencia de comandos de inicio de forma directa.
      • startup-script-url: con esta clave, puedes proporcionar una URL de Cloud Storage al archivo de secuencia de comandos de inicio.

gcloud

Con la herramienta de línea de comandos gcloud, usa instances add-metadata para agregar metadatos a la instancia. Usa cualquiera de las claves disponibles de la secuencia de comandos de inicio:

  • --metadata startup-script=CONTENTS: con esta clave, puedes proporcionar el contenido de la secuencia de comandos de inicio de forma directa.
  • --metadata startup-script-url=URL: con esta clave, puedes proporcionar una URL de Cloud Storage al archivo de secuencia de comandos de inicio.
  • --metadata-from-file startup-script=FILE: proporciona un archivo de secuencia de comandos de inicio almacenado de forma local.

Por ejemplo:

gcloud compute instances add-metadata example-instance \
    --metadata-from-file startup-script=path/to/file
gcloud compute instances add-metadata example-instance \
    --metadata startup-script-url=gs://bucket/file

API

En la API realiza una solicitud al método instances().setMetadata y proporciona los nuevos metadatos y un valor fingerprint.

Una huella digital es una string aleatoria de caracteres que genera Compute Engine y se usa para realizar un bloqueo optimista. Proporciona el valor de huella digital correspondiente para realizar tu solicitud. La huella digital cambia después de cada solicitud, y si proporcionas una huella digital que no coincida, se rechaza tu solicitud. De esta forma, solo se puede realizar una actualización a la vez, y se evitan colisiones.

Para obtener la huella digital actual de una instancia, realiza una solicitud instances().get y copia el valor de la huella digital:

GET https://compute.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/instances/example-instance
{

 ...
 "name": "example-instance",
 "metadata": {
  "kind": "compute#metadata",
  "fingerprint": "zhma6O1w2l8="
 },
 "...
}

A continuación, realiza una solicitud al método instances().setMetadata con una de las siguientes claves de metadatos y el valor de la huella digital:

  • startup-script: con esta clave, puedes proporcionar el contenido de la secuencia de comandos de inicio de forma directa.
  • startup-script-url: con esta clave, puedes proporcionar una URL de Cloud Storage al archivo de la secuencia de comandos de inicio.

Por ejemplo:

POST https://compute.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/instances/example-instance/setMetadata

    {
     "fingerprint": "zhma6O1w2l8=",
     "items": [
      {
       "key": "startup-script-url",
       "value": "gs://bucket/file"
      }
     ]
    }

Vuelve a ejecutar una secuencia de comandos de inicio

Para volver a ejecutar tus secuencias de comandos de inicio en tu instancia de VM, conéctate a la instancia y ejecuta uno de los siguientes comandos:

En imágenes de Debian, CentOS y RHEL

sudo google_metadata_script_runner startup

GCEMetadataScripts: Starting startup scripts (version YYMMDD.NN).
GCEMetadataScripts: Found startup-script in metadata.
GCEMetadataScripts: startup-script exit status 0
GCEMetadataScripts: Finished running startup scripts.

En imágenes de Container-Optimized OS, Ubuntu y SLES

sudo google_metadata_script_runner --script-type startup --debug

Visualiza los registros de las secuencias de comandos de inicio

El resultado de la secuencia de comandos de inicio se escribe en los siguientes archivos de registro:

CentOS y RHEL: /var/log/messages Debian: /var/log/daemon.log Ubuntu: /var/log/syslog SLES: /var/log/messages

También puedes usar el comando journalctl para ver el resultado de la secuencia de comandos de inicio.

sudo journalctl -u google-startup-scripts.service

Establece valores personalizados en secuencias de comandos de inicio

Cuando ejecutas secuencias de comandos de inicio en instancias, puede haber casos en los que te gustaría usar valores personalizados en tu secuencia de comandos de inicio. Por ejemplo, es posible que desees ejecutar una secuencia de comandos de inicio en diferentes instancias y que cada instancia muestre un mensaje personalizado.

Puedes especificar estos valores personalizados como pares clave-valor de metadatos personalizados en el momento de creación de la instancia y hacer referencia a ellos en tus secuencias de comandos de inicio. Para obtener más información sobre la creación de claves de metadatos personalizados, lee la página Establece metadatos personalizados.

Después de establecer un par de claves de metadatos personalizados, puedes modificar tu secuencia de comandos de inicio para consultar los nuevos metadatos. Por ejemplo, la secuencia de comandos anterior se puede modificar de la siguiente manera:

#! /bin/bash
VALUE_OF_FOO=$(curl http://metadata.google.internal/computeMetadata/v1/instance/attributes/foo -H "Metadata-Flavor: Google")
apt update
apt install -y apache2
cat <<EOF > /var/www/html/index.html
<html><body><h1>Hello World</h1>
<p>The value of foo: $VALUE_OF_FOO</p>
</body></html>
EOF

Solución de problemas

Conexión de red al servidor de metadatos

De forma específica para las máquinas virtuales de Linux, Compute Engine espera una conexión con el servidor de metadatos antes de intentar obtener información, como una secuencia de comandos personalizada de inicio o cierre del servidor de metadatos. Si el servidor de metadatos no responde, o la red aún no está configurada, la máquina virtual no termina de iniciarse.

De forma específica para máquinas virtuales Linux con imágenes anteriores a v20160606, la salida del puerto en serie muestra "Waiting for metadata server, attempt N", en el que N es el número de intentos realizados.

Este problema puede durar hasta siete minutos debido a un problema de red transitorio que debería resolverse por sí solo. Si el problema no se resuelve solo después de siete minutos, vuelve a crear tu instancia de máquina virtual.

Próximos pasos