OpenStack

Tutoriel à l’Observatoire de Paris

Cécile Cavet

APC
Merci à Aurélien, Jérome et Rémi

2024-01-18

Programme


  • Introduction sur la virtualisation
  • Découvrir OpenStack
  • Instancier une Machine Virtuelle et son cycle de vie
  • Utiliser des outils de déploiement automatique

Note sur la documentation utilisateur

  • Officielle d’OpenStack
  • Une autre documentation très complète : plateforme SCIGNE, membre de la Fédération française de cloud académique (FG-cloud) et d’EGI Federated Cloud Platform
  • CERN

Introduction

Virtualisation

  • Hyperviseur
  • Machine Virtuelle
  • Cloud Computing

Note

Machine Virtuelle (MV), Disque Persistent (DP), Infrastructure-as-a-Service (IaaS)

Hyperviseur

  • Emule l’unité centrale, la mémoire, le disque dur, le réseau et d’autres ressources matérielles de l’ordinateur
  • Types :
    • #1 : repose directement sur la base matérielle, hyperviseur de type bare-metal
    • #2 : repose sur un OS

MV de système

  • Repose sur un hyperviseur de type 1
  • Exécute un OS et des applications sans être lié à une machine physique
  • Possède son propre OS et fonctionne séparément des autres MV
  • Partage les ressources d’un hôte physique, notamment les cycles de CPU, la bande passante réseau et la mémoire.

Cycle de vie d’une MV

  • Choisir le système d’exploitation (OS)
  • Choisir le gabarit : nombre de coeurs, quantité de mémoire et de disque de chacune de ces machines
  • Déployer une instance manuellement ou automatiquement
  • Executer une application
  • Terminer la MV ou la garder comme service

Spécificité d’une MV

  • Non pérenne (seul le DP est pérenne)
  • Faible overhead
  • Utilisateur root et normal (cloud-user…)
  • Gestion par l’utilisateur de la sauvegarde des données

MV vs conteneur

Container

MV

MV

Conteneur

MV + conteneur

  • Sécurité de la MV (conteneur avec l’utilisateur root)
  • Adresse IP publique de la MV
  • Facilité et portabilité des conteneurs (intégration et déploiement continu)

Cloud computing

  • Ressources informatiques à la demande (on-demand)
MV-cloud

Cloud computing : historique

cloud

Cloud computing : types de service

type

Cloud computing : types de modèle

  • Public / commercial
  • Privé / communautaire (académique)
  • Hybride
  • Multi-cloud
MV

Cloud computing : scaling

  • Passage à l’échelle :
    • vertical : augmenter/diminuer les ressources de la MV
    • horizontal : multiplier le nombre de MV
MV

@StormIT

Cloud computing : fournisseurs académiques

OpenStack

Présentation

  • Solution OpenStack, cloud IaaS et PaaS.
  • Largement adoptée par les communautés académiques
  • Middleware Cloud ouvert / libre (licence Apache 2.0)
  • Développement Python, très actif
  • Disponible dans de nombreuses distributions

Historique

  • 2010 : Rackspace Hosting (stockage) et la NASA (calcul) lancent un projet de cloud open source
    • Objectif: permettre à toute organisation de créer et offrir des services cloud avec du matériel standard
    • Première version en octobre 2010
  • 2012 : OpenStack Foundation (gouvernance du projet)
  • 2020 : Open Infrastructure Foundation, ouverture à d’autres projets
  • Fondation : RedHat, IBM, Dell, Intel, Cisco, Juniper, NetApp, HP, VMWare, …

Releases

Ressources

@OpenStack

Modules de base

  • Authentification, ordonnanceur, …
  • Gestion/execution des images, du stockage, du réseau

Services@OpenStack

Modules évolués

Module

Services@CERN

Etats de la MV

state_vm

@OpenStack

PaaS de type Kubernetes

IaaS/PaaS pour la recherche

  • Euclid :
    • CODEEN : plateforme d’intégration continue au CC-IN2P3 ; Service Level Agreement (SLA)
  • SVOM :
    • French Science Center : pre-prod à l’IJCLab (Portainer + Docker Swarm) et future prod au CC-IN2P3
  • LISA :
    • Applications Web : CI/CD avec la stack Docker Compose + WatchTower + Traefik à l’IJCLab et à l’IPHC
    • MV Singularity pour le build et le catalogue d’images

Accès

MV

OpenStack@OBSPM

  • Version Train (Oct. 2019)
  • Modules : nova, keystone, glance, neutron, placement, cinder
  • Credentials :
    • Dans le réseau de l’Observatoire : user / password
    • A l’extérieur : tunnel ssh + identifiants

Installation de la CLI

PIP

pip | conda | mamba install python-openstackclient

Vérification de l’installation

openstack --version
# openstack 6.5.0

Information sur les modules

openstack <module> list --long
openstack <module> show <id>
openstack help <module>

Variables d’environnement OpenStack

Génération

  • Via le dashboard : <labo>-openrc.sh
  • Via un terminal :
export OS_AUTH_URL=https://keystone.obspm.fr:5000/v3/
export OS_PROJECT_ID=<project_id>
export OS_PROJECT_NAME="<labo>"
export OS_USER_DOMAIN_NAME="Obspm"
export OS_PROJECT_DOMAIN_ID="<project_domain_id>"
export OS_USERNAME="<user>"
export OS_PASSWORD=$OS_PASSWORD_INPUT
export OS_REGION_NAME="obspm_meudon"
export OS_INTERFACE=public
export OS_IDENTITY_API_VERSION=3

Var. d’env.

Activation

chmod 0400 ${HOME}/<labo>-openrc.sh
source ${HOME}/<labo>-openrc.sh

Vérification

openstack server list
# +-------------------------+----------------+--------+-------------------------+--------------------------+--------+
# | ID                      | Name           | Status | Networks                | Image                    | Flavor |
# +-------------------------+----------------+--------+-------------------------+--------------------------+--------+
# | f9e655d7-791b-4095-a157 | Debian-11-tuto | ACTIVE | nuage-                  | N/A (booted from volume) | medium |
# | -2369ee1d36aa           |                |        | poc=145.238.137.107     |                          |        |
# +-------------------------+----------------+--------+-------------------------+--------------------------+--------+

Gestion de la clé SSH

Génération

  • Via le dashboard : cloudkey-<user>-obs.pem
  • Via un terminal :
ssh-keygen -t rsa -b 4096 
# Generating public/private rsa key pair.
# Enter file in which to save the key (/home/username/.ssh/id_rsa):
# ...

Clé SSH

Ajout via la CLI

openstack keypair create --public-key=${HOME}/.ssh/id_rsa.pub cloudkey-<user>
openstack keypair list
# +-------------------------+-------------------------------------------------+------+
# | Name                    | Fingerprint                                     | Type |
# +-------------------------+-------------------------------------------------+------+
# | cloudkey-<user>         | 33:91:4b:38:52:63:1d:18:7b:e0:e3:0d:3b:63:ce:4b | ssh  |
# +-------------------------+-------------------------------------------------+------+

Cycle de vie des machines virtuelles

Images

Catalogue d’images

openstack image list
# +--------------------------------------+---------------------+--------+
# | ID                                   | Name                | Status |
# +--------------------------------------+---------------------+--------+
# | 509d6db5-a64d-408b-a49e-a40a7ff7930c | Debian-10           | active |
# | a6214ad4-7835-48f6-b2bc-15c8104bac08 | Debian-11-tuto      | active |
# | 49a99d8a-3def-4aa9-8fc1-d6febf34b4cd | Ubuntu-Focal        | active |
# | 1f46a506-7dbc-4318-8377-d61bf08418a9 | Ubuntu-Hirsute      | active |
# +--------------------------------------+---------------------+--------+

Images : OS

Debian

  • Debian-10
  • Debian-11-tuto : image ajoutée manuellement au catalogue pour le tutoriel, image recommandée

Ubuntu

  • Ubuntu-Focal : 20.04 LTS (Focal Fossa) : EOL Avril 2025
  • Ubuntu-Hirsute : 21.04 (Hirsute Hippo) : EOL
  • A ajouter : 22.04 LTS (Jammy Jellyfish)

Images : ajout d’images au catalogue

openstack image create \
    --container-format bare \
    --disk-format qcow2 \
    --min-disk 10 \
    --min-ram 2048 \
    --property hw_disk_bus=scsi \
    --property hw_scsi_model=virtio-scsi \
    --property os_type=linux \
    --property os_distro=debian \
    --property os_admin_user=debian \
    --property os_version='11' \
    --public \
    --file debian-11-genericcloud-amd64-20221219-1234.qcow2 \
    debian-11-<user> 

Gabarits

  • Nombre de coeurs, quantité de mémoire et de disque de chacune des MV
  • medium est un bon compromis avec les OS modernes
openstack flavor list
# +--------------------------------------+--------------+------+------+-----------+-------+-----------+
# | ID                                   | Name         |  RAM | Disk | Ephemeral | VCPUs | Is Public |
# +--------------------------------------+--------------+------+------+-----------+-------+-----------+
# | 03934b65-0ab9-4aae-b51d-60c20cab6090 | medium       | 2049 |   64 |         0 |     4 | True      |
# | 97ae1fbc-b2fb-4c8b-a2ca-3213cf8813ab | small        | 1024 |   64 |         0 |     2 | True      |
# | c3818476-5f31-4239-a92f-60489244b593 | super small  |  512 |   16 |         0 |     1 | True      |
# | ca7acb5c-9824-42e8-9076-5bb53f557acd | medium large | 4096 |  128 |         0 |     4 | True      |
# | cc4f8859-0f81-4c2a-8992-c8637dbbcb94 | large        | 8192 |  256 |         0 |     4 | True      |
# | e5dc4fe0-e88a-4306-bfbd-0416e3bdf23c | small medium | 2048 |   64 |         0 |     2 | True      |
# | f64a996d-0e62-4d94-9acd-2cc0a49efbc3 | very large   | 8192 |  256 |         0 |     8 | True      |
# +--------------------------------------+--------------+------+------+-----------+-------+-----------+

Réseau

Réseau public

  • Attribution automatique d’une IP publique du réseau nuage-poc
openstack network list
# +--------------------------------------+-----------+--------------------------------------+
# | ID                                   | Name      | Subnets                              |
# +--------------------------------------+-----------+--------------------------------------+
# | 9223f9ff-7ab0-4268-9b7f-3b5966625c65 | nuage-poc | 12cdcc06-bbf0-48f2-b303-bdfab460c696 |
# +--------------------------------------+-----------+--------------------------------------+

Réseau : groupes de sécurité

  • Filtres IP :
    • default : de base
    • tuto-23 : ping et ssh
openstack security group list
# +--------------------------------------+---------+--------------------------------+----------------------------------+------+
# | ID                                   | Name    | Description                    | Project                          | Tags |
# +--------------------------------------+---------+--------------------------------+----------------------------------+------+
# | 4cb51081-b60c-4413-9175-8c2252ce22ac | tuto-23 | with ssh and ping              | 9940e0fb746448f58fa2f638fc4e2de3 | []   |
# | ba242052-744a-45af-9f11-61a56f4333bf | default | Default security group         | 9940e0fb746448f58fa2f638fc4e2de3 | []   |
# +--------------------------------------+---------+--------------------------------+----------------------------------+------+

Lancement d’une MV

  • Réutilisation de tous les concepts précédents :
openstack server create \
    --key-name cloudkey-<user> \
    --image Debian-11-tuto \
    --flavor medium \
    --network nuage-poc \
    --security-group tuto-23 \
    debian-test-<user>
# +-----------------------------+------------------------------------------------------------------+
# | Field                       | Value                                                            |
# +-----------------------------+------------------------------------------------------------------+
# | OS-DCF:diskConfig           | MANUAL                                                           |
# | OS-EXT-AZ:availability_zone |                                                                  |
# | OS-EXT-STS:power_state      | NOSTATE                                                          |
# | OS-EXT-STS:task_state       | scheduling                                                       |
# | OS-EXT-STS:vm_state         | building                                                         |
# | OS-SRV-USG:launched_at      | None                                                             |
# | OS-SRV-USG:terminated_at    | None                                                             |
# | accessIPv4                  |                                                                  |
# | accessIPv6                  |                                                                  |
# | addresses                   |                                                                  |
# | adminPass                   | <password>                                                       |
# | config_drive                |                                                                  |
# | created                     | 2024-01-08T15:33:50Z                                             |
# | flavor                      | medium (03934b65-0ab9-4aae-b51d-60c20cab6090)                    |
# | hostId                      |                                                                  |
# | id                          | 1cd19416-a84c-48f5-bfb9-9c700be4376d                             |
# | image                       | Debian-11-tuto (a6214ad4-7835-48f6-b2bc-15c8104bac08)            |
# | key_name                    | cloudkey-<user>                                                 |
# | name                        | debian-test-<user>                                               |
# | progress                    | 0                                                                |
# | project_id                  | 9940e0fb746448f58fa2f638fc4e2de3                                 |
# | properties                  |                                                                  |
# | security_groups             | name='4cb51081-b60c-4413-9175-8c2252ce22ac'                      |
# | status                      | BUILD                                                            |
# | updated                     | 2024-01-08T15:33:50Z                                             |
# | user_id                     | <id>                           |
# | volumes_attached            |                                                                  |
+-----------------------------+------------------------------------------------------------------+

Statut de la MV

MV running

openstack server list
# +--------------------------------------+--------------------+--------+---------------------------+--------------------------+--------+
# | ID                                   | Name               | Status | Networks                  | Image                    | Flavor |
# +--------------------------------------+--------------------+--------+---------------------------+--------------------------+--------+
# | 1cd19416-a84c-48f5-bfb9-9c700be4376d | debian-test-<user> | ACTIVE | nuage-poc=145.238.137.72  | Debian-11-tuto           | medium |
# +--------------------------------------+--------------------+--------+---------------------------+--------------------------+--------+

MV active sur le réseau

ping 145.238.137.72

Statut de la MV : log

Volumes

  • De type bloc
  • Attachés aux instances pour assurer le stockage persistant
  • Possibilité de backup et snapshots
openstack volume list
# +--------------------------------------+-----------+-----------+------+---------------------------------------------------------------+
# | ID                                   | Name      | Status    | Size | Attached to                                                   |
# +--------------------------------------+-----------+-----------+------+---------------------------------------------------------------+
# | 99530dd7-8c51-4e03-9f59-a2fcaecc09a3 | data-tuto | available |    5 |                                                               |
# | 93fc0327-5c1c-42be-9c43-91e9fa767ac8 |           | in-use    |   64 | Attached to Debian-11-tuto on /dev/vda                        |
# +--------------------------------------+-----------+-----------+------+---------------------------------------------------------------+

Volumes : DP

Création d’un nouveau volume

openstack volume create --size 2 data-<user>

Attachement du volume à la MV

openstack server add volume <server_id> <vol_id> --device /dev/vdb

Acces à la MV

Via ssh

  • Dans le réseau OBSPM :
ssh -i ~/.ssh/cloudkey-<user>-obs.pem user@hostname
  • A l’extérieur :
    • avec la clé cloudkey-<user>.pub authorisée sur la passerelle styx
    • avec cloudkey-<user>.pem enregistrée sur styx
ssh -i ${HOME}/.ssh/cloudkey-<user>.pem -o ProxyCommand="ssh -XW %h:%p -i ${HOME}/.ssh/cloudkey-<user>.pem <user>@styx.obspm.fr" user@hostname

Gestion quotidienne de la MV

  • Root :
sudo -i
  • Update :
cat /etc/os-release
apt-get update -y
  • Montage automatique d’un volume :
df -h
fdisk -l
mkdir /data
mkfs.ext4 /dev/vdb
mount /dev/vdb /data
blkid
cat /etc/fstab
# /dev/vdb       /data        ext4     defaults        0 0

Gestion quotidienne de la MV

  • Cron pour les updates de sécurité :
echo "update_cmd=security" >> /etc/cron-apt/config
echo "apply_updates = yes" >> /etc/cron-apt/config
systemctl start cron
  • Destruction de la VM et du volume :
openstack server remove volume debian-test-<user> data-<user>
openstack server delete debian-test-<user>
openstack volume delete data-<user>

Outils de déploiement automatique

Avantages

  • Immutabilité
  • Lecture facile
  • Gestion de l’échec

Cloudinit

  • Solution standard pour la contextualisation (configuration au moment de l’instanciation)
  • Multi-distribution et multi-cloud
  • Présente de base dans les images génériques de cloud

Cloudinit : étapes

  • Generator : vérifie cloud-init.target dans le boot
  • Local : dès que possible (/ monté en rw) ; sources de données locales (p.e. un disque local) et configuration du réseau
  • Network : dès que le réseau est fonctionnel ; modules disk_setup et mounts (machine en cours de boot).
  • Config : modules liés à la configuration
  • Final : à la fin du boot (comme rc.local) ; installation des logiciels, configuration de plugins (comme puppet) et scripts utilisateurs (runcmd)

Cloudinit : journal de la console de l’instance

[   12.688758] cloud-init[371]: Cloud-init v. 20.4.1 running 'init-local' at Mon, 08 Jan 2024 15:35:53 +0000. Up 12.44 seconds.
[[0;32m  OK  [0m] Reached target [0;1;39mNetwork[0m.
         Starting [0;1;39mInitial cloud-ini��� (metadata service crawler)[0m...
[   16.746432] cloud-init[582]: Cloud-init v. 20.4.1 running 'init' at Mon, 08 Jan 2024 15:35:57 +0000. Up 16.72 seconds.
[   16.774039] cloud-init[582]: ci-info: +++++++++++++++++++++++++++++++++++++++Net device info+++++++++++++++++++++++++++++++++++++++
[   16.776565] cloud-init[582]: ci-info: +--------+------+------------------------------+---------------+--------+-------------------+
[   16.778967] cloud-init[582]: ci-info: | Device |  Up  |           Address            |      Mask     | Scope  |     Hw-Address    |
[   16.781268] cloud-init[582]: ci-info: +--------+------+------------------------------+---------------+--------+-------------------+
[   16.783652] cloud-init[582]: ci-info: |  ens3  | True |        145.238.137.72        | 255.255.255.0 | global | fa:16:3e:61:17:b0 |
[   16.785647] cloud-init[582]: ci-info: |  ens3  | True | fe80::f816:3eff:fe61:17b0/64 |       .       |  link  | fa:16:3e:61:17:b0 |
[   16.786709] cloud-init[582]: ci-info: |   lo   | True |          127.0.0.1           |   255.0.0.0   |  host  |         .         |
[   16.787734] cloud-init[582]: ci-info: |   lo   | True |           ::1/128            |       .       |  host  |         .         |
[   16.788787] cloud-init[582]: ci-info: +--------+------+------------------------------+---------------+--------+-------------------+
[   16.789819] cloud-init[582]: ci-info: +++++++++++++++++++++++++++++++++Route IPv4 info+++++++++++++++++++++++++++++++++
[   16.790771] cloud-init[582]: ci-info: +-------+-----------------+---------------+-----------------+-----------+-------+
[   16.791713] cloud-init[582]: ci-info: | Route |   Destination   |    Gateway    |     Genmask     | Interface | Flags |
[   16.792674] cloud-init[582]: ci-info: +-------+-----------------+---------------+-----------------+-----------+-------+
[   16.793624] cloud-init[582]: ci-info: |   0   |     0.0.0.0     | 145.238.137.1 |     0.0.0.0     |    ens3   |   UG  |
[   16.794579] cloud-init[582]: ci-info: |   1   |  145.238.137.0  |    0.0.0.0    |  255.255.255.0  |    ens3   |   U   |
[   16.795447] cloud-init[582]: ci-info: |   2   | 169.254.169.254 | 145.238.137.2 | 255.255.255.255 |    ens3   |  UGH  |
[   16.796052] cloud-init[582]: ci-info: +-------+-----------------+---------------+-----------------+-----------+-------+
[   16.796658] cloud-init[582]: ci-info: +++++++++++++++++++Route IPv6 info+++++++++++++++++++
[   16.797135] cloud-init[582]: ci-info: +-------+-------------+---------+-----------+-------+
[   16.797611] cloud-init[582]: ci-info: | Route | Destination | Gateway | Interface | Flags |
[   16.798102] cloud-init[582]: ci-info: +-------+-------------+---------+-----------+-------+
[   16.798581] cloud-init[582]: ci-info: |   1   |  fe80::/64  |    ::   |    ens3   |   U   |
[   16.799069] cloud-init[582]: ci-info: |   3   |  multicast  |    ::   |    ens3   |   U   |
[   16.799554] cloud-init[582]: ci-info: +-------+-------------+---------+-----------+-------+
[   18.945325] cloud-init[582]: Generating public/private rsa key pair.
[   18.946540] cloud-init[582]: Your identification has been saved in /etc/ssh/ssh_host_rsa_key
[   18.947372] cloud-init[582]: Your public key has been saved in /etc/ssh/ssh_host_rsa_key.pub
[   18.948206] cloud-init[582]: The key fingerprint is:
[   18.948761] cloud-init[582]: SHA256:AdmeHFH3HRMKpd/kvDJqAJdUtcUaLtNIVrgKFJm+ezA root@debian-test-toto
[   18.949609] cloud-init[582]: The key's randomart image is:
[   18.950182] cloud-init[582]: +---[RSA 3072]----+
[   18.950688] cloud-init[582]: |      .+=ooo*+.=.|
[   18.951196] cloud-init[582]: |      .=o. =oo+oo|
[   18.951716] cloud-init[582]: |      oooo+.=o+..|
[   18.952231] cloud-init[582]: |       +++ =.+=  |
[   18.952734] cloud-init[582]: |        S . o. + |
[   18.953258] cloud-init[582]: |       E o      .|
[   18.953760] cloud-init[582]: |        + .  o . |
[   18.954293] cloud-init[582]: |       . . .. o  |
[   18.954799] cloud-init[582]: |        . ..     |
[   18.955388] cloud-init[582]: +----[SHA256]-----+
[   18.955900] cloud-init[582]: Generating public/private dsa key pair.
[   18.956514] cloud-init[582]: Your identification has been saved in /etc/ssh/ssh_host_dsa_key
[   18.957013] cloud-init[582]: Your public key has been saved in /etc/ssh/ssh_host_dsa_key.pub
[   18.957518] cloud-init[582]: The key fingerprint is:
[   18.957828] cloud-init[582]: SHA256:yXe044TwmI588LIpyU1IvHVjcBbZVOyn6DQHtIsQaNM root@debian-test-toto
[   18.958351] cloud-init[582]: The key's randomart image is:
[   18.958685] cloud-init[582]: +---[DSA 1024]----+
[   18.958983] cloud-init[582]: |     o  .=.o.    |
[   18.959275] cloud-init[582]: |    + E + o .    |
[   18.959569] cloud-init[582]: |   o . =.. o.    |
[   18.959877] cloud-init[582]: |    o o.+*oo...  |
[   18.960175] cloud-init[582]: |   . +.+So++=o   |
[   18.960472] cloud-init[582]: |    o..=..=+o.   |
[   18.960765] cloud-init[582]: |   . ++ +o o.    |
[   18.961056] cloud-init[582]: |    + .=  .      |
[   18.961360] cloud-init[582]: |     .o          |
[   18.961656] cloud-init[582]: +----[SHA256]-----+
[   18.961949] cloud-init[582]: Generating public/private ecdsa key pair.
[   18.962338] cloud-init[582]: Your identification has been saved in /etc/ssh/ssh_host_ecdsa_key
[   18.962829] cloud-init[582]: Your public key has been saved in /etc/ssh/ssh_host_ecdsa_key.pub
[   18.963319] cloud-init[582]: The key fingerprint is:
[   18.963626] cloud-init[582]: SHA256:crgPPcnM6yNyoIf7zdfYUENnT01Fhifr10UPV7eLyJE root@debian-test-toto
[   18.964141] cloud-init[582]: The key's randomart image is:
[   18.964479] cloud-init[582]: +---[ECDSA 256]---+
[   18.964773] cloud-init[582]: |               =X|
[   18.965069] cloud-init[582]: |          . + =.B|
[   18.965360] cloud-init[582]: |         . E o O.|
[   18.965651] cloud-init[582]: |       .  + o + +|
[   18.965944] cloud-init[582]: |      o S. + o .o|
[   18.966249] cloud-init[582]: |    .  O..    . o|
[   18.966546] cloud-init[582]: |   o .o B=     . |
[   18.966846] cloud-init[582]: |  o oooo+oo      |
[   18.967128] cloud-init[582]: |  .+.oo++.       |
[   18.967406] cloud-init[582]: +----[SHA256]-----+
[   18.967684] cloud-init[582]: Generating public/private ed25519 key pair.
[   18.968065] cloud-init[582]: Your identification has been saved in /etc/ssh/ssh_host_ed25519_key
[   18.968553] cloud-init[582]: Your public key has been saved in /etc/ssh/ssh_host_ed25519_key.pub
[   18.969042] cloud-init[582]: The key fingerprint is:
[   18.969337] cloud-init[582]: SHA256:+k832rOB8+lA1YyA+AYwLs8o4PtCUJSaj2rIYMIhUWw root@debian-test-toto
[   18.969862] cloud-init[582]: The key's randomart image is:
[   18.970184] cloud-init[582]: +--[ED25519 256]--+
[   18.970467] cloud-init[582]: | +o.o. . ..      |
[   18.970744] cloud-init[582]: |. E. .o .  . +   |
[   18.971021] cloud-init[582]: |.*. .  o    o o  |
[   18.971300] cloud-init[582]: |B. =    o  .     |
[   18.971582] cloud-init[582]: |=+o o  .S .      |
[   18.971859] cloud-init[582]: |+=o    . . .     |
[   18.972141] cloud-init[582]: |O.    .   = +    |
[   18.972428] cloud-init[582]: |o+.    . . B.+   |
[   18.972714] cloud-init[582]: |. ..    ..o.*o   |
[   18.972993] cloud-init[582]: +----[SHA256]-----+
[   19.236732] cloud-init[661]: Cloud-init v. 20.4.1 running 'modules:config' at Mon, 08 Jan 2024 15:36:00 +0000. Up 19.19 seconds.
[   20.429439] cloud-init[679]: Cloud-init v. 20.4.1 running 'modules:final' at Mon, 08 Jan 2024 15:36:01 +0000. Up 20.38 seconds.
ci-info: ++++++++++++++++++++++++++++++++++Authorized keys from /home/debian/.ssh/authorized_keys for user debian+++++++++++++++++++++++++++++++++++
ci-info: +---------+-------------------------------------------------------------------------------------------------+---------+-------------------+
ci-info: | Keytype |                                       Fingerprint (sha256)                                      | Options |      Comment      |
ci-info: +---------+-------------------------------------------------------------------------------------------------+---------+-------------------+
ci-info: | ssh-rsa | 95:78:45:10:7c:43:2a:ff:77:68:37:35:f8:58:63:b1:5e:4d:d3:78:8c:04:44:da:d6:f9:37:3f:a1:99:df:cc |    -    | Generated-by-Nova |
ci-info: +---------+-------------------------------------------------------------------------------------------------+---------+-------------------+
<14>Jan  8 15:36:01 ec2: 
<14>Jan  8 15:36:01 ec2: #############################################################
<14>Jan  8 15:36:01 ec2: -----BEGIN SSH HOST KEY FINGERPRINTS-----
<14>Jan  8 15:36:01 ec2: 1024 SHA256:yXe044TwmI588LIpyU1IvHVjcBbZVOyn6DQHtIsQaNM root@debian-test-toto (DSA)
<14>Jan  8 15:36:01 ec2: 256 SHA256:crgPPcnM6yNyoIf7zdfYUENnT01Fhifr10UPV7eLyJE root@debian-test-toto (ECDSA)
<14>Jan  8 15:36:01 ec2: 256 SHA256:+k832rOB8+lA1YyA+AYwLs8o4PtCUJSaj2rIYMIhUWw root@debian-test-toto (ED25519)
<14>Jan  8 15:36:01 ec2: 3072 SHA256:AdmeHFH3HRMKpd/kvDJqAJdUtcUaLtNIVrgKFJm+ezA root@debian-test-toto (RSA)
<14>Jan  8 15:36:01 ec2: -----END SSH HOST KEY FINGERPRINTS-----
<14>Jan  8 15:36:01 ec2: #############################################################
-----BEGIN SSH HOST KEY KEYS-----
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBLhPsRuDOe3obJwvV6TUvzVnNy6/FLR6Qxa7sXnFwzSK+BHsJQ0tuGf+HGdJs4W6977v0DlYfJgK0RUnR6UVi/I= root@debian-test-toto
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIueTUylD5dDvBvhozYJ091UsnEOmkjUqHknSp1cr+2b root@debian-test-toto
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDPGfjQsKz4HDn6JsEWiXh7o5HSfTXo4nDoAeJWWundUHYUknoYRAB2nEPMkBn3lOQ6MAyCUS7gHMI/vxV8+2+trXbvNBrlHQvlZ+Inz9zdDfBqlEoqo4RvHPRNoPzmo7t0Oy0VS19hKYpIY4iKUzro8U4aehL8ludntNGF86yENBK3tDCVhUyvTET3P8fckNLOQLqiRM9sRa4RjIcM/mld1w1DSDaRoVJ7BeELTbJo28aAQm8Htz0rmF6rMQk7/85Yj4zKtbI0yq/Ejxnk1L9m/vZclU9stwFgXNon7LXJQ583zadjTpnswK0MWX5gXTZR2wioI/jo8Lzs7h1sifEeJTpYz49bhrafC+TLAvHWgVDP9CACFH1H/TPay0dAdwyoDAQd6Tmn8asUh218yEpOG8WLDeYgYRqlfQVlCbZISHonVFHpGzsSyIVzWLNOeBXF50Wn9iENwCW7Is9sUZVZ2p261gzl26rhMsOxSic4C3CmSnYNOWXSMTG+dnkSJnM= root@debian-test-toto
-----END SSH HOST KEY KEYS-----
[   20.545550] cloud-init[679]: Cloud-init v. 20.4.1 finished at Mon, 08 Jan 2024 15:36:01 +0000. Datasource DataSourceOpenStackLocal [net,ver=2].  Up 20.54 seconds
[[0;32m  OK  [0m] Finished [0;1;39mExecute cloud user/final scripts[0m.
[[0;32m  OK  [0m] Reached target [0;1;39mCloud-init target[0m.

Cloudinit : contextualisation utilisateur

  • Exemple :
    • Initialisation de la MV
    • Ajout de clés SSH (copie de la clé SSH de l’utilisateur sur la MV)
    • Installation de logiciels
    • Configuration de l’accès à un stockage spécifique
    • Collecte de logs

Cloudinit : fichier de contextualisation

  • Fichier cloud-init.yaml :
#cloud-config
package_upgrade: true
# package_update: true
packages:
  - nginx
runcmd:
  - systemctl enable nginx
  - systemctl start nginx
  - echo 'hello from cloud' > /var/www/html/index.nginx-debian.html

Cloudinit : MV avec contextualisation

  • Création de la MV :
openstack server create ... --user-data cloud-init.yaml \
    debian-test-cloudinit-<user>
watch openstack server list

Cloudinit : log

  • Log dans la MV :
    • /run/cloud-init/instancedata.json (fichier supprimé au premier reboot)
    • /var/log/cloud-init.log et cloud-init-output.log
    • Pour suivre l’éxécution de runcmd :
tail -f /var/log/cloud-init-output.log

MV : gestion des ports web

  • Afin de tester le serveur Web Nginx, utiliser un nouveau groupe de sécurité tuto-24-web (avec ssh, ping et ouverture de ports web) :
openstack server create ... --user-data cloud-init.yaml \
    --security-group tuto-24-web ...
curl <IP>
  • Destruction de la VM :
openstack server delete debian-test-cloudinit-<user>

Terraform/OpenTofu

  • Infrastructure-as-code (IaC) :
    • Automatisation du provisionnement et de la gestion des ressources informatiques
    • Déploiement multi-cloud
    • Déploiement d’application de type PaaS
  • Utilisation Terraform + Ansible :
    • Terraform : création et gestion des ressources d’infrastructure
    • Ansible : configuration des serveurs et des applications

OpenTofu

  • OpenTofu :
    • Fork open source de Terraform en 2023 (petite histoire)
    • Linux Foundation
    • Compatibilité totale avec Terraform 1.6 et nouvelles fonctionnalités (tofu test)
    • CLI

Terra/Tofu : étapes de déploiement

  1. Init : installer les providers et les plugins
  2. Write : décrire l’infrastructure-as-code (configuration)
  3. Plan : calculer/revoir les modifications à appliquer (state)
  4. Apply : fournir une infrastructure reproductible
  5. Destroy : supprimer les ressources

Terra/Tofu : concepts

  • Plugins/Providers :
    • Interaction avec les APIs des services
    • Accessibles via la Terraform registry
    • Ex : plugin OpenStack pour interagir avec le cloud OBSPM
  • Ressources :
    • Blocs de code décrivant les objets des infrastructures (MV, DP, réseau, IP, . . . ) gérés par Terraform

Terra/Tofu : fonctionnement général

  • Utilise deux entrées : la configuration (configuration) et l’état (state)
  • Génère un graphe de dépendances et en déduit un plan d’action : ordre de création des ressources, parallélisation…
  • Automatise les changements de l’infrastructure à l’aide de providers

Terra/Tofu : architecture d’une Infra-as-code

  • Séparation des états :
.
├── provider#1
├── provider#2
├── script_os#1.sh
└── script_os#2.sh

Terra/Tofu : architecture d’une Infra-as-code

  • Configuration dans un état :
    • main.tf : actions (créer un DP, une MV et les associer)
    • variables.tf : déclaration des variables
    • terraform.tfvars: variables liées au fournisseur de cloud (ID OS de la MV,…)
.
├── provider#1
│   ├── main.tf
│   ├── outputs.tf
│   ├── postinstall.yml
│   ├── terraform.tfvars
│   └── variables.tf
├── provider#2
└── script_os.sh

Terra/Tofu : language HCL

  • Templates *.tf :
    • HCL : surcouche de json pour pouvoir ajouter des commentaires (json autorisé maintenant)
## main.tf
terraform {
required_version = ">= 0.14.0"
  required_providers {
    openstack = {
      source  = "terraform-provider-openstack/openstack"
      version = "~> 1.53.0"
    }
  }
}

OpenTofu : installation de la CLI

Distribution

apt-get install -y tofu
  • Mac OS :
brew install opentofu

Test

tofu --version
# OpenTofu v1.6.2

Hands-on

Installation de Docker dans le DP d’une MV avec Terraform

  • Utiliser les fichiers du projet tp-openstack-obs-opentofu pour effectuer automatiquement :
    1. Création d’un DP
    2. Création d’une MV
    3. Association MV/PD
    4. Execution d’un script shell sur la MV qui installe Docker
git clone https://gitlab.in2p3.fr/cavet/tp-openstack-obs-opentofu.git

Terra/Tofu : initialisation

  • Commenter la variable d’environnement OS_REGION_NAMEdans LUTH-openrc.sh :
#export OS_REGION_NAME="obspm_meudon"
  • Recupèrer les plugins OpenStack via init :
    • .terraform : fichiers du provider
    • .terraform.lock.hcl : dependency lock file, to record the provider selections it made above
cd tp-openstack-obs-opentofu/obs && tofu init

Terra/Tofu : configuration

  • Préparer la configuration :
    • terraform.tfvars: modifier les variables liées à l’utilisateur (<user>, *-id)

Terra/Tofu : script pour Debian

  • Installation de Docker sur le DP :
#!/bin/bash

# install specific packages
apt-get update
apt-get install -y cvs net-tools cron-apt ca-certificates curl gnupg

# Add Docker's official GPG key: 
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg

# Add the repository to Apt sources:
echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get update

# Install Docker
apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
systemctl stop docker

## Cron for security updates
echo "update_cmd=security" >> /etc/cron-apt/config
echo "apply_updates = yes" >> /etc/cron-apt/config
systemctl start cron
systemctl enable cron

## Docker configuration
# storage driver: overlay on Ceph PD formatted with ext4
mkdir /data
mkfs.ext4 /dev/vdb
mount /dev/vdb /data
mkdir -p /data/docker

cat >> /etc/fstab << EOF
/dev/vdb                                  /data                   ext4     defaults        0 0
EOF

mkdir -p /etc/docker
cat >> /etc/docker/daemon.json << EOF
{
  "storage-driver": "overlay2",
  "data-root": "/data/docker"
}
EOF

systemctl start docker
systemctl enable docker

echo ${name_vm}
echo "VM is ready"

Terra/Tofu : plan

  • Vérifier le plan de déploiement via plan :
    • terraform.plan : plan de déploiement
tofu plan -out terraform.plan

Terra/Tofu : déploiement

  • Appliquer le plan via apply :
    • terraform.tfstate : fichier de statut local
    • terraform.tfstate.backup : backup, en cas de problème de corruption
tofu apply "terraform.plan"
# openstack_compute_instance_v2.web-server: Creating...
# openstack_compute_instance_v2.web-server: Creation complete after 1m54s [id=...]
# openstack_compute_volume_attach_v2.va_1: Creating...
# openstack_compute_volume_attach_v2.va_1: Creation complete after 7s [id=...]
# Apply complete! Resources: 3 added, 0 changed, 0 destroyed.

# Outputs:
# vm_name = "docker-terra-<user>"
# IP      = <IP>

Terra/Tofu : log de l’éxécution

Terra/Tofu : vérification de l’installation

  • Se connecter à la VM :
ssh <ip>
sudo -i
docker ps

Terra/Tofu : groupe de sécurité automatique

  • Ajouter la création d’un groupe de sécurité automatique :
    • voir la doc du provider
    • règle : seulement ssh
    openstack security group show tuto-23
    • modifier main.tf, variables.tf et terraform.tfvars

Terra/Tofu : solution

## terraform.tfvars
# New security group
security_group_id = "tuto-24-ssh"

## variables.tf
variable "security_group_id" {
  description = "security group creation"
  default     = "tuto-24"
}

## main.tf
# security group : create
resource "openstack_networking_secgroup_v2" "secgroup_1" {
  name        = "${var.security_group_id}"
  #name        = "tuto-24-terratofu"
  description = "Security group for tutorial 24"
}

resource "openstack_networking_secgroup_rule_v2" "secgroup_rule_1" {
  direction         = "ingress"
  ethertype         = "IPv4"
  protocol          = "tcp"
  port_range_min    = 22
  port_range_max    = 22
  remote_ip_prefix  = "0.0.0.0/0"
  security_group_id = openstack_networking_secgroup_v2.secgroup_1.id
}

# VM: create a docker server and attach the volume
resource "openstack_compute_instance_v2" "web-server" {
  ...
  security_groups = [openstack_networking_secgroup_v2.secgroup_1.id]
}

Terra/Tofu : relache des ressources

tofu destroy

The end!