Utiliser cloud-init avec les user data

Ce guide technique présente une approche pas à pas pour utiliser cloud-init dans une machine virtuelle (VM) OUTSCALE, afin de mettre en place de l’automatisation dans l’environnement Cloud.

En effet, lorsque vous créez une VM dans le Cloud OUTSCALE, vous pouvez transmettre à cette VM des user data, servant à exécuter des scripts ou des tâches de configuration automatisées.

Prérequis

Assurez-vous des points suivants :

  • Cette page suppose une connaissance de cloud-init. Pour une introduction plus générale à cet outil, voir Introduction à cloud-init.

  • La VM doit avoir un nom DNS public, accessible à partir d’Internet.

  • Le security group de la VM doit autoriser les connexions SSH, HTTP, et HTTPS.

Par défaut, les scripts de user data et les directives cloud-init sont exécutés uniquement au premier cycle de démarrage de la VM.

Méthode de définition des user data

Vous pouvez définir des user data de différentes façons pour votre VM :

  • Avec l’interface web Cockpit

    C’est cette méthode qui sera utilisée pour l’approche pas à pas décrite dans la suite de cette page.

  • Par requête API avec chaîne de caractères encodée en Base64

    L’exemple suivant montre comment spécifier le contenu d’un fichier local en tant que chaîne de caractères encodée en Base64 dans une requête en ligne de commande :

    $ osc-cli api CreateVms \
        --ImageId "ami-abcd1234" \
        --KeypairName "my-key-pair" \
        --VmType "tinav4.c1r1p2" \
        --SubnetId "Subnet-abcd1234" \
        --SecurityGroupIds "['sg-abcd1234']" \
        --UserData "$(cat my_script | base64)"

    Pour en savoir plus, voir Installer et configurer OSC CLI.

Approche pas à pas : user data dans Cockpit avec des fichiers types MIME en input

1/ Créez une VM

Suivez la procédure de création de VM décrite dans la page Créer des VM, jusqu’à arriver à l’écran User data / Cloud-init.

Dans les étapes suivantes, nous nous basons sur une VM créée à partir d’une image machine OUTSCALE (OMI) Ubuntu.

2/ Rédigez les user data

Exemple 1 : Modification du nom d’hôte (via contenu text/cloud-config)

Dans cet exemple, nous demandons une modification du nom d’hôte (qui fait implicitement appel au module set_hostname de cloud_init_modules configuré par défaut dans l’OMI officielle Ubuntu).

Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"
#cloud-config
##Update hostname at first boot
hostname: test-userdata

Exemple 2 : Installation de paquets (via contenu text/cloud-config)

Dans cet exemple, nous demandons l’installation du paquet python-pip. Pour ce faire, il faut d’abord activer le module package-update-upgrade-install (qui est par défaut désactivé dans l’OMI officielle Ubuntu) en appelant explicitement la directive cloud_config_modules.

Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"
#cloud-config
cloud_config_modules:
- package-update-upgrade-install
package_update: true
cloud_final_modules:
- [scripts-user, always]
##Install python-pip package
packages:
 - python-pip

Exemple 3 : Écriture dans des fichiers ou sur la sortie de console (via contenu text/x-shellscript)

Dans cet exemple, nous demandons l’exécution de quelques instructions définies dans des scripts shell (/bin/sh et /bin/bash) :

  • Écrire sur la sortie de console (/dev/ttyS0)

  • Écrire des nouveaux fichiers (/root/output.txt et /tmp/output.txt)

  • Modifier des fichiers existants (/root/.bashrc et /root/.vimrc)

Le type de contenu text/x-shellscript fournit le script utilisateur à exécuter par le module cloud_final_modules de cloud-init.

Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"
#!/bin/sh
##Writing in file
echo "Hello there. This is written with append." >> /root/output.txt
##Writing to console
echo "Hello there." >> /dev/ttyS0
#!/bin/bash
##Writing in file
/bin/echo "Hello there." >> /tmp/output.txt

cat > /root/.bashrc <<EOF
set -o vi
unalias -a
alias ll='ls -l'
EOF
touch /root/.vimrc
cat > /root/.vimrc <<EOF
set t_ti= t_te=
set compatible
set expandtab ts=2 sw=2 ai
EOF

Exemple 4 : Mélange de contenu text/cloud-config et text/x-shellscript

  • Cloud-init se comporte différemment en fonction du format des user data. L’un des formats les plus répandus pour les scripts d’user data, en plus du format shell, est le format cloud-config.

  • Par défaut, cloud-init autorise un seul type de contenu à la fois dans les user data.

  • Un fichier type MIME multiparties permet au script de changer la façon dont les user data sont exécutées par cloud-init. Pour en savoir plus sur les fichiers types MIME multiparties, voir Mime Multi Part Archive sur le site web de cloud-init.

Dans cet exemple, nous demandons l’exécution de scripts en utilisant successivement les types de contenu text/cloud-config et text/x-shellscript précédemment vus, en un seul fichier type MIME multiparties.

Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0

--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"

#cloud-config
package_update: true
# update hostname
hostname: test-userdata

--//
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"
#!/bin/bash
/bin/echo "Hello there." >> /tmp/output.txt
--//

Dans ce cas mixte :

  1. Commencez les user data par l’entête :

    Content-Type: multipart/mixed; boundary="//"
    MIME-Version: 1.0
  2. Précédez chacune des parties cloud-config et x-shellscript par les caractères --//.

  3. Terminez les user data par les caractères --//.

3/ Collez les user data dans le champ Section libre / Cloud-init

Collez les user data dans le champ Section libre / Cloud-init de l’écran User data de Cockpit.

4/ Confirmez la création de la VM

Cliquez sur Suivant puis sur le bouton de confirmation final pour créer la VM.

Vérification des user data

Pour vérifier les user data transmises à la VM, vous pouvez vous connecter à la VM et lancer la commande Curl suivante :

$ curl http://169.254.169.254/latest/user-data

Pour vérifier l’exécution des instructions, vous pouvez consulter :

  • La sortie de console de Cockpit. Pour en savoir plus, voir Consulter la sortie de la console d’une VM.

  • Les logs de cloud-init, disponibles dans le fichier /var/log/cloud-init-output.log dans le cas d’une VM Ubuntu.

    Les VM créées à partir d’OMI officielle CentOS ne contiennent pas les logs cloud-init-output.log.

Pages connexes