Instancier une VM dans un openstack en CLI

Posted on mer. 19 mai 2021 in adminsys

On va partir du principe qu'on vous a fourni un accès à une plateforme openstack. Cela veut dire qu'on vous a donné ces informations-ci, au minimum :

  • une URL (généralement celle de la web-GUI horizon1, du style https://horizon.openstack.example.org/)
  • un login
  • et son mot de passe associé.

Il faut savoir que les informations ci-dessus sont le strict minimum pour se connecter à la web-GUI, mais ne sont pas suffisantes pour vraiment travailler avec openstack. En effet, il manque d'autres informations, pour pouvoir utiliser l'API d'openstack. Typiquement, l'URL du keystone2, un "project id", etc...

La bonne pratique est la création d'un "RC file", un simple fichier sh qui mettra en place les bonnes variables d'environnement dont la CLI d'openstask a besoin, et de faire un source de ce fichier avant de travailler. Vous pouvez le créer vous-même, mais il faudra qu'on vous fournisse quand même les info manquantes. Le plus aisé, pour cette étape, est quand même de passer par la Web-GUI Horizon.

Le passage quasi-obligé de la web-GUI pour le fichier RC

La première chose à faire, donc, est de récupérer ces informations supplémentaires. Ça se passe sur la web-GUI à cette adresse : https://horizon.openstack.example.org/project/api_access/. Téléchargez simplement le fichier RC que vous propose, en haut à droite :

Où cliquer pour télécharger le fichier RC d'openstack

Jetons un œil au contenu de ce fichier :

> grep -v '#' openstack-rc.sh
export OS_AUTH_URL=https://horizon.openstack.example.org:5000/v3
export OS_PROJECT_ID=718336....................b8453d
export OS_PROJECT_NAME="sandbox"
export OS_USER_DOMAIN_NAME="mycompany"
if [ -z "$OS_USER_DOMAIN_NAME" ]; then unset OS_USER_DOMAIN_NAME; fi
export OS_PROJECT_DOMAIN_ID="19e48......................8c18a"
if [ -z "$OS_PROJECT_DOMAIN_ID" ]; then unset OS_PROJECT_DOMAIN_ID; fi
unset OS_TENANT_ID
unset OS_TENANT_NAME
export OS_USERNAME="myusername"
echo "Please enter your OpenStack Password for project $OS_PROJECT_NAME as user $OS_USERNAME: "
read -sr OS_PASSWORD_INPUT
export OS_PASSWORD=$OS_PASSWORD_INPUT
export OS_REGION_NAME="region1"
if [ -z "$OS_REGION_NAME" ]; then unset OS_REGION_NAME; fi
export OS_INTERFACE=public
export OS_IDENTITY_API_VERSION=3

Si comme moi, vous être plutôt adepte du shell fish, voici le fichier rc transposé pour ce shell, c'est cadeau :

set -gx OS_AUTH_URL https://horizon.openstack.example.org:5000/v3
set -gx OS_PROJECT_ID 718336....................b8453d
set -gx OS_PROJECT_NAME sandbox
set -gx OS_USER_DOMAIN_NAME mycompany
set -gx OS_PROJECT_DOMAIN_ID 19e48......................8c18a
set -e OS_TENANT_ID
set -e OS_TENANT_NAME

set -gx OS_USERNAME user
echo "Please enter your OpenStack Password for project $OS_PROJECT_NAME as user $OS_USERNAME: "
read -s OS_PASSWORD_INPUT
set -gx OS_PASSWORD $OS_PASSWORD_INPUT

set -gx OS_REGION_NAME region1
set -gx OS_INTERFACE public 
set -gx OS_IDENTITY_API_VERSION 3

Installation de la CLI cliente openstask

Ça paraît évident, mais vous allez avoir besoin d'un shell linux (bash généralement ou fish pour moi), et de python. Sur mon poste (Fedora), l'installation en virtualenv se passe comme ça :

sudo dnf install python3-devel python3-pip python3-virtualenv
virtualenv -p python3 venv
. venv/bin/activate.fish # ou . venv/bin/activate avec bash
pip install python-openstackclient

Testons maintenant que tout est bon :

. openstack-rc.fish # ou . openstack-rc.sh avec bash
openstack server list

Si tout se passe bien, vous devriez vous voir répondre quelque chose dans ce genre :

+--------------------------------------+---------------------+---------------+-----------------------------+---------------------+--------------+
| ID                                   | Name                | Status        | Networks                    | Image               | Flavor       |
+--------------------------------------+---------------------+---------------+-----------------------------+---------------------+--------------+
| 8a0...46-4..1-4..7-8..b-7b........ea | sandbox-test-test1  | ACTIVE        | internal=172.20.X.Y         | Debian-10           | c2.medium    |
| 35c...57-a..3-4..1-b..0-30........f0 | int-ubu-user39--6   | ACTIVE        | provider=10.8.X.Y           | Ubuntu-20.04        | c2.tiny      |
[...]
+--------------------------------------+---------------------+---------------+-----------------------------+---------------------+--------------+

Bravo !

Commandes utiles avant de créer votre première VM dans openstack

Avant de créer sa première VM au sein d'openstack, il faut savoir qu'elle image de base on peut utiliser, quelle taille de VM est posible, quel réseau, etc... Pour savoir tout cela, voici quelques commandes qui vont vous y aider.

Quelle taille (flavor) ?

Quelle taille de VM voulez-vous, et surtout, que propose votre fournisseur openstack ? Vous pouvez le savoir avec cette commande :

> openstack flavor list
+--------------------------------------+-----------------+-------+------+-----------+-------+-----------+
| ID                                   | Name            |   RAM | Disk | Ephemeral | VCPUs | Is Public |
+--------------------------------------+-----------------+-------+------+-----------+-------+-----------+
| 11....94-6629-444d-ab2d-f6........83 | c2.medium       |  4096 |   20 |         0 |     2 | True      |
| 1a....34-47f6-4417-a559-13........92 | c8.large        | 12288 |   80 |         0 |     8 | True      |
[...]
+--------------------------------------+-----------------+-------+------+-----------+-------+-----------+

Quelle image de base ?

Quelle image de base pouvez-vous utiliser ? Généralement, vous ne pouvez pas utiliser toutes les distributions linux existantes, mais juste quelques unes parmis un catalogue, catalogue qui se récupère ainsi :

> openstack image list
+--------------------------------------+---------------------------+--------+
| ID                                   | Name                      | Status |
+--------------------------------------+---------------------------+--------+
| 4d....db-cdee-4f08-b37e-71........fd | CentOS-7                  | active |
| 1b....63-27de-4b0c-bca9-c6........52 | CentOS-8                  | active |
| e4....3a-00e1-432d-b0eb-8d........69 | Ubuntu-20.04              | active |
| ea....5f-e72d-4da3-8f04-5d........3c | Debian-10                 | active |
[...]
+--------------------------------------+---------------------------+--------+

Quel réseau lui attacher ?

Votre VM va avoir besoin d'être connectée sur un réseau pour pouvoir communiquer et que vous puissiez vous y connecter. Pour avoir la liste, je pense que maintenant, vous devez commencer à deviner :

> openstack network list
+--------------------------------------+-------------------+--------------------------------------+
| ID                                   | Name              | Subnets                              |
+--------------------------------------+-------------------+--------------------------------------+
| 07....1a-09b9-49e6-9b09-1b........5c | internal          | 1a....5e-536d-4889-ae47-ca........02 |
| 08....56-76ca-4c85-b0d9-bb........6e | public            | ff....59-43b0-4620-a225-da........8b |
[...]
+--------------------------------------+-------------------+--------------------------------------+

Quel filtrage (security group) ?

Il faut que vous puissiez vous connecter en SSH à votre VM, il faut donc lui appliquer un "security group" qui l'autorise. Dans mon cas, il en existe un bien nommé "ssh".

> openstack security group list
+--------------------------------------+-------------+------------------------+----------------------------------+---------+
| ID                                   | Name        | Description            | Project                          | Tags    |
+--------------------------------------+-------------+------------------------+----------------------------------+---------+
| 0f....ee-497b-4917-8569-ae........ea | default     | Default security group | 71............................3d | []      |
| 29....82-f29a-470b-a7bf-cd........20 | ssh         |                        | 71............................3d | []      |
[...]
+--------------------------------------+-------------+------------------------+----------------------------------+---------+

Quelle clé SSH ?

On sait tous que se connecter en SSH sur un serveur avec un mot de passe, c'est pas génial. Du coup, il faut indiquer une pair de clé à openstask. Si vous en avez déjà inscrites dans openstack, c'est facile, un coup de openstack keypair list devrait suffir, mais si non, il faut le faire :

> openstack keypair list

> openstack keypair create --public-key ~/.ssh/id_rsa.pub ssh-rsa-etienne
+-------------+------------------------------------------------------------------+
| Field       | Value                                                            |
+-------------+------------------------------------------------------------------+
| created_at  | None                                                             |
| fingerprint | d9:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:cb                  |
| id          | ssh-rsa-etienne                                                  |
| is_deleted  | None                                                             |
| name        | ssh-rsa-etienne                                                  |
| type        | ssh                                                              |
| user_id     | 8e............................................................00 |
+-------------+------------------------------------------------------------------+
> openstack keypair list
+-----------------+-------------------------------------------------+------+
| Name            | Fingerprint                                     | Type |
+-----------------+-------------------------------------------------+------+
| ssh-rsa-etienne | d9:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:cb | ssh  |
+-----------------+-------------------------------------------------+------+

Créons notre premier VM avec openstack

Voici la commande qu'il faut utiliser pour créer une VM dans votre openstack, ainsi que sa syntaxe.

openstack server create --flavor {FlavorID-or-FlavorName} --image {ImageID-or-ImageName}  --nic net-id={NetworkID-or-NetworkName} --security-group {SecurityGroupID-SecurityGroupName} –key-name {KeypairName} <VM_Name>

Exemple :

> openstack server create --flavor c2.medium --image Debian-10  --nic net-id=internal --security-group ssh -–key-name ssh-rsa-etienne sandbox-test-user1
+-----------------------------+------------------------------------------------------------------+
| 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                   | xxxxxxxxxxxx                                                     |
| config_drive                |                                                                  |
| created                     | 2021-05-19T15:44:50Z                                             |
| flavor                      | c2.medium (11....94-6629-444d-ab2d-f6........83)                 |
| hostId                      |                                                                  |
| id                          | af....c2-562e-49b3-9848-f0........8d                             |
| image                       | Debian-10 (ea....5f-e72d-4da3-8f04-5d........3c)                 |
| key_name                    | ssh-rsa-etienne                                                  |
| name                        | sandbox-test-user1                                               |
| progress                    | 0                                                                |
| project_id                  | 71............................3d                                 |
| properties                  |                                                                  |
| security_groups             | name='29....92-f29a-470b-a7bf-cd........20'                      |
| status                      | BUILD                                                            |
| updated                     | 2021-05-19T15:44:50Z                                             |
| user_id                     | 8e............................................................00 |
| volumes_attached            |                                                                  |
+-----------------------------+------------------------------------------------------------------+

Vérification du résultat :

> openstack server list | grep sandbox-test-user1
| af....c2-562e-49b3-9848-f0........8d | sandbox-test-user1    | ACTIVE            | internal=172.20.X.Y                         | Debian-10           | c2.medium       |

La nouvelle VM est bien présente sur l'openstack.

> openstack server show sandbox-test-user1
+-----------------------------+------------------------------------------------------------------+
| Field                       | Value                                                            |
+-----------------------------+------------------------------------------------------------------+
| OS-DCF:diskConfig           | MANUAL                                                           |
| OS-EXT-AZ:availability_zone | nova                                                             |
| OS-EXT-STS:power_state      | Running                                                          |
| OS-EXT-STS:task_state       | None                                                             |
| OS-EXT-STS:vm_state         | active                                                           |
| OS-SRV-USG:launched_at      | 2021-05-19T15:44:56.000000                                       |
| OS-SRV-USG:terminated_at    | None                                                             |
| accessIPv4                  |                                                                  |
| accessIPv6                  |                                                                  |
| addresses                   | internal=172.20.X.Y                                              |
| config_drive                |                                                                  |
| created                     | 2021-05-19T15:44:50Z                                             |
| flavor                      | c2.medium (11....94-6629-444d-ab2d-f6........83)                 |
| hostId                      | 93....................................................99         |
| id                          | af....c2-562e-49b3-9848-f0........8d                             |
| image                       | Debian-10 (ea....5f-e72d-4da3-8f04-5d........3c)                 |
| key_name                    | ssh-rsa-etienne                                                  |
| name                        | sandbox-test-user1                                               |
| progress                    | 0                                                                |
| project_id                  | 71............................3d                                 |
| properties                  |                                                                  |
| security_groups             | name='ssh'                                                       |
| status                      | ACTIVE                                                           |
| updated                     | 2021-05-19T15:44:56Z                                             |
| user_id                     | 8e............................................................00 |
| volumes_attached            |                                                                  |
+-----------------------------+------------------------------------------------------------------+

Et son status est bien ACTIVE. Bravo.

Comment s'y connecter ?

Pour s'y connecter, dans l'immédiat, le plus facile est de lui assigner une floating IP. C'est une IP "publique" qu'on attache à la VM pour pouvoir la joindre depuis l'extérieur d'openstack. Sans cela, la VM existe, certes, mais vous ne pouvez pas vous y connecter directement.

J'imagine que maintenant, vous devez savoir comment procéder. On commence par lister les floating IP dosponible, pour ensuite en attacher une à la VM.

> openstack floating ip list
+--------------------------------------+---------------------+------------------+--------------------------------------+--------------------------------------+----------------------------------+
| ID                                   | Floating IP Address | Fixed IP Address | Port                                 | Floating Network                     | Project                          |
+--------------------------------------+---------------------+------------------+--------------------------------------+--------------------------------------+----------------------------------+
| 02....03-ad67-40f8-b580-cb........d1 | 10.8.X.Y            | None             | None                                 | 08....56-76ca-4c85-b0d9-bb........6e | 71............................3d |
| 19....32-72b4-494e-9bcb-2e........c0 | 10.8.X.Y            | 192.168.X.Y      | 04....16-0e56-4ad5-ae87-ac........c1 | 08....56-76ca-4c85-b0d9-bb........6e | 71............................3d |
[...]
+--------------------------------------+---------------------+------------------+--------------------------------------+--------------------------------------+----------------------------------+

Ici, on voit que la 1e floating IP est disponible, alors que la seconde non.

> openstack server add floating ip sandbox-test-user1 10.8.X.Y

Plus qu'à s'y connecter :

> ssh debian@10.8.X.Y
Linux sandbox-test-user1 4.19.0-10-amd64 #1 SMP Debian 4.19.132-1 (2020-07-24) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
debian@sandbox-test-user1:~$

Bravo !

Ça sera tout pour aujourd'hui.


  1. Openstack étant pensé en architecture micro-service, Horizon est le nom donné au service qui fait tourner la webui. 

  2. Keystone est le micro-service chargé de tout ce qui a rapport à l'authentification au sein d'openstack.