Introduction à cloud-init

Ce guide technique constitue une introduction générale à l’outil cloud-init. Cloud-init est un outil open source qui permet de personnaliser une instance Linux lors du premier démarrage de cette instance.

Vous pouvez par exemple utiliser cloud-init pour installer des paquets, écrire des fichiers, ou configurer des utilisateurs du système d’exploitation ou des paramètres de sécurité. Comme cloud-init s’exécute pendant le premier démarrage de l’instance, aucune étape manuelle ou supplémentaire n’est ensuite requise pour appliquer la configuration.

Fichier cloud-config

Un fichier cloud-config est un script conçu pour être exécuté par le processus cloud-init.

Le format de cloud-config utilise une syntaxe déclarative capable de réaliser de nombreuses tâches courantes, tout en conservant la souplesse d’un script pour des fonctionnalités plus complexes.

Cloud-init est compatible avec la plupart des distributions Linux. Par exemple, vous n’avez pas besoin d’indiquer des commandes spécifiques telles que apt-get install ou yum install dans votre script pour installer un paquet. À la place, vous pouvez définir une liste des paquets à installer, puis cloud-init se charge automatiquement d’utiliser l’outil de gestion de paquets natif correspondant à la distribution de l’instance.

Format YAML de cloud-config

Le fichier cloud-config utilise le format de sérialisation de données YAML. Le format YAML a été créé pour être à la fois facile à comprendre par les humains et facile à analyser par les programmes.

Voici un exemple de fichier cloud-config que nous allons analyser :

#cloud-config
users:
 - name: demo
   groups: sudo
   shell: /bin/bash
   sudo: ['ALL=(ALL) NOPASSWD:ALL']
   ssh-authorized-keys:
     - ssh-rsa
runcmd:
 - touch /test.txt

Chaque fichier cloud-config doit commencer par la mention #cloud-config. Cette mention indique au programme cloud-init que le contenu doit être interprété comme un fichier cloud-config. C’est l’équivalent pour un fichier de script ordinaire d’indiquer l’interpréteur à utiliser pour exécuter le fichier.

Le fichier ci-dessus a deux directives de niveau supérieur : users et runcmd. Ces deux mentions servent de clés. Les valeurs de ces clés sont indiquées sur des lignes indentées.

Exemples de directives cloud-config

Les exemples suivants représentent quelques cas d’usage courants.

D’autres exemples figurent dans la machine où est installé cloud-init, dans le répertoire /usr/share/doc/cloud-init/examples.

Gérer les utilisateurs

Pour définir de nouveaux utilisateurs dans le système d’exploitation, vous pouvez utiliser la directive users. Chaque nouvel utilisateur doit être précédé d’un tiret. Pour chaque utilisateur, des paramètres sont définis avec des paires clé-valeur :

#cloud-config
users:
 - first-user-parameter: value
   first-user-parameter: value

 - second-user-parameter: value
   second-user-parameter: value
   second-user-parameter: value

Voici un exemple pour créer un nouvel utilisateur nommé demo :

#cloud-config
users:
 - name: demo
   groups: sudo
   shell: /bin/bash
   sudo: ['ALL=(ALL) NOPASSWD:ALL']
   ssh-authorized-keys:
     - ssh-rsa

Gérer les paquets

Pour mettre à jour la base de données apt dans les distributions basées sur Debian, vous pouvez définir la directive package_update sur true. Cette directive correspond à une commande apt-get update dans le terminal. La valeur par défaut de cette directive est true. Vous n’avez donc à vous soucier de cette directive que si vous voulez la désactiver :

#cloud-config
package_update: false

Pour mettre à niveau tous les paquets de l’instance au moment du premier démarrage, vous pouvez utiliser la directive package_upgrade. Cette directive correspond à une commande apt-get upgrade dans le terminal. La valeur de cette directive est false par défaut. Assurez-vous donc de la définir sur true si vous voulez l’activer :

#cloud-config
package_upgrade: true

Pour installer des paquets supplémentaires, vous pouvez lister les noms des paquets à la suite d’une directive packages. Chaque paquet de la liste peut prendre l’une des formes suivantes :

  • Le nom du paquet.

  • Une liste entre crochets avec deux éléments. Le premier élément est le nom du paquet et le second élément est le numéro de version du paquet :

#cloud-config
packages:
  - package_1
  - package_2
  - [package_3, version_num]

L’utilisation de la directive packages définit automatiquement package_update sur true, même si vous avez précédemment défini cette dernière sur false.

Écrire des fichiers sur le disque

Pour écrire des fichiers sur le disque, vous pouvez utiliser la directive write_files. Les deux clés requises pour cette directive sont les suivantes :

  • path, qui définit l’emplacement où écrire le fichier.

  • content, le texte à écrire dans le fichier.

Par exemple, si vous voulez écrire un fichier à l’emplacement /test.txt de l’instance avec le texte suivant :

Here is a line.
Another line is here.

La partie de cloud-config à spécifier est la suivante :

#cloud-config
write_files:
  - path: /test.txt
    content: |
      Here is a line.
      Another line is here.

Pour un texte multilignes, vous devez spécifier une barre verticale (|) sur la ligne content, suivie à la ligne d’un bloc indenté spécifiant le texte.

Les fichiers binaires doivent eux inclure la mention !! binary | au lieu de la simple barre verticale.

Exécuter des commandes arbitraires

Pour exécuter des commandes arbitraires, vous pouvez utiliser la directive runcmd.

Cette directive prend une liste d’éléments à exécuter. Ces éléments peuvent être spécifiés de deux manières :

  • Si l’élément de liste est une simple chaîne de texte, l’intégralité de l’élément sera transmise au processus de shell sh à exécuter.

  • Si l’élément de liste est lui-même une liste entre crochets, le premier élément est interprété comme le nom de la commande à exécuter et les éléments suivants sont transmis comme arguments de cette commande.

#cloud-config
runcmd:
 - echo "modified some_file"
 - [cat, some_file]
 - [sed, -i, -e, 's/here/there/g', some_file]

Toute sortie sera écrite dans la sortie standard ainsi que dans le fichier /var/log/cloud-init-output.log de l’instance.

Utilisation de cloud-init chez OUTSCALE

Dans les instances OUTSCALE, vous devez spécifier le contenu du fichier cloud-config dans les user data de l’instance pour appliquer une configuration cloud-init. Pour en savoir plus, voir Utiliser cloud-init avec les user data.

Pages connexes