Utiliser des scripts de démarrage sur des VM Linux


Un script de démarrage est un fichier qui effectue des tâches au cours du processus de démarrage d'une instance de machine virtuelle (VM). Les scripts de démarrage peuvent s'appliquer à toutes les VM dans un projet ou à une seule VM. Les scripts de démarrage spécifiés par les métadonnées au niveau de la VM remplacent ceux spécifiés par les métadonnées au niveau du projet. Les scripts de démarrage ne s'exécutent que lorsqu'un réseau est disponible. Ce document explique comment utiliser des scripts de démarrage sur des instances de VM Linux. Pour en savoir plus sur l'ajout d'un script de démarrage au niveau du projet, consultez gcloud compute project-info add-metadata.

Pour les scripts de démarrage Linux, vous pouvez utiliser un fichier bash ou non-bash. Pour utiliser un fichier non-bash, désignez l'interpréteur en ajoutant #! en haut du fichier. Par exemple, pour utiliser un script de démarrage Python 3, ajoutez #! /usr/bin/python3 en haut du fichier.

Si vous spécifiez un script de démarrage à l'aide de l'une des procédures décrites dans ce document, Compute Engine effectue les opérations suivantes :

  1. Il copie le script de démarrage sur la VM

  2. Il définit les autorisations d'exécution sur le script de démarrage

  3. Il exécute le script de démarrage en tant qu'utilisateur root au démarrage de la VM.

Pour savoir quelles sont les différentes tâches liées aux scripts de démarrage et quand effectuer chacune d'entre elles, consultez la section Présentation.

Avant de commencer

  • Consultez la présentation des scripts de démarrage.
  • Apprenez-en plus sur le serveur de métadonnées.
  • Si ce n'est pas déjà fait, configurez l'authentification. L'authentification est le processus permettant de valider votre identité pour accéder aux services et aux API Google Cloud. Pour exécuter du code ou des exemples depuis un environnement de développement local, vous pouvez vous authentifier auprès de Compute Engine comme suit :

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

    1. Install the Google Cloud CLI, then initialize it by running the following command:

      gcloud init
    2. Set a default region and zone.
    3. REST

      Pour utiliser les exemples d'API REST de cette page dans un environnement de développement local, vous devez utiliser les identifiants que vous fournissez à gcloud CLI.

        Install the Google Cloud CLI, then initialize it by running the following command:

        gcloud init

      Pour en savoir plus, consultez la section S'authentifier pour utiliser REST dans la documentation sur l'authentification Google Cloud.

Clés de métadonnées pour les scripts de démarrage Linux

Un script de démarrage est transmis à une VM à partir d'un emplacement spécifié par une clé de métadonnées. Une clé de métadonnées spécifie si le script de démarrage est stocké localement, stocké dans Cloud Storage, ou transmis directement à la VM. La clé de métadonnées que vous utilisez peut également dépendre de la taille du script de démarrage.

Le tableau suivant présente les clés de métadonnées que vous pouvez utiliser pour les scripts de démarrage Linux, et fournit des informations sur la clé à utiliser en fonction de l'emplacement de stockage et de la taille du script de démarrage.

Clé de métadonnées Utiliser pour
startup-script Transmettre un script de démarrage bash ou non bash, stocké localement ou ajouté directement et dont la taille ne dépasse pas 256 Ko
startup-script-url Transmettre un script de démarrage bash ou non-bash, stocké dans Cloud Storage et dont la taille est supérieure à 256 Ko. La chaîne que vous saisissez ici est utilisée telle quelle pour exécuter gcloud storage. Si votre startup-script-url contient des espaces, ne remplacez pas ces espaces par %20 et n'ajoutez pas de guillemets doubles ("") à la chaîne startup-script-url.

Ordre d'exécution des scripts de démarrage Linux

Vous pouvez utiliser plusieurs scripts de démarrage. Les scripts de démarrage stockés localement ou ajoutés directement s'exécutent avant les scripts de démarrage stockés dans Cloud Storage. Le tableau suivant présente l'ordre d'exécution des scripts de démarrage Linux en fonction de la clé de métadonnées.

Clé de métadonnées Ordre d'exécution
startup-script En premier lors de chaque démarrage après le démarrage initial
startup-script-url En deuxième lors de chaque démarrage après le démarrage initial

Transmettre un script de démarrage Linux directement

Vous pouvez ajouter le contenu d'un script de démarrage directement à une VM lors de sa création. Les procédures suivantes montrent comment créer une VM avec un script de démarrage qui installe Apache et crée une page Web de base.

Console

Transmettre un script de démarrage Linux directement à une nouvelle VM

  1. Accédez à la page Créer une instance dans Google Cloud Console.

    Accéder à la page Créer une instance

  2. Pour Disque de démarrage, sélectionnez Modifier, puis sélectionnez un système d'exploitation Linux.

  3. Développez la section Options avancées et procédez comme suit :

    1. Développez la section Gestion.
    2. Dans la section Automatisation, ajoutez le script de démarrage suivant :

       #! /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. Cliquez sur Créer.

Transmettre un script de démarrage Linux directement à une VM existante

  1. Dans Google Cloud Console, accédez à la page Instances de VM.

    Accéder à la page Instances de VM

  2. Cliquez sur le Nom de la VM.

  3. Cliquez sur Modifier.

  4. Sous Automatisation, ajoutez le contenu de votre script de démarrage.

Vérifier le script de démarrage

Une fois la VM démarrée, affichez l'adresse IP externe dans un navigateur Web pour vérifier que le script de démarrage a créé le site Web. Un délai de 1 minute environ peut être nécessaire pour que l'exemple de script de démarrage se termine.

gcloud

Transmettre un script de démarrage Linux directement à une nouvelle VM

Transmettez le contenu d'un script de démarrage directement à une VM lors de sa création à l'aide de la commande gcloud compute instances create suivante.

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'

Remplacez VM_NAME par le nom de la VM.

Transmettre un script de démarrage Linux directement à une VM existante

Ajoutez le script de démarrage directement à une VM existante à l'aide de la commande gcloud compute instances add-metadata suivante :

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'

Remplacez les éléments suivants :

  • VM_NAME : nom de la VM

  • ZONE : zone de la VM

Vérifier le script de démarrage

Une fois la VM démarrée, affichez l'adresse IP externe dans un navigateur Web pour vérifier que le script de démarrage a créé le site Web. Un délai de 1 minute environ peut être nécessaire pour que l'exemple de script de démarrage se termine.

REST

Transmettre un script de démarrage Linux directement à une nouvelle VM

Transmettez le contenu d'un script de démarrage directement à une VM lors de sa création à l'aide de la méthode instances.insert suivante.

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"
      }
    ]
  },
  ...
}

Remplacez les éléments suivants :

  • PROJECT_ID : ID du projet

  • ZONE : zone dans laquelle créer la VM

Transmettre un script de démarrage Linux directement à une VM existante

  1. Récupérez la valeur tags.fingerprint de la VM à l'aide de la méthode instances.get.

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

    Remplacez les éléments suivants :

    • PROJECT_ID : ID du projet

    • ZONE : zone de la VM

    • VM_NAME : zone de la VM

  2. Transmettez le script de démarrage à l'aide de la valeur fingerprint, ainsi que la clé de métadonnées et la valeur du script de démarrage, dans un appel à la méthode 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"
        }
      ],
      ...
    }
    

    Remplacez les éléments suivants :

    • PROJECT_ID : ID du projet

    • ZONE : zone de la VM

    • VM_NAME : zone de la VM

    • FINGERPRINT : valeur tags.fingerprint obtenue à l'aide de la méthode instances.get

Vérifier le script de démarrage

Une fois la VM démarrée, affichez l'adresse IP externe dans un navigateur Web pour vérifier que le script de démarrage a créé le site Web. Un délai de 1 minute environ peut être nécessaire pour que l'exemple de script de démarrage se termine.

Transmettre un script de démarrage Linux à partir d'un fichier local

Vous pouvez stocker un script de démarrage dans un fichier local sur votre poste de travail et transmettre le fichier local en tant que métadonnées à une VM lors de sa création. Vous ne pouvez pas utiliser de fichiers stockés sur des VM en tant que scripts de démarrage.

Avant de transmettre un script de démarrage Linux depuis fichier local à une VM, procédez comme suit :

  1. Créez un fichier local pour stocker le script de démarrage.

  2. Notez le chemin relatif entre gcloud CLI et le script de démarrage.

  3. Ajoutez le script de démarrage suivant au fichier :

    #! /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

Transmettre un script de démarrage Linux depuis un fichier local à une nouvelle VM

Créez une VM et transmettez le contenu d'un fichier local à utiliser comme script de démarrage. Pour ce faire, exécutez la commande gcloud compute instances create avec l'option --metadata-from-file.

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

Remplacez les éléments suivants :

  • VM_NAME : nom de la VM

  • FILE_PATH : chemin relatif vers le fichier de script de démarrage

Transmettre un script de démarrage Linux depuis un fichier local à une VM existante

Transmettez un script de démarrage à une VM existante à partir d'un fichier local à l'aide de la commande gcloud compute instances add-metadata suivante :

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

Remplacez les éléments suivants :

  • VM_NAME : nom de la VM

  • ZONE : zone de la VM

  • FILE_PATH : chemin relatif vers le fichier de script de démarrage

Vérifier le script de démarrage

Affichez l'adresse IP externe dans un navigateur Web pour vérifier que le script de démarrage a créé le site Web. Un délai de 1 minute environ peut être nécessaire pour que l'exemple de script de démarrage se termine.

Transmettre un script de démarrage Linux à partir de Cloud Storage

Vous pouvez stocker un script de démarrage dans Cloud Storage et le transmettre à une VM lors de sa création. Après avoir ajouté un script de démarrage à Cloud Storage, vous disposez d'une URL que vous pouvez utiliser pour référencer le script de démarrage lorsque vous créez une VM.

Avant d'ajouter un script de démarrage à partir d'un bucket Cloud Storage, procédez comme suit :

  1. Créez un fichier pour stocker le script de démarrage. Cet exemple utilise un fichier bash (.sh).

  2. Ajoutez le code suivant au fichier bash, qui installe Apache et crée une page 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. Créez un bucket Cloud Storage.

  4. Ajoutez le fichier au bucket Cloud Storage.

Implications en termes de sécurité

  • Par défaut, les propriétaires et les éditeurs de projet peuvent accéder aux fichiers Cloud Storage qui appartiennent au même projet, sauf si des contrôles d'accès explicites l'interdisent.

  • Si le bucket ou l'objet Cloud Storage est moins sécurisé que les métadonnées, il existe un risque d'élévation des privilèges si le script de démarrage est modifié et que la VM redémarre. En effet, après le redémarrage de la VM, le script de démarrage s'exécute en tant que root et peut utiliser les autorisations du compte de service associé pour accéder à d'autres ressources.

Limites

Console

Transmettre un script de démarrage stocké dans Cloud Storage à une nouvelle VM

  1. Accédez à la page Créer une instance dans Google Cloud Console.

    Accéder à la page Créer une instance

  2. Spécifiez les détails de la VM.

  3. Pour Disque de démarrage, sélectionnez Modifier, puis sélectionnez un système d'exploitation Linux.

  4. Dans la section Identité et accès à l'API, sélectionnez un compte de service doté du rôle Lecteur des objets de l'espace de stockage (roles/storage.objectViewer).

  5. Développez la section Options avancées et procédez comme suit :

    1. Développez la section Gestion.
    2. Dans la section Métadonnées, ajoutez les valeurs suivantes :

      • Key : clé de métadonnées. Définie sur startup-script-url pour ajouter un script de démarrage à partir de Cloud Storage.

      • Value : valeur de métadonnées. Définie sur l'emplacement Cloud Storage du fichier de script de démarrage à l'aide de l'un des formats suivants :

        • URL authentifiée : https://storage.googleapis.com/BUCKET/FILE
        • URI gcloud storage: gs://BUCKET/FILE

        Remplacez les éléments suivants :

        • BUCKET : nom du bucket contenant le fichier de script de démarrage
        • FILE : nom du fichier de script de démarrage
  6. Pour créer la VM, cliquez sur Créer.

Transmettre un script de démarrage stocké dans Cloud Storage à une VM existante

  1. Dans Google Cloud Console, accédez à la page Instances de VM.

    Accéder à la page Instances de VM

  2. Cliquez sur le Nom de la VM.

  3. Cliquez sur Modifier.

  4. Dans la section Métadonnées, ajoutez les valeurs suivantes :

    • Key (Clé) : startup-script-url

    • Value (Valeur) : emplacement Cloud Storage du fichier de script de démarrage à l'aide de l'un des formats suivants :

      • URL authentifiée : https://storage.googleapis.com/BUCKET/FILE
      • URI gcloud storage: gs://BUCKET/FILE

Vérifier le script de démarrage

Affichez l'adresse IP externe dans un navigateur Web pour vérifier que le script de démarrage a créé le site Web. Un délai de 1 minute environ peut être nécessaire pour que l'exemple de script de démarrage se termine.

gcloud

Transmettre un script de démarrage stocké dans Cloud Storage à une nouvelle VM

Transmettez un script de démarrage stocké dans Cloud Storage à une VM lors de sa création à l'aide de la commande gcloud compute instances create suivante. Pour la valeur de l'option --scope, utilisez storage-ro afin que la VM puisse accéder à 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

Remplacez les éléments suivants :

  • VM_NAME : Nom de la VM.

  • CLOUD_STORAGE_URL : valeur de métadonnées. Définie sur l'emplacement Cloud Storage du fichier de script de démarrage à l'aide de l'un des formats suivants :

    • URL authentifiée : https://storage.googleapis.com/BUCKET/FILE
    • URI gcloud storage: gs://BUCKET/FILE

Transmettre un script de démarrage stocké dans Cloud Storage à une VM existante

Transmettez un script de démarrage stocké dans Cloud Storage à une VM existante à l'aide de la commande gcloud compute instances add-metadata suivante :

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

Remplacez les éléments suivants :

  • VM_NAME : Nom de la VM.

  • ZONE : zone de la VM.

  • CLOUD_STORAGE_URL : valeur de métadonnées. Définie sur l'emplacement Cloud Storage du fichier de script de démarrage à l'aide de l'un des formats suivants :

    • URL authentifiée : https://storage.googleapis.com/BUCKET/FILE
    • URI gcloud storage: gs://BUCKET/FILE

Vérifier le script de démarrage

Affichez l'adresse IP externe dans un navigateur Web pour vérifier que le script de démarrage a créé le site Web. Un délai de 1 minute environ peut être nécessaire pour que l'exemple de script de démarrage se termine.

REST

Transmettre un script de démarrage stocké dans Cloud Storage à une nouvelle VM

Transmettez un script de démarrage stocké dans Cloud Storage à une VM au moment de sa création à l'aide de la méthode instances.insert suivante. Dans le champ scopes, ajoutez https://www.googleapis.com/auth/devstorage.read_only afin que la VM puisse accéder à 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"
      }
    ]
  },
  ...
}

Remplacez les éléments suivants :

  • PROJECT_ID : ID du projet.

  • ZONE : zone dans laquelle créer la nouvelle VM.

  • CLOUD_STORAGE_URL : valeur de métadonnées. Définie sur l'emplacement Cloud Storage du fichier de script de démarrage à l'aide de l'un des formats suivants :

    • URL authentifiée : https://storage.googleapis.com/BUCKET/FILE
    • URI gcloud storage: gs://BUCKET/FILE

Transmettre un script de démarrage stocké dans Cloud Storage à une VM existante

  1. Récupérez la valeur tags.fingerprint de la VM à l'aide de la méthode instances.get.

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

    Remplacez les éléments suivants :

    • PROJECT_ID : ID du projet

    • ZONE : zone de la VM

    • VM_NAME : zone de la VM

  2. Transmettez le script de démarrage à l'aide de la valeur fingerprint, ainsi que la clé de métadonnées et la valeur du script de démarrage, dans un appel à la méthode 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"
        }
      ],
      ...
    }
    

    Remplacez les éléments suivants :

    • PROJECT_ID : ID du projet.

    • ZONE : zone de la VM.

    • VM_NAME : zone de la VM.

    • FINGERPRINT : valeur tags.fingerprint obtenue à l'aide de la méthode instances.get.

    • CLOUD_STORAGE_URL : valeur de métadonnées. Définie sur l'emplacement Cloud Storage du fichier de script de démarrage à l'aide de l'un des formats suivants :

      • URL authentifiée : https://storage.googleapis.com/BUCKET/FILE
      • URI gcloud storage: gs://BUCKET/FILE

Vérifier le script de démarrage

Affichez l'adresse IP externe dans un navigateur Web pour vérifier que le script de démarrage a créé le site Web. Un délai de 1 minute environ peut être nécessaire pour que l'exemple de script de démarrage se termine.

Accéder aux métadonnées à partir d'un script de démarrage Linux

Dans un script de démarrage, vous pouvez accéder aux valeurs de métadonnées. Par exemple, vous pouvez utiliser le même script pour plusieurs VM et paramétrer chaque script individuellement en transmettant des valeurs de métadonnées différentes à chaque VM.

Pour accéder à une valeur de métadonnées personnalisée à partir d'un script de démarrage, procédez comme suit :

  1. Créez un script de démarrage qui interroge la valeur d'une clé de métadonnées. Par exemple, le script de démarrage du fichier bash (.sh) suivant interroge la valeur de la clé de métadonnées 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. Définissez la valeur de la clé de métadonnées foo lors de la création d'une VM à l'aide de la commande gcloud compute instances create suivante. Pour cet exemple, le script de démarrage est transmis à la VM à partir d'un fichier 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
    

    Remplacez les éléments suivants :

    • VM_NAME : nom de la VM

    • FILE_PATH : chemin relatif vers le fichier de script de démarrage

    Pour en savoir plus sur la spécification d'une paire clé/valeur de métadonnées, consultez la section Définir des métadonnées personnalisées.

  3. Depuis votre poste de travail local, affichez l'adresse IP externe dans un navigateur Web pour vérifier que le script de démarrage génère la valeur de foo. Un délai de 1 minute environ peut être nécessaire pour que l'exemple de script de démarrage se termine.

Réexécuter un script de démarrage Linux

Réexécutez un script de démarrage en procédant comme suit :

  1. Se connecter à la VM.

  2. En exécutant la commande suivante :

    sudo google_metadata_script_runner startup
    

Afficher le résultat d'un script de démarrage Linux

Vous pouvez afficher le résultat d'un script de démarrage Linux en effectuant l'une des opérations suivantes :

Étapes suivantes