Principe
Il n’est pas question de configurer à la main la carte micro-SD de chaque Raspberry Pi 2 du cluster. Nous allons plutôt construire une image unique, un master, que l’on dupliquera. A chaque boot le Rasperry Pi s’auto configurera pour fonctionner comme nœud du cluster. Ce système d’auto configuration devra donner une adresse IP unique, ainsi qu’un nom (hostname) unique, à chaque nœud.L’affectation d’une adresse IP spécifique à chaque nœud se fera par DHCP. L’affectation du hostname pourrait aussi se faire via DHCP, mais tous les serveurs DHCP ne le permettent pas (en particulier ceux inclus dans les box des opérateurs internet). L’affectation du hostname unique se fera donc via un script exécuté sur le nœud à chaque fois qu’il recevra une adresse IP du serveur DHCP.
Concrètement
- Les IP seront allouées dans le réseau privé 192.168.0.0/24
- Sur la base de son adresse MAC, chaque nœud obtiendra du serveur DHCP une IP fixe spécifique, de la forme 192.168.0.XXX
- Au moment de l’allocation de cette adresse IP un script extraira du fichier /etc/hosts le hostname associé a cette IP et l'affectera au système.
Exemple :
Adresse MAC envoyée au serveur DHCP: b8 27 eb c6 3f 77
Adresse IP retournée par le DHCP: 192.168.0.105
Hostname assigné: node05
PAS à PAS
Si rien n'est dit c'est qu'il faut faire la même chose avec Raspberian et avec CentOS.a) Désactiver ipv6
Ajouter disable_ipv6=1 à la fin de l'unique ligne de /boot/cmdline.txt
et/ou ajouter au fichier /etc/sysctl.conf la ligne
net.ipv6.conf.all.disable_ipv6=1
b) Mettre à jour /etc/hosts
(on en profite pour enlever tout ce qui concerne ipv6)
> cat /etc/hosts
127.0.0.1 localhostc) Configuration du daemon client dhcpcd (Raspbian)
192.168.0.101 node01
192.168.0.102 node02
192.168.0.103 node03
...
192.168.0.115 node15
Son vrai nom est dhcpcd5 bien que ce soit la version 6 !
> cat /etc/dhcpcd.conf
# debug
ipv4only
noarp
option domain_name_servers, domains_name
nohook lookup-hostname, hostname
TOUT le reste doit être supprimé ou mis en commentaire avec #
Pour CentOS rien à faire (le fichier /etc/dhcpcd.conf n'existe pas) et le client s’appelle dhclient.
d) interfaces (Raspbian)
cat /etc/network/interfaces
auto lo eth0
iface lo inet loopback
iface eth0 inet manual
Même si c’est dhcpcd qui configurera l’interface eth0 il ne faut pas utiliser ‘dhcp’ mais ‘manual’.
Pour CentOS toujours rien à faire, eth0 est par défaut configurée par dhcp.
e) Attribution du hostname (Raspbian)
Dans le répertoire /lib/dhcpcd/dhcpcd-hooks créer le fichier 99-set-hostname
cat /lib/dhcpcd-hooks/99-set-hostname
get_hostname()Ce script utilise l'adresse ip assignée par le serveur DHCP pour trouver le hostname dans le fichier /etc/hosts et l'assigner au système. (c'est du reverse DNS sans DNS)
{
[ -z "$new_ip_address" ] && return 1
local h="$(/usr/bin/getent hosts $new_ip_address)"
if [ $? = 0 ]; then
echo "$h" | sed 's/[^ ]* *\([^ ]*\).*/\1/'
return 0
fi
return 1
}
if $if_up ; then
if [ -z "$new_host_name" -a -z "$new_fqdn_name" ]; then
export new_host_name="$(get_hostname)"
hostname $new_host_name
fi
fi
Note: dans ce même répertoire les deux scripts 29-loopup-hostname et 30-hostname ont été désactivés dans /etc/dhcpcd.conf par la commande :
nohook lookup-hostname, hostnamee) Attribution du hostname (CentOS 7.x)
A chaque changement dans la config réseau le NetworkManager exécute les scripts qui sont dans /etc/NetworkManager/dispatcher.d Dans ce répertoire il y a déjà le script 11-dhclient qui source les scripts xxxx.sh qui sont dans le répertoire /etc/dhcp/dhclient.d et invoque la fonction xxxx_config quand interface devient ‘up’, ou xxxx_restore quand une interface passe ‘down’. Les variables d’environnement donnant les info sur l’interface concernée (ip, netmask, gateway ..)
On va donc mettre notre script sethostname.sh dans /etc/dhcp/dhclient.d
cat /etc/dhcp/dhclient.d/sethostname.sh
function sethostname_config {
local ip_addr=127.0.0.1
if [ -n "$IP4_ADDRESS_0" ]; then
ip_addr="$(echo "$IP4_ADDRESS_0" | /usr/bin/cut -d'/' -f1)"
else
ip_addr=$DHCP4_IP_ADDRESS
fi
local h="$(/usr/bin/getent hosts $ip_addr)"
if [ $? = 0 ]; then
export new_hostname=$(echo "$h" | /usr/bin/awk '{print $2}')
/usr/bin/hostnamectl --static set-hostname $new_hostname
echo "Set my hostname to '$new_hostname' "
else
echo "ERROR: Cannot find $ip_addr in /etc/hosts"
fi
}
function sethostname_restore {
: # nothing todo
}
Ne pas oublier:
chmod +x /etc/dhcp/dhclient.d/sethostname.sh
f) Configurer le serveur DHCP
Se loguer sur chaque Raspberry Pi 2 pour noter l’adresse MAC de son interface Ethernet. Le plus simple est de faire cela via la console (HDMI/clavier usb), sans câble réseau. Ne pas être connecter au réseau évitera des problèmes de cache DHCP.
Une fois connecté à la console du Raspberry taper la commande :
cat /sys/class/net/eth0/address
Note : L’adresse MAC (Media Access Control Address) est constituée de 6 octets. Les 3 octets de poids fort dépendent du fabriquant. Pour Raspberry ces 3 octets sont toujours : b8 27 eb. Les 3 octets de poids faible identifient l’interface. Dans le cas des RPi ce sont les 3 octets de poids faible du numéro de série que l’on peut voir avec la commande : cat /proc/cpuinfo.
Pour chaque adresse MAC ajouter une entrée dans la configuration du serveur DHCP. (voir la doc de cotre serveur DHCP. Exemple ci-contre)
La routine à répéter 15 fois est donc :
- se loger a un Raspberry en console et sans câble réseau
- noter l'adresse mac afficher par cat /sys/class/net/eth0/address
- mettre à jour le serveur DHCP (adresse mac, adresse ip)
- brancher le réseau
- rebooter le RPi (alt-ctrl-del)
- Au boot on doit avoir l'IP et le hostname voulus.
- shutdown
- deplacer la carte micro-sd au raspberry suivant
répéter...
Patience, ne dupliquez pas encore cette carte.
A SUIVRE...