Openstack administration

Stacktrain setup

#!/bin/bash

package=$1
case ${package} in
  pike)
  archive="labs-stable-pike.tgz" ;;
  queens)
  archive="labs-stable-queens.tgz" ;;
  rocky)
  archive="labs-stable-rocky.tgz" ;;
  stein)
  archive="labs-master.tgz" ;;
  *)
  head -n15 $0 && exit ;;
esac

echo "---- Get the training-labs scripts ----"
wget http://tarballs.openstack.org/training-labs/dist/${archive}
tar xvfz ${archive}

echo "---- Configure directory path as env variables ----"
cat << EOF >> ~/.bashrc
OS_LAB=$HOME
OS_ST=$HOME/labs
OS_BASH=$HOME/labs/osbash
EOF
export OS_LAB=$HOME
export OS_ST=$HOME/labs
export OS_BASH=$HOME/labs/osbash

echo "---- Configure the controller and the compute1 components ----"
mv $OS_ST/config/config.controller $OS_ST/config/config.controller.bak
cat << EOF >> $OS_ST/config/config.controller
VM_SSH_PORT=2230
VM_WWW_PORT=8888
NET_IF_0=dhcp
NET_IF_1="static 10.0.0.11 1"
NET_IF_2="manual 203.0.113.0"
VM_MEM=6144
VM_CPUS=2
EOF
mv $OS_ST/config/config.compute1 $OS_ST/config/config.compute1.bak
cat << EOF >> $OS_ST/config/config.compute1
VM_SSH_PORT=2232
NET_IF_0=dhcp
NET_IF_1="static 10.0.0.31 1"
NET_IF_2="manual 203.0.113.0"
SECOND_DISK_SIZE=128000
VM_MEM=8192
VM_CPUS=4
EOF
cat << EOF | sudo tee --append /etc/hosts
10.0.0.11 controller
10.0.0.31 compute1
EOF
if [ ${package} == "pike" ] ; then
echo "---- Enable Heat service installation ----"
cp $OS_ST/config/scripts.ubuntu_cluster $OS_ST/config/scripts.ubuntu_cluster.bak
sed -i '/heat_controller/s/#//' $OS_ST/config/scripts.ubuntu_cluster
fi

if [ $(virsh --version > /dev/null ; echo $?) == '0' ] ; then
echo "---- install last prereq ----"
sudo apt update
sudo apt -qq install iptables-converter
echo "---- Default Storage Pool creation ----"
sudo virsh pool-destroy default
sudo virsh pool-undefine default
mkdir -p /home/stack/labs/pool
sudo virsh pool-define-as default dir - - - - "/home/stack/labs/pool"
sudo virsh pool-start default
sudo virsh pool-autostart default
echo "---- Populate env vars ----"
cat << EOF >> ~/.bashrc
VIRSH_DEFAULT_CONNECT_URI='qemu:///system'
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
EOF
export PATH=$PATH:/sbin:/usr/sbin/
echo "---- install last prereq ----"
sudo apt update
sudo apt -qq install iptables-converter
echo "---- Default Storage Pool creation ----"
sudo virsh pool-destroy default
sudo virsh pool-undefine default
mkdir -p /home/stack/labs/pool
sudo virsh pool-define-as default dir - - - - "/home/stack/labs/pool"
sudo virsh pool-start default
sudo virsh pool-autostart default
echo "---- Populate env vars ----"
cat << EOF >> ~/.bashrc
VIRSH_DEFAULT_CONNECT_URI='qemu:///system'
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
EOF
export PATH=$PATH:/sbin:/usr/sbin/
fi

Méthode d'administration d'OpenStack

Les méthode d'administration d'OpenStack peuvent être les suivantes :

On notera aussi que l'on peut l'administrer avec Ansible : Modules Ansible pour OpenStack dans des objectifs d'orchestration cloud.

Installation des pré-requis Stacktrain C2L Scaleway

Le script st_setup.sh prépare le serveur pour supporter l'installation d'Openstack sous VirtualBox en deux phase. Dans un premier temps, on monte une partition /dev/sda1 dans /opt (on désactivera la fonction si nécessaire). Ensuite, le système est mis à jour, des logiciels de dépendance sont installés et enfin, virtualbox est installé. Parce que les images Scaleway n'intègre pas le démarrage d'un noyau local avec les sources des Headers disponibles, il est nécessaire de le faire soi-même. Pour ce faire on propose l'exécution d'un livre de jeu Ansible. Le script se termine par la création d'un utilisateur doté de privilèges dont le nom est stack. Son dossier d'accueil est situé dans le dossier $HOME.

#!/bin/bash

mount_sda_partition () {
echo "---- Mount /dev/sda1 partition on /opt ----"
#mkfs -t ext4 /dev/sda1
cat << EOF >> /etc/systemd/system/opt.mount
[Unit]
Description=Mount SDA Volume at boot
[Mount]
What=UUID="$(blkid | grep /dev/sda1 | cut -d' ' -f2 | cut -d\" -f2)"
Where=/opt
Type=ext4
Options=defaults
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl start opt.mount
systemctl enable opt.mount
}

host_setup () {
echo "---- Non-interactive Ubuntu system upgrade and pre-reqs installation ----"
# https://superuser.com/questions/1332341/console-setup-causes-apt-get-update-to-hang
echo "console-setup   console-setup/charmap47 select  UTF-8" > encoding.conf
debconf-set-selections encoding.conf
rm encoding.conf
apt-get update
DEBIAN_FRONTEND=noninteractive apt-get -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" upgrade
DEBIAN_FRONTEND=noninteractive apt-get -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" dist-upgrade
DEBIAN_FRONTEND=noninteractive apt-get -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" install git ansible language-pack-en sudo
update-locale LANG=en_US.UTF-8
echo "---- Install virtualbox ----"
wget https://gist.githubusercontent.com/goffinet/6f606829a1b9400adb0165d49455b55d/raw/990161aed57b158e0f2c86f0df1b01a75e7b7b6a/scaleway-linux-headers.yml && ansible-playbook scaleway-linux-headers.yml
DEBIAN_FRONTEND=noninteractive apt-get -qq install virtualbox-dkms virtualbox
echo "---- Create a stack user ----"
useradd -s /bin/bash -d /home/stack -m -k /etc/skel stack
echo "stack ALL=(ALL) NOPASSWD: ALL" | tee /etc/sudoers.d/stack
}

mount_sda_partition
host_setup

Projet

  • Créer un projet et un groupe
  • Créer un compte associé au projet avec un rôle admin
  • créer une image Ubuntu associée au projet
  • créer une paire de clé
  • créer un groupe de sécurité
  • lancer une instance

En projet

Notes de lab

Ajouter une clé SSH

openstack keypair create --public-key ./mackey.pub mac-key
+-------------+-------------------------------------------------+
| Field       | Value                                           |
+-------------+-------------------------------------------------+
| fingerprint | 58:0a:81:2a:b8:19:f4:bd:3e:86:a4:12:0e:24:fb:11 |
| name        | mac-key                                         |
| user_id     | 82fae32816d84d09b711dec9298c2126                |
+-------------+-------------------------------------------------+

Groupe de sécurité

$ nova secgroup-list
+----+---------+-------------+
| Id | Name    | Description |
+----+---------+-------------+
| 2  | default | default     |
+----+---------+-------------+
$ nova secgroup-list-rules default
+-------------+-----------+---------+----------+--------------+
| IP Protocol | From Port | To Port | IP Range | Source Group |
+-------------+-----------+---------+----------+--------------+
+-------------+-----------+---------+----------+--------------+
$ 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 |              |
+-------------+-----------+---------+-----------+--------------+
$ 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-list-rules default
+-------------+-----------+---------+-----------+--------------+
| IP Protocol | From Port | To Port | IP Range  | Source Group |
+-------------+-----------+---------+-----------+--------------+
| tcp         | 22        | 22      | 0.0.0.0/0 |              |
| icmp        | -1        | -1      | 0.0.0.0/0 |              |
+-------------+-----------+---------+-----------+--------------+

Nova

$ nova image-list
+--------------------------------------+---------------------------------+--------+--------+
| ID                                   | Name                            | Status | Server |
+--------------------------------------+---------------------------------+--------+--------+
| c5e39d54-13f0-41fa-8554-9604f595d218 | Fedora23                        | ACTIVE |        |
| 9f58d212-5374-4287-b6be-2e7aed8211a5 | atomic                          | ACTIVE |        |
| 793fe192-3a00-4aae-820c-e7b5e7412612 | centos7                         | ACTIVE |        |
| d78f41db-942d-4133-a88c-8b2cc8a6617d | cirros-0.3.4-x86_64-uec         | ACTIVE |        |
| f884c9d1-03a3-460f-83b0-e944a9c4ed3f | cirros-0.3.4-x86_64-uec-kernel  | ACTIVE |        |
| 59e4a734-07d3-4dff-b6ed-ba6277be9ea4 | cirros-0.3.4-x86_64-uec-ramdisk | ACTIVE |        |
| dc6d522e-114a-4890-8af2-7f57b3217baa | ubuntu                          | ACTIVE |        |
+--------------------------------------+---------------------------------+--------+--------+
$ nova flavor-list
+--------------------------------------+-----------+-----------+------+-----------+------+-------+-------------+-----------+
| ID                                   | Name      | Memory_MB | Disk | Ephemeral | Swap | VCPUs | RXTX_Factor | Is_Public |
+--------------------------------------+-----------+-----------+------+-----------+------+-------+-------------+-----------+
| 0825654a-10fe-449a-b73e-c1f846d87e31 | m1.8      | 1024      | 8    | 0         | 2048 | 1     | 1.0         | True      |
| 1                                    | m1.tiny   | 512       | 1    | 0         |      | 1     | 1.0         | True      |
| 2                                    | m1.small  | 2048      | 20   | 0         |      | 1     | 1.0         | True      |
| 3                                    | m1.medium | 4096      | 40   | 0         |      | 2     | 1.0         | True      |
| 4                                    | m1.large  | 8192      | 80   | 0         |      | 4     | 1.0         | True      |
| 42                                   | m1.nano   | 64        | 0    | 0         |      | 1     | 1.0         | True      |
| 5                                    | m1.xlarge | 16384     | 160  | 0         |      | 8     | 1.0         | True      |
| 84                                   | m1.micro  | 128       | 0    | 0         |      | 1     | 1.0         | True      |
+--------------------------------------+-----------+-----------+------+-----------+------+-------+-------------+-----------+
$ nova --os-region-name RegionOne boot VM1 --flavor m1.small --image dc6d522e-114a-4890-8af2-7f57b3217baa
+--------------------------------------+-----------------------------------------------+
| Property                             | Value                                         |
+--------------------------------------+-----------------------------------------------+
| OS-DCF:diskConfig                    | MANUAL                                        |
| OS-EXT-AZ:availability_zone          |                                               |
| OS-EXT-SRV-ATTR:host                 | -                                             |
| OS-EXT-SRV-ATTR:hostname             | vm1                                           |
| OS-EXT-SRV-ATTR:hypervisor_hostname  | -                                             |
| OS-EXT-SRV-ATTR:instance_name        | instance-00000007                             |
| OS-EXT-SRV-ATTR:kernel_id            |                                               |
| OS-EXT-SRV-ATTR:launch_index         | 0                                             |
| OS-EXT-SRV-ATTR:ramdisk_id           |                                               |
| OS-EXT-SRV-ATTR:reservation_id       | r-o6rk1u0p                                    |
| OS-EXT-SRV-ATTR:root_device_name     | -                                             |
| OS-EXT-SRV-ATTR:user_data            | -                                             |
| OS-EXT-STS:power_state               | 0                                             |
| OS-EXT-STS:task_state                | scheduling                                    |
| OS-EXT-STS:vm_state                  | building                                      |
| OS-SRV-USG:launched_at               | -                                             |
| OS-SRV-USG:terminated_at             | -                                             |
| accessIPv4                           |                                               |
| accessIPv6                           |                                               |
| adminPass                            | 9i5VDXpgSWbz                                  |
| config_drive                         |                                               |
| created                              | 2016-03-01T20:22:22Z                          |
| flavor                               | m1.small (2)                                  |
| hostId                               |                                               |
| id                                   | 28e43480-93f0-44a1-b753-cd211ce046f7          |
| image                                | ubuntu (dc6d522e-114a-4890-8af2-7f57b3217baa) |
| key_name                             | -                                             |
| locked                               | False                                         |
| metadata                             | {}                                            |
| name                                 | VM1                                           |
| os-extended-volumes:volumes_attached | []                                            |
| progress                             | 0                                             |
| security_groups                      | default                                       |
| status                               | BUILD                                         |
| tenant_id                            | 8865369fb7d5443b8dada9e553c49157              |
| updated                              | 2016-03-01T20:22:23Z                          |
| user_id                              | f7bbe614d23a4b388aa63e6bbbda42cd              |
+--------------------------------------+-----------------------------------------------+
$ nova list
+--------------------------------------+------+--------+------------+-------------+------------------+
| ID                                   | Name | Status | Task State | Power State | Networks         |
+--------------------------------------+------+--------+------------+-------------+------------------+
| 28e43480-93f0-44a1-b753-cd211ce046f7 | VM1  | ACTIVE | -          | Running     | private=10.0.0.8 |
+--------------------------------------+------+--------+------------+-------------+------------------+

Adresses IP

$ nova floating-ip-pool-list
+--------+
| name   |
+--------+
| public |
| test   |
+--------+
$ nova floating-ip-list
+----+----+-----------+----------+------+
| Id | IP | Server Id | Fixed IP | Pool |
+----+----+-----------+----------+------+
+----+----+-----------+----------+------+
$ nova floating-ip-create
+----+------------+-----------+----------+--------+
| Id | IP         | Server Id | Fixed IP | Pool   |
+----+------------+-----------+----------+--------+
| 3  | 172.24.4.3 | -         | -        | public |
+----+------------+-----------+----------+--------+
$ nova list
+--------------------------------------+------+--------+------------+-------------+------------------+
| ID                                   | Name | Status | Task State | Power State | Networks         |
+--------------------------------------+------+--------+------------+-------------+------------------+
| 28e43480-93f0-44a1-b753-cd211ce046f7 | VM1  | ACTIVE | -          | Running     | private=10.0.0.8 |
+--------------------------------------+------+--------+------------+-------------+------------------+
$ nova floating-ip-associate 28e43480-93f0-44a1-b753-cd211ce046f7 172.24.4.3
$ nova list
+--------------------------------------+------+--------+------------+-------------+------------------------------+
| ID                                   | Name | Status | Task State | Power State | Networks                     |
+--------------------------------------+------+--------+------------+-------------+------------------------------+
| 28e43480-93f0-44a1-b753-cd211ce046f7 | VM1  | ACTIVE | -          | Running     | private=10.0.0.8, 172.24.4.3 |
+--------------------------------------+------+--------+------------+-------------+------------------------------+

5. Exercice

Cet exercice a pour but de mettre un nouveau projet à disposition d'un nouvel utilisateur avec son image, un gabarit, un réseau privé et un routeur connecté au réseau 'public' (disponible par défaut avec DevStack).

  1. Mise en place du projet en tant qu'admin
  2. Gestion en tant qu'utilisateurs

1. Mise en place du projet en tant qu'admin

En tant qu'admin :

  1. Création du projet
  2. Création d'un utilisateur
  3. Définition des rôles
  4. Création d'un réseau et d'un sous-réseau
  5. Création d'un groupe de sécurité autorisant ICMP echo req. et TCP22/80 en entrée
  6. Créer le réseau et le sous-réseau privés
  7. Créer le routeur
  8. Rattacher au routeur le réseau privé et le réseau public à disposition

De manière optionnelle en tant qu'admin

  1. Importer une image et l'enregistrer
  2. Créer un gabarit personnalisé
cd
cd devstack
. openrc admin admin

On manipulera dans cette démarche 5 variables qui se réalisent dans la démarche suivante :

proj_name=$1
net_id1="$(shuf -i 0-255 -n 1)" net_id2="$(shuf -i 0-255 -n 1)" # random /24 in 10.0.0.0/8 range
ip_range="10.${net_id1}.${net_id2}.0/24"
proj_user=${proj_name}-user
password=${proj_name}123
proj_desc="${proj_name} project"

openstack project create --description "$proj_desc" $proj_name
openstack user create --password $password $proj_user
openstack role add --project $proj_name --user $proj_user Member
openstack role add --project $proj_name --user admin admin
openstack router create --project $proj_name ${proj_name}-router
openstack router set --external-gateway public ${proj_name}-router
openstack network create --project $proj_name ${proj_name}-net
openstack subnet create --project $proj_name --subnet-range $ip_range --dhcp --network ${proj_name}-net ${proj_name}-subnet
openstack router add subnet ${proj_name}-router ${proj_name}-subnet
bash -x /project_init.sh webapp

Réseau créé :

Vérifications :

  • Projet
  • Utilisateurs
  • Rôles
  • Réseau et routeurs
  • Images
  • Gabarits
openstack project list
openstack user list
openstack network list
openstack security group show red-sec-group
openstack image list
openstack flavor list
openstack subnet list

Import d'images

openstack image create --disk-format qcow2 --container-format bare \
  --public --file ./centos63.qcow2 centos63-image

2. Gestion en tant qu'admin

En tant qu'utilisateur :

  1. Créer une paire de clés et enregistrer la clé publique
  2. Créer un instance avec l'image, le profil, le réseau et le groupe de sécurité adaptés
  3. Choisir une adresse IPv4 flottante et l'associer avec l'instance
  4. Tester l'instance en ICMP et SSH
cd
cd devstack
. openrc user project
OS_PASSWORD=
image=xenial-ubuntu
instance_name=$1
sec-group=

openstack server create \
--image $image \
--flavor ds512M \
--security-group $sec-group \
$instance_name

Vérifications :

  • clé
  • instance
  • métriques
  • test et connexion externes

Note sur les réseau

6. Préparer des images

Stockage

gestion des volumes dédiés aux instances

...

Accès tiers aux volumes

...

Comprendre la notion d'API

Outils : Curl et Postman

Documentation API Openstack : https://developer.openstack.org/api-guide/quick-start/

Notes

openstack flavor create --ram 2048 --disk 10 --vcpus 2 m1.xsmall
openstack security group create open-sg
openstack security group rule create --protocol tcp --dst-port 22:22 --remote
-ip 0.0.0.0/0 open-sg
+-------------------+--------------------------------------+
| Field             | Value                                |
+-------------------+--------------------------------------+
| created_at        | 2019-02-15T23:35:31Z                 |
| description       |                                      |
| direction         | ingress                              |
| ether_type        | IPv4                                 |
| id                | 174730ef-67c9-40f7-8f0e-1ea892c7acd1 |
| name              | None                                 |
| port_range_max    | 22                                   |
| port_range_min    | 22                                   |
| project_id        | 48430bc952784fbab1ce53f57c381687     |
| protocol          | tcp                                  |
| remote_group_id   | None                                 |
| remote_ip_prefix  | 0.0.0.0/0                            |
| revision_number   | 0                                    |
| security_group_id | 0062833a-d01b-4795-9690-2d4a9d3559d2 |
| updated_at        | 2019-02-15T23:35:31Z                 |
+-------------------+--------------------------------------+
openstack security group rule create --protocol icmp open-sg
+-------------------+--------------------------------------+
| Field             | Value                                |
+-------------------+--------------------------------------+
| created_at        | 2019-02-15T23:36:45Z                 |
| description       |                                      |
| direction         | ingress                              |
| ether_type        | IPv4                                 |
| id                | 407f7326-5ac2-4ac2-a65d-9d16abdedb9c |
| name              | None                                 |
| port_range_max    | None                                 |
| port_range_min    | None                                 |
| project_id        | 48430bc952784fbab1ce53f57c381687     |
| protocol          | icmp                                 |
| remote_group_id   | None                                 |
| remote_ip_prefix  | 0.0.0.0/0                            |
| revision_number   | 0                                    |
| security_group_id | 0062833a-d01b-4795-9690-2d4a9d3559d2 |
| updated_at        | 2019-02-15T23:36:45Z                 |
+-------------------+--------------------------------------+
openstack security group rule create --protocol tcp --dst-port 80:80 --remote-ip 0.0.0.0/0 open-sg
+-------------------+--------------------------------------+
| Field             | Value                                |
+-------------------+--------------------------------------+
| created_at        | 2019-02-15T23:37:17Z                 |
| description       |                                      |
| direction         | ingress                              |
| ether_type        | IPv4                                 |
| id                | a6b317ab-f8f6-40f3-8620-7f462dfe068e |
| name              | None                                 |
| port_range_max    | 80                                   |
| port_range_min    | 80                                   |
| project_id        | 48430bc952784fbab1ce53f57c381687     |
| protocol          | tcp                                  |
| remote_group_id   | None                                 |
| remote_ip_prefix  | 0.0.0.0/0                            |
| revision_number   | 0                                    |
| security_group_id | 0062833a-d01b-4795-9690-2d4a9d3559d2 |
| updated_at        | 2019-02-15T23:37:17Z                 |
+-------------------+--------------------------------------+

Divers

Dans cette installation, on va considérer que la solution OpenStack, déployée sur un noeud, met à disposition un service de type "Cloud" où les trois ressources fondamentales calcul, réseau et stockage sont représentées. DevStack standard fournit un service d'authentification et de gestion des rôles. Les instances virtuelles sont déployées localement sous formes d'images "firmware" déjà préparées pour OpenStack avec un utilisateur sudoer qu'il faut connaître d'avance. Il est possible de pousser une clé publique SSH à condition que l'image soit préparée avec cloud-init.