Utiliser un script de démarrage sur des VM Linux

Un script de démarrage effectue des tâches pendant le processus de démarrage d'une machine virtuelle (VM). Cette page vous explique comment utiliser des scripts de démarrage sur des instances de VM.

Avant de commencer

Pour utiliser les commandes de l'interface de ligne de commande (CLI) gdcloud, assurez-vous d'avoir téléchargé, installé et configuré la CLI gdcloud. Toutes les commandes pour Distributed Cloud utilisent la CLI gdcloud ou kubectl et nécessitent un environnement de système d'exploitation (OS).

Obtenir le chemin d'accès au fichier kubeconfig

Pour exécuter des commandes sur le serveur de l'API Management, assurez-vous de disposer des ressources suivantes :

  1. Connectez-vous et générez le fichier kubeconfig pour le serveur d'API Management si vous n'en avez pas.

  2. Utilisez le chemin d'accès au fichier kubeconfig du serveur de l'API Management pour remplacer MANAGEMENT_API_SERVER dans ces instructions.

Demander des autorisations et un accès

Pour effectuer les tâches listées sur cette page, vous devez disposer du rôle Administrateur VirtualMachine du projet. Suivez les étapes pour vérifier votre accès ou demandez à votre administrateur IAM de projet de vous attribuer le rôle Administrateur de machines virtuelles du projet (project-vm-admin) dans l'espace de noms du projet dans lequel réside la VM.

Transmettre un script de démarrage

Vous pouvez utiliser des scripts bash ou non-bash comme scripts de démarrage. Pour ce faire, incluez #!/bin/… au début du script pour indiquer l'interpréteur du script. Par exemple, pour utiliser un script de démarrage Python 3, ajoutez #! /usr/bin/python3 au début du script.

Google Distributed Cloud (GDC) air-gapped exécute les scripts de démarrage par ordre alphabétique, en fonction du nom de chaque script de démarrage.

Le tableau suivant indique le format de script à utiliser en fonction de la taille de votre script :

Taille du script Format du script
Scripts jusqu'à 2 048 octets Effacer le texte
Scripts de plus de 2 048 octets Secret Kubernetes

Définir un script de démarrage

Pour utiliser un script de démarrage, vous devez ajouter le champ startupScripts au champ spec de la VM. Dans ce champ, vous pouvez spécifier plusieurs scripts de démarrage sous forme de texte clair ou de secret Kubernetes.

L'exemple suivant spécifie les scripts de démarrage en texte clair et un secret Kubernetes :

apiVersion: virtualmachine.gdc.goog/v1
kind: VirtualMachine
metadata:
  name: "my-vm"
spec:
  
  startupScripts:
  - name: hello-world
    script: |
      #!/bin/bash
      echo hello
  - name: add-user
    scriptSecretRef:
      name: add-user
---

apiVersion: v1
kind: Secret
type: Opaque
metadata:
  name: add-user
data: 
  script:
    IyEvYmluL2Jhc2gKYWRkdXNlciB1c2VyCg==

Tenez compte des points suivants :

  • Le script de démarrage s'exécute à chaque démarrage.
  • Le script de démarrage dispose des droits racine par défaut.
  • Dans le secret Kubernetes, le nom de scriptSecretRef dans le spec de la VM doit correspondre au champ metadata.name.
  • Dans le secret Kubernetes, spécifiez le contenu du script de démarrage en ajoutant une clé script au champ data.

Créer une VM avec un script de démarrage

Ces instructions s'appliquent, quelle que soit l'image que vous utilisez pour créer votre VM. Effectuer les actions suivantes :

  1. Pour créer un script de démarrage en tant que secret Kubernetes, exécutez la commande suivante :

    cat <<EOF >>FILE_NAME
    STARTUP_SCRIPT_CONTENT
    EOF
    
    kubectl --kubeconfig MANAGEMENT_API_SERVER create secret -n PROJECT generic SECRET_NAME --from-file=script=FILE_NAME
    
    rm FILE_NAME
    
  2. Suivez les étapes de création d'une VM décrites sur la page Créer une VM. À l'étape 1, ajoutez le ou les scripts de démarrage au champ spec avant d'exécuter la commande permettant de créer une VM.

    Cet exemple définit un script de démarrage avec du texte clair et un secret Kubernetes :

    apiVersion: virtualmachine.gdc.goog/v1
    kind: VirtualMachine
    metadata:
    name: VM_NAME
    namespace: PROJECT
    spec:
    
    startupScripts:
    - name: CLEAR_TEXT_SCRIPT_NAME
      script: |
        #!/bin/bash
        CLEAR_TEXT_SCRIPT
    - name: SECRET_SCRIPT_NAME
      scriptSecretRef:
        name: SECRET_NAME
    

    Ces variables sont définies comme suit :

    VariableDéfinition
    MANAGEMENT_API_SERVER Fichier kubeconfig du serveur de l'API Management.
    PROJECT Projet Distributed Cloud dans lequel vous souhaitez créer la VM.
    VM_NAME Nom de la VM.
    FILE_NAME Nom du fichier dans lequel stocker le script de démarrage.
    STARTUP_SCRIPT_CONTENT Commandes à exécuter dans le script de démarrage
    CLEAR_TEXT_SCRIPT_NAME Nom du script de démarrage en texte brut.
    CLEAR_TEXT_SCRIPT Script en texte clair que vous définissez.
    SECRET_NAME Nom du secret Kubernetes.
    SECRET_SCRIPT_NAME Nom du script de démarrage en tant que secret Kubernetes.
  3. Suivez les étapes ci-dessous pour créer une VM.

    Voici un exemple de création d'une VM avec des scripts de démarrage qui ajoutent un utilisateur à l'aide d'un secret Kubernetes et de texte clair.

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
        apply -n PROJECT -f - <<EOF
    apiVersion: virtualmachine.gdc.goog/v1
    kind: VirtualMachineDisk
    metadata:
      name: VM_BOOT_DISK_NAME
    spec:
      source:
        image:
          name: BOOT_DISK_IMAGE_NAME
          namespace: vm-system
      size: BOOT_DISK_SIZE
    ---
    apiVersion: v1
    kind: Secret
    type: Opaque
    metadata:
      name: add-user
    data: 
      script:
        IyEvYmluL2Jhc2gKYWRkdXNlciB1c2VyCg==
    ---
    apiVersion: virtualmachine.gdc.goog/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
    spec:
      compute:
        virtualMachineType: MACHINE_TYPE
      disks:
      - virtualMachineDiskRef:
          name: VM_BOOT_DISK_NAME
        boot: true
        autoDelete: BOOT_DISK_AUTO_DELETE
      startupScripts:
      - name: add-user
        scriptSecretRef:
          name: add-user
      - name: add-to-sudoers
        script: |
          #!/bin/bash
          usermod -aG sudo user
    EOF
    

    Dans l'exemple, les variables sont définies comme suit :

    VariableDéfinition
    MANAGEMENT_API_SERVER Fichier kubeconfig du serveur de l'API Management.
    PROJECT Projet Distributed Cloud dans lequel vous souhaitez créer la VM.
    VM_NAME Nom de la nouvelle VM.
    VM_BOOT_DISK_NAME Nom du nouveau disque de démarrage de la VM.
    BOOT_DISK_IMAGE_NAME Nom de l'image à utiliser pour le nouveau disque de démarrage de la VM.
    BOOT_DISK_SIZE Taille du disque de démarrage, par exemple 20G.
    Cette valeur doit toujours être supérieure ou égale à la valeur minimumDiskSize de l'image de disque de démarrage.
    BOOT_DISK_AUTO_DELETE true ou false, indiquant si le disque de démarrage est automatiquement supprimé lorsque l'instance de VM est supprimée.
    MACHINE_TYPE Type de machine prédéfini pour la nouvelle VM. Pour sélectionner un type de machine disponible, exécutez la commande suivante :
    kubectl --kubeconfig MANAGEMENT_API_SERVER get virtualmachinetype.virtualmachine.gdc.goog --namespace vm-system

Mettre à jour une VM existante avec un script de démarrage

Vous pouvez également mettre à jour une VM existante avec un script de démarrage. La VM doit être arrêtée avant que vous effectuiez la mise à jour.

Suivez la procédure pour mettre à jour les propriétés de la VM et mettez à jour le champ spec avec le script de démarrage que vous souhaitez exécuter.

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

  1. Suivez la procédure pour vous connecter à une VM.
  2. Exécutez la commande suivante dans la VM invitée pour obtenir les journaux du script de démarrage que vous avez exécuté :

    sudo journalctl -u cloud-final
    

    Les journaux de script de démarrage commencent par le texte suivant :

    Started to run the command: /var/lib/google/startup-scripts/<script-name> ...