Exécuter des scripts de démarrage

Créez et exécutez vos propres scripts de démarrage sur vos machines virtuelles pour effectuer des tâches automatisées à chaque démarrage d'une instance. Les scripts de démarrage peuvent effectuer de nombreuses actions, comme installer des logiciels, passer des mises à jour, activer des services et lancer toute autre tâche qu'ils définissent. Vous pouvez utiliser des scripts de démarrage pour personnaliser facilement et de manière programmée vos instances de machines virtuelles, y compris au moment de leur création.

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

#! /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>
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 la console Google Cloud Platform 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. En présence d'un script de démarrage, Compute Engine :

  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 en haut du fichier pour que le système d'exploitation sache quel interpréteur utiliser. Par exemple, pour un script Python, vous pouvez ajouter une ligne shebang comme :

#! /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 un fichier de script de démarrage ou fournissez le contenu d'un 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 pouvez transmettre un fichier de script de démarrage local uniquement via l'outil de ligne de commande gcloud.

Pour transmettre un fichier de script de démarrage local, utilisez l'outil de ligne de commande gcloud et fournissez l'indicateur --metadata-from-file, suivi d'une paire de clés de métadonnées, startup-script=PATH/TO/FILE, où PATH/TO/FILE est 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 console GCP, spécifiez un script de démarrage directement dans la section Script de démarrage :

  1. Dans la console GCP, 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, spécifiez les propriétés souhaitées pour votre instance. Pour afficher les options de configuration avancées, développez la section .
  4. Dans la section Automatisation, indiquez le contenu de votre script de démarrage sous Script de démarrage.

    Capture d'écran du paramétrage du script de démarrage dans la console GCP

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

gcloud

Avec l'outil de ligne de commande gcloud, spécifiez l'indicateur --metadata pour fournir le contenu de votre script de démarrage, en utilisant la paire de clés startup-script=[CONTENTS], où [CONTENTS] est le contenu du 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-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 vous êtes sur un ordinateur Windows, vous pouvez exécuter cette commande sur une invite 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"

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

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

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 spécialisées répertoriées ci-dessous. Chaque clé doit correspondre au type de script que vous souhaitez exécuter. Vous pouvez également spécifier plusieurs scripts en transmettant différentes clés à votre instance. Chaque clé ne peut être spécifiée qu'une fois par instance.

Les clés suivantes peuvent être utilisées avec un script de démarrage local, en suivant les mêmes instructions que ci-dessus.

Type de script S'exécute pendant sysprep, avant le démarrage S'exécute après la fin de sysprep et à chaque démarrage ultérieur
scripts de démarrage url sysprep-specialize-script-url windows-startup-script-url
scripts de démarrage cmd sysprep-specialize-script-cmd windows-startup-script-cmd
scripts de démarrage bat sysprep-specialize-script-bat windows-startup-script-bat
scripts de démarrage ps11 sysprep-specialize-script-ps1 windows-startup-script-ps1

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

Vous pouvez stocker votre script sur Google 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 Google 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 avez les 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 la console Google Cloud Platform ou Créer un bucket dans gsutil.
  2. Importez le fichier dans le bucket. Suivez les instructions d'utilisation de gsutil ou de la console GCP pour importer un objet.
  3. Donnez l'URL du fichier du script de démarrage lorsque vous créez une instance.

    Console

    1. Dans la console GCP, 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, spécifiez les propriétés souhaitées pour votre instance. Pour afficher les options de configuration avancées, développez la section .
    4. Dans la section Métadonnées, indiquez startup-script-url comme clé de métadonnées.
    5. 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].
    6. 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.
    7. 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 indicateurs --scopes et --metadata, et spécifiez la clé startup-script-url. L'indicateur --scopes permet à la machine virtuelle d'accéder à Google Cloud Storage pour télécharger le script de démarrage. Vous pouvez fournir l'URL de Google 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 des scopes avec un champ d'application Google Cloud Storage, afin que la machine virtuelle puisse accéder au fichier de script de démarrage :

    POST https://www.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 indicateurs --scopes et --metadata, et spécifiez la clé windows-startup-script-url. L'indicateur --scopes permet à la machine virtuelle d'accéder à Google Cloud Storage pour télécharger le script de démarrage. Vous pouvez fournir l'URL de Google 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 des 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 Google 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 Google 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 de 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://www.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, en utilisant 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 Google Cloud Storage d'accès au fichier de script de démarrage avec cette clé.

Exemple :

POST https://www.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 forcer vos scripts de démarrage à s'exécuter à nouveau sur l'instance de VM en vous connectant à l'instance et en exécutant l'une des commandes suivantes :

Sur les images Debian, CentOS, RHEL, SLES, Container-Optimized OS et 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.

Sur Container-Optimized OS, vous pouvez également utiliser le journalctl pour afficher le résultat du script de démarrage.

$ sudo journalctl -u google-startup-scripts.service

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 14.04, 16.04 et 16.10 : /var/log/syslog
  • SLES 11 et 12 : /var/log/messages

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-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

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

Cette page vous a-t-elle été utile ? Évaluez-la :

Envoyer des commentaires concernant…

Documentation Compute Engine