Contextualisation
Contextualiser une VM, c’est la configurer au moment de l’instanciation. Cela consiste à passer des paramètres additionnels à la commande d’instanciation qui vont permettre l’exécution de scripts avec paramètres spécifiques pendant la séquence d’initialisation de la VM.
Exemples de possibilités offertes :
ajout de clés SSH ;
installation de logiciels ;
configuration de l’accès à un stockage spécifique au site ;
collecte de logs.
C’est un moyen de conserver une image générique et de la spécialiser à l’instanciation selon divers paramètres.
Attention
Le cloud du CC-IN2P3 supporte la contextualisation par cloud-init. Il faut donc que ce paquet soit installé dans l’image de la VM et correctement configuré.
Sources valides en entrée
La commande cloud-init peut être alimentée par différents types de fichiers en entrée. Les plus courants sont :
- Les fichiers de configuration
cloud-config Ils surchargent la configuration
cloud-initde la VM. Ces fichiers texte commencent par le header suivant :#cloud-config
Ils définissent les modules
cloud-inità utiliser et leurs paramètres. Leur contenu et leur syntaxe sera décrite plus bas.- Les scripts shells
Il est possible de fournir à
cloud-initun script shell, qui sera exécuté automatiquement à la fin du démarrage de la VM. Ces scripts ne nécessitent aucune spécialisation, et tout script shell présentant un en-tête standard de type :#!/bin/shfourni à cloud-init sera exécuté automatiquement.
- Les fichiers combinés
Il est possible de combiner différents types de fichiers en un seul afin de les transmettre à
cloud-init. Cela se fait via l’utilitairewrite-mime-multipart, fourni notamment par les paquetscloud-utils. Exemple d’utilisation :% write-mime-multipart --output=combined-userdata.txt my-user-script.sh my-cloudconfig.txt
où l’on combine les fichiers
my-user-script.shetmy-cloudconfig.txtdanscombined-userdata.txt.
Note
Il existe d’autres types de fichiers utilisables avec cloud-init, pour plus d’informations vous pouvez-vous reporter à la documentation cloud-init référencée.
Fichiers cloud-config
Le fichier cloud-config se divise en 2 sections principales :
Les éléments de configuration, de type
<paramètre>: <valeur>
ou
<paramètre>: - <valeur> - <valeur>
Les modules activés, qui fournissent différentes possibilités de configuration. De la même façon la liste se présente de la façon suivante :
cloud_config_modules: - <module1> - <module2>
Parmis les modules les plus utiles nous pouvons relever :
SSHpermet de configurer sshd, de générer des clés et d’en ajouter aux authorized_keys
set-passwordschangement des mots de passe
runcmdexécution automatique de commandes de type rc.local
mountsgestion des montages de partitions
phone_homeenvoi de données à une adresse à la fin de l’instanciation
Note
Les modules sont écrits en python et situés dans
/usr/lib/python2.6/site-packages/cloudinit/CloudConfig/
La configuration cloud-config appliquée par défaut est celle située dans /etc/cloud/cloud.cfg : elle sera surchargée par la configuration passée lors de l’instanciation de la machine, comme décrit dans le paragraphe suivant.
De nombreux exemples de configuration sont disponibles dans
/usr/share/doc/cloud-init/examples/
Exécuter un script
Selon les cas d’utilisation :
Fournir le chemin du script à la commande de boot :
% nova boot [...] --user-data /<chemin>/<script>.sh [...]
ou
décrire les commandes à exécuter dans le fichier de configuration
cloudinit.cfg:#cloud-config runcmd: - [ wget, "http://slashdot.org", -O, /tmp/index.html ] - [ sh, -xc, "echo $(date) ': hello world!'" ] [...] cloud_init_modules: - runcmd [...] cloud_final_modules: - scripts-user [...]
puis démarrer l’instance avec la configuration :
% nova boot [...] --user-data /<chemin>/cloudinit.cfg [...]
Note
Contrairement à ce qui est indiqué dans la documentation cloud-init, le module runcmd seul ne fera que créer un script à partir des commandes qui lui sont données mais n’exécutera rien. Il faut rajouter le module scripts-user dans la section cloud_final_modules pour que le script soit exécuté.
Exemples d’utilisation
Effectuer des montages spécifiques
créer le fichier
cloud-config.txtcomportant une section mounts. Par exemple, pour le montage de/dev/vdbdans/scratchavec les options"nosuid,nodev":#cloud-config [...] mounts: - [ vdb, /scratch, auto, "nosuid,nodev", "1", "2" ] [...] cloud_config_modules: [...] - mounts [...]
créer pour chaque montage une entrée dans cette section sous forme de tableau dont les champs sont équivalents à ceux du fichier
/etc/fstab;instancier une VM avec un flavor comportant un disque ephemeral, en fournissant le fichier
cloud-config.txt:% nova boot --image [...] --flavor [...] --user-data ./cloud-config.txt [...]
Configurer l’utilisateur
cloud-userpré-existant et permettre sa connexion par SSH :#cloud-config user: cloud-user ssh_authorized_keys: - ssh-rsa <valeur clé> ssh_pwauth: True chpasswd: list: | cloud-user:<mot de passe> expire: False [...] cloud_config_modules: [...] - ssh - set-passwords [...]configurer
cloud-initpour ne pas fixer le hostname au démarrage en fonction du nom de l’instance :#cloud-config preserve_hostname: true
Note
/devpeut être omis pour les entrées de typexvd,sd,hdouvd.Si le point de montage n’existe pas il sera créé. Ne pas oublier de lister les modules nécessaires parmis les modules
cloud-configactifs.redimensionner automatiquement une partition LVM et les volumes contenus à la création de la VM :
#cloud-config cloud_init_modules: - growpart - [ runcmd, instance ] # Le mot clé "instance" indique de n’exécuter cette configuration qu'une seule fois par instance. growpart: mode: growpart # L'outil growpart doit être présent dans l'image utilisée pour créer la VM. devices: - '/dev/vda2' # Vérifier le nom de la partition LVM dans l'image runcmd: - 'bash -c "pvresize /dev/vda2"' # Redimensionnement du volume physique LVM - 'bash -c "lvresize -r -l +10%FREE rootvg/tmp"' # Redimensionnement des volumes logiques et des partitions sous-jacentes en utilisant un pourcentage de l'espace libre dans le volume group - 'bash -c "lvresize -r -l +33%FREE rootvg/usr"' - 'bash -c "lvresize -r -l +25%FREE rootvg/root"' - 'bash -c "lvresize -r -l +100%FREE rootvg/var"' cloud_final_modules: - [ scripts-user, instance ]
Références
Documentation en ligne : https://help.ubuntu.com/community/CloudInit
Pour les détails du contenu d’un fichier
cloud-configvoir le contenu du fichier suivant dans une machine virtuelle sur laquellecloud-initest installé :/usr/share/doc/cloud-init/examples/cloud-config.txt