Il est possible de personnaliser la création d’une instance en fournissant un fichier de données utilisateur.
Cloud-init est le paquet qui gère l’initialisation d’une instance à l’aide de données utilisateur.
Les données utilisateurs sur lesquelles cloud-init peut agir doivent faire partie de l’un de ces types :
Le type définira par quoi doit commencer le fichier de données :
#!
#include
#cloud-config
#upstart-job
#cloud-boothook
#part-handler
Dans notre cas, nous nous intéresserons plus spécialement au type cloud-config.
Mais vous pouvez en savoir plus en vous référant à la documentation de cloud-init :
https://cloudinit.readthedocs.io/en/latest/topics/format.html
Le fichier cloud-config est un moyen assez simple pour définir des tâches à accomplir au lancement de l’instance.
Un fichier cloud-config doit être écrit avec une syntaxe yaml valide.
Pour commencer, le fichier doit débuter par #cloud-config
.
#cloud-config
# vim: syntax=yaml
# This is a cloud-config file for user-data
L’installation de paquets se fait à l’aide du mot clef : packages
et la mise à niveau en définissant package_upgrade
à ‘true’.
Il suffit de faire la liste des paquets à installer sans préciser le dépôt dans lequel aller les chercher.
package_upgrade: true
packages:
- aptitude
- linuxlogo
- vim
- ssh
- python
- gcc
- g++
Avec le mot clef users
on ajoute des utilisateurs qui pourront accéder à l’instance grâce à leur clef publique.
users:
- name: "user1"
gecos: "user 1"
sudo: ['ALL=(ALL) NOPASSWD:ALL']
groups: [ wheel , sudo ]
homedir: "/home/user1"
shell: "/bin/bash"
ssh-authorized-keys: [ < public_key_user1 > ]
- name: "ubuntu"
sudo: ['ALL=(ALL) NOPASSWD:ALL']
groups: [ wheel , sudo ]
homedir: "/home/ubuntu"
shell: "/bin/bash"
ssh-authorized-keys: [ < public_key_user1 > , < public_key_user2 > ]
- name: "user2"
gecos: "user 2"
sudo: ['ALL=(ALL) NOPASSWD:ALL']
groups: [ wheel , sudo ]
homedir: "/home/user2"
shell: "/bin/bash"
ssh-authorized-keys: [ < public_key_user2 > ]
Il est possible d’écrire des fichiers au premier lancement avec write_files
en precisant son contenu, son chemin d’accès (path), ses permissions et son propriétaire.
write_files:
- content: |
#!/bin/bash
var="Hello World"
echo "$var"
owner: root:root
path: /home/ubuntu/hello.sh
permissions: '0777'
- content: |
#!/bin/bash
now="$(date)"
computer_name="$(hostname)"
echo "Current date and time : $now"
echo "Computer name : $computer_name"
owner: root:root
path: /home/ubuntu/Hello/date.sh
permissions: '0777'
Le mot clef runcmd
liste les commandes à exécuter dans un terminal.
runcmd:
# Personnalisation du bash pour user
- echo "linuxlogo" >> /home/user/.bashrc
- source /home/user/.bashrc
# Execution des deux scripts ecrits plus haut
- bash /home/ubuntu/hello.sh
- bash /home/ubuntu/Hello/date.sh
Un message final peut être affiché dans le journal de lancement d’une instance pour montrer que tout le cloud-init s’est déroulé sans encombre.
final_message: "The system is finally up, after $UPTIME seconds"
Créer une instance personnalisée se fait de la même façon que pour une instance basique mais avec une option en plus : celle du fichier de données utilisateur (--user-data cloud-config
).
openstack server create \
--image <image> \
--flavor <gabarit> \
--user-data cloud-config \
--network <project>-int-net \
--security-group <group> \
--key-name <rsa-key> \
<instance-name>
Il est possible de démarrer une instance à partir d’un volume plutôt que d’une image.
Pour cela, utilisez la commande de création d’instance openstack
openstack server create
avec les options suivantes
--block-device
: qui permet de démarrer à partir d’une source (image, volume ou instantané) existante.--swap
: qui joint un disque d’échange à une instance.--ephemeral
: qui joint un disque éphémère à une instance.Pour en savoir plus sur la création d’une instance à partir d’un volume, se référer à la documentation d’OpenStack.
Documentation d’OpenStack