Project

General

Profile

Openstack Installation TTNN » History » Version 103

« Previous - Version 103/251 (diff) - Next » - Current version
Mehdi Abaakouk, 08/27/2014 02:26 PM


Openstack Installation TTNN

Liens

Pending upstream fixes:

Installation

Le setup installé est composé de :

  • 3 hyperviseurs (compute node) qui contiendront 1 ceph-mon, N ceph-osd, nova-compute (qui lance les VM), neutron-openvswitch-agent (qui configure le réseau des vms)
  • 1 VM (controler node), qui contient tous les services de management d'openstack (nova, cinder, glance, neutron)
Les étapes d'installation sont les suivantes:
  • Préparation manuelle de la VM de management sur un des hyperviseurs
  • Installation de ceph et openstack sur toutes les machines avec puppet
  • Déplacement de la VM de management d'openstack dans openstack.

Information sur le puppet master:

La conf et modules puppet utilisé par tetaneutral.net ce trouve la:

http://chiliproject.tetaneutral.net/projects/git-tetaneutral-net/repository/puppetmaster
http://chiliproject.tetaneutral.net/projects/git-tetaneutral-net/repository/puppetmaster/revisions/master/entry/manifests/nodes/openstack.pp

Seulement c'est 3 classes sont spécifique à tetaneutral, le reste est réutilisable:

class { 'ttnn::server': }
class { 'backup::client': }
class { 'sexymotd': }

Les modules qui sont nécessaire pour openstack pour le reste du fichier sont:

https://github.com/puppetlabs/puppetlabs-apache.git
https://github.com/puppetlabs/puppetlabs-apt
https://github.com/stackforge/puppet-ceph.git
https://github.com/stackforge/puppet-cinder.git
https://github.com/puppetlabs/puppetlabs-concat.git
https://github.com/stackforge/puppet-glance.git
https://github.com/stackforge/puppet-horizon.git
https://github.com/puppetlabs/puppetlabs-inifile.git
https://github.com/stackforge/puppet-keystone.git
https://github.com/camptocamp/puppet-kmod.git
https://github.com/saz/puppet-memcached.git
https://github.com/puppetlabs/puppetlabs-mysql.git
https://github.com/stackforge/puppet-neutron.git
https://github.com/stackforge/puppet-nova.git
https://github.com/puppetlabs/puppetlabs-rabbitmq.git
https://github.com/nanliu/puppet-staging.git
https://github.com/puppetlabs/puppetlabs-stdlib.git
https://github.com/duritong/puppet-sysctl.git
https://github.com/puppetlabs/puppetlabs-vcsrepo.git
https://github.com/stackforge/puppet-vswitch.git
https://github.com/puppetlabs/puppetlabs-xinetd.git

Préparation réseaux des hosts:

Voici le fichier rc.local d'un hyperviseur (g1)

#!/bin/sh

for i in /proc/sys/net/ipv6/conf/*; do for j in autoconf accept_ra; do echo 0 > $i/$j; done;done
# https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt
for i in /proc/sys/net/ipv4/conf/*/arp_announce; do echo 2 > $i;done

echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv6/conf/all/forwarding

ip link set eth0 up

ip link add link eth0 name eth0.3131 type vlan id 3131
ip link set eth0.3131 up

ip addr add 89.234.156.251/32 dev eth0.3131
ip route add 91.224.149.0/24 dev eth0.3131
ip route add default via 91.224.149.254

ip addr add 2a01:6600:8083:fb00::1/56 dev eth0.3131
ip route add default via fe80::31 dev eth0.3131

ip route add 89.234.156.250/32 dev eth0.3131
ip route add 89.234.156.252/32 dev eth0.3131
ip route add 89.234.156.253/32 dev eth0.3131

ovs_vlan_attach(){
        bridge=$1
        interface=$2
        vlan=$3
        ip=$4
        # Clean ovs mess (it create the interface without vlan tag id)
        ovs-vsctl del-port ${bridge} ${interface}.${vlan}
        ip link del ${interface}.${vlan}
        ip link add link ${interface} name ${interface}.${vlan} type vlan id ${vlan}
        ip link set ${interface}.${vlan} up
        ovs-vsctl add-port ${bridge} ${interface}.${vlan}
        ip link set ${bridge} up
        [ "${ip}" ] && ip addr add ${ip} dev ${bridge}
}

ovs_vlan_attach br-admin eth0 3175 192.168.3.101/24
ovs_vlan_attach br-tsf eth0 3195 

ip link set br-net up
ip addr add fe80::31/64 dev br-net
ip addr add 91.224.148.0/32 dev br-net

for i in /etc/init.d/{ceph,nova-compute,neutron-plugin-*-agent} ; do
        $i restart
done

/root/tetaneutral-openstack-routing-daemon.sh -d

is_openstack_vm_here=$(virsh list --all | awk '{if ($2 == "openstack") print $0}')
if [ "$is_openstack_vm_here" ]; then
        virsh start openstack
        ip route add 89.234.156.249/32 dev br-net proto 42
        ip -6 route add 2a01:6600:8083:f900::/56 dev br-net proto 42
fi

exit 0

note: Les bridges openvswitch sont mémorisés et recréés automatiquement par le service openvswitch-switch

Sur h7.tetaneutral.net le routage est le suivant

ip route add 89.234.156.251/32 dev eth0.3131
ip route add 89.234.156.252/32 dev eth0.3131
ip route add 89.234.156.253/32 dev eth0.3131
ip route add 2a01:6600:8083:fb00::/56 dev eth0.3131
ip route add 2a01:6600:8083:fc00::/56 dev eth0.3131
ip route add 2a01:6600:8083:fd00::/56 dev eth0.3131

Ainsi que ceci le temps de l'installation

ip route add 89.234.156.248/32 via 89.234.156.251 # NOTE(sileht): temporairement pour le setup openstack
ip route add 2a01:6600:8083:f800::/56 via 2a01:6600:8083:fb00::1 dev eth0.3131 # NOTE(sileht): temporairement pour le setup openstack

Preparation de la VM de management, le controlleur

Installation des prérequis

$ apt-get install libvirt-bin openstack-debian-images virtinst openvswitch-switch 
#NOTE(sileht): temporairement appliquer les patches de au-dessus à openstack-debian-images 

Preparation de l'image de la VM

On notera les ip temporaire 192.168.3.100

$ vim hook.sh
set -xv

echo "openstack" > $BODI_CHROOT_PATH/etc/hostname

cat > $BODI_CHROOT_PATH/etc/resolv.conf <<EOF
domain tetaneutral.net
search tetaneutral.net
nameserver 8.8.8.8
EOF

cat > $BODI_CHROOT_PATH/etc/network/interfaces <<EOF
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet manual
  pre-up /sbin/sysctl -w net.ipv6.conf.eth0.accept_ra=0
  pre-up /sbin/sysctl -w net.ipv6.conf.eth0.autoconf=0
  up ip link set eth0 up
  up ip addr add 89.234.156.249/32 dev eth0
  up ip route add 91.224.148.0/32 dev eth0
  up ip route add default via 91.224.148.0

iface eth0 inet6 static
    pre-up /sbin/sysctl -w net.ipv6.conf.eth0.accept_ra=0
    pre-up /sbin/sysctl -w net.ipv6.conf.eth0.autoconf=0
    address 2a01:6600:8083:f900::1
    netmask 56
    gateway fe80::31

auto eth1
iface eth1 inet static
  pre-up /sbin/sysctl -w net.ipv6.conf.eth1.accept_ra=0
  pre-up /sbin/sysctl -w net.ipv6.conf.eth1.autoconf=0
  address 192.168.3.100
  netmask 255.255.255.0
EOF

mkdir -p $BODI_CHROOT_PATH/root/.ssh
chmod 600 $BODI_CHROOT_PATH/root/.ssh
cat >> $BODI_CHROOT_PATH/root/.ssh/authorized_keys <<EOF
ssh-dss AAAAB3NzaC1kc3MAAACBAJtnGLvuz4uVD6fnERDxDi/C0UyzwCiKmgNtEessopREYasAX4Gu6Fg10jAyIL5Nuc7YDnqj//pOfxNjD7hp99a2ZmkRQgh/ltClxYML9fqhBHgsUCpVse9nOYDHDnDgvXIPRSDUHat2UFpdchHVrFURNLIlZnBztsr+GCDURTV/AAAAFQD9SrBcH49ltaKOm6V5ssCPmgs1SwAAAIAbAvkQ3/tMzzdACO5B9s5Yb3ZuM7XImm0iqufivVf2Xy39g8HOBulUsN7eKEGPhVriqNolgIO7q7tVgYAff4/NE4yDP0Kp0SPg4tjt2yFJuL31Y3wzwHjnKrjgNlDSLl3uZnRXSipwUMwGKbdHB6NZSqlq192VKbHilQ00pbiMlAAAAIB5dfB1lVHkJ0o5CcaVQRPbca9DvbbRwnoTSmKHc5DUcqsPqDhS07CkM9ZcJuY1Nh4wGl4Q9kArj7Tnsvvygf/HReSUcIk4+nbDytJ8/pca/Qx4fzQQyppa94TylN62LSFT6MIJKLoMwYa0dQURT7Mv5+9Qj2vk5pZ38w2iQ9zVCg== root@h1
EOF

sed -i -e 's/^.*Port.*$/Port 2222/' -e 's/^[# ]*PasswordAuthentication.*$/PasswordAuthentication no/' $BODI_CHROOT_PATH/etc/ssh/sshd_config
chroot $BODI_CHROOT_PATH dpkg-reconfigure openssh-server
chroot $BODI_CHROOT_PATH apt-get purge -y cloud-init*
$ chmod +x hook.sh
$ build-openstack-debian-image --image-size 20  --release jessie -u http://apt.tetaneutral.net/debian/ -s http://apt.tetaneutral.net/debian/ --hook-script $(pwd)/hook.sh
$ mv debian-jessie-7.0.0-3-amd64.raw /openstack.raw 
$ rm debian-jessie-7.0.0-3-amd64.qcow2

note: la derniere commande lancée par le script doit être 'qemu-img convert -c -f raw .... , sinon l'image de bootera pas
note(jessie): si l'erreur est celle ci-dessous, relancer manuellement 'kpartx -d debian-jessie-7.0.0-3-amd64.raw' jusqu'a ce que l'erreur disparaissent et le .raw est utilisable:

+ 'kpartx -d debian-jessie-7.0.0-3-amd64.raw'
device-mapper: remove ioctl on loop0p1 failed: Device or resource busy
loop deleted : /dev/loop0

note: si parted freeze -> lancer /etc/init.d/udev restart

On garde l'image raw qui sera importable dans ceph plus tard et on la mets à la racine pour qui l'utilisateur libvirt puisse y accéder.

Préparation du réseau

$ modprobe vhost-net
$ ovs-vsctl add-br br-net 
$ ip link set br-net up 
$ ovs-vsctl br-set-external-id br-net bridge-id br-net 
$ ip link set br-admin up 
$ ovs-vsctl br-set-external-id br-net bridge-id br-admin 
$ ovs-vsctl add-port br-admin eth0.3175
$ ip addr add 192.168.3.101/24 dev br-admin 
$ ip addr add fe80::31/64 dev br-net 
$ ip route add 89.234.156.249/32 dev br-net
$ ip -6 route add 2a01:6600:8083:f900::/56 dev br-net

Installation de la VM

$ virt-install --name openstack --ram 2048 --network bridge=br-net,model=virtio --network bridge=br-admin,model=virtio --nographics --serial pty --wait -1 --noreboot --autostart --disk /openstack.raw,bus=virtio,cache=none,io=native --import
$ EDITOR="sed -i -e \"s,<source bridge='br-net'/>,<source bridge='br-net'/><virtualport type='openvswitch' />,g\"" virsh edit openstack # Openvswitch is not yet supported by virt-install 
$ EDITOR="sed -i -e \"s,<source bridge='br-admin'/>,<source bridge='br-admin'/><virtualport type='openvswitch' />,g\"" virsh edit openstack # Openvswitch is not yet supported by virt-install 
$ virsh  start openstack
$ ssh root@89.234.156.249 -p 2222

Une fois connecté à la VM:

$ apt-get install puppet
$ puppet agent --enable
$ puppet agent -vt --server puppet.tetaneutral.net --certname openstack.tetaneutral.net --pluginsync 
Info: Caching certificate for ca
Info: csr_attributes file loading from /etc/puppet/csr_attributes.yaml
Info: Creating a new SSL certificate request for openstack.tetaneutral.net
Info: Certificate Request fingerprint (SHA256): AE:72:47:40:A0:E2:F4:59:BA:39:FA:3D:C2:A7:C9:1B:9F:87:A5:B7:65:3A:F9:D4:DE:AF:E2:A3:02:41:0F:2E
Info: Caching certificate for ca
Exiting; no certificate found and waitforcert is disabled

Sur le puppetmaster:

$ puppet ca sign openstack.tetaneutral.net 

note: si un vieux cert existe: puppet ca revoke openstack.tetaneutral.net ; puppet cert clean openstack.tetaneutral.net; puppet node clean openstack.tetaneutral.net

De nouveau sur la VM:

$ puppet agent -vt --server puppet.tetaneutral.net --certname openstack.tetaneutral.net --pluginsync 
$ puppet agent -vt --server puppet.tetaneutral.net --certname openstack.tetaneutral.net --pluginsync 
$ puppet agent -vt --server puppet.tetaneutral.net --certname openstack.tetaneutral.net --pluginsync 

Il ne doit plus y avoir d'erreur la 3°/4° fois.

Configuration des hyperviseurs

Une fois la configuration réseau faite, tout ce fait avec puppet:

$ apt-get install puppet
$ puppet agent --enable
$ puppet agent -vt --server puppet.tetaneutral.net --certname openstack.tetaneutral.net --pluginsync 
Info: Caching certificate for ca
Info: csr_attributes file loading from /etc/puppet/csr_attributes.yaml
Info: Creating a new SSL certificate request for openstack.tetaneutral.net
Info: Certificate Request fingerprint (SHA256): AE:72:47:40:A0:E2:F4:59:BA:39:FA:3D:C2:A7:C9:1B:9F:87:A5:B7:65:3A:F9:D4:DE:AF:E2:A3:02:41:0F:2E
Info: Caching certificate for ca
Exiting; no certificate found and waitforcert is disabled

Sur le puppetmaster:

$ puppet ca sign openstack.tetaneutral.net 

note: si un vieux cert existe: puppet ca revoke openstack.tetaneutral.net ; puppet cert clean openstack.tetaneutral.net; puppet node clean openstack.tetaneutral.net

De nouveau sur la VM:

$ puppet agent -vt --server puppet.tetaneutral.net --certname openstack.tetaneutral.net --pluginsync 
$ puppet agent -vt --server puppet.tetaneutral.net --certname openstack.tetaneutral.net --pluginsync 
$ puppet agent -vt --server puppet.tetaneutral.net --certname openstack.tetaneutral.net --pluginsync 

Il ne doit plus y avoir d'erreur la 3°/4° fois.

Information sur la configuration d'un hyperviseur sur le puppet master

La configuration puppet ressemble à :

node "gX.tetaneutral.net" inherits openstack_node_common {
  # Configuration du routerid et de l'AS number de cette machine
  # Il faut aussi mettre la conf bgp de h7 ainsi que les fichiers 
  # /etc/puppet/manifests/files/openstack-bird.conf.erb et
  # /etc/puppet/manifests/files/openstack-bird6.conf.erb
  # pour ajouter cette AS interne
  ttnn_os_bird {'198.51.100.1': asnum => "65001"}

  # Dans le cas d'une moniteur ceph, mais uniquement 3 suffissent, on a déjà g1,g2,g3
  ttnn_ceph_mon {$::hostname:}
  # Sinon utilisait:
  # class{"ttnn_ceph_osd_only": }

  # La partie Openstack, l'uuid doit être unique par machine (générer avec uuid-gen)
  ttnn_os_compute {"9d26ec10-a48b-4f0f-a122-f10ed16d270f": }
}

Déplacement du controlleur dans openstack (Work In Progress)

$ cat > os.conf <<EOF
export OS_AUTH_URL=http://89.234.156.248:5000/v2.0/
export OS_USERNAME=admin
export OS_TENANT_NAME=ttnn_admin
export OS_PASSWORD=<password>
EOF
$ source os.conf 

Générer d'abord une image debian jessie et l'uploader dans glance

$ glance image-create --progress --name debian-jessie-7.0.0-3-amd64 --disk-format raw --container-format bare  < debian-jessie-7.0.0-3-amd64.raw
# glance image-list | grep jessie
| c81df9d4-8786-4f77-b84b-8409f1f11018 | debian-jessie-7.0.0-3-amd64 | raw         | bare             | 1073741824 | active |

On boot une debian vide avec config-drive à false pour ne pas avoir le réseau configuré dans la VM (sinon la vrai va couper)

$ netid_net=$(neutron net-list | awk '/ttnn-net/{print $2}')
$ netid_admin=$(neutron net-list | awk '/ttnn-admin/{print $2}')
$ nova boot --nic net-id=$netid_net,v4-fixed-ip=89.234.156.249 --nic net-id=$netid_admin,v4-fixed-ip=192.168.3.100 --block-device source=image,id=c81df9d4-8786-4f77-b84b-8409f1f11018,shutdown=preserve,dest=volume,bootindex=0,size=50 --flavor m1.medium --poll openstack.tetaneutral.net --config-drive false
+--------------------------------------+-------------------------------------------------+
| Property                             | Value                                           |
+--------------------------------------+-------------------------------------------------+
| OS-DCF:diskConfig                    | MANUAL                                          |
| OS-EXT-AZ:availability_zone          | nova                                            |
| OS-EXT-SRV-ATTR:host                 | -                                               |
| OS-EXT-SRV-ATTR:hypervisor_hostname  | -                                               |
| OS-EXT-SRV-ATTR:instance_name        | instance-0000000b                               |
| 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                            |                                                 |
| config_drive                         |                                                 |
| created                              | 2014-08-26T09:19:34Z                            |
| flavor                               | m1.medium (3)                                   |
| hostId                               |                                                 |
| id                                   | 899b93b2-d5a0-4531-9f92-0b8103755fda            |
| image                                | Attempt to boot from volume - no image supplied |
| key_name                             | -                                               |
| metadata                             | {}                                              |
| name                                 | openstack.tetaneutral.net                       |
| os-extended-volumes:volumes_attached | []                                              |
| progress                             | 0                                               |
| security_groups                      | default                                         |
| status                               | BUILD                                           |
| tenant_id                            | 700f4abd173f472499a934eacf9730bd                |
| updated                              | 2014-08-26T09:19:35Z                            |
| user_id                              | f5603324b48542eca4c34d3a32d725cb                |
+--------------------------------------+-------------------------------------------------+
Server building... 0% complete

Ensuite on va stopper la VM niveau libvirt

$ nova show openstack.tetaneutral.net | grep -e hostname -e instance_name
| OS-EXT-SRV-ATTR:hypervisor_hostname  | g3.tetaneutral.net                                       |
| OS-EXT-SRV-ATTR:instance_name        | instance-00000004                         

# On éteint la VM de management
$ virsh shutdown openstack 

Donc sur g3.tetaneutral.net, éteint la vide openstack vide

$ virsh destroy instance-00000004

Sur g1, on remplace le disk de "instance-00000004" par celui de la vrai vm de management:

# rbd -p cinder ls
volume-58de0590-d9e6-4d00-8ea1-1a83b740a1f6
# rbd -p cinder rm volume-58de0590-d9e6-4d00-8ea1-1a83b740a1f6
Removing image: 100% complete...done.
# rbd -p cinder import /var/lib/ceph/osd/ceph-2/openstack.raw  volume-58de0590-d9e6-4d00-8ea1-1a83b740a1f6

Donc sur g3.tetaneutral.net on redémarre la VM

$ virsh start instance-00000004

Nettoyage des routes provisoir sur g1:

ip route del 89.234.156.249
ip -6 r  d 2a01:6600:8083:f900::/56 dev br-net

Sur h7:

ip route del 89.234.156.249/32 via 89.234.156.251
ip route del 2a01:6600:8083:f900::/56 via 2a01:6600:8083:fb00::1 dev eth0.3131

Sur g3.t

ip route add 89.234.156.249/32 dev br-net proto 42
ip -6 route add 2a01:6600:8083:f900::/56 dev br-net proto 42

Vérification que la route est bien propagé à h7.t sur h7.t:

# ip route get 89.234.156.249
89.234.156.249 via 89.234.156.253 dev eth0.3131  src 91.224.149.254 
    cache 

Ca marche !

$ ssh openstack.t
X11 forwarding request failed on channel 0

  server: openstack.tetaneutral.net
  system: Debian jessie/sid, kernel 3.14-2-amd64, puppet 3.6.1
     cpu: 1/1 (QEMU Virtual CPU version 2.1.0)
  memory: 1.96 GB

    eth0: 52:54:00:90:d8:c7 / 89.234.156.249 / 2a01:6600:8083:f900::1
    eth1: 52:54:00:13:fa:13 / 192.168.3.100

 modules: openstack_node_common ttnn::server resolver checkmk::agent checkmk::client rsyslog::client rsyslog apt apt::update puppet nullmailer backup::client sexymotd 
                            _             _    
  ___  _ __   ___ _ __  ___| |_ __ _  ___| | __
 / _ \| '_ \ / _ \ '_ \/ __| __/ _` |/ __| |/ /
| (_) | |_) |  __/ | | \__ \ || (_| | (__|   < 
 \___/| .__/ \___|_| |_|___/\__\__,_|\___|_|\_\
      |_|                                      
Last login: Wed Aug 27 08:10:02 2014 from atoulouse-652-1-119-50.w2-6.abo.wanadoo.fr
root@openstack:~# 

Preparation des OSD pour ceph

Cas général un disque entier:

$ ceph-disk prepare /dev/sdb
$ ceph-disk activate /dev/sdb

Cas particulier du SSD ou ce trouve l'OS

En général avec ceph, on donne un disque, ceph créé 2 partitions une pour le journal de l'OSD, l'autre pour les datas
mais pour le SSD de tetaneutral qui a aussi l'OS, voici la méthode

Création manuelle de la partition de data ceph /dev/sda2 ici

$ fdisk /dev/sda

n
p
<enter>
<enter>
<enter>
<enter>
w

$ partprobe

On prepare le disk comme normalement

ceph-disk prepare /dev/sda2
ceph-disk activate /dev/sda2

Le disque n'étant pas utilisé uniquement par ceph, le service ceph ne le chargera pas automatiquement:
Il faut ajouter ceci dans le /etc/rc.local:

ceph-disk activate /dev/sda2

Preparation du Pool SSD pour ceph

Configuration de la crushmap de ceph:

REF: http://ceph.com/docs/master/rados/operations/crush-map/#getcrushmap

$ ceph osd getcrushmap -o compiled-crushmap
$ crushtool -d compiled-crushmap -o crushmap.txt
# EDIT crushmap.txt
$ crushtool -c crushmap.txt -o compiled-crushmap 
$ ceph osd setcrushmap -i compiled-crushmap

Definition de la crushmap de ttnn

Chaque machine se trouve dans 2 hosts, un host SSD et un host HARDDISK (même si en réalité les deux sont sur la même machine physique),

Ensuite on créé 2 object root un pour les hosts SSD et un autre pour les host HARDDISK

On créé ensuite 2 règles de stockage une qui envoie les objects vers le root SSD et l'autre vers le root HARDDISK

Cela permettra d'avoir de définir une règle différente suivant les pools ceph.

Niveau Openstack nous avons 4 pools:
  • nova: que nous n'allons pas utilisé mais que nova utilise pour stocker quelles fichiers pour le boot des VMs. (Il normalement utilisé si on créé pas préalablement de volume)
  • cinder: ce pool sera le pool par défaut de création des disques
  • cinder-ssd: sera le pool sur le quel on applique la politique de stockage numero 1
  • glance: c'est la que seront stocké les images de VMs.

Une fois la crushmap modifié on applique la règle sur le pool cinder-ssd:

ceph osd pool set cinder-ssd crush_ruleset 1

Il faut ensuite attendre que ceph redistribue les data comme on lui a demandé, on peut suivre l'avancement avec :

ceph -s

La crushmap le jour de l'installation:

# begin crush map
tunable choose_local_tries 0
tunable choose_local_fallback_tries 0
tunable choose_total_tries 50
tunable chooseleaf_descend_once 1

# devices
device 0 osd.0
device 1 osd.1
device 2 osd.2
device 3 osd.3
device 4 osd.4
device 5 osd.5

# types
type 0 osd
type 1 host
type 2 chassis
type 3 rack
type 4 row
type 5 pdu
type 6 pod
type 7 room
type 8 datacenter
type 9 region
type 10 root

host g3-ssd {
    id -1        # do not change unnecessarily
    alg straw
    hash 0    # rjenkins1
    item osd.3 weight 0.040
}

host g3-harddisk {
    id -2        # do not change unnecessarily
    alg straw
    hash 0    # rjenkins1
    item osd.1 weight 1.810
}

host g2-ssd {
    id -3        # do not change unnecessarily
    # weight 3.630
    alg straw
    hash 0    # rjenkins1
    item osd.4 weight 0.000
}

host g2-harddisk {
    id -4        # do not change unnecessarily
    # weight 3.630
    alg straw
    hash 0    # rjenkins1
    item osd.0 weight 3.630
}

host g1-ssd {
    id -5        # do not change unnecessarily
    # weight 3.630
    alg straw
    hash 0    # rjenkins1
    item osd.5 weight 0.000
}
host g1-harddisk {
    id -6        # do not change unnecessarily
    # weight 3.630
    alg straw
    hash 0    # rjenkins1
    item osd.2 weight 3.630
}

root harddrive {
    id -7
    alg straw
    hash 0
    item g1-harddisk weight 2.00
    item g2-harddisk weight 2.00
    item g3-harddisk weight 2.00
}

root ssd {
    id -8
    alg straw
    hash 0
    item g1-ssd weight 2.00
    item g2-ssd weight 2.00
    item g3-ssd weight 2.00
}

# rules
rule default {
    ruleset 0
    type replicated
    min_size 1
    max_size 10
    step take harddrive
    step chooseleaf firstn 0 type host
    step emit
}

rule ssd {
    ruleset 1
    type replicated
    min_size 1
    max_size 10
    step take ssd
    step chooseleaf firstn 0 type host
    step emit
}

# end crush map

Vérification de l'arbre des OSD:

Avec la crushmap par défaut:

root@g2:~# ceph osd tree 
# id    weight    type name    up/down    reweight
-1    9.53    root default
-2    3.84        host g2
0    0.21            osd.0    up    1    
4    3.63            osd.4    up    1    
-3    1.85        host g3
1    0.03999            osd.1    up    1    
3    1.81            osd.3    up    1    
-4    3.84        host g1
2    0.21            osd.2    up    1    
5    3.63            osd.5    up    1    

Avec la nouvelle crushmap:

root@g2:~# ceph osd tree
# id    weight    type name    up/down    reweight
-8    6    root ssd
-5    2        host g1-ssd
5    0            osd.5    up    1    
-3    2        host g2-ssd
4    0            osd.4    up    1    
-1    2        host g3-ssd
3    0.03999            osd.3    up    1    
-7    6    root harddrive
-6    2        host g1-harddisk
2    3.63            osd.2    up    1    
-4    2        host g2-harddisk
0    3.63            osd.0    up    1    
-2    2        host g3-harddisk
1    1.81            osd.1    up    1    

Management d'openstack