Skip to content

II. cloud-init

1. Intro

cloud-init

cloud-init est un outil qui permet de configurer une VM dès son premier boot.

C'est bien beau de pop une VM dans le "cloud", mais comment on dépose notre clé SSH ? On aimerait éviter de se co avec un password, et ce, dès la première connexion.

Ok, là Azure le fait pour nous. Et si on veut créer deux ou trois users, parce qu'on est plusieurs à administrer la machine ?

cloud-init a donc pour charge de configurer la VM juste après son premier boot. Il ne se lance que au premier boot.

C'est très répandu, c'est très simpliste, mais très puissant : t'allumes une VM pour la première fois, elle s'autoconfigure.

Il peut par exemple :

  • créer des users
  • définir des password
  • définir une conf sudo
  • poser une clé publique
  • installer des paquets
  • déposer des fichiers de conf
  • démarrer des services
  • plein d'autres trucs
Info

Quand vous allez sur un site pour télécharger un OS et qu'il existe une version "cloud", généralement ça veut dire que c'est l'OS de base avec des trucs déjà faits dedans : y'a cloud-init qui est installé et prêt à run au prochain boot, un serveur SSH déjà installé et activé, une configuration sudo, etc. De quoi pouvoir instantanément se co à distance sur une machine préconfigurée quoi !

2. Gooooo

Warning

⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️
POUR WINDOWS : je vous recommande très fort, exceptionnellement, si vous êtes sous Windows, d'utiliser WSL Ubuntu pour ça.
Une putain de plaie avec Powershell, j'pense qu'on a trouvé des bugs pas reportés.
Donc dès que vous utilisez cloud-init, commande az avec --custom-data, vous devriez les lancer depuis WSL Ubuntu pour éviter les soucis.
⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️

Sur votre PC, créez un fichier cloud-init.txt avec le contenu suivant :

#cloud-config
disable_root: false
system_info:
  default_user:
    name: <TON_USER>

users:
  - name: <TON_USER>
    sudo: ALL=(ALL) NOPASSWD:ALL
    groups: sudo
    shell: /bin/bash
    ssh_authorized_keys:
      - <TA_CLE_PUBLIQUE>

  - name: <UN_AUTRE_USER>
    sudo: ALL=(ALL) NOPASSWD:ALL
    groups: sudo
    shell: /bin/bash
    ssh_authorized_keys:
      - <TA_CLE_PUBLIQUE>
Warning

<TA_CLE_PUBLIQUE> c'est directement ta clé publique, pas le chemin.
Aussi, le commentaire #cloud-config à la ligne 1 est obligatoire, ne l'enlevez pas.
Enfin, le "premier user", le "admin-username" comme dit Azure, doit être indiqué au début, dans le bloc system_info c'est obligatoire.
Et oui, vous le renseignez de nouveau dans la section users, pour indiquer toutes ses propriétés comme sa clé. (Azure oblige à avoir un "admin username" défini en haut)

🌞 Tester cloud-init

  • en créant une nouvelle VM et en lui passant ce fichier cloud-init.txt au démarrage
  • pour ça, utilisez une commande az vm create
  • utilisez l'option --custom-data /path/to/cloud-init.txt
Warning

Une fois que vous utilisez --custom-data, n'utilisez plus --addmin-username mais conservez --ssh-key-values.
Vous gérez tous les utilisateurs à déployer avec votre fichier cloud-init.txt directement.
Un exemple de commande :

# PAS de --admin-username
az vm create \
    --resource-group meo \
    --name azure2.tp2 \
    --size Standard_B1s \
    --image Ubuntu2404 \
    --location francecentral \
    --public-ip-address "" \
    --ssh-key-values .ssh/cloud_tp.pub \
    --custom-data ./cloud-init.txt

🌞 Vérifier que cloud-init a bien fonctionné

  • connectez-vous en SSH à la VM nouvellement créée, directement sur le nouvel utilisateur créé par cloud-init
# Statut du service cloud-init
sudo systemctl status cloud-init

# Etat de cloud-init actuel, quand il s'est bien déroulé c'est "done"
cloud-init status

# Et y'a des logs dans /var/log que vous pouvez consulter en cas d'erreurs
ls -al /var/log/cloud-init*

3. Write your own

🌞 Utilisez cloud-init pour préconfigurer une VM comme azure2.tp2 :

  • ajoutez un user qui porte votre pseudo

    • il a un password défini
    • clé SSH publique déposée
    • il a accès aux droits de root via sudo
  • installer MySQL sur la machine

  • déposer un fichier init.sql qui contient les commandes SQL du TP1
  • lance une commande mysql pour exécuter le contenu du script init.sql

🌞 Testez que ça fonctionne

  • un déploiement avec un az vm create en passant votre fichier cloud-init.txt
  • connectez-vous en SSH, vérifiez que vous pouvez vous connecter au serveur de db (commande mysql) et que la base est créée