24.10. Configuration d'un serveur HTTP Apache dans un cluster à haute disponibilité avec le rôle de système ha_cluster
Cette procédure configure un serveur HTTP Apache actif/passif dans un cluster Red Hat Enterprise Linux High Availability Add-On à deux nœuds à l'aide du rôle de système ha_cluster
.
Conditions préalables
ansible-core
est installé sur le nœud à partir duquel vous souhaitez exécuter le playbook.NoteIl n'est pas nécessaire que
ansible-core
soit installé sur les nœuds membres du cluster.-
Le paquetage
rhel-system-roles
est installé sur le système à partir duquel vous souhaitez exécuter le playbook. - Les systèmes que vous utiliserez comme membres de votre cluster disposent d'une couverture d'abonnement active pour RHEL et RHEL High Availability Add-On.
- Votre système comprend une adresse IP virtuelle publique, nécessaire pour Apache.
- Votre système comprend un stockage partagé pour les nœuds de la grappe, utilisant iSCSI, Fibre Channel ou un autre périphérique de bloc réseau partagé.
- Vous avez configuré un volume logique LVM avec un système de fichiers XFS, comme décrit dans Configuration d'un volume LVM avec un système de fichiers XFS dans un cluster Pacemaker.
- Vous avez configuré un serveur HTTP Apache, comme décrit dans la section Configuration d'un serveur HTTP Apache.
- Votre système comprend un interrupteur d'alimentation APC qui sera utilisé pour clôturer les nœuds du cluster.
Le rôle de système ha_cluster
remplace toute configuration de cluster existante sur les nœuds spécifiés. Tous les paramètres non spécifiés dans le rôle seront perdus.
Procédure
- Créez un fichier d'inventaire spécifiant les nœuds de la grappe, comme décrit dans la section Spécification d'un inventaire pour le rôle de système ha_cluster.
Créez un fichier playbook, par exemple
http-cluster.yml
.NoteLors de la création de votre fichier playbook pour la production, le coffre-fort crypte le mot de passe, comme décrit dans Cryptage du contenu avec Ansible Vault.
L'exemple de fichier playbook suivant configure un serveur HTTP Apache créé précédemment dans un cluster HA actif/passif à deux nœuds exécutant les services
firewalld
etselinux
.Cet exemple utilise un commutateur d'alimentation APC dont le nom d'hôte est
zapc.example.com
. Si le cluster n'utilise pas d'autres agents de clôture, vous pouvez éventuellement lister uniquement les agents de clôture dont votre cluster a besoin lors de la définition de la variableha_cluster_fence_agent_packages
, comme dans cet exemple.- hosts: z1.example.com z2.example.com roles: - rhel-system-roles.ha_cluster vars: ha_cluster_hacluster_password: password ha_cluster_cluster_name: my_cluster ha_cluster_manage_firewall: true ha_cluster_manage_selinux: true ha_cluster_fence_agent_packages: - fence-agents-apc-snmp ha_cluster_resource_primitives: - id: myapc agent: stonith:fence_apc_snmp instance_attrs: - attrs: - name: ipaddr value: zapc.example.com - name: pcmk_host_map value: z1.example.com:1;z2.example.com:2 - name: login value: apc - name: passwd value: apc - id: my_lvm agent: ocf:heartbeat:LVM-activate instance_attrs: - attrs: - name: vgname value: my_vg - name: vg_access_mode value: system_id - id: my_fs agent: Filesystem instance_attrs: - attrs: - name: device value: /dev/my_vg/my_lv - name: directory value: /var/www - name: fstype value: xfs - id: VirtualIP agent: IPaddr2 instance_attrs: - attrs: - name: ip value: 198.51.100.3 - name: cidr_netmask value: 24 - id: Website agent: apache instance_attrs: - attrs: - name: configfile value: /etc/httpd/conf/httpd.conf - name: statusurl value: http://127.0.0.1/server-status ha_cluster_resource_groups: - id: apachegroup resource_ids: - my_lvm - my_fs - VirtualIP - Website
- Enregistrer le fichier.
Exécutez le playbook en indiquant le chemin d'accès au fichier d'inventaire inventory que vous avez créé à l'étape 1.
# ansible-playbook -i inventory http-cluster.yml
Lorsque vous utilisez l'agent de ressources
apache
pour gérer Apache, il n'utilise passystemd
. Pour cette raison, vous devez modifier le scriptlogrotate
fourni avec Apache afin qu'il n'utilise passystemctl
pour recharger Apache.Supprimez la ligne suivante dans le fichier
/etc/logrotate.d/httpd
sur chaque nœud du cluster./bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
Remplacez la ligne que vous avez supprimée par les trois lignes suivantes, en spécifiant
/var/run/httpd-website.pid
comme chemin d'accès au fichier PID où website est le nom de la ressource Apache. Dans cet exemple, le nom de la ressource Apache estWebsite
./usr/bin/test -f /var/run/httpd-Website.pid >/dev/null 2>/dev/null && /usr/bin/ps -q $(/usr/bin/cat /var/run/httpd-Website.pid) >/dev/null 2>/dev/null && /usr/sbin/httpd -f /etc/httpd/conf/httpd.conf -c "PidFile /var/run/httpd-Website.pid" -k graceful > /dev/null 2>/dev/null || true
Verification steps
Depuis l'un des nœuds de la grappe, vérifiez l'état de la grappe. Notez que les quatre ressources sont exécutées sur le même nœud,
z1.example.com
.Si vous constatez que les ressources que vous avez configurées ne fonctionnent pas, vous pouvez exécuter la commande
pcs resource debug-start resource
pour tester la configuration des ressources.[root@z1 ~]# pcs status Cluster name: my_cluster Last updated: Wed Jul 31 16:38:51 2013 Last change: Wed Jul 31 16:42:14 2013 via crm_attribute on z1.example.com Stack: corosync Current DC: z2.example.com (2) - partition with quorum Version: 1.1.10-5.el7-9abe687 2 Nodes configured 6 Resources configured Online: [ z1.example.com z2.example.com ] Full list of resources: myapc (stonith:fence_apc_snmp): Started z1.example.com Resource Group: apachegroup my_lvm (ocf::heartbeat:LVM-activate): Started z1.example.com my_fs (ocf::heartbeat:Filesystem): Started z1.example.com VirtualIP (ocf::heartbeat:IPaddr2): Started z1.example.com Website (ocf::heartbeat:apache): Started z1.example.com
Une fois que le cluster est opérationnel, vous pouvez diriger un navigateur vers l'adresse IP que vous avez définie comme ressource
IPaddr2
pour voir l'exemple d'affichage, qui consiste en un simple mot "Hello".Bonjour
Pour vérifier si le groupe de ressources s'exécutant sur
z1.example.com
est transféré au nœudz2.example.com
, mettez le nœudz1.example.com
en modestandby
, après quoi le nœud ne sera plus en mesure d'héberger des ressources.[root@z1 ~]# pcs node standby z1.example.com
Après avoir mis le nœud
z1
en modestandby
, vérifiez l'état de la grappe à partir de l'un des nœuds de la grappe. Notez que les ressources devraient maintenant toutes être exécutées surz2
.[root@z1 ~]# pcs status Cluster name: my_cluster Last updated: Wed Jul 31 17:16:17 2013 Last change: Wed Jul 31 17:18:34 2013 via crm_attribute on z1.example.com Stack: corosync Current DC: z2.example.com (2) - partition with quorum Version: 1.1.10-5.el7-9abe687 2 Nodes configured 6 Resources configured Node z1.example.com (1): standby Online: [ z2.example.com ] Full list of resources: myapc (stonith:fence_apc_snmp): Started z1.example.com Resource Group: apachegroup my_lvm (ocf::heartbeat:LVM-activate): Started z2.example.com my_fs (ocf::heartbeat:Filesystem): Started z2.example.com VirtualIP (ocf::heartbeat:IPaddr2): Started z2.example.com Website (ocf::heartbeat:apache): Started z2.example.com
Le site web à l'adresse IP définie doit s'afficher sans interruption.
Pour supprimer
z1
du modestandby
, entrez la commande suivante.[root@z1 ~]# pcs node unstandby z1.example.com
NoteLe retrait d'un nœud du mode
standby
n'entraîne pas en soi le basculement des ressources vers ce nœud. Cela dépend de la valeur deresource-stickiness
pour les ressources. Pour plus d'informations sur le méta-attributresource-stickiness
, voir Configurer une ressource pour qu'elle préfère son nœud actuel.