Ejecuta secuencias de comandos de inicio

Crea y ejecuta tus propias secuencias de comandos de inicio en tus máquinas virtuales (VM) para realizar tareas automáticas cada vez que se inicia tu instancia. Las secuencias de comandos de inicio pueden realizar muchas acciones, como instalar software, realizar actualizaciones, activar servicios y cualquier otra tarea que se defina en la secuencia de comandos. Puedes usar secuencias de comandos de inicio para personalizar de manera fácil y programática tus instancias de VM, incluso en el momento de creación de instancias nuevas.

Por ejemplo, una secuencia de comandos de inicio simple que instala y, luego, inicia un servidor Apache podría verse así:

#! /bin/bash
apt-get update
apt-get 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>

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

Antes de comenzar

Permisos necesarios para esta tarea

Para realizar esta tarea, debes contar con los siguientes permisos:

Ejecución de 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, 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 Bash, agrega una línea shebang en la parte superior del archivo para que el sistema operativo sepa qué intérprete usar. Por ejemplo, para una secuencia de comandos de Python, puedes agregar una línea shebang como la que se muestra a continuación:

#! /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 gcloud. Incluye la marca --metadata-from-file, seguida de un par de claves de metadatos, startup-script=PATH/TO/FILE, en el que PATH/TO/FILE es una ruta de acceso en relación con 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 gcloud o la API para escribir o pegar el contenido de tu secuencia de comandos de inicio de forma directa.

Console

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

  1. En GCP Console, ve a la página VM Instances.

    Ir a la página Instancias de VM

  2. Haz clic en Crear instancia.
  3. En la página Crear una instancia nueva, llena las propiedades que quieras para tu instancia. Para ver las opciones de configuración avanzadas, amplía la sección Administración, seguridad, discos, redes, un solo inquilino.
  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 GCP Console

  5. Haz clic en Crear para crear la instancia.

gcloud

Con la herramienta de línea de comandos gcloud, especifica la marca --metadata para proporcionar el contenido de tu secuencia de comandos de inicio. Hazlo con el par de claves startup-script=[CONTENTS], donde [CONTENTS] es 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-get update
apt-get 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-get update;
apt-get 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-get update;
apt-get 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 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-get update\napt-get 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 entre cualquiera de las claves especializadas que se enumeran a continuación. Cada clave debe coincidir con el tipo de secuencia de comandos que deseas ejecutar. También puedes especificar varias secuencias de comandos mediante el traspaso de diferentes claves a tu instancia. Cada clave se puede especificar solo una vez por instancia.

Si necesitas ejecutar las secuencias de comandos de inicio en una instancia de VM de forma manual después de que haya comenzado, puedes hacerlo con la siguiente ruta de acceso:

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

Las siguientes claves se pueden usar con una secuencia de comandos de inicio local, con las mismas instrucciones que se indicaron más arriba.

Tipo de secuencias 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 sysprep-specialize-script-url windows-startup-script-url
Secuencia de comandos de inicio cmd sysprep-specialize-script-cmd windows-startup-script-cmd
Secuencia de comandos de inicio bat sysprep-specialize-script-bat windows-startup-script-bat
Secuencia de comandos de inicio ps11 sysprep-specialize-script-ps1 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 cómo crear un depósito en Google Cloud Platform Console o crear un depósito en gsutil.
  2. Sube el archivo al depósito. Sigue las instrucciones para usar gsutil o GCP Console a fin de subir un objeto.
  3. Proporciona la URL al archivo de la secuencia de comandos de inicio cuando creas una instancia nueva.

    Console

    1. En GCP Console, ve a la página VM Instances.

      Ir a la página Instancias de VM

    2. Haz clic en Crear instancia.
    3. En la página Crear una instancia nueva, llena las propiedades que quieras para tu instancia. Para ver las opciones de configuración avanzadas, amplía la sección Administración, seguridad, discos, redes, un solo inquilino.
    4. En la sección Metadatos, proporciona startup-script-url como clave de metadatos.
    5. 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].
    6. 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 servicios debería tener la función de Visualizador de objetos de almacenamiento.
    7. 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 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 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. Ve 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 pasos siguientes:

    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 de secuencia de comandos de inicio disponibles:

  • --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 Google 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 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, RHEL, SLES, Container-Optimized OS y Ubuntu

sudo google_metadata_script_runner --script-type startup --debug

startup-script: INFO Starting startup scripts.
startup-script: INFO startup-script: Return code 0.
startup-script: INFO Finished running startup scripts.

En Container-Optimized OS, 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

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

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 sobre cómo establecer 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-get update
apt-get 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

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

Enviar comentarios sobre...

Documentación de Compute Engine