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 instances de 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 script de démarrage qui installe et démarre un serveur Apache pourrait ressembler à ceci :

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

Pour spécifier un script de démarrage, vous utilisez des clés de métadonnées de script de démarrage avec le serveur de métadonnées. Vous pouvez utiliser Google Cloud Console, l'outil de ligne de commande gcloud ou l'API Compute Engine 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 un script de démarrage

Lorsque le réseau est disponible, la VM exécute toujours les scripts de démarrage comme suit :

  • Pour les VM Linux, avec l'utilisateur root.
  • Pour les VM Windows, avec le compte System.

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 du script de démarrage dans un fichier local de l'instance
  2. Définition des autorisations d'exécution sur le fichier
  3. Exécution du fichier

Vous pouvez, par exemple, fournir un script Python au lieu d'un script bash. Sachez que Compute Engine exécutera le script intégralement, quel que soit son type.

Pour exécuter un script autre qu'un script bash, ajoutez une ligne shebang (une ligne commençant par #!) au début 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 pouvez 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 Fournir un script de démarrage stocké sur Cloud Storage.

Fournir un fichier de script de démarrage

Vous ne pouvez fournir un fichier de script de démarrage local qu'en utilisant l'outil de ligne de commande gcloud. Incluez l'option --metadata-from-file, suivie 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 utiliser Google Cloud Console, l'outil de ligne de commande gcloud ou l'API Compute Engine pour saisir ou coller directement le contenu de votre script de démarrage.

Console

Dans 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 Automation (Automatisation), sous Startup script (Script de démarrage), spécifiez le contenu de votre script de démarrage.

    Définition d&#39;un 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, utilisez l'option --metadata pour fournir le contenu de votre script de démarrage à l'aide de la paire clé-valeur 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 accéder à l'adresse IP externe de l'instance pour afficher le contenu de la page index.html.

Sur un ordinateur Linux, exécutez la commande suivante :

gcloud compute instances create example-instance --tags http-server \
  --metadata startup-script='#! /bin/bash
# Installs apache and a custom homepage
  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 vous êtes sur un ordinateur Windows, vous pouvez exécuter cette commande dans un 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"

De la même manière, si vous utilisez PowerShell, vous pouvez exécuter cette commande avec le caractère spécial d'arrêt de l'analyse (--%) pour transmettre une commande exacte à l'outil 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

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

Fournir un script de démarrage pour des 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 suivant. 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 avez besoin d'exécuter manuellement les scripts de démarrage d'une instance de VM après son démarrage, 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 :
  • Après GCESysprep2
  • À 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 pouvez accéder aux fichiers de ce projet, sauf si des contrôles d'accès explicites vous en empêchent.

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 les pages 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 d'utilisation de gsutil ou de Cloud Console pour importer un objet.
  3. Spécifiez l'URL du fichier de script de démarrage lorsque vous créez une instance.

    Console

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

      Accéder à la page "Instances de VM"

    2. Cliquez sur Create Instance (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.

    8. 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 VM 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/FILE.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), qui inclut un champ d'application Cloud Storage afin que la VM 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/FILE"
          }
        ]
      },
      "tags": {
        "items": []
      },
      "machineType": "zones/us-central1-a/machineTypes/e2-medium",
      "name": "example-instance"
    }
    

    Windows

    À l'aide de l'outil de ligne de commande gcloud, créez une instance en utilisant les options --scopes et --metadata, et spécifiez la clé windows-startup-script-url. L'option --scopes permet à la VM 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/FILE.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 est également exécuté lors de tous les redémarrages ultérieurs.

Pour définir un script de démarrage sur une instance en cours d'exécution, procédez comme suit :

Console

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

    Accéder à la page "Instances de VM"

  2. Cliquez sur l'instance à laquelle vous souhaitez ajouter un script de démarrage.

  3. Sur la page des détails de l'instance, procédez comme suit :

    1. Cliquez sur le bouton Modifier.
    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 : permet de fournir directement le contenu du script de démarrage.
      • startup-script-url : permet de fournir une URL Cloud Storage d'accès au fichier de script de démarrage.

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 : permet de fournir directement le contenu du script de démarrage.
  • --metadata startup-script-url=URL : permet de fournir une URL Cloud Storage d'accès au fichier de script de démarrage.
  • --metadata-from-file startup-script=FILE : permet de fournir 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. Cela permet de n'effectuer qu'une seule mise à jour à la fois, évitant ainsi les conflits.

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

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

Ensuite, copiez la valeur de l'empreinte :

{

 ...
 "name": "example-instance",
 "metadata": {
  "kind": "compute#metadata",
  "fingerprint": "zhma6O1w2l8="
 },
 "...
}

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

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

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

Étape suivante

Faites l'essai

Si vous débutez sur Google Cloud, créez un compte pour évaluer les performances de Compute Engine en conditions réelles. Les nouveaux clients bénéficient également de 300 $ de crédits gratuits pour exécuter, tester et déployer des charges de travail.

Profiter d'un essai gratuit de Compute Engine