OpenStack est un logiciel libre1) qui permet la construction de cloud privé et public. C’est aussi le nom d’une communauté et d’un projet qui ont pour but d’aider les organisations à mettre en œuvre un système de serveur et de stockage virtuel.
OpenStack est composé d’une série de logiciels et de projets au code source libre qui sont maintenus par la communauté. Il comprend notamment les composants OpenStack Compute, nommé Nova, OpenStack Object Storage, nommé Swift, et OpenStack Image Service, nommé Glance.
Ce document présente l’installation des composants d’identité, d’images et de virtualisation, sur une seule machine. Cela correspond davantage à une configuration de développement. Elle est néanmoins fonctionnelle. Les services réseau avancé, nommé Neutron (ex-Quantum), et stockage objet, nommé Swift, ne sont pas abordés ici.
Dispositions générales :
Notes particulières :
Modifiez avec les droits d'administration votre fichier /etc/network/interfaces comme ci-dessous en adaptant a votre configuration.
auto lo iface lo inet loopback auto eth0 iface eth0 inet manual auto eth1 iface eth1 inet manual auto br0 iface br0 inet static bridge_ports eth0 address 192.168.1.250 netmask 255.255.255.0 gateway 192.168.1.254 broadcast 192.168.1.255 auto br1 iface br1 inet manual bridge_ports eth1
Modifiez avec les droits d'administration votre fichier /etc/resolv.conf comme ci-dessous et ajoutez vos DNS habituels.
Les DNS ci dessous sont ceux de Google
nameserver 8.8.8.8 nameserver 8.8.4.4
Relancez les cartes réseau pour que les modifications soient prises en compte.
for a in `ifconfig | awk '/Link/ { if ($1 != "lo") print $1 }'`; do sudo ifdown $a ; done sudo ifup -e lo -av
net.ipv4.ip_forward=1
puis lancez la commande :
sysctl -p
Le serveur NTP étant nécessaire à la bonne synchronisation du cloud, installez le paquet ntp.
Ensuite, ouvrez avec les droits d'administration le fichier /etc/ntp.conf et ajoutez les lignes
server ntp.ubuntu.com iburst server 127.127.1.0 fudge 127.127.1.0 stratum 10
redémarrez le service
sudo service ntp restart
Les volumes LVM serviront de disques durs supplémentaires pour les serveurs virtuels.
Installez les paquets tgt,open-iscsi,open-iscsi-utils,lvm2
Les commandes qui suivent supposent que vous avez un disque dur /dev/sdc vide sans partition. Adaptez les commandes en fonction de votre configuration.
Créez une partition non formatée de 100Gigas sur /dev/sdc en adaptant à votre configuration:
sudo fdisk /dev/sdc n p 1 <return> +100G w
Vous avez maintenant une partition primaire vide de 100 Gigas /dev/sdc1.
Créez maintenant le volume LVM. Attention, le nom nova-volumes doit être respecté:
sudo pvcreate /dev/sdc1 sudo vgcreate nova-volumes /dev/sdc1
RabbitMQ est un courtier de messages se basant sur le standard AMQP afin d'échanger avec différents clients.
Pour faire simple: c'est le service qui permet aux composants OpenStack de communiquer entre eux.
Installez les paquets rabbitmq-server,memcached,python-memcache
Chaque composant possède sa base de données MySQL, contenant toutes les données modifiables à chaud (ID des images disques, des instances virtuelles, réseaux, identités…). Les données de configuration fixes sont stockées dans des fichiers texte.
Pour indiquer a MySQL que le serveur doit écouter sur toutes les adresses et pas seulement sur la boucle locale, modifiez sa configuration en ouvrant avec les droits d'administration le fichier /etc/mysql/my.cnf pour remplacer:
bind-address = 127.0.0.1
par
bind-address = 0.0.0.0
et redémarrez MySQL
sudo service mysql restart
Le composant Keystone est chargé de la gestion des utilisateurs et des services.
La gestion des utilisateurs s’articule autour de 3 objets :
La gestion des différents services s’applique notamment aux :
La définition des points d’accès à ces différents services porte en l’occurrence sur :
Commencez par créer la base MySQL.
La commande suivante crée un utilisateur et sa base de données nommés "keystone". Changez SQLPASSWD par un mot de passe de votre choix.
mysql -u root -p <<EOF CREATE DATABASE keystone; GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY 'SQLPASSWD'; FLUSH PRIVILEGES; EOF
Installez les paquets keystone,python-keystone,python-keystoneclient,python-mysqldb.
Puis supprimez la base de données SQLite :
rm /var/lib/keystone/keystone.db
Ouvrez avec les droits d'administration le fichier /etc/keystone/keystone.conf pour modifier les sections suivantes :
Remplacez ADMPASSWD par un mot de passe de votre choix et SQLPASSWD par le mot de passe MySQL précédemment défini.
[DEFAULT] bind_host = 0.0.0.0 public_port = 5000 admin_port = 35357 # Mot de passe d'administration admin_token = ADMPASSWD compute_port = 8774 verbose = True debug = True log_config = /etc/keystone/logging.conf [sql] connection = mysql://keystone:SQLPASSWD@192.168.1.250:3306/keystone idle_timeout = 200
Redémarrez le service keystone :
sudo service keystone restart
Synchronisez la base de données :
sudo keystone-manage db_sync
et donnez les droits en lecture / écriture à l’utilisateur / au groupe keystone :
chown keystone:keystone /var/lib/keystone/keystone.db
Chaque commande ci-dessous contient l’authentification définie dans le fichier keystone.conf et utilisée par le client Python sous la forme suivante :
--token admin_token # mot de passe d'administration --endpoint url_du_service_keystone # adresse du serveur:port/dossier/
Commande à exécuter après adaptation :
keystone --token ADMPASSWD --endpoint http://192.168.1.250:35357/v2.0/ user-create --name=admin --pass=ADMPASSWD --email=admin@example.com
Réponse obtenue de manière approximative :
+----------+-------------------------------------------------------------------------------------------------------------------------+ | Property | Value | +----------+-------------------------------------------------------------------------------------------------------------------------+ | email | admin@example.com | | enabled | True | | id | c97c87b3ed894401975dd6d757b40330 | | name | admin | | password | $6$rounds=40000$cZhg187ypC6hMMD1$YQAxiXspmMVsu1di.o3UlZjvjlEO9WXii48Q29tyIXTzDpT5e92XBij9Pz4A5YLoGaccf8PBf1jcAan9YLDOl. | | tenantId | None | +----------+-------------------------------------------------------------------------------------------------------------------------+
Commande à exécuter après adaptation :
keystone --token ADMPASSWD --endpoint http://192.168.1.250:35357/v2.0/ user-create --name=glance --pass=ADMPASSWD --email=glance@example.com
Réponse obtenue de manière approximative :
+----------+-------------------------------------------------------------------------------------------------------------------------+ | Property | Value | +----------+-------------------------------------------------------------------------------------------------------------------------+ | email | glance@example.com | | enabled | True | | id | 876ef0a6c0c048039f847e61da7260b4 | | name | glance | | password | $6$rounds=40000$pYJjQYtDJGdFB/nl$UOmryhbqCIROSPNhs8/svbPg2JIns31yImcAXTh/CXT3o9GOZTNYadZe2zp7M0.XeHqJD5bI1lhZYM09uSrmN0 | | tenantId | None | +----------+-------------------------------------------------------------------------------------------------------------------------+
Commande à exécuter après adaptation :
keystone --token ADMPASSWD --endpoint http://192.168.1.250:35357/v2.0/ user-create --name=nova --pass=ADMPASSWD --email=nova@example.com
Réponse obtenue de manière approximative :
+----------+-------------------------------------------------------------------------------------------------------------------------+ | Property | Value | +----------+-------------------------------------------------------------------------------------------------------------------------+ | email | nova@example.com | | enabled | True | | id | 5c54624fef2242e185af10b7a2a2768f | | name | nova | | password | $6$rounds=40000$ogH/.VbZJgp2pDF8$w7TCuRu95Q8c6PMR5Zmbs7Osjk8tXfkDKixzRY.t/Ghv/WvOoLD1au/cCbMWVfaEhr14RAGheTA2E2rPoVEjd1 | | tenantId | None | +----------+-------------------------------------------------------------------------------------------------------------------------+
Chaque utilisateur peut être associé à un des deux rôles suivants :
Les rôles KeystoneAdmin et KeystoneServiceAdmin sont des rôles internes et nécessaires.
Par la suite, les commandes proposées intègrent l’authentification et l’accès au service sur le même modèle que pour la création des utilisateurs supra.
Commande à exécuter de manière adaptée :
keystone --token ADMPASSWD --endpoint http://192.168.1.250:35357/v2.0/ role-create --name=admin
Réponse obtenue de manière approximative :
+----------+----------------------------------+ | Property | Value | +----------+----------------------------------+ | id | 3d945f41e08e4e2db1584fdb8f05d333 | | name | admin | +----------+----------------------------------+
Commande à exécuter de manière adaptée :
keystone --token ADMPASSWD --endpoint http://192.168.1.250:35357/v2.0/ role-create --name=Member
Réponse obtenue de manière approximative :
+----------+----------------------------------+ | Property | Value | +----------+----------------------------------+ | id | 84697b61736c439288900904bdf4a48d | | name | Member | +----------+----------------------------------+
Commande à exécuter de manière adaptée :
keystone --token ADMPASSWD --endpoint http://192.168.1.250:35357/v2.0/ role-create --name=KeystoneAdmin
Réponse obtenue de manière approximative :
+----------+----------------------------------+ | Property | Value | +----------+----------------------------------+ | id | d4d6482b0ec04e0fa24aa8263c182d08 | | name | KeystoneAdmin | +----------+----------------------------------+
Commande à exécuter de manière adaptée :
keystone --token ADMPASSWD --endpoint http://192.168.1.250:35357/v2.0/ role-create --name=KeystoneServiceAdmin
Réponse obtenue de manière approximative :
+----------+----------------------------------+ | Property | Value | +----------+----------------------------------+ | id | 46590e32dbbe40f29253b5b928b83d1b | | name | KeystoneServiceAdmin | +----------+----------------------------------+
Par la suite, les commandes proposées intègrent l’authentification et l’accès au service sur le même modèle que pour la création des utilisateurs supra.
Le Tenant admin permet à ses membres d’administrer les services.
Commande à exécuter de manière adaptée :
keystone --token ADMPASSWD --endpoint http://192.168.1.250:35357/v2.0/ tenant-create --name=admin
Réponse obtenue de manière approximative :
+-------------+----------------------------------+ | Property | Value | +-------------+----------------------------------+ | description | None | | enabled | True | | id | 0f71e86d30e247d3b1216fe5f2f3aa50 | | name | admin | +-------------+----------------------------------+
Le Tenant service permet à ses membres d’accéder au service.
Commande à exécuter de manière adaptée :
keystone --token ADMPASSWD --endpoint http://192.168.1.250:35357/v2.0/ tenant-create --name=service
Réponse obtenue de manière approximative :
+-------------+----------------------------------+ | Property | Value | +-------------+----------------------------------+ | description | None | | enabled | True | | id | 1a3515e468f14e0ebb4a4e83447e7bf7 | | name | service | +-------------+----------------------------------+
Il faut pour cela utiliser les ID affichés lors de la création des Users2), Roles3) et Tenants.
L'User "admin" a un Role admin sur le Tenant "admin".
keystone --token ADMPASSWD --endpoint http://192.168.1.250:35357/v2.0/ user-role-add --user-id c97c87b3ed894401975dd6d757b40330 --role-id 3d945f41e08e4e2db1584fdb8f05d333 --tenant_id 0f71e86d30e247d3b1216fe5f2f3aa50
Comme ce n'est pas pratique de recopier les IDs, les erreurs de frappe seront évitées grâce à l'outil awk. Il s'agira de définir les rôles ainsi:
Voici les commandes correspondantes :
keystone user-role-add --user-id `keystone user-list | awk '/ admin / { print $2 }'` --role-id `keystone role-list | awk '/ KeystoneAdmin / { print $2 }'` --tenant_id `keystone tenant-list | awk '/ admin / { print $2 }'` keystone user-role-add --user-id `keystone user-list | awk '/ admin / { print $2 }'` --role-id `keystone role-list | awk '/ KeystoneServiceAdmin / { print $2 }'` --tenant_id `keystone tenant-list | awk '/ admin / { print $2 }'` keystone user-role-add --user-id `keystone user-list | awk '/ glance / { print $2 }'` --role-id `keystone role-list | awk '/ admin / { print $2 }'` --tenant_id `keystone tenant-list | awk '/ service / { print $2 }'` keystone user-role-add --user-id `keystone user-list | awk '/ nova / { print $2 }'` --role-id `keystone role-list | awk '/ admin / { print $2 }'` --tenant_id `keystone tenant-list | awk '/ service / { print $2 }'`
Il s'agira dans l'exemple qui suit de la création d'un compte utilisateur, d'un projet supplémentaire et définition du role avec la variable d'environnement $USER (remplacer par ce que vous voulez, c'est juste un exemple)
Le rôle "Member" est suffisant. Remplacez USRPASSWD par un mot de passe de votre choix.
L'User $USER (xavier ici) a un Role "Member" sur le Tenant $USER (xavier ici).
keystone --token ADMPASSWD --endpoint http://192.168.1.250:35357/v2.0/ user-create --name=$USER --pass=USRPASSWD --email=$USER@example.com
+----------+-------------------------------------------------------------------------------------------------------------------------+ | Property | Value | +----------+-------------------------------------------------------------------------------------------------------------------------+ | email | xavier@example.com | | enabled | True | | id | 13247a59ad844458ad36c0bd06451376 | | name | xavier | | password | $6$rounds=40000$3YPS4NJ1DqKdzEjc$XPGFlqCfu2ZCNUMJCjFMkvFfXrOkixuVq1I6.mjd9PXzU.4u6ELHYeNbvYJyiCGvUHaggIgo9rMESeA8v4x3Y1 | | tenantId | None | +----------+-------------------------------------------------------------------------------------------------------------------------+
keystone --token ADMPASSWD --endpoint http://192.168.1.250:35357/v2.0/ tenant-create --name=$USER
+-------------+----------------------------------+ | Property | Value | +-------------+----------------------------------+ | description | None | | enabled | True | | id | c6f05a03b4aa482c91b61a2230356618 | | name | xavier | +-------------+----------------------------------+
keystone --token ADMPASSWD --endpoint http://192.168.1.250:35357/v2.0/ user-role-add --user-id 13247a59ad844458ad36c0bd06451376 --role-id 84697b61736c439288900904bdf4a48d --tenant_id c6f05a03b4aa482c91b61a2230356618
keystone --token ADMPASSWD --endpoint http://192.168.1.250:35357/v2.0/ service-create --name=keystone --type=identity --description='Keystone Identity Service'
+-------------+----------------------------------+ | Property | Value | +-------------+----------------------------------+ | description | Keystone Identity Service | | id | 41905e02540d48228166c6d06ddcd9f0 | | name | keystone | | type | identity | +-------------+----------------------------------+
keystone --token ADMPASSWD --endpoint http://192.168.1.250:35357/v2.0/ endpoint-create --region RegionOne --service_id=41905e02540d48228166c6d06ddcd9f0 --publicurl=http://192.168.1.250:5000/v2.0 --internalurl=http://192.168.1.250:5000/v2.0 --adminurl=http://192.168.1.250:35357/v2.0
+-------------+----------------------------------+ | Property | Value | +-------------+----------------------------------+ | adminurl | http://192.168.2.250:35357/v2.0 | | id | f1c517d5754a493fa67fc21b3f4264c4 | | internalurl | http://192.168.2.250:5000/v2.0 | | publicurl | http://192.168.2.250:5000/v2.0 | | region | RegionOne | | service_id | 41905e02540d48228166c6d06ddcd9f0 | +-------------+----------------------------------+
Les services et points d'accès des autres services seront ajoutés après l'installation du composant bien qu'il soit possible de les définir dès maintenant.
Il y a plusieurs façons possibles de s'identifier en lançant une commande keystone.
--endpoint
et --token
keystone --endpoint http://localhost:35357/v2.0 --token ADMPASSWD user-list
--username
, --tenant_name
, --password
, après définition des utilisateurs, rôles et projets, et l'argument --auth_url
.keystone --username admin --password ADMPASSWD --tenant_name admin --auth_url http://localhost:5000/v2.0 user-list
Pour les deux méthodes, il est possible d'utiliser des variables d'environnement pour éviter de ressaisir tous les arguments à chaque commande.
1ère méthode:
export SERVICE_ENDPOINT=http://localhost:5000/v2.0/ export SERVICE_TOKEN=ADMPASSWD keystone user-list
2ème méthode:
export OS_TENANT_NAME=admin export OS_USERNAME=admin export OS_PASSWORD=ADMPASSWD export OS_AUTH_URL="http://localhost:5000/v2.0/" keystone user-list
Pour éviter de refaire un export des variables à chaque ouverture de terminal, vous pouvez les exporter automatiquement.
Il suffit de créer un fichier .novarc dans votre Dossier Personnel contenant les lignes suivantes
export OS_TENANT_NAME=admin export OS_USERNAME=admin export OS_PASSWORD=ADMPASSWD export OS_AUTH_URL="http://192.168.1.250:5000/v2.0/"
Ajoutez ensuite la ligne suivante a la fin de votre fichier .bashrc
source ~/.novarc
Les variables seront exportées comme variables d'environnement et vous pourrez utiliser toutes les commandes sous la forme simple sans ressaisir les informations d'authentification.
keystone user-list
+----------------------------------+---------+--------------------------+--------+ | id | enabled | email | name | +----------------------------------+---------+--------------------------+--------+ | 13247a59ad844458ad36c0bd06451376 | True | xavier@example.com | xavier | | 5c54624fef2242e185af10b7a2a2768f | True | nova@example.com | nova | | 876ef0a6c0c048039f847e61da7260b4 | True | glance@example.com | glance | | c97c87b3ed894401975dd6d757b40330 | True | admin@example.com | admin | +----------------------------------+---------+--------------------------+--------+
Les commandes keystone role-list
et keystone tenant-list
affichent respectivement la liste des rôles et tenants.
Il est bien sûr possible d'envoyer des commandes à partir de n'importe quel autre ordinateur où le paquet python-keystoneclient est installé.
Pour voir la liste des commandes disponibles et les détails utilisez :
keystone help [NOM DE LA COMMANDE]
La prochaine étape est l'installation du service d'images Glance.
C'est le service chargé de distribuer les images de disque dur système utilisées par les machines virtuelles.
La commande suivante crée un utilisateur et sa base de données nommés "glance". Changez SQLPASSWD par un mot de passe de votre choix.
mysql -u root -p <<EOF CREATE DATABASE glance; GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'%' IDENTIFIED BY 'SQLPASSWD'; FLUSH PRIVILEGES; EOF
Il faut aussi créer les services et points d'accès correspondants pour Keystone
keystone service-create --name=glance --type=image --description='Glance Image Service'
+-------------+----------------------------------+ | Property | Value | +-------------+----------------------------------+ | description | Glance Image Service | | id | 39bbd3107c4c4153a408a3b6a34ef931 | | name | glance | | type | image | +-------------+----------------------------------+
keystone endpoint-create --region RegionOne --service_id=39bbd3107c4c4153a408a3b6a34ef931 --publicurl=http://192.168.1.250:9292/v1 --internalurl=http://192.168.1.250:9292/v1 --adminurl=http://192.168.1.250:9292/v1
+-------------+----------------------------------+ | Property | Value | +-------------+----------------------------------+ | adminurl | http://192.168.1.250:9292/v1 | | id | 8fa4c9092dbb4ce989fdcbaceddec45d | | internalurl | http://192.168.1.250:9292/v1 | | publicurl | http://192.168.1.250:9292/v1 | | region | RegionOne | | service_id | 39bbd3107c4c4153a408a3b6a34ef931 | +-------------+----------------------------------+
Dans les fichiers ci-dessous, SQLPASSWD est le mot de passe MySQL Glance, ADMPASSWD le mot de passe du compte de service Glance
Ouvrez avec les droits d'administration le fichier /etc/glance/glance-api-paste.ini, allez à la fin pour modifier ces lignes avec les valeurs correspondant à votre installation:
admin_tenant_name = service admin_user = glance admin_password = ADMPASSWD
La section [pipeline:glance-api] doit contenir
[pipeline:glance-api] pipeline = versionnegotiation authtoken auth-context apiv1app
Ouvrez avec les droits d'administration le fichier /etc/glance/glance-api.conf pour y ajouter les lignes suivantes:
[paste_deploy] flavor = keystone
Ouvrez avec les droits d'administration le fichier /etc/glance/glance-registry.conf et modifiez la ligne suivante:
sql_connection = mysql://glance:SQLPASSWD@192.168.1.250:3306/glance
et ajoutez à la fin
[paste_deploy] flavor = keystone
Ouvrez avec les droits d'administration le fichier /etc/glance/glance-scrubber.conf pour ajouter les lignes suivantes:
sql_connection = mysql://glance:SQLPASSWD@192.168.1.250:3306/glance sql_idle_timeout = 3600
Ouvrez avec les droits d'administration le fichier /etc/glance/glance-registry-paste.ini et modifiez les lignes suivantes:
admin_tenant_name = service admin_user = glance admin_password = ADMPASSWD
et la section
[pipeline:glance-registry] pipeline = authtoken auth-context context registryapp
Synchronisez maintenant la base de données MySQL
sudo glance-manage version_control 0 sudo glance-manage db_sync
Si message d'erreur "CRITICAL glance [-] ValueError: Tables "migrate_version" have non utf8 collation, please make sure all tables are CHARSET=utf8" :
mysql -u root -p glance alter table migrate_version convert to character set utf8 collate utf8_unicode_ci; flush privileges; quit
Redémarrez les services pour la prise en compte des modifications
sudo service glance-api restart && sudo service glance-registry restart
Vérifiez maintenant si tout fonctionne correctement. Téléchargez une première image pour tester:
wget http://uec-images.ubuntu.com/releases/precise/release/ubuntu-12.04-server-cloudimg-amd64-disk1.img
Ajoutez maintenant l'image téléchargée aux images Glance
glance add name="Ubuntu 12.04 cloudimg amd64" is_public=true container_format=ovf disk_format=qcow2 < ubuntu-12.04-server-cloudimg-amd64-disk1.img
Uploading image 'Ubuntu 12.04 cloudimg amd64' =====================================================================================================================================================================================================================================[100%] 136.648660M/s, ETA 0h 0m 0s Added new image with ID: d1b7defa-0c35-4e8c-aef5-0d58c8d80a52
La commande glance index
donne une liste des images:
glance index
ID Name Disk Format Container Format Size ------------------------------------ ------------------------------ -------------------- -------------------- -------------- d1b7defa-0c35-4e8c-aef5-0d58c8d80a52 Ubuntu 12.04 cloudimg amd64 qcow2 ovf 230490112
La commande glance details
affiche des informations détaillées sur toutes les images.
glance details
================================================================================ URI: http://192.168.1.250:9292/v1/images/d1b7defa-0c35-4e8c-aef5-0d58c8d80a52 Id: d1b7defa-0c35-4e8c-aef5-0d58c8d80a52 Public: Yes Protected: No Name: Ubuntu 12.04 cloudimg amd64 Status: active Size: 230490112 Disk format: qcow2 Container format: ovf Minimum Ram Required (MB): 0 Minimum Disk Required (GB): 0 Owner: 0f71e86d30e247d3b1216fe5f2f3aa50 ================================================================================
La syntaxe de la commande glance add est la suivante :
glance add name="<Image name>" is_public=true container_format=<container_format> disk_format=<disk_format> < <filename>
où:
Pour voir la liste des commandes disponibles et les détails utilisez :
glance help [NOM DE LA COMMANDE]
Passez maintenant à l'installation de Nova, la gestion des instances des machines virtuelles, de leur espace disque et du réseau.
La commande suivante crée un utilisateur et sa base de données nommés "nova". Changez SQLPASSWD par un mot de passe de votre choix
mysql -u root -p <<EOF CREATE DATABASE nova; GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' IDENTIFIED BY 'SQLPASSWD'; EOF
Installez les paquets nova-api nova-cert nova-common nova-compute nova-compute-kvm nova-doc nova-network nova-objectstore nova-scheduler novnc nova-consoleauth nova-volume python-nova python-novaclient.
Création des services et points d'accès pour Keystone, au nombre de 2: les services de type compute (auquel on donne le nom de "nova") et de type volume (auquel on donne le nom de "volume").
keystone service-create --name=nova --type=compute --description='OpenStack Compute Service'
+-------------+----------------------------------+ | Property | Value | +-------------+----------------------------------+ | description | OpenStack Compute Service | | id | 4ba6c7149dd1421f8c429afc0c8dbdfe | | name | nova | | type | compute | +-------------+----------------------------------+
keystone endpoint-create --region RegionOne --service_id=4ba6c7149dd1421f8c429afc0c8dbdfe --publicurl='http://192.168.1.250:8774/v2/%(tenant_id)s' --internalurl='http://192.168.1.250:8774/v2/%(tenant_id)s' --adminurl='http://192.168.1.250:8774/v2/%(tenant_id)s'
+-------------+--------------------------------------------+ | Property | Value | +-------------+--------------------------------------------+ | adminurl | http://192.168.1.250:8774/v2/%(tenant_id)s | | id | f783461a1d0f4d9fb8e6dabc0fd0a177 | | internalurl | http://192.168.1.250:8774/v2/%(tenant_id)s | | publicurl | http://192.168.1.250:8774/v2/%(tenant_id)s | | region | RegionOne | | service_id | 4ba6c7149dd1421f8c429afc0c8dbdfe | +-------------+--------------------------------------------+
keystone service-create --name=volume --type=volume --description='OpenStack Volume Service'
+-------------+----------------------------------+ | Property | Value | +-------------+----------------------------------+ | description | OpenStack Volume Service | | id | de65a68c5ae34737bc6678f6c7bc884a | | name | volume | | type | volume | +-------------+----------------------------------+
keystone endpoint-create --region RegionOne --service_id=de65a68c5ae34737bc6678f6c7bc884a --publicurl='http://192.168.1.250:8776/v1/%(tenant_id)s' --internalurl='http://192.168.1.250:8776/v1/%(tenant_id)s' --adminurl='http://192.168.1.250:8776/v1/%(tenant_id)s'
+-------------+--------------------------------------------+ | Property | Value | +-------------+--------------------------------------------+ | adminurl | http://192.168.1.250:8776/v1/%(tenant_id)s | | id | 36834fdc7ce3410a8442dffd90c3d3e2 | | internalurl | http://192.168.1.250:8776/v1/%(tenant_id)s | | publicurl | http://192.168.1.250:8776/v1/%(tenant_id)s | | region | RegionOne | | service_id | de65a68c5ae34737bc6678f6c7bc884a | +-------------+--------------------------------------------+
Dans les fichiers ci-dessous, SQLPASSWD est le mot de passe MySQL Nova, ADMPASSWD le mot de passe du compte de service Nova
Ouvrez avec les droits d'administration le fichier /etc/nova/api-paste.ini et modifiez les lignes:
admin_tenant_name = service admin_user = nova admin_password = ADMPASSWD
Ouvrez avec les droits d'administration le fichier /etc/nova/nova.conf et remplacer tout avec les lignes ci dessous.
La configuration obtenue utilisera le mode DHCP. La ligne "nova.scheduler.simple.SimpleScheduler" définit une utilisation avec un seul serveur.
Pour un mode VLAN, pour utiliser plusieurs serveurs ou d'autres options, reportez-vous à la documentation OpenStack (en).
# LOGS/STATE --verbose --logdir=/var/log/nova --state_path=/var/lib/nova --lock_path=/var/lock/nova --allow_admin_api=true --use_deprecated_auth=false --cc_host=192.168.1.250 --nova_url=http://192.168.1.250:8774/v1.1/ --routing_source_ip=192.168.1.250 --s3_host=192.168.1.250 --ec2_host=192.168.1.250 --ec2_url=http://192.168.1.250:8773/services/Cloud --keystone_ec2_url=http://192.168.1.250:5000/v2.0/ec2tokens --scheduler_driver=nova.scheduler.simple.SimpleScheduler #root_helper est deprecie, rootwrap_config=/etc/nova/rootwrap.conf --root_helper=sudo nova-rootwrap # AUTHENTICATION --auth_strategy=keystone # VOLUMES --iscsi_helper=tgtadm --iscsi_ip_prefix=172.16.0 # DATABASE --sql_connection=mysql://nova:SQLPASSWD@192.168.1.250/nova # COMPUTE --libvirt_type=kvm --connection_type=libvirt --libvirt_use_virtio_for_bridges=true --api_paste_config=/etc/nova/api-paste.ini --allow_resize_to_same_host=True --start_guests_on_host_boot=true --resume_guests_state_on_host_boot=true # RABBITMQ --rabbit_host=192.168.1.250 # GLANCE --image_service=nova.image.glance.GlanceImageService --glance_api_servers=192.168.1.250:9292 # NETWORK --network_manager=nova.network.manager.FlatDHCPManager --dhcpbridge_flagfile=/etc/nova/nova.conf --dhcpbridge=/usr/bin/nova-dhcpbridge --fixed_range=172.16.0.0/24 --flat_network_dhcp_start=172.16.0.2 --flat_network_bridge=br1 --flat_interface=eth1 --network_size=256 --flat_injected=False --my_ip=192.168.1.250 --floating_range=192.168.1.0/24 --force_dhcp_release --public_interface=br0 # NOVNC CONSOLE --vnc_enabled=true --novncproxy_base_url=http://192.168.1.250:6080/vnc_auto.html --vncserver_proxyclient_address=127.0.0.1 --vncserver_listen=127.0.0.1
Toutes les entrées --flat… correspondent au réseau privé(172.16.0.0/24, début 172.16.0.2), destiné aux communications entre les VMs (pour Virtual Machine ou machines virtuelles), les autres serveurs Nova ou de stockage s'il y a…
--floating_range est le réseau public (LAN ou Internet) sur lequel est branché l'interface br0, pour attribuer une adresse aux VMs sur le réseau public. L'adresse 192.168.1.250 est celle de l'interface br0, ne remplacez pas par 127.0.0.1, ça ne fonctionnera pas.
Modifiez les droits sur le répertoire /etc/nova
sudo chown -R nova:nova /etc/nova/
Redémarrez tous les services nova
for a in libvirt-bin nova-network nova-compute nova-api nova-objectstore nova-scheduler nova-volume nova-cert nova-consoleauth novnc; do sudo service "$a" stop; done for a in libvirt-bin nova-network nova-compute nova-api nova-objectstore nova-scheduler nova-volume nova-cert nova-consoleauth novnc; do sudo service "$a" start; done
Synchronisez la base de données
sudo nova-manage db sync
Redémarrez de nouveau tous les services
for a in libvirt-bin nova-network nova-compute nova-api nova-objectstore nova-scheduler nova-volume nova-cert nova-consoleauth novnc; do sudo service "$a" stop; done for a in libvirt-bin nova-network nova-compute nova-api nova-objectstore nova-scheduler nova-volume nova-cert nova-consoleauth novnc; do sudo service "$a" start; done
Vous pouvez maintenant vérifier que tous les services fonctionnent, le résultat dans la colonne STATE doit être
sudo nova-manage service list
2012-05-16 00:20:09 DEBUG nova.utils [req-527f4f50-f02e-41da-bc96-43d3d9070807 None None] backend <module 'nova.db.sqlalchemy.api' from '/usr/lib/python2.7/dist-packages/nova/db/sqlalchemy/api.pyc'> from (pid=9869) __get_backend /usr/lib/python2.7/dist-packages/nova/utils.py:658 Binary Host Zone Status State Updated_At nova-scheduler myhost nova enabled :-) 2012-05-15 22:20:04 nova-volume myhost nova enabled :-) 2012-05-15 22:20:03 nova-compute myhost nova enabled :-) 2012-05-15 22:20:05 nova-network myhost nova enabled :-) 2012-05-15 22:20:03 nova-consoleauth myhost nova enabled :-) 2012-05-15 22:20:03 nova-cert myhost nova enabled :-) 2012-05-15 22:20:04
Listez les images disque fournies par le service Glance
nova image-list
+--------------------------------------+-----------------------------+--------+--------+ | ID | Name | Status | Server | +--------------------------------------+-----------------------------+--------+--------+ | d1b7defa-0c35-4e8c-aef5-0d58c8d80a52 | Ubuntu 12.04 cloudimg amd64 | ACTIVE | | +--------------------------------------+-----------------------------+--------+--------+
Profitez-en pour créer les réseaux privés et publics. Les adresses seront enregistrées dans la base MySQL. Le réseau public
sudo nova-manage floating create --ip_range=192.168.1.0/24
Le réseau privé, destiné aux communications entre les VMs, les autres serveurs Nova ou de stockage s'il y a…
sudo nova-manage network create private --fixed_range_v4=172.16.0.0/24 --num_networks=1 --bridge=br1 --bridge_interface=eth1 --network_size=256
Par défaut, les règles de parefeu bloquent les paquets entrants sur l'interface publique à destination des VMs. Il est possible de créer des ensembles de règles. L'ensemble des règles utilisées devra être spécifié au lancement de chaque instance. Ci-dessous un exemple de création de règles sur l'ensemble "default" créé automatiquement à l'installation, si vous voulez autoriser le ping et SSH pour toutes les VMs sur l'interface publique ( icmp -1 correspond a tout ).
nova secgroup-add-rule default icmp -1 -1 0.0.0.0/0
+-------------+-----------+---------+-----------+--------------+ | IP Protocol | From Port | To Port | IP Range | Source Group | +-------------+-----------+---------+-----------+--------------+ | icmp | -1 | -1 | 0.0.0.0/0 | | +-------------+-----------+---------+-----------+--------------+
nova secgroup-add-rule default tcp 22 22 0.0.0.0/0
+-------------+-----------+---------+-----------+--------------+ | IP Protocol | From Port | To Port | IP Range | Source Group | +-------------+-----------+---------+-----------+--------------+ | tcp | 22 | 22 | 0.0.0.0/0 | | +-------------+-----------+---------+-----------+--------------+
Listez les règles de ports autorisés sur le groupe de règles "default"
nova secgroup-list-rules default
+-------------+-----------+---------+-----------+--------------+ | IP Protocol | From Port | To Port | IP Range | Source Group | +-------------+-----------+---------+-----------+--------------+ | icmp | -1 | -1 | 0.0.0.0/0 | | | tcp | 22 | 22 | 0.0.0.0/0 | | +-------------+-----------+---------+-----------+--------------+
Maintenant que tout fonctionne, vous allez pouvoir créez votre première VM.
Assurez-vous d'avoir créé une clé SSH:
ssh-keygen -t rsa
Ajoutez-la au serveur
nova keypair-add --pub_key ~/.ssh/id_rsa.pub key1
Il faut définir les spécifications de la future VM, pour voir les possibilités, utilisez la commande ci-dessous, la création de vos propres définitions étant bien sûr possible:
nova flavor-list
+----+-----------+-----------+------+-----------+------+-------+-------------+ | ID | Name | Memory_MB | Disk | Ephemeral | Swap | VCPUs | RXTX_Factor | +----+-----------+-----------+------+-----------+------+-------+-------------+ | 1 | m1.tiny | 512 | 0 | 0 | | 1 | 1.0 | | 2 | m1.small | 2048 | 10 | 20 | | 1 | 1.0 | | 3 | m1.medium | 4096 | 10 | 40 | | 2 | 1.0 | | 4 | m1.large | 8192 | 10 | 80 | | 4 | 1.0 | | 5 | m1.xlarge | 16384 | 10 | 160 | | 8 | 1.0 | +----+-----------+-----------+------+-----------+------+-------+-------------+
Pour la suite, il sera utilisé l'ID 1 correspondant à une machine disposant de 512 Mb de RAM, 1 CPU virtuel et aucun disque supplémentaire.
Lancez votre première VM avec la commande nova boot
, le paramètre --flavor indique les spécifications choisies, --image l'ID de l'image fournie par glance, vient ensuite le nom et la clé ssh utilisée. Indiquez aussi l'ensemble de règles de parefeu, sinon c'est l'ensemble "default" qui est appliqué.
nova boot --flavor 1 --image d1b7defa-0c35-4e8c-aef5-0d58c8d80a52 myfirstvm --key_name key1 &
[1] 5472 +-------------------------------------+--------------------------------------+ | Property | Value | +-------------------------------------+--------------------------------------+ | OS-DCF:diskConfig | MANUAL | | OS-EXT-SRV-ATTR:host | myhost | | OS-EXT-SRV-ATTR:hypervisor_hostname | None | | OS-EXT-SRV-ATTR:instance_name | instance-00000003 | | OS-EXT-STS:power_state | 0 | | OS-EXT-STS:task_state | scheduling | | OS-EXT-STS:vm_state | building | | accessIPv4 | | | accessIPv6 | | | adminPass | 4BMRzdXgtLvF | | config_drive | | | created | 2012-07-09T17:09:18Z | | flavor | m1.tiny | | hostId | | | id | 9360ae16-6b3a-4eb6-9b15-6b05d3f83989 | | image | Ubuntu 12.04 cloudimg amd64 | | key_name | key1 | | metadata | {} | | name | myfirstvm | | progress | 0 | | status | BUILD | | tenant_id | 0f71e86d30e247d3b1216fe5f2f3aa50 | | updated | 2012-07-09T17:09:19Z | | user_id | c97c87b3ed894401975dd6d757b40330 | +-------------------------------------+--------------------------------------+ [1]+ Fini nova boot --flavor 1 --image d1b7defa-0c35-4e8c-aef5-0d58c8d80a52 myfirstvm --key_name key1
Un récapitulatif des propriétés de la machine s'affiche. Pour le réafficher, utilisez la commande
nova show myfirstvm
Pour lister les VM existantes
nova list
+--------------------------------------+-----------+--------+--------------------+ | ID | Name | Status | Networks | +--------------------------------------+-----------+--------+--------------------+ | 9360ae16-6b3a-4eb6-9b15-6b05d3f83989 | myfirstvm | ACTIVE | private=172.16.0.2 | +--------------------------------------+-----------+--------+--------------------+
Connectez-vous sur la VM
ssh ubuntu@172.16.0.2
Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.2.0-25-virtual x86_64) * Documentation: https://help.ubuntu.com/ System information as of Mon Jul 9 17:10:53 UTC 2012 . . . To run a command as administrator (user "root"), use "sudo <command>". See "man sudo_root" for details. ubuntu@myfirstvm:~$ exit logout Connection to 172.16.0.2 closed.
Vous pouvez créez un disque dur supplémentaire
nova volume-create --display_name "volume1" 10
Attachez-le à la VM
nova volume-attach myfirstvm 1 /dev/vdb
Vérifiez le rattachement
nova volume-list
+----+--------+--------------+------+-------------+--------------------------------------+ | ID | Status | Display Name | Size | Volume Type | Attached to | +----+--------+--------------+------+-------------+--------------------------------------+ | 1 | in-use | volume1 | 10 | None | 9360ae16-6b3a-4eb6-9b15-6b05d3f83989 | +----+--------+--------------+------+-------------+--------------------------------------+
Vous pouvez maintenant vous reconnecter à la VM pour partitionner ce disque et l'utiliser.
Connectez maintenant cette instance virtuelle à votre LAN.
Il faut tout d'abord allouer une adresse IP
nova floating-ip-create
+-------------+-------------+----------+------+ | Ip | Instance Id | Fixed Ip | Pool | +-------------+-------------+----------+------+ | 192.168.1.1 | None | None | nova | +-------------+-------------+----------+------+
Puis attachez cette adresse à la VM
nova add-floating-ip myfirstvm 192.168.1.1
Patientez quelques secondes et vérifiez la présence sur votre LAN d'une machine à cette adresse
ping -c 2 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data. 64 bytes from 192.168.1.1: icmp_req=1 ttl=64 time=0.589 ms 64 bytes from 192.168.1.1: icmp_req=2 ttl=64 time=0.452 ms --- 192.168.1.1 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 999ms rtt min/avg/max/mdev = 0.452/0.520/0.589/0.072 ms
La commande nova list vous confirme l'attribution
nova list
+--------------------------------------+-----------+--------+---------------------------------+ | ID | Name | Status | Networks | +--------------------------------------+-----------+--------+---------------------------------+ | 9360ae16-6b3a-4eb6-9b15-6b05d3f83989 | myfirstvm | ACTIVE | private=172.16.0.2, 192.168.1.1 | +--------------------------------------+-----------+--------+---------------------------------+
Il est bien sûr possible d'envoyer des commandes à partir de n'importe quel autre ordinateur où les paquets python-novaclient,python-nova-adminclient sont installés.
Pour voir la liste des commandes disponibles et les détails utilisez :
nova help [NOM DE LA COMMANDE]
L'interface graphique, le Dashboard Horizon, a été développée pour simplifier l'administration du serveur et des projets. L'accès se fait à partir d'un navigateur web pointant à l'adresse du serveur.
Les différents services doivent être installés et configurés avant de pouvoir l'utiliser. Une grande partie des commandes est alors à portée d'un clic de souris.
Installez les paquets apache2,libapache2-mod-wsgi,openstack-dashboard
Redémarrez le serveur web Apache pour vérifier que tout est OK
sudo service apache2 restart
Ouvrez votre navigateur favori à l'adresse de votre interface publique ou 127.0.0.1
Les identifiants de connexion de l'administrateur sont les mêmes que ceux du fichier .novarc. Si vous avez suivi ce document sans rien changer, il s'agit donc pour le compte d'administration de:
Username : admin Password: ADMPASSWD.
Les comptes qui ont pour rôle "admin" ont accès à l'interface d'administration sur le Dashboard, ainsi qu'à leur(s) projet(s). Les rôles "Member" n'ont accès qu'à leur(s) projet(s).
Dans l'ordre les différents menus :
Un bouton permet de basculer entre les différents projets dont l'utilisateur est membre, si il y a. Puis viennent les menus :
L'intérêt d'OpenStack étant de déployer rapidement des instances de machines virtuelles, ça ne servirait à rien de devoir passer ensuite des heures à les configurer. La création de vos propres images vous permettra de gagner un temps précieux.
Plusieurs grandes distributions ont été testées avec succès, dont Ubuntu et Debian, RedHat et Centos mais aussi Mandriva. D'autres systèmes peuvent aussi servir comme FreeBSD ou encore Windows.
Pour un système Linux, les pré-requis sont :un système à jour, Curl et un serveur SSH. Pour FreeBSD ou Windows, prévoyez l'installation du pilote Virtio.(driver Windows signé disponible ici).
Installez et configurez une VM avec KVM, installez les logiciels et services voulus et les comptes utilisateurs. Gardez à l'esprit que tout ce que vous faites sur cette image se retrouvera sur chaque instance. Et à l'inverse, tout ce que vous n'aurez pas fait sera aussi à refaire à chaque nouvelle VM.
Pour simplifier l'administration des comptes sur les instances, l'utilisation d'un annuaire LDAP facilite grandement le travail. Il suffira ensuite de faire les changements sur l'annuaire pour ne pas être obligé de remettre ses images à jour.
Pour finir, pour les images Linux, ouvrez avec les droits d'administration le fichier /etc/rc.local et ajoutez les lignes suivantes avant la ligne "exit 0" (ou avant "/var/lock/subsys/local" pour Centos). Ceci permettra à l'instance de récupérer les clés SSH au lancement.
echo >> /root/.ssh/authorized_keys curl -m 10 -s http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key | grep 'ssh-rsa' >> /root/.ssh/authorized_keys echo "AUTHORIZED_KEYS:" echo "************************" cat /root/.ssh/authorized_keys echo "************************"
Une dernière précaution à prendre pour éviter les conflits de nommage des interfaces réseau: effacer la règle udev y faisant référence:
sudo rm -rf /etc/udev/rules.d/70-persistent-net.rules
Votre image disque est maintenant prête à être exportée sur le serveur Glance.
Pour supprimer cette application, supprimer les paquets. Selon la méthode choisie, la configuration globale de l'application est conservée ou supprimée. Les journaux du système, et les fichiers de préférence des utilisateurs dans leurs dossiers personnels sont toujours conservés.
Supprimez ensuite les bases de données keystone, glance et nova