Actions de personnalisation acceptées

Pour personnaliser vos images de machines virtuelles (par exemple, en exécutant des scripts de terminal, en mettant à jour les paramètres de démarrage, en transférant des binaires ou en installant des pilotes de GPU), vous pouvez définir des actions d'assistance spécifiques dans le bloc spec.steps de votre recette de personnalisation (imagebuilder.yaml).

Présentation

Pendant la phase d'exécution d'une compilation Image Builder, l'orchestrateur exécute séquentiellement les étapes déclarées dans votre recette de personnalisation (spec.steps) sur la VM de nœud de calcul temporaire.

Chaque étape doit spécifier un bloc name, un bloc action et un bloc inputs adaptés à ce type d'action. Image Builder est compatible avec les actions de personnalisation suivantes :

  • Shell : exécute des scripts ou des commandes de terminal intégrés sur l'OS invité du worker.
  • UpdateKernelCommandLine : modifie les paramètres de démarrage et les flags de ligne de commande du noyau.
  • FileCopy : transfère les fichiers de configuration, les scripts ou les composants depuis Cloud Storage ou des espaces de travail locaux vers la VM.
  • InstallGPU : télécharge, compile et enregistre les pilotes de GPU NVIDIA.

Action du shell

L'action Shell vous permet d'exécuter des scripts de terminal intégrés ou des commandes shell uniques sur l'OS invité de la VM de nœud de calcul temporaire pour effectuer des personnalisations telles que la mise à jour de packages, la configuration de comptes utilisateur ou la compilation de logiciels.

Spécifiez l'une des entrées suivantes sous steps.inputs :

  • inlineScript (chaîne) : commandes shell brutes multilignes à exécuter.
  • command (chaîne) : chaîne de commande système unique ou chemin d'accès relatif à un fichier binaire exécutable.

Exemples de configurations

Les onglets suivants présentent des exemples de configurations d'étapes pour exécuter un script intégré ou une seule commande :

Exécuter un script intégré

La configuration suivante exécute un script multiligne qui met à jour les packages à l'aide de apt :

- name: "Update guest packages and configure groups"
  action: Shell
  inputs:
    inlineScript: |
      #!/bin/bash
      apt-get update -y
      apt-get install -y fail2ban build-essential
      groupadd -r adminusers

Exécuter une seule commande

La configuration suivante exécute une seule commande shell pour vérifier la version du noyau du système d'exploitation actif :

- name: "Log kernel identifier"
  action: Shell
  inputs:
    command: "uname -a"

Comportements spéciaux

Lorsque vous exécutez des actions Shell, le provisionneur de personnalisation gère l'audit de sécurité et les redémarrages système automatisés, comme décrit dans les sections suivantes :

Audits de sécurité

Pour éviter que des jetons, des secrets ou du code propriétaire sensibles ne soient divulgués dans les journaux d'exécution, le provisionneur de personnalisation n'imprime pas les lignes brutes de vos scripts, sauf si le débogage interactif est activé (debug: true). Au lieu de cela, il enregistre le hachage d'intégrité SHA-256 de la charge utile de votre script dans les journaux de compilation. Ce hachage fournit une trace d'audit immuable du code exécuté sur l'image.

Redémarrages du système (code d'erreur 3010)

Certaines actions shell, telles que les mises à jour des correctifs du noyau ou les ajustements des partitions de stockage, nécessitent un redémarrage du système avant que les étapes suivantes puissent s'exécuter.

Pour demander un redémarrage du système lors de la personnalisation, votre script shell doit se terminer par la commande exit 3010. Lorsque le provisionneur de personnalisation reçoit le code de sortie 3010, il gère le cycle de vie du redémarrage comme suit :

  1. Le provisionneur détecte le code de sortie 3010, met l'exécution en pause et marque l'index de progression de l'étape.
  2. Le provisionneur redémarre la VM de nœud de calcul.
  3. Une fois la VM redémarrée, le provisionneur monte l'espace de travail et reprend automatiquement le pipeline à l'étape suivante de la file d'attente.
Exemple de redémarrage :

L'exemple suivant montre une configuration d'étape qui met à jour les packages et demande un redémarrage :

- name: "Install core updates and request reboot"
  action: Shell
  inputs:
    inlineScript: |
      #!/bin/bash
      echo "Applying configuration package upgrades..."
      apt-get dist-upgrade -y
      # Terminate with return code 3010 to trigger a system reboot
      exit 3010
- name: "Post-reboot verification"
  action: Shell
  inputs:
    command: "uname -r"

Action UpdateKernelCommandLine

L'action UpdateKernelCommandLine permet de localiser, de remplacer, d'insérer ou de supprimer des indicateurs de ligne de commande transmis au noyau au démarrage du système, par exemple lorsque vous configurez les journaux de la console ou ajustez les paramètres du noyau.

Spécifiez les propriétés suivantes dans la carte steps.inputs :

  • oldArguments (chaîne, obligatoire) : arguments de ligne de commande exacts pour localiser, supprimer ou remplacer dans la configuration du bootloader.
  • newArguments (chaîne, facultatif) : arguments de remplacement à écrire à la place des indicateurs cibles. Si vous omettez la propriété newArguments, Image Builder supprime entièrement les paramètres configurés dans la propriété oldArguments de la ligne de démarrage.

Exemples de configurations

Les onglets suivants présentent des exemples de configurations d'étapes pour remplacer ou supprimer des arguments de démarrage du noyau :

Remplacer les arguments de démarrage

La configuration suivante localise la clé de niveau de journal du noyau loglevel=4 et la remplace par des paramètres plus détaillés loglevel=6 console=ttyS0 :

- name: "Configure detailed boot logging"
  action: UpdateKernelCommandLine
  inputs:
    oldArguments: "loglevel=4"
    newArguments: "loglevel=6 console=ttyS0"

Supprimer les arguments de démarrage

La configuration suivante recherche le paramètre quiet et le supprime des arguments de démarrage pour activer la journalisation détaillée lors des phases de vérification du démarrage :

- name: "Enable verbose startup diagnostics"
  action: UpdateKernelCommandLine
  inputs:
    oldArguments: "quiet"

Détails d'exécution spécifiques à l'OS

Les onglets suivants décrivent comment le provisionneur de personnalisation gère les modifications d'image en fonction du système d'exploitation invité source :

Container-Optimized OS (COS)

Étant donné que COS dispose d'une mise en page de partition en lecture seule, il omet les outils de configuration standards. L'approvisionneur de personnalisation effectue les opérations suivantes :

  1. Détermine le chemin d'accès au périphérique de démarrage actif.
  2. Monte la partition 12, la partition EFI, du périphérique de démarrage.
  3. Met à jour directement les paramètres du bootloader dans /efi/boot/grub.cfg.
  4. Démonte la partition 12 de manière sécurisée.

Ubuntu

Sur les images Ubuntu, l'approvisionneur de personnalisation effectue les opérations suivantes :

  1. Ouvre /etc/default/grub et les fichiers sous /etc/default/grub.d/*.cfg.
  2. Insère, modifie ou supprime les arguments cibles sous le bloc GRUB_CMDLINE_LINUX.
  3. Exécute la commande de package update-grub pour régénérer les configurations du bootloader.

Action FileCopy

L'action FileCopy copie les fichiers de configuration, les binaires ou les certificats d'un bucket distant ou de votre dépôt local vers votre image personnalisée. Le provisionneur de personnalisation télécharge ou lit le fichier source, l'écrit dans le chemin d'accès invité que vous avez spécifié sur la VM de nœud de calcul et configure les autorisations.

Spécifiez les entrées suivantes sous steps.inputs :

  • destination (chaîne, obligatoire) : chemin absolu dans l'OS invité où le fichier est créé.
  • permissions (chaîne, obligatoire) : représentation octale des autorisations de configuration cibles, telles que "0755" ou "0644".
  • Spécifiez l'une des propriétés de source suivantes :
    • gcsSourcePath (chaîne) : URI Cloud Storage du fichier source, qui doit respecter le format gs://BUCKET_NAME/OBJECT_NAME.
    • localSourcePath (chaîne) : chemin d'accès relatif au fichier dans le dossier du dépôt de l'espace de travail local. La traversée de répertoire à l'aide de ../ est bloquée pour des raisons de sécurité.

Exemples de configurations

Les onglets suivants présentent des exemples de configurations d'étapes pour copier un fichier depuis Cloud Storage ou depuis votre espace de travail local :

Cloud Storage

La configuration suivante copie un modèle de configuration depuis un bucket Cloud Storage vers l'image de VM invitée :

- name: "Import licensing configuration"
  action: FileCopy
  inputs:
    gcsSourcePath: "gs://enterprise-configs-bucket/licensing/license.key"
    destination: "/etc/app/license.key"
    permissions: "0600"

Espace de travail local

La configuration suivante copie un script d'application compilé lors des étapes Cloud Build précédentes :

- name: "Deploy setup automation daemon"
  action: FileCopy
  inputs:
    localSourcePath: "bin/setup-daemon"
    destination: "/usr/local/bin/setup-daemon"
    permissions: "0755"

Consignes spécifiques à l'OS

Les onglets suivants décrivent les consignes concernant l'emplacement des fichiers en fonction du système d'exploitation invité cible :

Container-Optimized OS (COS)

Les images COS contiennent une mise en page de partition en lecture seule pour des raisons de sécurité. Certaines cibles système standards, telles que /usr/ ou /bin/, sont protégées en écriture.

Lorsque vous configurez des destinations de fichiers sur COS :

Ubuntu

Les images Ubuntu présentent une disposition standard de partition racine Linux en lecture/écriture (/). Vous pouvez spécifier des destinations de fichiers dans n'importe quel chemin d'accès système standard, tel que /etc, /usr/local/bin, /var ou /home, à condition que le profil utilisateur ou le dossier de destination disposent des autorisations de configuration appropriées sur la VM de nœud de calcul.

Action InstallGPU

Utilisez l'action InstallGPU pour créer des images de VM optimisées pour les charges de travail de machine learning, de data science ou scientifiques. Image Builder télécharge, compile et enregistre les pilotes de GPU NVIDIA sur vos images personnalisées. Selon le type d'image de base et le matériel cible, vous pouvez choisir d'installer des pilotes précompilés ou de compiler des fichiers .run de pilote personnalisé.

Spécifiez l'une des entrées suivantes sous steps.inputs :

  • version (chaîne) : numéro de version du pilote NVIDIA cible, tel que "595.129.03". Si vous ne spécifiez que version, l'orchestrateur télécharge le pilote à partir du dépôt NVIDIA officiel (https://us.download.nvidia.com/tesla/<version>).
  • gcsRunfile (chaîne) : chemin d'accès Cloud Storage d'un fichier d'installation de pilote NVIDIA personnalisé, qui doit utiliser le format gs://BUCKET_NAME/OBJECT_NAME.run.
  • sourceRunfile (chaîne) : chemin d'accès relatif à un fichier .run d'installation dans le dossier du dépôt de l'espace de travail local.

Exemples de configurations

Les onglets suivants présentent des exemples de configurations d'étapes pour l'installation d'une version spécifique de pilote préconfiguré par rapport à l'installation d'un fichier .run personnalisé :

Télécharger la version standard

La configuration suivante télécharge et installe une version spécifique du pilote NVIDIA à partir du dépôt officiel :

- name: "Configure default NVIDIA drivers"
  action: InstallGPU
  inputs:
    version: "<var>DRIVER_VERSION</var>"

Fichier d'exécution Cloud Storage

La configuration suivante déploie un programme d'installation de pilote NVIDIA personnalisé .run directement à partir d'un bucket Cloud Storage :

- name: "Deploy custom GPU driver from Cloud Storage"
  action: InstallGPU
  inputs:
    gcsRunfile: "gs://<var>BUCKET_NAME</var>/drivers/NVIDIA-Linux-aarch64-<var>DRIVER_VERSION</var>.run"

Fichier d'exécution de l'espace de travail local

La configuration suivante déploie un programme d'installation de pilote NVIDIA personnalisé .run à partir de l'espace de travail de votre dépôt local :

- name: "Deploy custom GPU driver from workspace"
  action: InstallGPU
  inputs:
    sourceRunfile: "drivers/NVIDIA-Linux-x86_64-<var>DRIVER_VERSION</var>.run"

Méthodes de configuration

Les onglets suivants décrivent les méthodes compatibles pour configurer les pilotes de GPU NVIDIA sur vos images personnalisées :

Pilotes précompilés

Nous vous recommandons d'utiliser des versions de pilotes pré-emballées pour éviter la surcharge de calcul et le temps de compilation des pilotes à partir de zéro.

  • Container-Optimized OS (COS) : si vous spécifiez une version de pilote pré-packagée par Google, le provisionneur de personnalisation exécute l'outil invité cos-extensions install gpu pour l'activer.

    Pour afficher la liste des versions de pilotes précompilés compatibles avec votre version de COS, exécutez sudo cos-extensions list sur une instance COS en cours d'exécution ou consultez Identifier la version du pilote de GPU.

  • Ubuntu : pour gagner du temps de compilation sur Ubuntu, nous vous recommandons de sélectionner des images de base préconfigurées à partir du projet public ubuntu-os-accelerator-images, où les pilotes NVIDIA sont préinstallés.

    Pour lister les images d'accélérateur disponibles, exécutez la commande suivante dans la CLI gcloud :

    gcloud compute images list \
        --project=ubuntu-os-accelerator-images \
        --no-standard-images
    

Fichiers d'exécution personnalisés

Si vous devez installer une version de pilote personnalisée qui n'est pas précompilée par Google ou Canonical, vous pouvez spécifier des fichiers d'exécution d'installation directe pour la compilation comme suit :

  • Ubuntu : effectue la compilation dans le système invité. Le provisionneur de personnalisation installe automatiquement les en-têtes de noyau correspondants (linux-headers-$(uname -r)), compile le fichier de pilote NVIDIA .run sur la VM de nœud de calcul et l'enregistre auprès de DKMS (Dynamic Kernel Module Support). L'enregistrement auprès de DKMS garantit que les pilotes restent actifs lors des mises à jour mineures du noyau.
  • Container-Optimized OS (COS) : le comportement de compilation varie en fonction de l'architecture du processeur de votre image de VM de base source :
    • Images ARM64 : comme les VM COS ARM64 ne sont pas compatibles avec la compilation d'en-têtes dans le guest, Image Builder effectue automatiquement une compilation croisée de votre utilitaire de pilote personnalisé .run dans le conteneur de compilation et installe le bundle résultant dans /var/lib/nvidia sur la VM de nœud de calcul.
    • Images x86-64 : effectue la compilation dans le guest directement sur la VM de nœud de calcul.

Étapes suivantes