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.

Warning

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 :

  1. Les éléments de configuration, de type

    paramètre: valeur
    

    ou

    paramètre:
     - valeur
     - valeur
    
  2. 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 :

  1. SSH permet de configurer sshd, de générer des clés et d’en ajouter aux authorized_keys
  2. set-passwords changement des mots de passe
  3. runcmd exécution automatique de commandes de type rc.local
  4. mounts gestion des montages de partitions
  5. 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 :

  1. Fournir le chemin du script à la commande de boot :

    % nova boot [...] --user-data /chemin/script.sh [...]
    

ou

  1. décrire les commandes à exécuter dans le fichier de configuration de cloud-init :

    % cat 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
    [...]
    
  2. 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
  1. 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
    [...]
    
  2. 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

  3. 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é.