Exécuter des scripts de démarrage

Compute Engine vous permet de créer et d'exécuter vos propres scripts de démarrage sur vos machines virtuelles (VM) pour effectuer des tâches automatisées à chaque démarrage de votre instance. Les scripts de démarrage peuvent effectuer des actions, comme installer des logiciels, réaliser des mises à jour, activer des services et lancer toute autre tâche qu'ils définissent.

Par exemple, un simple script de démarrage qui installe et démarre un serveur Apache pourrait ressembler à ceci :

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

Un script de démarrage est spécifié via le serveur de métadonnées, à l'aide des clés de métadonnées du script de démarrage. Vous pouvez utiliser l'outil de ligne de commande gcloud, l'API ou Google Cloud Console pour fournir un script de démarrage.

Avant de commencer

Autorisations requises pour cette tâche

Pour effectuer cette tâche, vous devez disposer des autorisations suivantes :

  • Toutes les autorisations requises pour créer une instance
  • compute.instances.setMetadata sur l'instance

Exécuter le script de démarrage

L'instance exécute toujours les scripts de démarrage en mode root une fois le réseau disponible.

Un script de démarrage peut être de tout type de fichier. Si un script de démarrage est présent, Compute Engine effectue les opérations suivantes :

  1. Copie le script de démarrage dans un fichier local de l'instance.
  2. Définit des autorisations pour rendre le fichier exécutable.
  3. Exécute le fichier.

Vous pouvez, par exemple, fournir un script Python au lieu d'un script bash. N'oubliez pas que Compute Engine exécute le script comme il se présente, quel que soit le type de script.

Pour exécuter un script qui n'est pas bash, ajoutez une ligne shebang (une ligne commençant par #!) en haut du fichier. Cela indique au système d'exploitation quel interpréteur utiliser. Par exemple, si vous utilisez un script Python, vous pouvez ajouter la ligne shebang suivante :

#! /usr/bin/python

Utiliser un script de démarrage local

Un script de démarrage local est un script situé sur votre ordinateur local. Pour utiliser un script de démarrage local, transmettez le fichier local correspondant à l'instance ou fournissez le contenu du script de démarrage directement au serveur de métadonnées. Les exemples dans les sous-sections suivantes montrent comment ajouter des métadonnées de script de démarrage à partir d'un fichier local ou via saisie directe.

Les scripts de démarrage locaux sont soumis à la limite de longueur des valeurs de métadonnées de 256 Ko. Si votre script de démarrage dépasse cette limite, vous ne pourrez pas le charger localement. Dans ce cas, enregistrez votre fichier sur Google Cloud Storage et spécifiez l'URL du script au moment de la création de l'instance. Pour en savoir plus, consultez la section Utiliser un script de démarrage stocké sur Cloud Storage.

Fournir un fichier de script de démarrage

Vous ne pouvez transmettre un fichier de script de démarrage local qu'à l'aide de l'outil de ligne de commande gcloud. Incluez l'indicateur --metadata-from-file, suivi d'une paire de clés de métadonnées, startup-script=path-to-file, en remplaçant path-to-file par un chemin d'accès relatif au script de démarrage :

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

Fournir directement le contenu du script de démarrage

Vous pouvez également saisir ou coller le contenu de votre script de démarrage directement via la console, l'outil de ligne de commande gcloud ou l'API.

Console

Dans la Cloud Console, spécifiez un script de démarrage directement dans la section Script de démarrage :

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

    Accéder à la page Instances de VM

  2. Cliquez sur Créer une instance.
  3. Sur la page Créer une instance, renseignez les propriétés de votre instance. Pour afficher les options de configuration avancées, développez la section Gestion, sécurité, disques, réseau et location unique.
  4. Dans la section Automatisation, indiquez le contenu de votre script de démarrage sous Script de démarrage.

    Capture d'écran de la configuration du script de démarrage dans Cloud Console

  5. Cliquez sur Créer pour créer l'instance.

gcloud

Avec l'outil de ligne de commande gcloud, spécifiez l'option --metadata pour indiquer le contenu de votre script de démarrage à l'aide de la paire de clés startup-script=contents, en remplaçant contents par le contenu de votre script de démarrage.

Par exemple, la commande suivante crée une instance qui, au démarrage, effectue certaines mises à jour du système, installe Apache et lance une page Web. Vous pouvez exécuter cette commande, puis visiter l'adresse IP externe de l'instance pour afficher le contenu de la page index.html.

Sur un ordinateur Linux, exécutez la commande comme suit :

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 vous êtes sur un ordinateur Windows, vous pouvez exécuter cette commande sur un 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"

De même, si vous utilisez PowerShell, vous pouvez exécuter cette commande à l'aide du marqueur --% pour transmettre la commande exacte à l'outil 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

Dans l'API, fournissez un script de démarrage comme propriété de métadonnées de votre requête, en utilisant startup-script comme clé de métadonnées :

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

Fournir un script de démarrage pour les instances Windows

Vous pouvez exécuter des scripts de démarrage sur des instances Windows à l'aide de clés de métadonnées uniques spécifiques à Windows. Choisissez l'une des clés de métadonnées spécialisées répertoriées dans le tableau ci-dessous. Chaque clé de métadonnées doit correspondre au type de script que vous souhaitez exécuter. Vous pouvez également spécifier plusieurs scripts en transmettant différentes clés de métadonnées à votre instance. Vous ne pouvez spécifier chaque clé de métadonnées qu'une seule fois pour chaque instance de VM.

Si vous devez exécuter manuellement les scripts de démarrage sur une instance de VM après le démarrage de celle-ci, un administrateur peut le faire à l'aide de la commande suivante :

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

Le tableau suivant indique les types de scripts de démarrage compatibles, leur exécution et la clé de métadonnées à utiliser pour spécifier le script. Pour en savoir plus sur l'utilisation de ces clés de métadonnées, consultez la page Utiliser un script de démarrage local. Notez que ces scripts ne s'exécutent que si vous préparez votre image à l'aide de la commande GCESysprep.

Type de script Exécution :
  • Pendant GCESysprep2
  • Avant le démarrage
Exécution :
  • Une fois l'opération GCESysprep2 terminée
  • À chaque démarrage suivant
Scripts de démarrage url clé de métadonnées :
sysprep-specialize-script-url
clé de métadonnées :
windows-startup-script-url
Scripts de démarrage cmd clé de métadonnées :
sysprep-specialize-script-cmd
clé de métadonnées :
windows-startup-script-cmd
Scripts de démarrage bat clé de métadonnées :
sysprep-specialize-script-bat
clé de métadonnées :
windows-startup-script-bat
Scripts de démarrage ps11 clé de métadonnées :
sysprep-specialize-script-ps1
clé de métadonnées :
windows-startup-script-ps1

Fournir un script de démarrage stocké sur Cloud Storage

Vous pouvez stocker votre script sur Cloud Storage et fournir l'URL du script lors de la création de l'instance. Cela vous permet d'accéder à votre script de démarrage de n'importe où et de contourner la limite du serveur de métadonnées.

Définir des autorisations d'accès à votre script

Pour utiliser un script de démarrage depuis Cloud Storage, vous devez avoir l'autorisation d'accéder au script. Vérifiez les paramètres de contrôle d'accès sur le bucket et le fichier pour vous assurer que vous disposez des autorisations nécessaires.

Par défaut, si vous êtes propriétaire ou éditeur du projet, vous devriez pouvoir accéder aux fichiers de ce projet, sauf si des contrôles d'accès explicites l'interdisent.

Fournir un script de démarrage

  1. Créez un bucket Vous pouvez créer un bucket ou utiliser un bucket existant. Pour en savoir plus sur la création des buckets, consultez la section Créer un bucket dans Google Cloud Console ou Créer un bucket dans gsutil.
  2. Importez le fichier dans le bucket. Suivez les instructions pour utiliser gsutil ou Cloud Console pour importer un objet.
  3. Donnez l'URL du fichier du script de démarrage lorsque vous créez une instance.

    Console

    1. Accédez à la page Instances de VM dans Google Cloud Console.

      Accéder à la page Instances de VM

    2. Cliquez sur Créer une instance.
    3. Sur la page Créer une instance, renseignez les propriétés de votre instance.
    4. Dans la section Identité et accès à l'API, sélectionnez un compte de service ayant un accès en lecture au fichier de script de démarrage dans Cloud Storage. Par exemple, le compte de service doit disposer des autorisations du rôle Lecteur des objets de l'espace de stockage.
    5. Développez la section Gestion, sécurité, disques, mise en réseau et location unique.
    6. Dans la section Métadonnées, indiquez startup-script-url comme clé de métadonnées.
    7. Dans la zone Valeur, fournissez une URL vers le fichier de script de démarrage, au format gs://[BUCKET]/[FILE] ou https://storage.googleapis.com/[BUCKET]/[FILE].
      1. Cliquez sur Créer pour créer l'instance.

    gcloud

    À l'aide de l'outil de ligne de commande gcloud, créez une instance avec les options --scopes et --metadata, et spécifiez la clé startup-script-url. L'option --scopes permet à la machine virtuelle d'accéder à Cloud Storage pour télécharger le script de démarrage. Vous pouvez fournir l'URL Cloud Storage d'accès au script, au format gs://bucket/file ou https://storage.googleapis.com/bucket/file.

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

    API

    Dans l'API, fournissez un script de démarrage comme propriété de métadonnées de votre requête, en utilisant startup-script-url comme clé de métadonnées. Fournissez également une liste de champs d'application scopes avec un champ d'application Cloud Storage, afin que la machine virtuelle puisse accéder au fichier de script de démarrage :

    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

    À l'aide de l'outil de ligne de commande gcloud, créez une instance avec les options --scopes et --metadata, et spécifiez la clé windows-startup-script-url. L'option --scopes permet à la machine virtuelle d'accéder à Cloud Storage pour télécharger le script de démarrage. Vous pouvez fournir l'URL Cloud Storage d'accès au script, au format gs://bucket/file ou 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
    

Appliquer un script de démarrage à des instances en cours d'exécution

Ajoutez le script de démarrage à l'instance en cours d'exécution et, au prochain redémarrage de l'instance, le script de démarrage s'exécutera. Le script de démarrage sera également exécuté lors de tous les redémarrages ultérieurs.

Suivez ces instructions pour définir un script de démarrage sur une instance en cours d'exécution.

Console

  1. Accédez à la page Instances de VM dans Google Cloud Console.

    Accéder à la page Instances de VM

  2. Cliquez sur l'instance à laquelle vous souhaitez ajouter un script de démarrage. La page des détails de l'instance s'affiche.
  3. Sur la page des détails de l'instance, procédez comme suit :

    1. Cliquez sur le bouton Modifier en haut de la page.
    2. Sous Métadonnées personnalisées, cliquez sur Ajouter un élément.
    3. Ajoutez votre script de démarrage en utilisant l'une des clés suivantes :

      • startup-script : fournissez le contenu du script de démarrage directement avec cette clé.
      • startup-script-url : fournissez une URL Cloud Storage d'accès au fichier de script de démarrage avec cette clé.

gcloud

À l'aide de l'outil de ligne de commande gcloud, utilisez la commande instances add-metadata pour ajouter des métadonnées à l'instance. Utilisez l'une des clés de script de démarrage disponibles :

  • --metadata startup-script=CONTENTS : fournissez le contenu du script de démarrage directement avec cette clé.
  • --metadata startup-script-url=URL : fournissez une URL Cloud Storage d'accès au fichier de script de démarrage avec cette clé.
  • --metadata-from-file startup-script=FILE : fournissez un fichier de script de démarrage stocké localement.

Exemple :

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

Dans l'API, envoyez une requête à la méthode instances().setMetadata, en fournissant les nouvelles métadonnées et une valeur d'empreinte (fingerprint).

Une empreinte est une chaîne aléatoire de caractères générée par Compute Engine et utilisée pour effectuer un verrouillage optimal. Fournissez la valeur d'empreinte correspondante pour envoyer votre requête. L'empreinte change après chaque requête et, si vous fournissez une empreinte non concordante, votre requête est refusée. De cette manière, une seule mise à jour peut être effectuée à la fois, évitant ainsi les conflits.

Pour obtenir l'empreinte actuelle d'une instance, exécutez une requête instances().get et copiez la valeur de l'empreinte :

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

Envoyez ensuite une requête à la méthode instances().setMetadata, à l'aide de l'une des clés de métadonnées suivantes et la valeur d'empreinte :

  • startup-script : fournissez le contenu du script de démarrage directement avec cette clé.
  • startup-script-url : fournissez une URL Cloud Storage d'accès au fichier de script de démarrage avec cette clé.

Exemple :

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

Réexécuter un script de démarrage

Vous pouvez relancer vos scripts de démarrage sur l'instance de VM en vous connectant à l'instance et en exécutant l'une des commandes suivantes :

Sur les images Debian, CentOS et 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.

Sur les images Container-Optimized OS, Ubuntu et SLES

sudo google_metadata_script_runner --script-type startup --debug

Afficher les journaux de script de démarrage

Le résultat du script de démarrage est écrit dans les fichiers journaux suivants :

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

Vous pouvez également utiliser la commande journalctl pour afficher le résultat du script de démarrage.

sudo journalctl -u google-startup-scripts.service

Définir des valeurs personnalisées dans les scripts de démarrage

Lorsque vous exécutez des scripts de démarrage sur des instances, il peut arriver que vous souhaitiez utiliser des valeurs personnalisées dans votre script de démarrage. Par exemple, vous souhaitez peut-être exécuter un script de démarrage sur différentes instances et faire en sorte que chaque instance imprime un message personnalisé.

Vous pouvez spécifier ces valeurs personnalisées en tant que paires clé/valeur de métadonnées personnalisées au moment de la création de l'instance et les référencer dans vos scripts de démarrage. Pour en savoir plus sur la création de clés de métadonnées personnalisées, consultez la section Définir des métadonnées personnalisées.

Une fois que vous avez défini une paire de clés de métadonnées personnalisées, vous pouvez modifier votre script de démarrage pour rechercher les nouvelles métadonnées. Par exemple, le script ci-dessus peut être modifié comme suit :

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

Dépannage

Connectivité réseau au serveur de métadonnées

Spécifiquement pour les machines virtuelles Linux, Compute Engine attend une connexion au serveur de métadonnées avant de tenter d'obtenir de celui-ci des informations telles qu'un script de démarrage ou d'arrêt personnalisé. Si le serveur de métadonnées ne répond pas ou que le réseau n'est pas encore configuré, la machine virtuelle ne termine pas son démarrage.

Spécifiquement pour les machines virtuelles Linux avec des images antérieures à la v20160606, la sortie du port série affiche "Waiting for metadata server, attempt N", où N est le nombre de tentatives effectuées.

Ce problème peut durer jusqu'à sept minutes en raison d'un problème de réseau transitoire qui devrait se régler seul. Si le problème ne se résout pas de lui-même après sept minutes, recréez votre instance de machine virtuelle.

Étapes suivantes