Ejecuta secuencias de comandos de inicio


Compute Engine te permite crear y ejecutar tus propias secuencias de comandos de inicio en las instancias de máquina virtual (VM) para realizar tareas automatizadas cada vez que la instancia se inicia. Con las secuencias de comandos de inicio, se pueden realizar distintas 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 con la que se instala y, luego, se inicia un servidor Apache puede verse así:

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

Para especificar una secuencia de comandos de inicio, debes usar claves de metadatos de secuencia de comandos de inicio con el servidor de metadatos. Puedes usar Google Cloud Console, la herramienta de línea de comandos de gcloud o la API de Compute Engine 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:

Ejecuta una secuencia de comandos de inicio

La instancia siempre ejecuta secuencias de comandos de inicio como raíz después de que 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 hace lo siguiente:

  1. Copia la secuencia de comandos de inicio en un archivo local en la instancia.
  2. Establece permisos de ejecución en el archivo.
  3. Ejecuta 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 ejecuta la secuencia de comandos de manera literal, sin importar el tipo.

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 la 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 directamente. 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 extensión de los valores de metadatos de 256 KB. Si tu secuencia de comandos de inicio supera este límite, no puedes cargarla de forma local. En cambio, guarda tu archivo en Cloud Storage y especifica la URL de la secuencia de comandos durante la creación de la instancia. Para obtener más información, consulta Proporciona una secuencia de comandos de inicio almacenada en Cloud Storage.

Proporciona un archivo de secuencia de comandos de inicio

Solo puedes pasar un archivo de secuencia de comandos de inicio local mediante 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 directamente

Como alternativa, puedes usar Google Cloud Console, la herramienta de línea de comandos de gcloud o la API de Compute Engine para escribir o pegar el contenido de tu secuencia de comandos de inicio directamente.

Console

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

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

    Ir a 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, en Secuencia de comandos de inicio, proporciona el contenido de tu secuencia de comandos de inicio.

    Configura una 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, usa la marca --metadata para proporcionar el contenido de tu secuencia de comandos de inicio con el par clave-valor startup-script=contents y reemplaza contents por el contenido de la 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 -y install apache2
  cat <<EOF > /var/www/html/index.html
  <html><body><h1>Hello World</h1>
  <p>This page was created from a 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 -y install apache2;
  echo \"This page was created from a start up script.\" ^> /var/www/html/index.html"

Del mismo modo, si usas PowerShell, puedes ejecutar este comando con el carácter especial para dejar de analizar (--%) a fin de pasar un comando exacto a la herramienta de gcloud:

gcloud --% compute instances create example-instance --tags http-server \
  --metadata startup-script="
  apt update;
  apt -y install apache2;
  echo \"This page was created from a 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 -y install apache2\ncat <<EOF > /var/www/html/index.html\n<html><body><h1>Hello World</h1>\n<p>This page was created from a 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 mediante claves de metadatos únicas y 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. Puedes especificar cada clave de metadatos solo una vez para cada instancia de VM.

Si necesitas ejecutar de forma manual las secuencias de comandos de inicio en una instancia de VM, un administrador puede 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 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 GCESysprep2
  • Antes del inicio
Se ejecuta:
  • Una vez que se completa GCESysprep2
  • 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 la 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.

De forma predeterminada, si eres propietario o editor de un proyecto, puedes 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 o usar uno existente. Para obtener más información sobre cómo crear un depósito, consulta Crea un depósito en Google Cloud Console o Crea 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 secuencia de comandos de inicio cuando crees una instancia.

    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 debe tener los permisos de 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, proporciona una URL al archivo de secuencia de comandos de inicio, ya sea en formato gs://BUCKET/FILE o https://storage.googleapis.com/BUCKET/FILE.

    8. Haz clic en Crear para crear la instancia.

    gcloud

    Con la herramienta de línea de comandos de gcloud, crea una instancia con las marcas --scopes y --metadata, y especifica la clave startup-script-url. La marca --scopes le otorga a la VM 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/FILE.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. Además, proporciona una lista de scopes que incluya un permiso de Cloud Storage para que la VM pueda acceder al archivo de 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/FILE"
          }
        ]
      },
      "tags": {
        "items": []
      },
      "machineType": "zones/us-central1-a/machineTypes/e2-medium",
      "name": "example-instance"
    }
    

    Windows

    Con la herramienta de línea de comandos de gcloud, crea una instancia con las marcas --scopes y --metadata, y especifica la clave windows-startup-script-url. La marca --scopes le otorga a la VM 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-windows-instance --scopes storage-ro \
      --metadata windows-startup-script-url=gs://BUCKET/FILE.ps1
    

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

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

Completa las siguientes 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 a la que deseas agregar una secuencia de comandos de inicio.

  3. En la página de detalles de la instancia, completa los siguientes pasos:

    1. Haz clic en el botón Editar.
    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: Proporciona el contenido de la secuencia de comandos de inicio directamente con esta clave.
      • startup-script-url: Proporciona una URL de Cloud Storage al archivo de secuencia de comandos de inicio con esta clave.

gcloud

Con la herramienta de línea de comandos de gcloud, usa el comando 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: Proporciona el contenido de la secuencia de comandos de inicio directamente con esta clave.
  • --metadata startup-script-url=URL: Proporciona una URL de Cloud Storage al archivo de secuencia de comandos de inicio con esta clave.
  • --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 generada por Compute Engine que se usa para realizar un bloqueo optimista. Proporciona el valor de la huella digital correspondiente para realizar la solicitud. La huella digital cambia después de cada solicitud, y, si proporcionas una huella digital que no coincide, se rechaza la solicitud. De esta forma, solo se puede realizar una actualización a la vez, lo que evita que se generen colisiones.

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

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

Luego, copia el valor de la huella digital:

{

 ...
 "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: Proporciona el contenido de la secuencia de comandos de inicio directamente con esta clave.
  • startup-script-url: Proporciona una URL de Cloud Storage al archivo de secuencia de comandos de inicio con esta clave.

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 la 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 situaciones en las que desees usar valores personalizados en la 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 imprima un mensaje personalizado.

Puedes especificar estos valores personalizados como pares clave-valor de metadatos durante la 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, consulta 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 metadatos nuevos. 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 -y install 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

Próximos pasos