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
cloud-init peut être alimenté par différents types de fichiers en entrée. Les plus courants sont :
Les fichiers de configuration cloud-config :
Ils surchargent la configuration cloud-init de 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-init un 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/sh
fourni à 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’utilitaire “write-mime-multipart”, fourni notamment par les paquets “cloud-utils”. Exemple d’utilisation :
% write-mime-multipart --output=combined-userdata.txt my-user-script.sh my-cloudconfig.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 en annexe.
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 :
SSH permet de configurer sshd, de générer des clés et d’en ajouter aux authorized_keys
set-passwords changement des mots de passe
runcmd exécution automatique de commandes de type rc.local
mounts gestion des montages de partitions
phone_home envoi 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 doc de 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.txt comportant une section mounts. Par exemple, pour le montage de
/dev/vdb
dans/scratch
avec 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
% nova boot --image [...] --flavor [...] --user-data ./cloud-config.txt [...]
Configurer l’utilisateur “cloud-user” pré-existant et permettre sa connexion par SSH :
#cloud-config user: cloud-user ssh_authorized_keys: - ssh-rsa XXXXXXX[...] ssh_pwauth: True chpasswd: list: | cloud-user:passw0rd expire: False [...] cloud_config_modules: [...] - ssh - set-passwords [...]
configurer cloud-init pour ne pas fixer le hostname au démarrage en fonction du nom de l’instance :
#cloud-config preserve_hostname: true
Note
/dev
peut être omis pour les entrées de type xvd
, sd
, hd
ou vd
.
Si le point de montage n’existe pas il sera créé.
Ne pas oublier de lister les modules nécessaires parmis les modules cloud-config actifs.
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 (c'est le cas dans l'image official-centosCC-7x-x86_64 depuis nov 2017). 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
Détails du contenu d’un fichier cloud-config : voir le contenu du fichier
/usr/share/doc/cloud-init/examples/cloud-config.txt
dans une machine virtuelle sur laquelle cloud-init est installé.