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-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’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
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 :
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 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.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 typexvd
,sd
,hd
ouvd
.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
Pour les détails du contenu d’un fichier
cloud-config
voir le contenu du fichier suivant dans une machine virtuelle sur laquellecloud-init
est installé :/usr/share/doc/cloud-init/examples/cloud-config.txt