Usa secuencias de comandos de inicio en VM de Linux


Una secuencia de comandos de inicio es un archivo que realiza tareas durante el proceso de inicio de una instancia de máquina virtual (VM). Las secuencias de comandos de inicio se pueden aplicar a todas las VM de un proyecto o a una sola VM. Las secuencias de comandos de inicio especificadas en los metadatos a nivel de VM anulan las secuencias de comandos de inicio que se especifican en los metadatos a nivel de proyecto, y estas solo se ejecutan cuando hay una red disponible. En este documento, se describe cómo usar secuencias de comandos de inicio en instancias de VM de Linux. Si deseas obtener información para agregar una secuencia de comandos de inicio a nivel de proyecto, consulta gcloud compute project-info add-metadata.

Para las secuencias de comandos de inicio de Linux, puedes utilizar los archivos bash o no bash. Para usar un archivo que no sea bash, designa el intérprete mediante la adición de un #! a la parte superior del archivo. Por ejemplo, para usar una secuencia de comandos de inicio de Python 3, agrega #! /usr/bin/python3 en la parte superior del archivo.

Si especificas una secuencia de comandos de inicio con uno de los procedimientos de este documento, Compute Engine hace lo siguiente:

  1. Copia la secuencia de comandos de inicio en la VM.

  2. Configura los permisos de ejecución en la secuencia de comandos de inicio.

  3. Ejecuta la secuencia de comandos de inicio como el usuario root cuando se inicia la VM.

Para obtener información sobre las diversas tareas relacionadas con las secuencias de comandos de inicio y cuándo realizar cada una, consulta Descripción general.

Antes de comenzar

  • Lee la descripción general de las secuencias de comandos de inicio.
  • Lee sobre el servidor de metadatos.
  • Si aún no lo hiciste, configura la autenticación. La autenticación es el proceso mediante el cual se verifica tu identidad para acceder a los servicios y las API de Google Cloud. Para ejecutar código o muestras desde un entorno de desarrollo local, puedes autenticarte en Compute Engine de la siguiente manera.

    Selecciona la pestaña para saber cómo planeas usar las muestras en esta página:

    Consola

    Cuando usas la consola de Google Cloud para acceder a los servicios y las APIs de Google Cloud, no necesitas configurar la autenticación.

    gcloud

    1. Instala Google Cloud CLI y, luego, inicializa la ejecución del siguiente comando:

      gcloud init
    2. Configura una región y una zona predeterminadas.

    REST

    Para usar las muestras de la API de REST en esta página en un entorno de desarrollo local, debes usar las credenciales que proporcionas a la CLI de gcloud.

      Instala Google Cloud CLI y, luego, inicializa la ejecución del siguiente comando:

      gcloud init

Claves de metadatos para secuencias de comandos de inicio de Linux

Se pasa una secuencia de comandos de inicio a una VM desde una ubicación que se especifica mediante una clave de metadatos. Una clave de metadatos especifica si la secuencia de comandos de inicio se almacena de forma local, en Cloud Storage o si se pasa directamente a la VM. La clave de metadatos que uses también puede depender del tamaño de la secuencia de comandos de inicio.

En la siguiente tabla, se muestran las claves de metadatos que puedes usar para las secuencias de comandos de inicio de Linux y se proporciona información sobre qué clave usar según la ubicación de almacenamiento y el tamaño de la secuencia de comandos de inicio.

Clave de metadatos Usos
startup-script Pasa una secuencia de comandos de inicio bash o no bash que se almacena localmente o se agrega directamente y que tiene un tamaño de hasta 256 KB
startup-script-url Pasa una secuencia de comandos de inicio bash o no bash que se almacena en Cloud Storage y que tiene un tamaño superior a 256 KB La string que ingreses aquí se usará tal como está para ejecutar gsutil. Si tu startup-script-url contiene caracteres de espacio, no reemplaces los espacios por %20 ni agregues comillas dobles ("") a la string startup-script-url.

Orden de ejecución de las secuencias de comandos de inicio de Linux

Puedes usar múltiples secuencias de comandos de inicio. Las secuencias de comandos de inicio almacenadas de forma local o agregadas directamente se ejecutan antes que las secuencias de comandos de inicio almacenadas en Cloud Storage. En la siguiente tabla, se muestra, según la clave de metadatos, el orden de ejecución de las secuencias de comandos de inicio para Linux.

Clave de metadatos Orden de ejecución
startup-script Primero durante cada inicio después del primer inicio
startup-script-url Segundo durante cada inicio después del primer inicio

Pasa una secuencia de comandos de inicio de Linux directamente

Puedes agregar el contenido de una secuencia de comandos de inicio directamente a una VM cuando la creas. En los siguientes procedimientos, se muestra cómo crear una VM con una secuencia de comandos de inicio que instala Apache y crea una página web básica.

Console

Pasa una secuencia de comandos de inicio de Linux directamente a una VM nueva

  1. En la consola de Google Cloud, ve a la página Crear una instancia.

    Ir a Crear una instancia

  2. En Disco de arranque, elige Cambiar y, luego, un sistema operativo Linux.

  3. Expande la sección Opciones avanzadas y sigue estos pasos:

    1. Expande la sección Administración.
    2. En la sección Automatización, agrega la siguiente secuencia de comandos de inicio:

       #! /bin/bash
       apt update
       apt -y install apache2
       cat <<EOF > /var/www/html/index.html
       <html><body><p>Linux startup script added directly.</p></body></html>
       EOF
      
  4. Haga clic en Crear.

Pasar una secuencia de comandos de inicio de Linux directamente a una VM existente

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

    Ir a Instancias de VM

  2. Haz clic en el nombre de la VM.

  3. Haga clic en Editar.

  4. En Automatización, agrega el contenido de tu secuencia de comandos de inicio.

Verifica la secuencia de comandos de inicio

Después de que se inicie la VM, consulta la IP externa en un navegador web para verificar que la secuencia de comandos de inicio haya creado el sitio web. Es posible que debas esperar alrededor de 1 minuto para que finalice la secuencia de comandos de inicio de muestra.

gcloud

Pasa una secuencia de comandos de inicio de Linux directamente a una VM nueva

Pasa el contenido de una secuencia de comandos de inicio directamente a una VM cuando la crees mediante el siguiente comando gcloud compute instances create.

gcloud compute instances create VM_NAME \
  --image-project=debian-cloud \
  --image-family=debian-10 \
  --metadata=startup-script='#! /bin/bash
  apt update
  apt -y install apache2
  cat <<EOF > /var/www/html/index.html
  <html><body><p>Linux startup script added directly.</p></body></html>
  EOF'

Reemplaza VM_NAME por el nombre de la VM.

Pasar una secuencia de comandos de inicio de Linux directamente a una VM existente

Agrega la secuencia de comandos de inicio directamente a una VM existente con el siguiente comando gcloud compute instances add-metadata:

gcloud compute instances add-metadata VM_NAME \
    --zone=ZONE \
    --metadata=startup-script='#! /bin/bash
    apt update
    apt -y install apache2
    cat <<EOF > /var/www/html/index.html
    <html><body><p>Linux startup script added directly.</p></body></html>
    EOF'

Reemplaza lo siguiente:

  • VM_NAME: El nombre de la VM

  • ZONE: La zona de la VM

Verifica la secuencia de comandos de inicio

Después de que se inicie la VM, consulta la IP externa en un navegador web para verificar que la secuencia de comandos de inicio haya creado el sitio web. Es posible que debas esperar alrededor de 1 minuto para que finalice la secuencia de comandos de inicio de muestra.

REST

Pasa una secuencia de comandos de inicio de Linux directamente a una VM nueva

Pasa el contenido de una secuencia de comandos de inicio directamente a una VM cuando la crees mediante el siguiente método instances.insert.

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances

{
  ...
  "networkInterfaces": [
    {
      "accessConfigs": [
        {
          "type": "ONE_TO_ONE_NAT"
        }
      ]
    }
  ],
  "metadata": {
    "items": [
      {
        "key": "startup-script",
        "value": "#! /bin/bash\napt update\napt -y install apache2\ncat <<EOF > /var/www/html/index.html\n<html><body><p>Linux startup script added directly.</p></body></html>\nEOF"
      }
    ]
  },
  ...
}

Reemplaza lo siguiente:

  • PROJECT_ID: El ID del proyecto

  • ZONE: Es la zona en la que se creará la VM.

Pasar una secuencia de comandos de inicio de Linux directamente a una VM existente

  1. Obtén el valor tags.fingerprint de la VM mediante el método instances.get.

    GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME
    

    Reemplaza lo siguiente:

    • PROJECT_ID: El ID del proyecto

    • ZONE: La zona de la VM

    • VM_NAME: La zona de la VM

  2. Pasa la secuencia de comandos de inicio con el valor fingerprint, junto con el valor y la clave de metadatos de la secuencia de comandos de inicio, en una llamada al método instances.setMetadata:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/setMetadata
    
    {
      "fingerprint": FINGERPRINT,
      "items": [
        {
          "key": "startup-script",
          "value": "#! /bin/bash\napt update\napt -y install apache2\ncat <<EOF > /var/www/html/index.html\n<html><body><p>Linux startup script added directly.</p></body></html>\nEOF"
        }
      ],
      ...
    }
    

    Reemplaza lo siguiente:

    • PROJECT_ID: El ID del proyecto

    • ZONE: La zona de la VM

    • VM_NAME: La zona de la VM

    • FINGERPRINT: el valor tags.fingerprint obtenido mediante el método instances.get

Verifica la secuencia de comandos de inicio

Después de que se inicie la VM, consulta la IP externa en un navegador web para verificar que la secuencia de comandos de inicio haya creado el sitio web. Es posible que debas esperar alrededor de 1 minuto para que finalice la secuencia de comandos de inicio de muestra.

Pasa una secuencia de comandos de inicio de Linux desde un archivo local

Puedes almacenar una secuencia de comandos de inicio en un archivo local en tu estación de trabajo y pasar el archivo local como metadatos a una VM cuando la creas. No puedes usar archivos almacenados en VM como secuencias de comandos de inicio.

Antes de pasar una secuencia de comandos de inicio de Linux desde un archivo local a una VM, haz lo siguiente:

  1. Crea un archivo local para almacenar la secuencia de comandos de inicio.

  2. Ten en cuenta la ruta de acceso relativa de la CLI de gcloud a la secuencia de comandos de inicio.

  3. Agrega la siguiente secuencia de comandos de inicio al archivo:

    #! /bin/bash
    apt update
    apt -y install apache2
    cat <<EOF > /var/www/html/index.html
    <html><body><p>Linux startup script from a local file.</p></body></html>
    EOF
    

gcloud

Pasa una secuencia de comandos de inicio de Linux desde un archivo local a una VM nueva

Crea una VM y pasa el contenido de un archivo local que se usará como secuencia de comandos de inicio mediante el comando gcloud compute instances create con la marca --metadata-from-file:

gcloud compute instances create VM_NAME \
  --image-project=debian-cloud \
  --image-family=debian-10 \
  --metadata-from-file=startup-script=FILE_PATH

Reemplaza lo siguiente:

  • VM_NAME: El nombre de la VM

  • FILE_PATH: La ruta de acceso relativa al archivo de secuencia de comandos de inicio

Pasa una secuencia de comandos de inicio de Linux de un archivo local a una VM existente

Pasa una secuencia de comandos de inicio a una VM existente desde un archivo local con el siguiente comando gcloud compute instances add-metadata:

gcloud compute instances add-metadata VM_NAME \
  --zone=ZONE \
  --metadata-from-file startup-script=FILE_PATH

Reemplaza lo siguiente:

  • VM_NAME: El nombre de la VM

  • ZONE: La zona de la VM

  • FILE_PATH: La ruta de acceso relativa al archivo de secuencia de comandos de inicio

Verifica la secuencia de comandos de inicio

Visualiza la IP externa en un navegador web para verificar que la secuencia de comandos de inicio creó el sitio web. Es posible que debas esperar alrededor de 1 minuto para que finalice la secuencia de comandos de inicio de muestra.

Pasa una secuencia de comandos de inicio de Linux desde Cloud Storage

Puedes almacenar una secuencia de comandos de inicio en Cloud Storage y pasarla a una VM cuando la crees. Después de agregar una secuencia de comandos de inicio a Cloud Storage, tendrás una URL que puedes usar para hacer referencia a la secuencia de comandos de inicio cuando crees una VM.

Antes de agregar una secuencia de comandos de inicio desde un bucket de Cloud Storage, haz lo siguiente:

  1. Crea un archivo para almacenar la secuencia de comandos de inicio. En este ejemplo, se usa un archivo bash (.sh).

  2. Agrega lo siguiente al archivo bash, que instala Apache y crea una página web simple:

    #! /bin/bash
    apt update
    apt -y install apache2
    cat <<EOF > /var/www/html/index.html
    <html><body><p>Linux startup script from Cloud Storage.</p></body></html>
    EOF
    
  3. Crea depósitos de almacenamiento.

  4. Sube el archivo al bucket de Cloud Storage.

Implicaciones de seguridad

  • De forma predeterminada, los propietarios y editores del proyecto pueden acceder a los archivos de Cloud Storage en el mismo proyecto, a menos que haya controles de acceso explícitos que no lo permitan.

  • Si el objeto o bucket de Cloud Storage es menos seguro que los metadatos, existe el riesgo de una elevación de privilegios si se modifica la secuencia de comandos de inicio y la VM se reinicia. Esto se debe a que, después de reiniciar la VM, la secuencia de comandos de inicio se ejecuta como root y puede usar los permisos de la cuenta de servicio conectada para acceder a otros recursos.

Limitaciones

Console

Pasa una secuencia de comandos de inicio almacenada en Cloud Storage a una VM nueva

  1. En la consola de Google Cloud, ve a la página Crear una instancia.

    Ir a Crear una instancia

  2. Especifica los detalles de la VM.

  3. En Disco de arranque, elige Cambiar y, luego, un sistema operativo Linux.

  4. En la sección Identidad y acceso a la API, elige una cuenta de servicio que tenga la función Visualizador de objetos de Storage (roles/storage.objectViewer).

  5. Expande la sección Opciones avanzadas y sigue estos pasos:

    1. Expande la sección Administración.
    2. En la sección Metadatos, agrega valores para lo siguiente:

      • Clave: Es la clave de metadatos. Configúrala como startup-script-url para agregar una secuencia de comandos de inicio desde Cloud Storage.

      • Valor: El valor de los metadatos. Configúralo en la ubicación de Cloud Storage del archivo de secuencia de comandos de inicio con uno de los siguientes formatos:

        • URL autenticadahttps://storage.googleapis.com/BUCKET/FILE
        • URI de gsutilgs://BUCKET/FILE

        Reemplaza lo siguiente:

        • BUCKET: Es el nombre del bucket que contiene el archivo de la secuencia de comandos de inicio
        • FILE: Es el nombre del archivo de secuencia de comandos de inicio
  6. Para crear la VM, haz clic en Crear.

Pasar una secuencia de comandos de inicio que se almacena en Cloud Storage a una VM existente

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

    Ir a Instancias de VM

  2. Haz clic en el nombre de la VM.

  3. Haz clic en Edit.

  4. En Metadatos, agrega los siguientes valores:

    • Key: startup-script-url

    • Valor: La ubicación de Cloud Storage del archivo de secuencia de comandos de inicio con uno de los siguientes formatos:

      • URL autenticadahttps://storage.googleapis.com/BUCKET/FILE
      • URI de gsutilgs://BUCKET/FILE

Verifica la secuencia de comandos de inicio

Visualiza la IP externa en un navegador web para verificar que la secuencia de comandos de inicio creó el sitio web. Es posible que debas esperar alrededor de 1 minuto para que finalice la secuencia de comandos de inicio de muestra.

gcloud

Pasa una secuencia de comandos de inicio almacenada en Cloud Storage a una VM nueva

Pasa una secuencia de comandos de inicio almacenada en Cloud Storage a una VM cuando la crees mediante el siguiente comando gcloud compute instances create. Para el valor de la marca --scope, usa storage-ro de modo que la VM pueda acceder a Cloud Storage.

gcloud compute instances create VM_NAME \
  --image-project=debian-cloud \
  --image-family=debian-10 \
  --scopes=storage-ro \
  --metadata=startup-script-url=CLOUD_STORAGE_URL

Reemplaza lo siguiente:

  • VM_NAME: El nombre de la VM

  • CLOUD_STORAGE_URL: Es el valor de metadatos. Se establece en la ubicación de Cloud Storage del archivo de secuencia de comandos de inicio con uno de los siguientes formatos:

    • URL autenticadahttps://storage.googleapis.com/BUCKET/FILE
    • URI de gsutilgs://BUCKET/FILE

Pasar una secuencia de comandos de inicio que se almacena en Cloud Storage a una VM existente

Pasa una secuencia de comandos de inicio que se almacena en Cloud Storage a una VM existente mediante el siguiente comando gcloud compute instances add-metadata:

gcloud compute instances add-metadata VM_NAME \
    --zone=ZONE \
    --metadata startup-script-url=CLOUD_STORAGE_URL

Reemplaza lo siguiente:

  • VM_NAME: El nombre de la VM

  • ZONE: La zona de la VM

  • CLOUD_STORAGE_URL: Es el valor de metadatos. Se establece en la ubicación de Cloud Storage del archivo de secuencia de comandos de inicio con uno de los siguientes formatos:

    • URL autenticadahttps://storage.googleapis.com/BUCKET/FILE
    • URI de gsutilgs://BUCKET/FILE

Verifica la secuencia de comandos de inicio

Visualiza la IP externa en un navegador web para verificar que la secuencia de comandos de inicio creó el sitio web. Es posible que debas esperar alrededor de 1 minuto para que finalice la secuencia de comandos de inicio de muestra.

REST

Pasa una secuencia de comandos de inicio almacenada en Cloud Storage a una VM nueva

Pasa una secuencia de comandos de inicio almacenada en Cloud Storage a una VM cuando la crees mediante el siguiente método instances.insert. En el campo scopes, agrega https://www.googleapis.com/auth/devstorage.read_only para que la VM pueda acceder a Cloud Storage.

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances

{
  ...
  "networkInterfaces": [
    {
      "accessConfigs": [
        {
          "type": "ONE_TO_ONE_NAT"
        }
      ]
    }
  ],
  "serviceAccounts": [
    {
      "email": "default",
      "scopes": [
        "https://www.googleapis.com/auth/devstorage.read_only"
      ]
    }
  ],
  "metadata": {
    "items": [
      {
        "key": "startup-script-url",
        "value": "CLOUD_STORAGE_URL"
      }
    ]
  },
  ...
}

Reemplaza lo siguiente:

  • PROJECT_ID: El ID del proyecto.

  • ZONE: Es la zona en la que se creará la VM.

  • CLOUD_STORAGE_URL: Es el valor de metadatos. Se establece en la ubicación de Cloud Storage del archivo de secuencia de comandos de inicio con uno de los siguientes formatos:

    • URL autenticadahttps://storage.googleapis.com/BUCKET/FILE
    • URI de gsutilgs://BUCKET/FILE

Pasar una secuencia de comandos de inicio que se almacena en Cloud Storage a una VM existente

  1. Obtén el valor tags.fingerprint de la VM mediante el método instances.get.

    GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME
    

    Reemplaza lo siguiente:

    • PROJECT_ID: El ID del proyecto

    • ZONE: La zona de la VM

    • VM_NAME: La zona de la VM

  2. Pasa la secuencia de comandos de inicio con el valor fingerprint, junto con el valor y la clave de metadatos de la secuencia de comandos de inicio, en una llamada al método instances.setMetadata:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/setMetadata
    
    {
      "fingerprint": FINGERPRINT,
      "items": [
        {
            "key": "startup-script-url",
            "value": "CLOUD_STORAGE_URL"
        }
      ],
      ...
    }
    

    Reemplaza lo siguiente:

    • PROJECT_ID: El ID del proyecto.

    • ZONE: La zona de la VM

    • VM_NAME: la zona de la VM.

    • FINGERPRINT: el valor tags.fingerprint obtenido mediante el método instances.get.

    • CLOUD_STORAGE_URL: Es el valor de metadatos. Se establece en la ubicación de Cloud Storage del archivo de secuencia de comandos de inicio con uno de los siguientes formatos:

      • URL autenticadahttps://storage.googleapis.com/BUCKET/FILE
      • URI de gsutilgs://BUCKET/FILE

Verifica la secuencia de comandos de inicio

Visualiza la IP externa en un navegador web para verificar que la secuencia de comandos de inicio creó el sitio web. Es posible que debas esperar alrededor de 1 minuto para que finalice la secuencia de comandos de inicio de muestra.

Accede a los metadatos desde una secuencia de comandos de inicio de Linux

En una secuencia de comandos de inicio, puedes acceder a los valores de metadatos. Por ejemplo, puedes usar la misma secuencia de comandos para múltiples VM y parametrizar cada secuencia de forma individual si pasas valores de metadatos diferentes a cada VM.

Para acceder a un valor de metadatos personalizados desde una secuencia de comandos de inicio, haz lo siguiente:

  1. Crea una secuencia de comandos de inicio que consulte el valor de una clave de metadatos. Por ejemplo, la siguiente secuencia de comandos de inicio de archivo bash (.sh) consulta el valor de la clave de metadatos foo.

    #! /bin/bash
    METADATA_VALUE=$(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><p>Accessing metadata value of foo: $METADATA_VALUE</p></body></html>
    EOF
    
  2. Configura el valor de la clave de metadatos foo cuando crees una VM mediante el siguiente comando gcloud compute instances create. Para este ejemplo, la secuencia de comandos de inicio se pasa a la VM desde un archivo local.

    gcloud

    gcloud compute instances create VM_NAME \
      --image-project=debian-cloud \
      --image-family=debian-10 \
      --metadata-from-file=startup-script=FILE_PATH \
      --metadata=foo=bar
    

    Reemplaza lo siguiente:

    • VM_NAME: El nombre de la VM

    • FILE_PATH: La ruta de acceso relativa al archivo de secuencia de comandos de inicio

    Para obtener más información sobre cómo especificar un par clave-valor de metadatos, consulta Establece metadatos personalizados.

  3. Desde la estación de trabajo local, visualiza la IP externa en un navegador web para verificar que la secuencia de comandos de inicio muestre el valor de foo. Es posible que debas esperar alrededor de 1 minuto para que finalice la secuencia de comandos de inicio de muestra.

Vuelve a ejecutar una secuencia de comandos de inicio de Linux

Vuelve a ejecutar una secuencia de comandos de inicio de la siguiente manera:

  1. Conéctate a la VM.

  2. Ejecuta el siguiente comando:

    sudo google_metadata_script_runner startup
    

Visualiza el resultado de una secuencia de comandos de inicio de Linux

Para ver el resultado de una secuencia de comandos de inicio de Linux, puedes elegir una de las siguientes opciones:

¿Qué sigue?