Version : 2021.01

Dernière mise-à-jour :

HAR100 - Gestion de la Haute Disponibilité avec Red Hat High-Availability Cluster

Contenu du Module

HAR100 - Gestion de la Haute Disponibilité avec Red Hat High-Availability Cluster

Red Hat High Availability Cluster sous CentOS 7

Red Hat High Availability Cluster versus Red Hat Cluster Suite

Installer le Logiciel du Module Red Hat High Availability

Firewalld

hacluster

Démarrer le daemon pcsd

Préparation des Machines Virtuelles

Ethernet Channel Bonding

Configuration du node1.i2tch.loc

Configuration du node2.i2tch.loc

Tester les Serveurs

Démarrer le Service pcsd si nécessaire

LAB #1 - L'Authentification de l'utilisateur pcs hacluster

LAB #2 - Création du cluster my_cluster

LAB #3 - Activer les services cluster sur chaque noeud

LAB #4 - Mise en place d'une clôture

LAB #5 - Mise en place d'un Serveur Apache Actif/Passif

Création du Stockage Partagé - Mutualisation du Stockage

Création des Ressources du Cluster

Red Hat High Availability Cluster versus Red Hat Cluster Suite

Dans la version Red Hat High Availability Cluster :

pcs remplace luci,

keepalivedremplace Pirahna. Keepalived est configuré dans le fichier /etc/keepalived/keepalived.conf - voir man keepalived.conf,

rgmanager et cman sont remplacés par pacemaker et corosync. Cette modification introduit des agents de ressource qui fonctionnent avec le gestionnaire de ressources Pacemaker,

votequorum remplace qdiskd - voir man 5 votequorum.

Installer le Logiciel du Module Red Hat High Availability

L'installation de Red Hat High Availability se fait simplement en utilisant yum :

[root@centos7 ~]# yum install pcs pacemaker fence-agents-all

Firewalld

RHEL/CentOS 7 utilisent firewalld :

[root@centos7 ~]# firewall-cmd --state
running

De ce fait, il convient de créer les règles adéquates pour la haute disponibilité :

[root@centos7 ~]# firewall-cmd --permanent --add-service=high-availability
success
[root@centos7 ~]# firewall-cmd --add-service=high-availability
success

hacluster

L'utilisateur hacluster est utilisé par pcs afin de configurer et communiquer avec chaque noeud dans le cluster. Cet utilisateur doit avoir un mot de passe :

[root@centos7 ~]# passwd hacluster
Changing password for user hacluster.
New password: fenestros
BAD PASSWORD: The password fails the dictionary check - it is based on a dictionary word
Retype new password: fenestros
passwd: all authentication tokens updated successfully.

Important - Il est recommendé à ce que le mot de passe de l'utilisateur hacluster soit identique sur chaque noeud. Dans le cas de notre exemple, le mot de passe est fenestros. Le mot de passe ci-dessus vous est montré dans le cadre de l'exemple. Dans le cas d'un système en production, le mot de passe ne sera pas visible et doit être autre que fenestros !

Démarrer le daemon pcsd

Sous RHEL/CentOS 7 , le daemon pcsd doit être démarré sur chaque noeud afin que les mises-à-jour de la configuration du cluster puissent être propagées aux autres noeuds.

Vérifiez si pcsd est démarré :

[root@centos7 ~]# systemctl status pcsd
● pcsd.service - PCS GUI and remote configuration interface
Loaded: loaded (/usr/lib/systemd/system/pcsd.service; disabled; vendor preset: disabled)
Active: inactive (dead)
Docs: man:pcsd(8)
man:pcs(8)
You have new mail in /var/spool/mail/root

Démarrez pcsd puis configurez-le pour un démarrage automatique :

[root@centos7 ~]# systemctl start pcsd.service
[root@centos7 ~]# systemctl enable pcsd.service
Created symlink from /etc/systemd/system/multi-user.target.wants/pcsd.service to /usr/lib/systemd/system/pcsd.service.
[root@centos7 ~]# systemctl status pcsd
● pcsd.service - PCS GUI and remote configuration interface
Loaded: loaded (/usr/lib/systemd/system/pcsd.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2018-08-28 09:39:29 CEST; 11s ago
Docs: man:pcsd(8)
man:pcs(8)
Main PID: 2520 (pcsd)
CGroup: /system.slice/pcsd.service
└─2520 /usr/bin/ruby /usr/lib/pcsd/pcsd > /dev/null &
Aug 28 09:39:22 centos7.fenestros.loc systemd[1]: Starting PCS GUI and remote configuration interface...
Aug 28 09:39:29 centos7.fenestros.loc systemd[1]: Started PCS GUI and remote configuration interface.

La configuration de pcsd se trouve dans le fichier /etc/sysconfig/pcsd :

[root@centos7 ~]# cat /etc/sysconfig/pcsd
# pcsd configuration file
# Set PCSD_DEBUG to true for advanced pcsd debugging information
PCSD_DEBUG=false
# Set DISABLE_GUI to true to disable GUI frontend in pcsd
PCSD_DISABLE_GUI=false
# Set web UI sesions lifetime in seconds
PCSD_SESSION_LIFETIME=3600
# List of IP addresses pcsd should bind to delimited by ',' character
#PCSD_BIND_ADDR='::'
# Set port on which pcsd should be available
#PCSD_PORT=2224
# SSL settings
# set SSL options delimited by ',' character
# list of valid options can be obtained by running
# ruby -e 'require "openssl"; puts OpenSSL::SSL.constants.grep /^OP_/'
#PCSD_SSL_OPTIONS='OP_NO_SSLv2,OP_NO_SSLv3,OP_NO_TLSv1,OP_NO_TLSv1_1'
# set SSL ciphers
#PCSD_SSL_CIPHERS='DEFAULT:!RC4:!3DES:@STRENGTH'
# Proxy settings for pcsd node to node communication
# See ENVIRONMENT section in curl(1) man page for more details.
# Proxy address
#HTTPS_PROXY=
# Do not use proxy for specified hostnames
#NO_PROXY=
# Do not change
RACK_ENV=production

Préparation des Machines Virtuelles

A partir de votre serveur cloud, créez 2 clones complets de la VM CentOS_7 :

[root@centos7 ~]# exit
[trainee@centos7 ~]$ exit
desktop@serverXX:~$ VBoxManage controlvm CentOS_7 poweroff
desktop@serverXX:~$ VBoxManage clonevm CentOS_7 --name="node1.i2tch.loc" --register --mode=all
desktop@serverXX:~$ VBoxManage clonevm CentOS_7 --name="node2.i2tch.loc" --register --mode=all

Modifiez la configuration réseau de la première interface réseau de node2.i2tch.loc :

desktop@serverXX:~$ VBoxManage modifyvm "node2.i2tch.loc" --natpf1 "node2.i2tch.loc,tcp,,4022,,22

Mettez les interfaces 2 et 3 de chaque VM dans le réseau interne intnet :

desktop@serverXX:~$ VBoxManage modifyvm "node1.i2tch.loc" --nic2 intnet
desktop@serverXX:~$ VBoxManage modifyvm "node1.i2tch.loc" --nic3 intnet
desktop@serverXX:~$ VBoxManage modifyvm "node2.i2tch.loc" --nic2 intnet
desktop@serverXX:~$ VBoxManage modifyvm "node2.i2tch.loc" --nic3 intnet

Les deux VMs ont maintenant trois interfaces réseau :

Adaptateur	Carte 1	Carte 2	Carte 3
Type de réseau	NAT	intnet	intnet

Démarrez les machines virtuelles node1.i2tch.loc et node2.i2tch.loc :

desktop@serverXX:~$ VBoxManage startvm node1.i2tch.loc --type headless
...
desktop@serverXX:~$ VBoxManage startvm node2.i2tch.loc --type headless
...

Connectez-vous aux deux VMs :

desktop@serverXX:~$ ssh -l trainee localhost -p 3022

desktop@serverXX:~$ ssh -l trainee localhost -p 4022

Modifiez les noms d'hôtes des deux VMs :

[root@centos7 ~]# nmcli general hostname node1.i2tch.loc
[root@centos7 ~]# hostname
node1.i2tch.loc

[root@centos7 ~]# nmcli general hostname node2.i2tch.loc
[root@centos7 ~]# hostname
node2.i2tch.loc

Important - Déconnectez-vous de et re-connectez-vous à chaque VM.

Vérifiez la configuration réseau sur chaque nœud :

[root@node1 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:69:d2:e8 brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic enp0s3
valid_lft 84419sec preferred_lft 84419sec
inet6 fe80::c031:adb3:2f96:1705/64 scope link
valid_lft forever preferred_lft forever
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:69:b7:6f brd ff:ff:ff:ff:ff:ff
inet6 fe80::9e75:d62:334c:162/64 scope link
valid_lft forever preferred_lft forever
4: enp0s9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:1c:5d:3d brd ff:ff:ff:ff:ff:ff
inet6 fe80::d7e2:3ad3:ef04:636d/64 scope link
valid_lft forever preferred_lft forever

[root@node2 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:10:90:fc brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic enp0s3
valid_lft 86366sec preferred_lft 86366sec
inet6 fe80::2d4d:e50a:4f0e:65d3/64 scope link
valid_lft forever preferred_lft forever
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:16:89:9f brd ff:ff:ff:ff:ff:ff
inet6 fe80::ecac:ad95:803e:976/64 scope link
valid_lft forever preferred_lft forever
4: enp0s9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:73:0e:e6 brd ff:ff:ff:ff:ff:ff
inet6 fe80::a716:721e:e633:9598/64 scope link
valid_lft forever preferred_lft forever

Ethernet Channel Bonding

Le Channel Bonding est un regroupement d'interfaces réseau sur le même serveur afin de mettre en place la redondance ou d'augmenter les performances.

Le Channel Bonding est géré nativement sous Linux. Aucune application tierce n'est requise.

Configuration du node1.i2tch.loc

Assurez-vous que le module bonding soit chargé :

[root@node1 ~]# lsmod | grep bonding
[root@node1 ~]# modprobe bonding
[root@node1 ~]# lsmod | grep bonding
bonding 145728 0

Pour rendre le chargement du module persistant lors du re-démarrage, injectez modprobe bonding dans le fichier /etc/rc.modules :

[root@node1 ~]# echo bonding >> /etc/modules-load.d/modules.conf

Consultez la configuration des interfaces réseaux :

[root@node1 ~]# nmcli c show
NAME UUID TYPE DEVICE
Wired connection 1 79fe874b-fef7-3522-aedb-98ec2da7c789 802-3-ethernet enp0s3
Wired connection 2 d5779aae-201a-30d2-9a15-cca7eccb07bc 802-3-ethernet --
Wired connection 3 600a91aa-0b32-3d0c-a4b5-29563e9f31ad 802-3-ethernet --

Créez le fichier /etc/sysconfig/network-scripts/ifcfg-bond0 :

[root@node1 ~]# vi /etc/sysconfig/network-scripts/ifcfg-bond0
[root@node1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0
USERCTL=no
BOOTPROTO=none
ONBOOT=yes
IPADDR=10.0.3.15
NETMASK=255.255.255.0
NETWORK=10.0.3.0
BONDING_OPTS="miimon=100 mode=balance-xor"
TYPE=Unknown
IPV6INIT=no

Créez le fichier /etc/sysconfig/network-scripts/ifcfg-enp0s8 :

[root@node1 ~]# vi /etc/sysconfig/network-scripts/ifcfg-enp0s8
[root@node1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-enp0s8
DEVICE=enp0s8
BOOTPROTO=none
ONBOOT=yes
MASTER=bond0
SLAVE=yes
USERCTL=no

Créez le fichier /etc/sysconfig/network-scripts/ifcfg-enp0s9 :

[root@node1 ~]# vi /etc/sysconfig/network-scripts/ifcfg-enp0s9
[root@node1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-enp0s9
DEVICE=enp0s9
BOOTPROTO=none
ONBOOT=yes
MASTER=bond0
SLAVE=yes
USERCTL=no

Créez le fichier /etc/modprobe.d/bonding.conf :

[root@node1 ~]# vi /etc/modprobe.d/bonding.conf
[root@node1 ~]# cat /etc/modprobe.d/bonding.conf
alias bond0 bonding

Modifiez le fichier /etc/hosts :

[root@node1 ~]# vi /etc/hosts
[root@node1 ~]# cat /etc/hosts
127.0.0.1	localhost.localdomain localhost
::1	localhost6.localdomain6 localhost6
10.0.3.15	node1.i2tch.loc	node1
10.0.3.16	node2.i2tch.loc	node2

Re-démarrez le service network :

[root@node1 ~]# systemctl restart network
[root@node1 ~]# nmcli c show
NAME UUID TYPE DEVICE
System enp0s8 00cb8299-feb9-55b6-a378-3fdc720e0bc6 802-3-ethernet enp0s8
System enp0s9 93d13955-e9e2-a6bd-df73-12e3c747f122 802-3-ethernet enp0s9
Wired connection 1 79fe874b-fef7-3522-aedb-98ec2da7c789 802-3-ethernet enp0s3
bond0 234cf049-1b53-43eb-9377-7113c0fa363e bond bond0

Vérifiez la configuration du réseau :

[root@node1 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:69:d2:e8 brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic enp0s3
valid_lft 86251sec preferred_lft 86251sec
inet6 fe80::c031:adb3:2f96:1705/64 scope link
valid_lft forever preferred_lft forever
3: enp0s8: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP qlen 1000
link/ether 08:00:27:69:b7:6f brd ff:ff:ff:ff:ff:ff
4: enp0s9: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP qlen 1000
link/ether 08:00:27:69:b7:6f brd ff:ff:ff:ff:ff:ff
5: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000
link/ether 08:00:27:69:b7:6f brd ff:ff:ff:ff:ff:ff
inet 10.0.3.15/24 brd 10.0.3.255 scope global bond0
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fe69:b76f/64 scope link tentative dadfailed
valid_lft forever preferred_lft forever

Consultez la configuration de l'interface bond0 :

[root@node1 ~]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)
Bonding Mode: load balancing (xor)
Transmit Hash Policy: layer2 (0)
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0
Slave Interface: enp0s8
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 08:00:27:69:b7:6f
Slave queue ID: 0
Slave Interface: enp0s9
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 08:00:27:1c:5d:3d
Slave queue ID: 0

Attention - Avant de poursuivre, arrêtez votre machine virtuelle. Créez deux clones : node10.i2tch.loc et node100i2tch.loc. Démarrez la machine node1.i2tch.loc.

Configuration du node2.i2tch.loc

Assurez-vous que le module bonding soit chargé :

[root@node2 ~]# lsmod | grep bonding
[root@node2 ~]# modprobe bonding
[root@node2 ~]# lsmod | grep bonding
bonding 145728 0

Pour rendre le chargement du module persistant lors du re-démarrage, injectez modprobe bonding dans le fichier /etc/rc.modules :

[root@node1 ~]# echo bonding >> /etc/modules-load.d/modules.conf

Consultez la configuration des interfaces réseaux :

[root@node2 ~]# nmcli c show
NAME UUID TYPE DEVICE
Wired connection 1 69caf9d4-3497-3c22-ad5a-b462c1d4a213 802-3-ethernet enp0s3
Wired connection 2 e04d1654-d23e-3244-a970-8429b06c96ad 802-3-ethernet enp0s8
Wired connection 3 982d3b86-e2ee-3a9b-be22-b3ecc9e8be13 802-3-ethernet enp0s9

Créez le fichier /etc/sysconfig/network-scripts/ifcfg-bond0 :

[root@node2 ~]# vi /etc/sysconfig/network-scripts/ifcfg-bond0
[root@node2 ~]# cat /etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0
USERCTL=no
BOOTPROTO=none
ONBOOT=yes
IPADDR=10.0.3.16
NETMASK=255.255.255.0
NETWORK=10.0.3.0
BONDING_OPTS="miimon=100 mode=balance-xor"
TYPE=Unknown
IPV6INIT=no

Créez le fichier /etc/sysconfig/network-scripts/ifcfg-enp0s8 :

[root@node2 ~]# vi /etc/sysconfig/network-scripts/ifcfg-enp0s8
[root@node2 ~]# cat /etc/sysconfig/network-scripts/ifcfg-enp0s8
DEVICE=enp0s8
BOOTPROTO=none
ONBOOT=yes
MASTER=bond0
SLAVE=yes
USERCTL=no

Créez le fichier /etc/sysconfig/network-scripts/ifcfg-enp0s9 :

[root@node2 ~]# vi /etc/sysconfig/network-scripts/ifcfg-enp0s9
[root@node2 ~]# cat /etc/sysconfig/network-scripts/ifcfg-enp0s9
DEVICE=enp0s9
BOOTPROTO=none
ONBOOT=yes
MASTER=bond0
SLAVE=yes
USERCTL=no

Créez le fichier /etc/modprobe.d/bonding.conf :

[root@node2 ~]# vi /etc/modprobe.d/bonding.conf
[root@node2 ~]# cat /etc/modprobe.d/bonding.conf
alias bond0 bonding

Modifiez le fichier /etc/hosts :

[root@node2 ~]# vi /etc/hosts
[root@node2 ~]# cat /etc/hosts
127.0.0.1	localhost.localdomain localhost
::1	localhost6.localdomain6 localhost6
10.0.3.15	node1.i2tch.loc	node1
10.0.3.16	node2.i2tch.loc	node2

Re-démarrez le service network :

[root@node2 ~]# systemctl restart network
[root@node2 ~]# nmcli c show
NAME UUID TYPE DEVICE
System enp0s8 00cb8299-feb9-55b6-a378-3fdc720e0bc6 802-3-ethernet enp0s8
System enp0s9 93d13955-e9e2-a6bd-df73-12e3c747f122 802-3-ethernet enp0s9
Wired connection 1 69caf9d4-3497-3c22-ad5a-b462c1d4a213 802-3-ethernet enp0s3
bond0 44e713ff-ba22-44bb-9cb8-603fe130431f bond bond0
Wired connection 2 e04d1654-d23e-3244-a970-8429b06c96ad 802-3-ethernet --
Wired connection 3 982d3b86-e2ee-3a9b-be22-b3ecc9e8be13 802-3-ethernet --

Vérifiez la configuration du réseau :

[root@node2 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:10:90:fc brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic enp0s3
valid_lft 86157sec preferred_lft 86157sec
inet6 fe80::2d4d:e50a:4f0e:65d3/64 scope link
valid_lft forever preferred_lft forever
3: enp0s8: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP qlen 1000
link/ether 08:00:27:16:89:9f brd ff:ff:ff:ff:ff:ff
4: enp0s9: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP qlen 1000
link/ether 08:00:27:16:89:9f brd ff:ff:ff:ff:ff:ff
5: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000
link/ether 08:00:27:16:89:9f brd ff:ff:ff:ff:ff:ff
inet 10.0.3.16/24 brd 10.0.3.255 scope global bond0
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fe16:899f/64 scope link tentative dadfailed
valid_lft forever preferred_lft forever

Consultez la configuration de l'interface bond0 :

[root@node2 ~]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)
Bonding Mode: load balancing (xor)
Transmit Hash Policy: layer2 (0)
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0
Slave Interface: enp0s8
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 08:00:27:16:89:9f
Slave queue ID: 0
Slave Interface: enp0s9
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 08:00:27:73:0e:e6
Slave queue ID: 0

Tester les Serveurs

Vérifiez que chaque machine puisse se voir sur le réseau 10.0.3.0. Vérifiez que chaque machine a accès à Internet.

[root@node1 ~]# ping -c1 www.free.fr
PING www.free.fr (212.27.48.10) 56(84) bytes of data.
64 bytes from www.free.fr (212.27.48.10): icmp_seq=1 ttl=63 time=36.7 ms
--- www.free.fr ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 36.751/36.751/36.751/0.000 ms
[root@node1 ~]# ping -c1 10.0.3.16
PING 10.0.3.16 (10.0.3.16) 56(84) bytes of data.
64 bytes from 10.0.3.16: icmp_seq=1 ttl=64 time=3.41 ms
--- 10.0.3.16 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 3.419/3.419/3.419/0.000 ms

[root@node2 ~]# ping -c1 www.free.fr
PING www.free.fr (212.27.48.10) 56(84) bytes of data.
64 bytes from www.free.fr (212.27.48.10): icmp_seq=1 ttl=63 time=17.0 ms
--- www.free.fr ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 17.080/17.080/17.080/0.000 ms
[root@node2 ~]# ping -c1 10.0.3.15
PING 10.0.3.15 (10.0.3.15) 56(84) bytes of data.
64 bytes from 10.0.3.15: icmp_seq=1 ttl=64 time=1.01 ms
--- 10.0.3.15 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 1.013/1.013/1.013/0.000 ms

Démarrer le Service pcsd si nécessaire

Dernièrement démarrez le service pcsd sur chaque noeud si necessaire :

[root@node1 ~]# systemctl status pcsd
● pcsd.service - PCS GUI and remote configuration interface
Loaded: loaded (/usr/lib/systemd/system/pcsd.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2018-08-29 11:22:01 CEST; 13min ago
Docs: man:pcsd(8)
man:pcs(8)
Main PID: 552 (pcsd)
CGroup: /system.slice/pcsd.service
└─552 /usr/bin/ruby /usr/lib/pcsd/pcsd > /dev/null &
Aug 29 11:21:33 node1.i2tch.loc systemd[1]: Starting PCS GUI and remote conf....
Aug 29 11:22:01 node1.i2tch.loc systemd[1]: Started PCS GUI and remote confi....
Hint: Some lines were ellipsized, use -l to show in full.

[root@node2 ~]# systemctl status pcsd
● pcsd.service - PCS GUI and remote configuration interface
Loaded: loaded (/usr/lib/systemd/system/pcsd.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2018-08-29 11:22:02 CEST; 12min ago
Docs: man:pcsd(8)
man:pcs(8)
Main PID: 538 (pcsd)
CGroup: /system.slice/pcsd.service
└─538 /usr/bin/ruby /usr/lib/pcsd/pcsd > /dev/null &
Aug 29 11:21:30 node2.i2tch.loc systemd[1]: Starting PCS GUI and remote conf....
Aug 29 11:22:02 node2.i2tch.loc systemd[1]: Started PCS GUI and remote confi....
Hint: Some lines were ellipsized, use -l to show in full.

LAB #1 - L'Authentification de l'utilisateur pcs hacluster

La commande suivante authentifie l'utilisateur hacluster sur node1.i2tch.loc pour les deux neouds node1.i2tch.loc et node2.i2tch.loc :

[root@node1 ~]# pcs cluster auth node1.i2tch.loc node2.i2tch.loc
Username: hacluster
Password: fenestros
node2.i2tch.loc: Authorized
node1.i2tch.loc: Authorized

Les options de la commande pcs sont :

[root@node1 ~]# pcs --help
Usage: pcs [-f file] [-h] [commands]...
Control and configure pacemaker and corosync.
Options:
-h, --help Display usage and exit.
-f file Perform actions on file instead of active CIB.
--debug Print all network traffic and external commands run.
--version Print pcs version information. List pcs capabilities if
--full is specified.
--request-timeout Timeout for each outgoing request to another node in
seconds. Default is 60s.
--force Override checks and errors, the exact behavior depends on
the command. WARNING: Using the --force option is
strongly discouraged unless you know what you are doing.
Commands:
cluster Configure cluster options and nodes.
resource Manage cluster resources.
stonith Manage fence devices.
constraint Manage resource constraints.
property Manage pacemaker properties.
acl Manage pacemaker access control lists.
qdevice Manage quorum device provider on the local host.
quorum Manage cluster quorum settings.
booth Manage booth (cluster ticket manager).
status View cluster status.
config View and manage cluster configuration.
pcsd Manage pcs daemon.
node Manage cluster nodes.
alert Manage pacemaker alerts.

LAB #2 - Création du cluster my_cluster

Créez le cluster my_cluster en propageant les fichiers de configuration à chaque noeud et en démarrant les services avec l'option –start :

[root@node1 ~]# pcs cluster setup --start --name my_cluster node1.i2tch.loc node2.i2tch.loc
Destroying cluster on nodes: node1.i2tch.loc, node2.i2tch.loc...
node1.i2tch.loc: Stopping Cluster (pacemaker)...
node2.i2tch.loc: Stopping Cluster (pacemaker)...
node2.i2tch.loc: Successfully destroyed cluster
node1.i2tch.loc: Successfully destroyed cluster
Sending 'pacemaker_remote authkey' to 'node1.i2tch.loc', 'node2.i2tch.loc'
node1.i2tch.loc: successful distribution of the file 'pacemaker_remote authkey'
node2.i2tch.loc: successful distribution of the file 'pacemaker_remote authkey'
Sending cluster config files to the nodes...
node1.i2tch.loc: Succeeded
node2.i2tch.loc: Succeeded
Starting cluster on nodes: node1.i2tch.loc, node2.i2tch.loc...
node1.i2tch.loc: Starting Cluster...
node2.i2tch.loc: Starting Cluster...
Synchronizing pcsd certificates on nodes node1.i2tch.loc, node2.i2tch.loc...
node2.i2tch.loc: Success
node1.i2tch.loc: Success
Restarting pcsd on the nodes in order to reload the certificates...
node2.i2tch.loc: Success
node1.i2tch.loc: Success

Pour consulter le statut du cluster, utilisez la commande pcs cluster status :

[root@node1 ~]# pcs cluster status
Cluster Status:
Stack: corosync
Current DC: node1.i2tch.loc (version 1.1.18-11.el7_5.3-2b07d5c5a9) - partition with quorum
Last updated: Wed Aug 29 11:59:03 2018
Last change: Wed Aug 29 11:53:23 2018 by hacluster via crmd on node1.i2tch.loc
2 nodes configured
0 resources configured
PCSD Status:
node1.i2tch.loc: Online
node2.i2tch.loc: Online

LAB #3 - Activer les services cluster sur chaque noeud

Activer les services cluster sur chaque noeud dans le cluster quand le noeud est démarré :

[root@node1 ~]# pcs cluster enable --all
node1.i2tch.loc: Cluster Enabled
node2.i2tch.loc: Cluster Enabled
[root@node1 ~]#
[root@node1 ~]# pcs cluster status
Cluster Status:
Stack: corosync
Current DC: node1.i2tch.loc (version 1.1.18-11.el7_5.3-2b07d5c5a9) - partition with quorum
Last updated: Wed Aug 29 12:00:38 2018
Last change: Wed Aug 29 11:53:23 2018 by hacluster via crmd on node1.i2tch.loc
2 nodes configured
0 resources configured
PCSD Status:
node2.i2tch.loc: Online
node1.i2tch.loc: Online

LAB #4 - Mise en place d'une clôture

Commencez par modifier le fichier /etc/hosts sur les deux noeuds :

[root@node1 ~]# vi /etc/hosts
[root@node1 ~]# cat /etc/hosts
127.0.0.1	localhost.localdomain localhost
::1	localhost6.localdomain6 localhost6
10.0.3.15	node1.i2tch.loc	node1
10.0.3.16	node2.i2tch.loc	node2
10.0.3.17 apc.i2tch.loc apc

[root@node2 ~]# vi /etc/hosts
[root@node2 ~]# cat /etc/hosts
127.0.0.1	localhost.localdomain localhost
::1	localhost6.localdomain6 localhost6
10.0.3.15	node1.i2tch.loc	node1
10.0.3.16	node2.i2tch.loc	node2
10.0.3.17	apc.i2tch.loc	apc

Créez maintenant la ressource STONITH :

[root@node1 ~]# pcs stonith create myapc fence_apc_snmp --force ipaddr="apc.i2tch.loc" pcmk_host_map="node1.i2tch.loc:1;node2.i2tch.loc:2" pcmk_host_check="static-list" pcmk_host_list="node1.i2tch.loc,node2.i2tch.loc" login="trainee" passwd="trainee"

Vérifiez que la ressource soit active :

[root@node1 ~]# pcs cluster status
Cluster Status:
Stack: corosync
Current DC: node1.i2tch.loc (version 1.1.18-11.el7_5.3-2b07d5c5a9) - partition with quorum
Last updated: Thu Aug 30 08:12:26 2018
Last change: Wed Aug 29 13:55:22 2018 by root via cibadmin on node1.i2tch.loc
2 nodes configured
1 resource configured
PCSD Status:
node1.i2tch.loc: Online
node2.i2tch.loc: Online

Il est possible de voir la liste de tous les agents STONITH en utilisant la commande suivante :

[root@node1 ~]# pcs stonith list
fence_amt_ws - Fence agent for AMT (WS)
fence_apc - Fence agent for APC over telnet/ssh
fence_apc_snmp - Fence agent for APC, Tripplite PDU over SNMP
fence_bladecenter - Fence agent for IBM BladeCenter
fence_brocade - Fence agent for HP Brocade over telnet/ssh
fence_cisco_mds - Fence agent for Cisco MDS
fence_cisco_ucs - Fence agent for Cisco UCS
fence_compute - Fence agent for the automatic resurrection of OpenStack compute
instances
fence_drac5 - Fence agent for Dell DRAC CMC/5
fence_eaton_snmp - Fence agent for Eaton over SNMP
fence_emerson - Fence agent for Emerson over SNMP
fence_eps - Fence agent for ePowerSwitch
fence_evacuate - Fence agent for the automatic resurrection of OpenStack compute
instances
fence_heuristics_ping - Fence agent for ping-heuristic based fencing
fence_hpblade - Fence agent for HP BladeSystem
fence_ibmblade - Fence agent for IBM BladeCenter over SNMP
fence_idrac - Fence agent for IPMI
fence_ifmib - Fence agent for IF MIB
fence_ilo - Fence agent for HP iLO
fence_ilo2 - Fence agent for HP iLO
fence_ilo3 - Fence agent for IPMI
fence_ilo3_ssh - Fence agent for HP iLO over SSH
fence_ilo4 - Fence agent for IPMI
fence_ilo4_ssh - Fence agent for HP iLO over SSH
fence_ilo_moonshot - Fence agent for HP Moonshot iLO
fence_ilo_mp - Fence agent for HP iLO MP
fence_ilo_ssh - Fence agent for HP iLO over SSH
fence_imm - Fence agent for IPMI
fence_intelmodular - Fence agent for Intel Modular
fence_ipdu - Fence agent for iPDU over SNMP
fence_ipmilan - Fence agent for IPMI
fence_kdump - Fence agent for use with kdump
fence_mpath - Fence agent for multipath persistent reservation
fence_rhevm - Fence agent for RHEV-M REST API
fence_rsa - Fence agent for IBM RSA
fence_rsb - I/O Fencing agent for Fujitsu-Siemens RSB
fence_sbd - Fence agent for sbd
fence_scsi - Fence agent for SCSI persistent reservation
fence_virt - Fence agent for virtual machines
fence_vmware_rest - Fence agent for VMware REST API
fence_vmware_soap - Fence agent for VMWare over SOAP API
fence_wti - Fence agent for WTI
fence_xvm - Fence agent for virtual machines

ainsi que de consulter les détails de chaque agent :

[root@node1 ~]# pcs stonith describe fence_apc_snmp
fence_apc_snmp - Fence agent for APC, Tripplite PDU over SNMP
fence_apc_snmp is an I/O Fencing agent which can be used with the APC network power switch or Tripplite PDU devices.It logs into a device via SNMP and reboots a specified outlet. It supports SNMP v1, v2c, v3 with all combinations of authenticity/privacy settings.
Stonith options:
ipport: TCP/UDP port to use for connection with device
snmp_version: Specifies SNMP version to use (1,2c,3)
community: Set the community string
snmp_priv_prot: Set privacy protocol (DES|AES)
port: Physical plug number, name of virtual machine or UUID
inet6_only: Forces agent to use IPv6 addresses only
ipaddr (required): IP Address or Hostname
snmp_priv_passwd: Set privacy protocol password
snmp_priv_passwd_script: Script to run to retrieve privacy password
snmp_auth_prot: Set authentication protocol (MD5|SHA)
inet4_only: Forces agent to use IPv4 addresses only
passwd_script: Script to retrieve password
snmp_sec_level: Set security level (noAuthNoPriv|authNoPriv|authPriv)
passwd: Login password or passphrase
login: Login Name
verbose: Verbose mode
debug: Write debug information to given file
separator: Separator for CSV created by operation list
power_wait: Wait X seconds after issuing ON/OFF
login_timeout: Wait X seconds for cmd prompt after login
power_timeout: Test X seconds for status change after ON/OFF
delay: Wait X seconds before fencing is started
shell_timeout: Wait X seconds for cmd prompt after issuing command
retry_on: Count of attempts to retry power on
priority: The priority of the stonith resource. Devices are tried in order of
highest priority to lowest.
pcmk_host_map: A mapping of host names to ports numbers for devices that do
not support host names. Eg. node1:1;node2:2,3 would tell the
cluster to use port 1 for node1 and ports 2 and 3 for node2
pcmk_host_list: A list of machines controlled by this device (Optional unless
pcmk_host_check=static-list).
pcmk_host_check: How to determine which machines are controlled by the device.
Allowed values: dynamic-list (query the device), static-list
(check the pcmk_host_list attribute), none (assume every
device can fence every machine)
pcmk_delay_max: Enable a random delay for stonith actions and specify the
maximum of random delay. This prevents double fencing when
using slow devices such as sbd. Use this to enable a random
delay for stonith actions. The overall delay is derived from
this random delay value adding a static delay so that the sum
is kept below the maximum delay.
pcmk_delay_base: Enable a base delay for stonith actions and specify base
delay value. This prevents double fencing when different
delays are configured on the nodes. Use this to enable a
static delay for stonith actions. The overall delay is
derived from a random delay value adding this static delay so
that the sum is kept below the maximum delay.
pcmk_action_limit: The maximum number of actions can be performed in parallel
on this device Pengine property concurrent-fencing=true
needs to be configured first. Then use this to specify the
maximum number of actions can be performed in parallel on
this device. -1 is unlimited.
Default operations:
monitor: interval=60s

En utilisant la commande suivante, il est possible de consulter le statut des ressources STONITH :

[root@node1 ~]# pcs stonith show
myapc	(stonith:fence_apc_snmp):	Stopped

L'ensemble des sous-commandes de la commande pcs stonith peuvent être visualisées grâce à la commande suivante :

[root@node1 ~]# pcs stonith --help
Usage: pcs stonith [commands]...
Configure fence devices for use with pacemaker
Commands:
[show [stonith id]] [--full]
Show all currently configured stonith devices or if a stonith id is
specified show the options for the configured stonith device. If
--full is specified all configured stonith options will be displayed.
list [filter] [--nodesc]
Show list of all available stonith agents (if filter is provided then
only stonith agents matching the filter will be shown). If --nodesc is
used then descriptions of stonith agents are not printed.
describe <stonith agent> [--full]
Show options for specified stonith agent. If --full is specified, all
options including advanced ones are shown.
create <stonith id> <stonith device type> [stonith device options]
[op <operation action> <operation options> [<operation action>
<operation options>]...] [meta <meta options>...]
[--group <group id> [--before <stonith id> | --after <stonith id>]]
[--disabled] [--wait[=n]]
Create stonith device with specified type and options.
If --group is specified the stonith device is added to the group named.
You can use --before or --after to specify the position of the added
stonith device relatively to some stonith device already existing in the
group.
If --disabled is specified the stonith device is not used.
If --wait is specified, pcs will wait up to 'n' seconds for the stonith
device to start and then return 0 if the stonith device is started, or 1
if the stonith device has not yet started. If 'n' is not specified it
defaults to 60 minutes.
update <stonith id> [stonith device options]
Add/Change options to specified stonith id.
delete <stonith id>
Remove stonith id from configuration.
enable <stonith id> [--wait[=n]]
Allow the cluster to use the stonith device. If --wait is specified, pcs
will wait up to 'n' seconds for the stonith device to start and then
return 0 if the stonith device is started, or 1 if the stonith device
has not yet started. If 'n' is not specified it defaults to 60 minutes.
disable <stonith id> [--wait[=n]]
Attempt to stop the stonith device if it is running and disallow the
cluster to use it. If --wait is specified, pcs will wait up to 'n'
seconds for the stonith device to stop and then return 0 if the stonith
device is stopped or 1 if the stonith device has not stopped. If 'n' is
not specified it defaults to 60 minutes.
cleanup [<stonith id>] [--node <node>]
Make the cluster forget failed operations from history of the stonith
device and re-detect its current state. This can be useful to purge
knowledge of past failures that have since been resolved. If a stonith
id is not specified then all resources / stonith devices will be cleaned
up. If a node is not specified then resources / stonith devices on all
nodes will be cleaned up.
refresh [<stonith id>] [--node <node>] [--full]
Make the cluster forget the complete operation history (including
failures) of the stonith device and re-detect its current state. If you
are interested in forgetting failed operations only, use the 'pcs
stonith cleanup' command. If a stonith id is not specified then all
resources / stonith devices will be refreshed. If a node is not
specified then resources / stonith devices on all nodes will be
refreshed. Use --full to refresh a stonith device on all nodes,
otherwise only nodes where the stonith device's state is known will be
considered.
level [config]
Lists all of the fencing levels currently configured.
level add <level> <target> <stonith id> [stonith id]...
Add the fencing level for the specified target with the list of stonith
devices to attempt for that target at that level. Fence levels are
attempted in numerical order (starting with 1). If a level succeeds
(meaning all devices are successfully fenced in that level) then no
other levels are tried, and the target is considered fenced.
Target may be a node name <node_name> or %<node_name> or
node%<node_name>, a node name regular expression regexp%<node_pattern>
or a node attribute value attrib%<name>=<value>.
level remove <level> [target] [stonith id]...
Removes the fence level for the level, target and/or devices specified.
If no target or devices are specified then the fence level is removed.
Target may be a node name <node_name> or %<node_name> or
node%<node_name>, a node name regular expression regexp%<node_pattern>
or a node attribute value attrib%<name>=<value>.
level clear [target|stonith id(s)]
Clears the fence levels on the target (or stonith id) specified or
clears all fence levels if a target/stonith id is not specified. If
more than one stonith id is specified they must be separated by a comma
and no spaces.
Target may be a node name <node_name> or %<node_name> or
node%<node_name>, a node name regular expression regexp%<node_pattern>
or a node attribute value attrib%<name>=<value>.
Example: pcs stonith level clear dev_a,dev_b
level verify
Verifies all fence devices and nodes specified in fence levels exist.
fence <node> [--off]
Fence the node specified (if --off is specified, use the 'off' API
call to stonith which will turn the node off instead of rebooting it).
confirm <node> [--force]
Confirm to the cluster that the specified node is powered off. This
allows the cluster to recover from a situation where no stonith device
is able to fence the node. This command should ONLY be used after
manually ensuring that the node is powered off and has no access to
shared resources.
WARNING: If this node is not actually powered off or it does have
access to shared resources, data corruption/cluster failure can occur.
To prevent accidental running of this command, --force or interactive
user response is required in order to proceed.
NOTE: It is not checked if the specified node exists in the cluster
in order to be able to work with nodes not visible from the local
cluster partition.
sbd enable [--watchdog=<path>[@<node>]] ... [--device=<path>[@<node>]] ...
[<SBD_OPTION>=<value>] ...
Enable SBD in cluster. Default path for watchdog device is
/dev/watchdog. Allowed SBD options: SBD_WATCHDOG_TIMEOUT (default: 5),
SBD_DELAY_START (default: no) and SBD_STARTMODE (default: always). It is
possible to specify up to 3 devices per node.
WARNING: Cluster has to be restarted in order to apply these changes.
Example of enabling SBD in cluster with watchdogs on node1 will be
/dev/watchdog2, on node2 /dev/watchdog1, /dev/watchdog0 on all other
nodes, device /dev/sdb on node1, device /dev/sda on all other nodes and
watchdog timeout will bet set to 10 seconds:
pcs stonith sbd enable \
--watchdog=/dev/watchdog2@node1 \
--watchdog=/dev/watchdog1@node2 \
--watchdog=/dev/watchdog0 \
--device=/dev/sdb@node1 \
--device=/dev/sda \
SBD_WATCHDOG_TIMEOUT=10
sbd disable
Disable SBD in cluster.
WARNING: Cluster has to be restarted in order to apply these changes.
sbd device setup --device=<path> [--device=<path>]...
[watchdog-timeout=<integer>] [allocate-timeout=<integer>]
[loop-timeout=<integer>] [msgwait-timeout=<integer>]
Initialize SBD structures on device(s) with specified timeouts.
WARNING: All content on device(s) will be overwritten.
sbd device message <device-path> <node> <message-type>
Manually set a message of the specified type on the device for the node.
Possible message types (they are documented in sbd(8) man page): test,
reset, off, crashdump, exit, clear
sbd status [--full]
Show status of SBD services in cluster and local device(s) configured.
If --full is specified, also dump of SBD headers on device(s)
will be shown.
sbd config
Show SBD configuration in cluster.
Examples:
pcs stonith create MyStonith fence_virt pcmk_host_list=f1

LAB #5 - Mise en place d'un Serveur Apache Actif/Passif

Création du Stockage Partagé - Mutualisation du Stockage

Vous allez simuler un SAN avec iSCSI. Démarrez la machine virtuelle iscsi :

[root@node1 ~]# exit
[trainee@node1 ~]$ exit
desktop@serverXX:~$ VBoxManage startvm iscsi --type headless

Connectez-vous à la VM iscsi :

desktop@serverXX:~$ ssh -l trainee localhost -p 6022

Commencez par installer le paquet scsi-target-utils :

[trainee@iscsi ~]$ su -
...
[root@iscsi ~]# yum install -y epel-release
[root@iscsi ~]# yum install -y scsi-target-utils

Le paquet contient la commande tgtd et la commande tgtadm.

Les options de la commande tgtd sont :

[root@iscsi ~]# tgtd --help
Linux SCSI Target framework daemon, version 1.0.55
Usage: tgtd [OPTION]
-f, --foreground make the program run in the foreground
-C, --control-port NNNN use port NNNN for the mgmt channel
-t, --nr_iothreads NNNN specify the number of I/O threads
-d, --debug debuglevel print debugging information
-V, --version print version and exit
-h, --help display this help and exit

Les options de la commande tgtadm sont :

[root@iscsi ~]# tgtadm --help
Linux SCSI Target administration utility, version 1.0.55
Usage: tgtadm [OPTION]
--lld <driver> --mode target --op new --tid <id> --targetname <name>
add a new target with <id> and <name>. <id> must not be zero.
--lld <driver> --mode target --op delete [--force] --tid <id>
delete the specific target with <id>.
With force option, the specific target is deleted
even if there is an activity.
--lld <driver> --mode target --op show
show all the targets.
--lld <driver> --mode target --op show --tid <id>
show the specific target's parameters.
--lld <driver> --mode target --op update --tid <id> --name <param> --value <value>
change the target parameters of the target with <id>.
--lld <driver> --mode target --op bind --tid <id> --initiator-address <address>
--lld <driver> --mode target --op bind --tid <id> --initiator-name <name>
enable the target to accept the specific initiators.
--lld <driver> --mode target --op unbind --tid <id> --initiator-address <address>
--lld <driver> --mode target --op unbind --tid <id> --initiator-name <name>
disable the specific permitted initiators.
--lld <driver> --mode logicalunit --op new --tid <id> --lun <lun>
--backing-store <path> --bstype <type> --bsopts <bs options> --bsoflags <options>
add a new logical unit with <lun> to the specific
target with <id>. The logical unit is offered
to the initiators. <path> must be block device files
(including LVM and RAID devices) or regular files.
bstype option is optional.
bsopts are specific to the bstype.
bsoflags supported options are sync and direct
(sync:direct for both).
--lld <driver> --mode logicalunit --op delete --tid <id> --lun <lun>
delete the specific logical unit with <lun> that
the target with <id> has.
--lld <driver> --mode account --op new --user <name> --password <pass>
add a new account with <name> and <pass>.
--lld <driver> --mode account --op delete --user <name>
delete the specific account having <name>.
--lld <driver> --mode account --op bind --tid <id> --user <name> [--outgoing]
add the specific account having <name> to
the specific target with <id>.
<user> could be <IncomingUser> or <OutgoingUser>.
If you use --outgoing option, the account will
be added as an outgoing account.
--lld <driver> --mode account --op unbind --tid <id> --user <name> [--outgoing]
delete the specific account having <name> from specific
target. The --outgoing option must be added if you
delete an outgoing account.
--lld <driver> --mode lld --op start
Start the specified lld without restarting the tgtd process.
--control-port <port> use control port <port>
--help
display this help and exit
Report bugs to <stgt@vger.kernel.org>.

Activez et démarrez le service tgtd :

[root@iscsi ~]# systemctl enable tgtd
[root@iscsi ~]# systemctl restart tgtd

Configurez firewalld pour le service :

[root@iscsi ~]# firewall-cmd --add-service=iscsi-target --permanent
[root@iscsi ~]# firewall-cmd --reload

Créez d'abord une cible à laquelle vous pouvez rajouter le disque :

[root@iscsi ~]# tgtadm --lld iscsi --op new --mode target --tid 1 -T target

Consultez la configuration actuelle :

[root@iscsi ~]# tgtadm --lld iscsi --op show --mode target
Target 1: target
System information:
Driver: iscsi
State: ready
I_T nexus information:
LUN information:
LUN: 0
Type: controller
SCSI ID: IET 00010000
SCSI SN: beaf10
Size: 0 MB, Block size: 1
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
SWP: No
Thin-provisioning: No
Backing store type: null
Backing store path: None
Backing store flags:
Account information:
ACL information:

Ajoutez maintenant le disque au premier LUN :

[root@iscsi ~]# tgtadm --lld iscsi --op new --mode logicalunit --tid 1 --lun 1 -b /dev/sdb

Consultez la configuration :

[root@iscsi ~]# tgtadm --lld iscsi --op show --mode target
Target 1: target
System information:
Driver: iscsi
State: ready
I_T nexus information:
LUN information:
LUN: 0
Type: controller
SCSI ID: IET 00010000
SCSI SN: beaf10
Size: 0 MB, Block size: 1
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
SWP: No
Thin-provisioning: No
Backing store type: null
Backing store path: None
Backing store flags:
LUN: 1
Type: disk
SCSI ID: IET 00010001
SCSI SN: beaf11
Size: 1074 MB, Block size: 512
Online: Yes
Removable media: No
Prevent removal: No
Readonly: Yes
SWP: No
Thin-provisioning: No
Backing store type: rdwr
Backing store path: /dev/sdb
Backing store flags:
Account information:
ACL information:

Configurez maintenant le deuxième LUN :

[root@iscsi ~]# tgtadm --lld iscsi --op new --mode logicalunit --tid 1 --lun 2 -b /dev/sdb

Configurez le serveur pour que tous les clients puissent y avoir accès :

[root@iscsi ~]# tgtadm --lld iscsi --op bind --mode target --tid 1 -I ALL

Dernièrement configurez LUN1 et LUN2 en mode r/w :

[root@iscsi ~]# tgtadm --lld iscsi --mode logicalunit --op update --tid 1 --lun 1 --params readonly=0
[root@iscsi ~]# tgtadm --lld iscsi --mode logicalunit --op update --tid 1 --lun 2 --params readonly=0

Consultez la configuration :

[root@iscsi ~]# tgtadm --lld iscsi --op show --mode target
Target 1: target
System information:
Driver: iscsi
State: ready
I_T nexus information:
LUN information:
LUN: 0
Type: controller
SCSI ID: IET 00010000
SCSI SN: beaf10
Size: 0 MB, Block size: 1
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
SWP: No
Thin-provisioning: No
Backing store type: null
Backing store path: None
Backing store flags:
LUN: 1
Type: disk
SCSI ID: IET 00010001
SCSI SN: beaf11
Size: 1074 MB, Block size: 512
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
SWP: No
Thin-provisioning: No
Backing store type: rdwr
Backing store path: /dev/sdb
Backing store flags:
LUN: 2
Type: disk
SCSI ID: IET 00010002
SCSI SN: beaf12
Size: 1074 MB, Block size: 512
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
SWP: No
Thin-provisioning: No
Backing store type: rdwr
Backing store path: /dev/sdb
Backing store flags:
Account information:
ACL information:
ALL

Important - Notez que les SCSI ID et les SCSI SN des deux LUNs ne sont pas identiques. Dans l'état donc, le multipathing ne fonctionera pas car celui-ci necéssite à ce que les deux enregistrements soient identiques.

L'option –params de la commande tgtadm permet de modifier les paramètres de la configuration :

[root@iscsi ~]# tgtadm --lld iscsi --op update --mode logicalunit --tid 1 --lun 1 --params vendor_id="I2TCH",product_id="MyISCSIDisk",product_rev="1.0",scsi_id="scsi001",scsi_sn="0123456789"
[root@iscsi ~]# tgtadm --lld iscsi --op update --mode logicalunit --tid 1 --lun 2 --params vendor_id="I2TCH",product_id="MyISCSIDisk",product_rev="1.0",scsi_id="scsi001",scsi_sn="0123456789"

Consultez maintenant la configuration :

[root@iscsi ~]# tgtadm --lld iscsi --op show --mode target
Target 1: target
System information:
Driver: iscsi
State: ready
I_T nexus information:
LUN information:
LUN: 0
Type: controller
SCSI ID: IET 00010000
SCSI SN: beaf10
Size: 0 MB, Block size: 1
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
SWP: No
Thin-provisioning: No
Backing store type: null
Backing store path: None
Backing store flags:
LUN: 1
Type: disk
SCSI ID: scsi001
SCSI SN: 0123456789
Size: 1074 MB, Block size: 512
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
SWP: No
Thin-provisioning: No
Backing store type: rdwr
Backing store path: /dev/sdb
Backing store flags:
LUN: 2
Type: disk
SCSI ID: scsi001
SCSI SN: 0123456789
Size: 1074 MB, Block size: 512
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
SWP: No
Thin-provisioning: No
Backing store type: rdwr
Backing store path: /dev/sdb
Backing store flags:
Account information:
ACL information:
ALL

Vérifiez que le port 3260 est bien ouvert et en état d'écoute :

[root@iscsi ~]# netstat -apn | grep 3260
tcp 0 0 0.0.0.0:3260 0.0.0.0:* LISTEN 4169/tgtd
tcp6 0 0 :::3260 :::* LISTEN 4169/tgtd

Pour accéder à notre cible ISCSI, le client doit disposer d'un initiateur. Installez donc le paquet iscsi-initiator-utils :

[root@node1 ~]# yum -y install iscsi-initiator-utils

[root@node2 ~]# yum -y install iscsi-initiator-utils

Lancez maintenant la découverte des cibles sur le serveur iscsi :

[root@node1 ~]# iscsiadm --mode discovery --type sendtargets --portal 10.0.3.18
192.168.121.3:3260,1 target

[root@node2 ~]# iscsiadm --mode discovery --type sendtargets --portal 10.0.3.18
192.168.121.3:3260,1 target

Connectez-vous à la cible à partir de chaque noeud :

[root@node1 ~]# iscsiadm --mode node --targetname target --login
Logging in to [iface: default, target: target, portal: 10.0.3.18,3260] (multiple)
Login to [iface: default, target: target, portal: 10.0.3.18,3260] successful.

[root@node2 ~]# iscsiadm --mode node --targetname target --login
Logging in to [iface: default, target: target, portal: 10.0.3.18,3260] (multiple)
Login to [iface: default, target: target, portal: 10.0.3.18,3260] successful.

Consultez le journal /var/log/messages de chaque noeud :

[root@node1 ~]# tail /var/log/messages
Sep 16 17:15:54 node1 kernel: sd 3:0:0:1: [sdb] 16777216 512-byte logical blocks: (8.58 GB/8.00 GiB)
Sep 16 17:15:54 node1 kernel: sd 3:0:0:2: Attached scsi generic sg4 type 0
Sep 16 17:15:54 node1 kernel: sd 3:0:0:1: [sdb] Write Protect is off
Sep 16 17:15:54 node1 kernel: sd 3:0:0:2: [sdc] 16777216 512-byte logical blocks: (8.58 GB/8.00 GiB)
Sep 16 17:15:54 node1 kernel: sd 3:0:0:1: [sdb] Write cache: enabled, read cache: enabled, supports DPO and FUA
Sep 16 17:15:54 node1 kernel: sd 3:0:0:2: [sdc] Write Protect is off
Sep 16 17:15:54 node1 kernel: sd 3:0:0:2: [sdc] Write cache: enabled, read cache: enabled, supports DPO and FUA
Sep 16 17:15:54 node1 kernel: sd 3:0:0:1: [sdb] Attached SCSI disk
Sep 16 17:15:54 node1 kernel: sd 3:0:0:2: [sdc] Attached SCSI disk
Sep 16 17:15:55 node1 iscsid: Connection1:0 to [target: target, portal: 10.0.3.18,3260] through [iface: default] is operational now

[root@node2 ~]# tail /var/log/messages
Aug 31 10:18:24 node2 kernel: sd 3:0:0:2: [sdc] 16777216 512-byte logical blocks: (8.58 GB/8.00 GiB)
Aug 31 10:18:24 node2 kernel: sd 3:0:0:1: [sdb] Write cache: enabled, read cache: enabled, supports DPO and FUA
Aug 31 10:18:24 node2 kernel: sd 3:0:0:2: [sdc] Write Protect is off
Aug 31 10:18:24 node2 kernel: sd 3:0:0:2: [sdc] Write cache: enabled, read cache: enabled, supports DPO and FUA
Aug 31 10:18:24 node2 kernel: sd 3:0:0:1: [sdb] Attached SCSI disk
Aug 31 10:18:24 node2 kernel: sd 3:0:0:2: [sdc] Attached SCSI disk
Aug 31 10:18:25 node2 iscsid: Connection1:0 to [target: target, portal: 10.0.3.18,3260] through [iface: default] is operational now
Aug 31 10:19:03 node2 systemd: Starting Cleanup of Temporary Directories...
Aug 31 10:19:05 node2 systemd: Started Cleanup of Temporary Directories.
Aug 31 10:19:21 node2 sh: Sleeping '' ''

Important - Notez que les deux disques SCSI sont vus comme /dev/sdb et /dev/sdc.

A partir de node1.i2tch.loc, créez la partition sdb1 :

[root@node1 ~]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x6f284e72.
Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
Partition number (1-4, default 1):
First sector (2048-16777215, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-16777215, default 16777215):
Using default value 16777215
Partition 1 of type Linux and of size 8 GiB is set
Command (m for help): p
Disk /dev/sdb: 8589 MB, 8589934592 bytes, 16777216 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x6f284e72
Device Boot Start End Blocks Id System
/dev/sdb1 2048 16777215 8387584 83 Linux
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
[root@node1 ~]# partprobe
[root@node1 ~]# fdisk -l
Disk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000c5a90
Device Boot Start End Blocks Id System
/dev/sda1 * 2048 411647 204800 83 Linux
/dev/sda2 411648 20891647 10240000 83 Linux
/dev/sda3 20891648 25083903 2096128 82 Linux swap / Solaris
/dev/sda4 25083904 41943039 8429568 5 Extended
/dev/sda5 25085952 26109951 512000 83 Linux
/dev/sda6 26112000 27135999 512000 83 Linux
Disk /dev/sdb: 8589 MB, 8589934592 bytes, 16777216 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x6f284e72
Device Boot Start End Blocks Id System
/dev/sdb1 2048 16777215 8387584 83 Linux
Disk /dev/sdc: 8589 MB, 8589934592 bytes, 16777216 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x6f284e72
Device Boot Start End Blocks Id System
/dev/sdc1 2048 16777215 8387584 83 Linux

Créez ensuite un PV sur sdb1 :

[root@node1 ~]# pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created.

Créez maintenant un VG :

[root@node1 ~]# vgcreate my_vg /dev/sdb1
Volume group "my_vg" successfully created

Dernièrement créez le LV my_lv :

[root@node1 ~]# lvcreate -L450 -n my_lv my_vg
Rounding up size to full physical extent 452.00 MiB
Logical volume "my_lv" created.

Constatez la présence du volume logique :

[root@node1 ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
my_lv my_vg -wi-a----- 452.00m

Créez maintenant un système de fichiers ext4 sur le volume logique my_lv :

[root@node1 ~]# mkfs.ext4 /dev/my_vg/my_lv
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
115824 inodes, 462848 blocks
23142 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=34078720
57 block groups
8192 blocks per group, 8192 fragments per group
2032 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409
Allocating group tables: done
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

Installez Apache sur chaque noeud :

[root@node1 ~]# yum install -y httpd wget

[root@node2 ~]# yum install -y httpd wget

Afin que l'agent de la ressource Apache puisse obtenir le statut de chaque Apache, ajoutez les lignes suivantes à la fin du fichier /etc/httpd/conf/httod.conf de chaque noeud :

[root@node1 ~]# vi /etc/httpd/conf/httpd.conf
[root@node1 ~]# cat /etc/httpd/conf/httpd.conf
...
<Location /server-status>
SetHandler server-status
Require local
</Location>

[root@node2 ~]# vi /etc/httpd/conf/httpd.conf
[root@node2 ~]# cat /etc/httpd/conf/httpd.conf
...
<Location /server-status>
SetHandler server-status
Require local
</Location>

L'agent de la ressource Apache n'utilise pas systemd. Pour cette raison vous devez éditer le script de logrotate afin que celui-ci n'utilise pas la commande systemctl pour recharger Apache :

[root@node1 ~]# vi /etc/logrotate.d/httpd
[root@node1 ~]# cat /etc/logrotate.d/httpd
/var/log/httpd/*log {
missingok
notifempty
sharedscripts
delaycompress
postrotate
# /bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
/usr/sbin/httpd -f /etc/httpd/conf/httpd.conf -c "PidFile /var/run/httpd.pid" -k graceful > /dev/null 2>/dev/null || true
endscript
}

[root@node2 ~]# vi /etc/logrotate.d/httpd
[root@node2 ~]# cat /etc/logrotate.d/httpd
/var/log/httpd/*log {
missingok
notifempty
sharedscripts
delaycompress
postrotate
# /bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
/usr/sbin/httpd -f /etc/httpd/conf/httpd.conf -c "PidFile /var/run/httpd.pid" -k graceful > /dev/null 2>/dev/null || true
endscript
}

Créez le fichier index.html sur le volume logique my_lv :

[root@node1 ~]# mount /dev/my_vg/my_lv /var/www/
You have new mail in /var/spool/mail/root
[root@node1 ~]# mkdir /var/www/html
[root@node1 ~]# mkdir /var/www/cgi-bin
[root@node1 ~]# mkdir /var/www/error
[root@node1 ~]# restorecon -R /var/www
[root@node1 ~]# cat <<-END >/var/www/html/index.html
> <html>
> <body>Hello</body>
> </html>
> END
[root@node1 ~]# umount /var/www

Afin d'accorder le contrôle de l'activation du groupe de volumes my_vg au cluster et non au système d'exploitation, afin d'éviter toute possibilité de corruption des méta-données, il convient de modifier la directive volume_list du fichier /etc/lvm/lvm.conf de chaque noeud.

Premièrement, modifiez la valeur de la directive use_lvmetad dans le fichier /etc/lvm/lvm.conf de chaque noeud :

[root@node1 ~]# vi /etc/lvm/lvm.conf
[root@node1 ~]# cat /etc/lvm/lvm.conf | grep "use_lvmetad ="
use_lvmetad = 0

[root@node2 ~]# vi /etc/lvm/lvm.conf
[root@node2 ~]# cat /etc/lvm/lvm.conf | grep "use_lvmetad ="
use_lvmetad = 0

Arrêtez et désactivez tous les processus éventuels de use_lvmetad sur chaque noeud :

[root@node1 ~]# lvmconf --enable-halvm --services --startstopservices
Warning: Stopping lvm2-lvmetad.service, but it can still be activated by:
lvm2-lvmetad.socket
Removed symlink /etc/systemd/system/sysinit.target.wants/lvm2-lvmetad.socket.

[root@node2 ~]# lvmconf --enable-halvm --services --startstopservices
Warning: Stopping lvm2-lvmetad.service, but it can still be activated by:
lvm2-lvmetad.socket
Removed symlink /etc/systemd/system/sysinit.target.wants/lvm2-lvmetad.socket.

Modifiez la directive volume_list dans le fichier /etc/lvm/lvm.conf de chaque neoud :

[root@node1 ~]# vi /etc/lvm/lvm.conf
[root@node1 ~]# cat /etc/lvm/lvm.conf | grep my_vg
volume_list = [ ]

[root@node2 ~]# vi /etc/lvm/lvm.conf
[root@node2 ~]# cat /etc/lvm/lvm.conf | grep my_vg
volume_list = [ ]

Regénérez un initramfs sur chaque noeud afin de prendre en compte ces modifications :

[root@node1 ~]# dracut -H -f /boot/initramfs-$(uname -r).img $(uname -r)

[root@node2 ~]# dracut -H -f /boot/initramfs-$(uname -r).img $(uname -r)

Re-démarrez chaque noeud :

[root@node1 ~]# shutdown -r now

[root@node2 ~]# shutdown -r now

Création des Ressources du Cluster

Créez la ressource cluster my_lvm :

[root@node1 ~]# pcs resource create my_lvm LVM volgrpname=my_vg exclusive=true --group apachegroup
Assumed agent name 'ocf:heartbeat:LVM' (deduced from 'LVM')

Contrôlez le statut du cluster :

[root@node1 ~]# pcs status
Cluster name: my_cluster
Stack: corosync
Current DC: node1.i2tch.loc (version 1.1.18-11.el7_5.3-2b07d5c5a9) - partition with quorum
Last updated: Tue Sep 18 06:56:44 2018
Last change: Tue Sep 18 06:56:10 2018 by root via cibadmin on node1.i2tch.loc
2 nodes configured
2 resources configured
Online: [ node1.i2tch.loc node2.i2tch.loc ]
Full list of resources:
myapc	(stonith:fence_apc_snmp):	Stopped
Resource Group: apachegroup
my_lvm	(ocf::heartbeat:LVM):	Started node1.i2tch.loc
Failed Actions:
* myapc_start_0 on node1.i2tch.loc 'unknown error' (1): call=14, status=Error, exitreason='',
last-rc-change='Tue Sep 18 06:48:02 2018', queued=0ms, exec=14307ms
* myapc_start_0 on node2.i2tch.loc 'unknown error' (1): call=6, status=Error, exitreason='',
last-rc-change='Tue Sep 18 06:48:14 2018', queued=2ms, exec=16999ms
Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled

Créez ensuite les ressources my_fs ainsi que VirtualIP :

[root@node1 ~]# pcs resource create my_fs Filesystem device="/dev/my_vg/my_lv" directory="/var/www" fstype="ext4" --group apachegroup
Assumed agent name 'ocf:heartbeat:Filesystem' (deduced from 'Filesystem')
[root@node1 ~]#
[root@node1 ~]# pcs resource create VirtualIP IPaddr2 ip=10.0.3.100 cidr_netmask=24 --group apachegroup
Assumed agent name 'ocf:heartbeat:IPaddr2' (deduced from 'IPaddr2')

Dernièrement, créez la ressource Website :

[root@node1 ~]# pcs resource create Website apache configfile="/etc/httpd/conf/httpd.conf" statusurl="http://127.0.0.1/server-status" --group apachegroup
Assumed agent name 'ocf:heartbeat:apache' (deduced from 'apache')

Contrôlez de nouveau le statut du cluster et noter le neoud sur lequel ont été démarrés les services ( dans ce cas node1.i2tch.loc ) :

[root@node1 ~]# pcs status
Cluster name: my_cluster
Stack: corosync
Current DC: node1.i2tch.loc (version 1.1.18-11.el7_5.3-2b07d5c5a9) - partition with quorum
Last updated: Tue Sep 18 07:34:49 2018
Last change: Tue Sep 18 07:34:44 2018 by root via cibadmin on node1.i2tch.loc
2 nodes configured
5 resources configured
Online: [ node1.i2tch.loc node2.i2tch.loc ]
Full list of resources:
myapc	(stonith:fence_apc_snmp):	Stopped
Resource Group: apachegroup
my_lvm	(ocf::heartbeat:LVM):	Started node1.i2tch.loc
my_fs	(ocf::heartbeat:Filesystem):	Started node1.i2tch.loc
VirtualIP	(ocf::heartbeat:IPaddr2):	Started node1.i2tch.loc
Website	(ocf::heartbeat:apache):	Started node1.i2tch.loc
Failed Actions:
* myapc_start_0 on node2.i2tch.loc 'unknown error' (1): call=22, status=Error, exitreason='',
last-rc-change='Tue Sep 18 07:24:17 2018', queued=0ms, exec=13456ms
* myapc_start_0 on node1.i2tch.loc 'unknown error' (1): call=6, status=Error, exitreason='',
last-rc-change='Tue Sep 18 07:24:03 2018', queued=0ms, exec=13600ms
Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled

Contrôlez la présence de l'adresse IP 10.0.3.100 sur le noeud concerné :

[root@node1 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:10:90:fc brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic enp0s3
valid_lft 85984sec preferred_lft 85984sec
inet6 fe80::2d4d:e50a:4f0e:65d3/64 scope link
valid_lft forever preferred_lft forever
3: enp0s8: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP qlen 1000
link/ether 08:00:27:16:89:9f brd ff:ff:ff:ff:ff:ff
4: enp0s9: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP qlen 1000
link/ether 08:00:27:16:89:9f brd ff:ff:ff:ff:ff:ff
5: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000
link/ether 08:00:27:16:89:9f brd ff:ff:ff:ff:ff:ff
inet 10.0.3.15/24 brd 10.0.3.255 scope global bond0
valid_lft forever preferred_lft forever
inet 10.0.3.200/24 brd 10.0.3.255 scope global secondary bond0
valid_lft forever preferred_lft forever
inet6 fe80::aadb:c074:fbc7:5e94/64 scope link tentative dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::5915:b321:a5ae:321e/64 scope link tentative dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::138a:5c7a:1284:aa3d/64 scope link tentative dadfailed
valid_lft forever preferred_lft forever

Arrêtez le noeud hébergeant les services :

[root@node1 ~]# shutdown - h now

Consultez le statut du cluster et notez le basculement des services :

[root@node2 ~]# pcs status
Cluster name: my_cluster
Stack: corosync
Current DC: node1.i2tch.loc (version 1.1.18-11.el7_5.3-2b07d5c5a9) - partition with quorum
Last updated: Tue Sep 18 07:50:18 2018
Last change: Tue Sep 18 07:34:44 2018 by root via cibadmin on node1.i2tch.loc
2 nodes configured
5 resources configured
Online: [ node1.i2tch.loc node2.i2tch.loc ]
Full list of resources:
myapc	(stonith:fence_apc_snmp):	Stopped
Resource Group: apachegroup
my_lvm	(ocf::heartbeat:LVM):	Started node2.i2tch.loc
my_fs	(ocf::heartbeat:Filesystem):	Started node2.i2tch.loc
VirtualIP	(ocf::heartbeat:IPaddr2):	Started node2.i2tch.loc
Website	(ocf::heartbeat:apache):	Starting node2.i2tch.loc
Failed Actions:
* myapc_start_0 on node2.i2tch.loc 'unknown error' (1): call=22, status=Error, exitreason='',
last-rc-change='Tue Sep 18 07:38:00 2018', queued=1ms, exec=15975ms
* myapc_start_0 on node1.i2tch.loc 'unknown error' (1): call=6, status=Error, exitreason='',
last-rc-change='Tue Sep 18 07:37:47 2018', queued=0ms, exec=13536ms
Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled

Démarrez node1. Passez la machine virtuelle en mode graphique avec les commandes suivantes :

[root@node1 ~]# rm -rf /etc/systemd/system/default.target
[root@node1 ~]# ln -s /lib/systemd/system/graphical.target /etc/systemd/system/default.target
[root@node1 ~]# shutdown -r now

Ouvrez un navigateur Internet et ouvrez l'URL https://node1.i2tch.loc:2224. Connectez-vous avec l'utilisateur hacluster.

Pour plus d'information concernant l'interface HTML, consultez ce lien.

<html> <DIV ALIGN=“CENTER”> Copyright © 2020 Hugh Norris. </DIV> </html>