Afin de personnaliser mes instances Cloud Public, ou même des machines virtuelles, nous allons apprendre comment utiliser cloud-init.

Lors de cet article, nous allons voir :

  • Comment créer votre premier fichier de configuration cloud-init,
  • Créer une machine virtuelle en utilisant notre fichier,
  • Installer automatiquement Docker dans notre nouvelle machine.

Mais tout d'abord cloud-init, c'est quoi ?

Cloud-init

cloud-init est un outil qui permet de personnaliser une machine virtuelle, ou une instance cloud, lors de son premier démarrage. Il s'agit d'un standard qui est très largement répandu.

Grâce à cloud-init nous allons pouvoir personnaliser dès sa création, notre instance Cloud.

Je vais donc pouvoir homogéiniser mes installations en automatisant certaines tâches, comme par exemple :

  • Ajouter un utilisateur au système,
  • Configurer son accès SSH,
  • Installer des paquets.
  • Personnaliser notre installation.

Cet outil est notamment supporté par les distributions suivantes :

  • Ubuntu
  • SLES/openSUSE
  • RHEL/CentOS
  • Fedora
  • Gentoo Linux
  • Debian
  • ArchLinux
  • FreeBSD
  • NetBSD
  • OpenBSD

Et par de nombreux cloud providers, dont voici une liste non exhaustive :

  • Amazon Web Services
  • Microsoft Azure
  • Google Cloud Platform
  • Oracle Cloud Infrastructure
  • Digital Ocean
  • Hetzner
  • Alibaba Cloud
  • OVH
  • OpenNebula
  • Scaleway

Lors de l'exemple qui va suivre, je vais utiliser un fichier de configuration cloud-init avec multipass afin de valider son bon fonctionnement.

Notre première configuration cloud-init

La configuration de notre instance va se réaliser au travers de user-data que nous allons fournir à cloud-init.

L'un des formats les plus populaires pour les scripts user-data est le format cloud-config. Mais ce n'est pas le seul, par exemple nous avions déjà utilisé un fichier shell dans un précédent exemple :

OVH : Utilisation de l’API OpenStack
Déployer en quelques minutes une instance avec Kubernetes, Traefik et WordPress sur le Cloud Public d’OVH ?! Let’s go !

Aujourd'hui, je vais donc utiliser le format :

  • text/cloud-config

Pour information, il existe 9 types de format pris en compte et il est même possible de les mixer dans un même script !

Je vais donc créer un fichier cloud-init.yaml avec les informations suivantes :

#cloud-config

package_update: true

packages:
  - apt-transport-https
  - ca-certificates
  - curl
  - gnupg-agent
  - software-properties-common

runcmd:
  - curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
  - add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
  - apt-get update -y
  - apt-get install -y docker-ce docker-ce-cli containerd.io
  - systemctl start docker
  - systemctl enable docker

final_message: "The system is finally up, after $UPTIME seconds"

Attention le fichier présenté ici fonctionne avec une instance Ubuntu. Il est bien sûr nécessaire d'adapter ce fichier si vous utilisez un autre système d'exploitation.

Quelques explications :

package_update : Mise à jour de la base apt au premier démarrage.
packages : La liste des paquets que je souhaite installer.
runcmd : Contient une liste de commandes à exécuter.
final_message : Ce message sera affiché à la fin du premier démarrage, vous pourrez le retrouver dans le log de cloud-init.

Je vais pouvoir essayer mon script très simplement avec multipass :

multipass launch -n my-test --cloud-init cloud-config.yaml

Après quelques instants, je peux essayer d'accéder à Docker sur ma nouvelle machine avec la commande suivante :

multipass exec my-test -- sudo docker ps

Si une commande ne s'est pas correctement terminée, vous pourrez vérifier le log de cloud-init :

multipass exec my-test -- sudo cat /var/log/cloud-init-output.log

Si nécessaire, vous pouvez débuggez vos fichiers de logs à l'aide de la commande cloud-init.

Vous pourrez trouver plus d'informations à ce sujet sur la documentation officielle :

https://cloudinit.readthedocs.io/en/latest/topics/debugging.html

Et chez OVH ?

Vous pouvez utiliser votre script sur l'interface graphique lorsque vous créez votre instance, lors de l'étape numéro 4 :

add_script

Il vous suffit de cliquer sur le bouton ajouter et de copié/collé le script précédent :

add_script_ok

Ou vous pouvez utiliser l'API OpenStack comme nous l'avons déjà fait par le passé avec la commande suivante :

lfache@Midgar:~$ openstack server create --image "Ubuntu 20.04" --flavor "s1-8" --key-name "MyKey" --net "Ext-Net" --user-data=cloud-config.yaml my-instance

Au bout de quelques secondes/minutes, vous devriez obtenir l'accès sur votre instance. Vous pourrez ensuite vérifier que tout est fonctionel :

lfache@Midgar:~$ ssh ubuntu@X.X.X.X
ubuntu@s1-4-gra7:~$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

Comme vous pouvez le constater, la manipulation est vraiment simple et permet de gagner un temps précieux lors du déploiement de vos instances.


Nous avons pu voir ensemble, comment créer votre premier fichier de configuration cloud-init. Grâce à cela, vous êtes maintenant en capacité de déployer facilement des instances Cloud avec votre outil de conteneurisation Docker.

Cela vous permet :

  • Automatiser vos créations d'instances et ainsi les rendrent homogènes,
  • Gagner du temps d'installation et de déploiement sur des tâches récurrentes.

Il est bien évidemment possible d'ajouter plus de commandes à notre fichier, pour par exemple :

  • Rejoindre un cluster Swarm existant,
  • Déployer une application via Git,
  • Installer puppet par exemple.

Il n'y a - presque - pas de limites aux possibilités offertes par cloud-init !

En tout cas n'hésitez pas à m'apporter des remarques ou des commentaires sur Twitter ou via les commentaires ! C'est toujours un plaisir d'avoir des retours ! 😇