Contexte :
Nous allons voir comment configurer un cluster de Seach Head (SHC) dans le cadre d’un POC (pas d’optimisation), pour cela nous allons utiliser vagrant .
Nous utiliserons des CentOS 8 avec Splunk en version 8.2.1.
Préparation de l’environnement avec Vagrant :
Nous partirons avec 3 SH et 1 US (Utility Server, Splunk Core avec une fonctionnalité spécique) qui aura le rôle de Deployer (deploiement de config SH).
Utilisation de la doc : SHC deployement Overview v8.2.1
Vagrantfile :
$ mkdir -p ~/.my_vagrant/demoSplunkSHC
$ vi ~/.my_vagrant/demoSplunkSHC/Vagrantfile
#Version 0.1
# Command system/custom/add packages ....
$packagesinstall = <<-SCRIPT
# Package custom
sudo yum install -y lsof vim git bind-utils
# Package to Splunk health check iowait
sudo yum install -y sysstat
# Package installing
echo "# Splunk RPM installation"
sudo yum localinstall -y /vagrant/splunk-8.2.1-ddff1c41e5cf-linux-2.6-x86_64.rpm
# Setup Splunk config
echo "# Set permissions on Splunk folder"
sudo chown -R vagrant:vagrant /opt/splunk
# Splunk apps :
# Manage min Free Space to POC instance
echo "# Set minFreeSpace to POC instance"
sudo mkdir -p /opt/splunk/etc/apps/my_customsplunk/local/
sudo echo "[diskUsage]" > /opt/splunk/etc/apps/my_customsplunk/local/server.conf
sudo echo "minFreeSpace = 50" >> /opt/splunk/etc/apps/my_customsplunk/local/server.conf
sudo chown -R vagrant:vagrant /opt/splunk/etc/apps/my_customsplunk/
echo "# Splunk activation on boot with Vagrant user"
sudo /opt/splunk/bin/splunk enable boot-start -systemd-managed 1 --accept-license -user vagrant --seed-passwd changeme
echo "# Launch Splunk"
sudo /opt/splunk/bin/splunk start --no-prompt
SCRIPT
#Get IP to display after vagrant up
$getip= <<-SCRIPT
echo "IP of $(hostname) : "
ip -4 addr sh eth1
echo ""
echo "Splunk Version ; "
/opt/splunk/bin/splunk version
SCRIPT
#Message post up
$postupmessage = <<-SCRIPT
Congratulations VM/box available.
Generate by Vagrant !
SCRIPT
#Customise OS env
$customenv= <<-SCRIPT
echo "Custom environnement"
#Bash profile
echo "Set .bash_profile to Vagrant user"
sudo curl -sk "https://raw.githubusercontent.com/alasta/dotfiles/master/.bash_profile_vagrant" -o /home/vagrant/.bash_profile
#inputrc
echo "Set inputrc"
echo "Set inputrc to Vagrant user"
sudo curl -sk "https://raw.githubusercontent.com/alasta/dotfiles/master/.inputrc" -o /home/vagrant/.inputrc
#.vimrc
echo "Set vimrc"
sudo curl -sk "https://raw.githubusercontent.com/alasta/dotfiles/master/.vimrc" -o /home/vagrant/.vimrc
#bash profile and inputrc to root
sudo curl -sk "https://raw.githubusercontent.com/alasta/dotfiles/master/.bash_profile_root" -o /root/.bash_profile
#Set timezone
echo "# Set timezone"
timedatectl set-timezone 'Europe/Paris'
# Manage DNS server to disable DNS on private net
echo "# Disable DNS private net"
sudo sed -i -e 's/.*10.0/#&/g' /etc/resolv.conf
SCRIPT
#Config box
Vagrant.configure("2") do |config|
(1..3).each do |i|
config.vm.define "shc#{i}" do |vm1|
#vm1.vm.provider "virtualbox" do |v|
# v.memory = 2048
# v.cpus = 2
#end
#vm1.vm.box = "centos/7"
vm1.vm.box = "centos/8"
vm1.vm.hostname = "shc#{i}"
vm1.vm.box_url = "centos/8"
vm1.vm.network "public_network", bridge: "en0: Wi-Fi (AirPort)", auto_config: false
vm1.vm.provision "file", source: "~/Downloads/splunk-8.2.1-ddff1c41e5cf-linux-2.6-x86_64.rpm", destination: "/vagrant/"
vm1.vm.provision "shell", inline: $packagesinstall
vm1.vm.provision "shell", inline: $customenv
vm1.vm.provision "shell", inline: $getip, run: "always"
vm1.vm.post_up_message = $postupmessage
#vm1.vm.provision "shell", inline: "ip -4 addr sh eth1", run: "always"
end
end
config.vm.define "us1" do |vm1|
#vm1.vm.provider "virtualbox" do |v|
# v.memory = 2048
# v.cpus = 2
#end
#vm1.vm.box = "centos/7"
vm1.vm.box = "centos/8"
vm1.vm.hostname = 'us1'
vm1.vm.box_url = "centos/8"
vm1.vm.network "public_network", bridge: "en0: Wi-Fi (AirPort)", auto_config: false
vm1.vm.provision "file", source: "~/Downloads/splunk-8.2.1-ddff1c41e5cf-linux-2.6-x86_64.rpm", destination: "/vagrant/"
vm1.vm.provision "shell", inline: $packagesinstall
vm1.vm.provision "shell", inline: $customenv
vm1.vm.provision "shell", inline: $getip, run: "always"
vm1.vm.post_up_message = $postupmessage
#vm1.vm.provision "shell", inline: "ip -4 addr sh eth1", run: "always"
end
end
Déploiement de l’environnement :
$ vagrant up
....
Un moment plus tard ….
Disponible aussi via GitHub (avec les updates futures).
Config Splunk :
Deployer :
Sur us1
$ cd /opt/splunk/etc/apps
$ mkdir -p myappdeployer/local
$ vi myappdeployer/local/server.conf
[shclustering]
pass4SymmKey = mysecuritykey
shcluster_label = shclusterpoc
Redémarrage pour prise en compte :
$ sudo systemctl restart Splunkd
Note : au redémarrage, le pass4SymmKey va être chiffré.
Récupérer les fichiers suivants et les déployer sur toutes les autres instances Splunk core/full install :
$SPLUNK_HOME/etc/auth/splunk.secret
$SPLUNK_HOME/etc/passwd
Si l’instance a déjà démarrée avant la mise en place de ces fichiers, il faudra stopper Splunkd, supprimer les paramètres :
sslPassword
pass4SymmKey
Dans le fichier $SPLUNK_HOME/etc/system/local/server.conf et redémarrer Splunkd.
Config SH Cluster :
Sur les 3 SH :
$ /opt/splunk/bin/splunk init shcluster-config -auth admin:changeme -mgmt_uri https://"$(hostname)".udmiot.lab:8089 -replication_port 9001 -replication_factor 2 -conf_deploy_fetch_url https://us1.udmiot.lab:8089 -secret mysecuritykey -shcluster_label shclusterpoc
Search head clustering has been initialized on this node.
You need to restart the Splunk Server (splunkd) for your changes to take effect.
On déclarre chaque membre comme faisant parti du cluster de SH avec le port de management, le compte admin (initialisé à l’installation), le port de réplication, le replication factor, le deployer et les informations du server.conf du deployer .
Redémarrage pour prise en compte :
$ sudo systemctl restart Splunkd
Election du captain :
Choisir un des SH pour être le premier Captain , il évoluera dans le temps :
Nous choisirons le shc1 :
$ /opt/splunk/bin/splunk bootstrap shcluster-captain -servers_list "https://shc1.udmiot.lab:8089,https://shc2.udmiot.lab:8089,https://shc3.udmiot.lab:8089" -auth admin:changeme
Successfully bootstrapped this node as the captain with the given servers.
Vérifications :
Sur tous les SH :
Etat du SHC :
$ /opt/splunk/bin/splunk show shcluster-status -auth admin:changeme
Captain:
dynamic_captain : 1
elected_captain : Mon Aug 9 22:33:02 2021
id : 90F41B44-625A-4F69-BA23-4AD2435AEBC2
initialized_flag : 1
label : shc1
mgmt_uri : https://shc1.udmiot.lab:8089
min_peers_joined_flag : 1
rolling_restart_flag : 0
service_ready_flag : 1
Members:
shc2
label : shc2
last_conf_replication : Mon Aug 9 22:34:11 2021
mgmt_uri : https://shc2.udmiot.lab:8089
mgmt_uri_alias : https://192.168.3.199:8089
status : Up
shc3
label : shc3
last_conf_replication : Mon Aug 9 22:34:09 2021
mgmt_uri : https://shc3.udmiot.lab:8089
mgmt_uri_alias : https://192.168.3.92:8089
status : Up
shc1
label : shc1
mgmt_uri : https://shc1.udmiot.lab:8089
mgmt_uri_alias : https://192.168.3.75:8089
status : Up
Etat du KVStore :
$ /opt/splunk/bin/splunk show kvstore-status -auth admin:changeme
This member:
backupRestoreStatus : Ready
date : Mon Aug 9 22:35:34 2021
dateSec : 1628541334.208
disabled : 0
guid : D367F1FD-1006-44AD-95B1-BF085AB23AA5
oplogEndTimestamp : Mon Aug 9 22:35:33 2021
oplogEndTimestampSec : 1628541333
oplogStartTimestamp : Mon Aug 9 22:33:15 2021
oplogStartTimestampSec : 1628541195
port : 8191
replicaSet : splunkrs
replicationStatus : Non-captain KV store member
standalone : 0
status : ready
storageEngine : mmapv1
Enabled KV store members:
shc2.udmiot.lab:8191
guid : 061286CC-8D57-4EDE-8EC1-24A15D9105D5
hostAndPort : shc2.udmiot.lab:8191
shc3.udmiot.lab:8191
guid : B3301141-F2CE-4597-ADD5-A34E58A03A42
hostAndPort : shc3.udmiot.lab:8191
shc1.udmiot.lab:8191
guid : D367F1FD-1006-44AD-95B1-BF085AB23AA5
hostAndPort : shc1.udmiot.lab:8191
KV store members:
shc2.udmiot.lab:8191
configVersion : 1
electionDate : Mon Aug 9 22:33:26 2021
electionDateSec : 1628541206
hostAndPort : shc2.udmiot.lab:8191
lastHeartbeat : Mon Aug 9 22:35:33 2021
lastHeartbeatRecv : Mon Aug 9 22:35:32 2021
lastHeartbeatRecvSec : 1628541332.81
lastHeartbeatSec : 1628541333.956
optimeDate : Mon Aug 9 22:35:33 2021
optimeDateSec : 1628541333
pingMs : 4
replicationStatus : KV store captain
uptime : 138
shc3.udmiot.lab:8191
configVersion : 1
hostAndPort : shc3.udmiot.lab:8191
lastHeartbeat : Mon Aug 9 22:35:34 2021
lastHeartbeatRecv : Mon Aug 9 22:35:33 2021
lastHeartbeatRecvSec : 1628541333.739
lastHeartbeatSec : 1628541334.141
optimeDate : Mon Aug 9 22:35:33 2021
optimeDateSec : 1628541333
pingMs : 0
replicationStatus : Non-captain KV store member
uptime : 133
shc1.udmiot.lab:8191
configVersion : 1
hostAndPort : shc1.udmiot.lab:8191
optimeDate : Mon Aug 9 22:35:33 2021
optimeDateSec : 1628541333
replicationStatus : Non-captain KV store member
uptime : 363
Test de bacule du captain :
Nous allons tester la bascule du captain, pour cela nous allons arrêter le service Splunkd sur le captain actuel, ici shc1 :
Sur shc1 :
sudo systemctl stop Splunkd
Sur un autre SH, ici shc2 :
$ /opt/splunk/bin/splunk show shcluster-status -auth admin:changeme
Encountered some errors while trying to obtain shcluster status.
Failed to proxy call to member https://shc1.udmiot.lab:8089.
Pendant quelques minutes le cluster est en erreur le temps que la ré-élection se relance.
Aprés quelques minutes :
$ /opt/splunk/bin/splunk show shcluster-status -auth admin:changeme
Captain:
dynamic_captain : 1
elected_captain : Mon Aug 9 22:39:42 2021
id : 90F41B44-625A-4F69-BA23-4AD2435AEBC2
initialized_flag : 1
label : shc3
mgmt_uri : https://shc3.udmiot.lab:8089
min_peers_joined_flag : 1
rolling_restart_flag : 0
service_ready_flag : 1
Members:
shc2
label : shc2
last_conf_replication : Mon Aug 9 22:40:32 2021
mgmt_uri : https://shc2.udmiot.lab:8089
mgmt_uri_alias : https://192.168.3.199:8089
status : Up
shc3
label : shc3
mgmt_uri : https://shc3.udmiot.lab:8089
mgmt_uri_alias : https://192.168.3.92:8089
status : Up
shc1
label : shc1
last_conf_replication : Mon Aug 9 22:38:18 2021
mgmt_uri : https://shc1.udmiot.lab:8089
mgmt_uri_alias : https://192.168.3.75:8089
status : Down
Retour à la normale :
Redémarrage du service Splunkd sur shc1 :
$ sudo systemctl start Splunkd
Etat du cluster :
$ /opt/splunk/bin/splunk show shcluster-status -auth admin:changeme
Captain:
dynamic_captain : 1
elected_captain : Mon Aug 9 22:39:42 2021
id : 90F41B44-625A-4F69-BA23-4AD2435AEBC2
initialized_flag : 1
label : shc3
mgmt_uri : https://shc3.udmiot.lab:8089
min_peers_joined_flag : 1
rolling_restart_flag : 0
service_ready_flag : 1
Members:
shc2
label : shc2
last_conf_replication : Mon Aug 9 22:43:27 2021
mgmt_uri : https://shc2.udmiot.lab:8089
mgmt_uri_alias : https://192.168.3.199:8089
status : Up
shc3
label : shc3
mgmt_uri : https://shc3.udmiot.lab:8089
mgmt_uri_alias : https://192.168.3.92:8089
status : Up
shc1
label : shc1
last_conf_replication : Mon Aug 9 22:43:27 2021
mgmt_uri : https://shc1.udmiot.lab:8089
mgmt_uri_alias : https://192.168.3.75:8089
status : Up
Deployer une apps type Dashboard sur le SHC :
Sur le deployer us1 :
Télécharger une app sur la Splunkbase ici Splunk App for Infrastructure :
$ cd /opt/splunk/etc/shcluster/apps/
$ tar xzf /PATH/OF/splunk-app-for-infrastructure_224.tgz
$ ln -s ../../apps/my_customsplunk/
Note :
On se positionne dans le dossier du deployer
On décompresse l’app
On fait un lien symbolique vers l’app qui configure le minFreeSpace (utile que dans un POC avec un petit disque) car le deployer va faire du ménage dans le $SPLUNK_HOME/etc/apps des SH
Déployement :
$ /opt/splunk/bin/splunk apply shcluster-bundle -target https://shc1.udmiot.lab:8089
Warning: Depending on the configuration changes being pushed, this command might initiate a rolling restart of the cluster members. Please refer to the documentation for the details. Do you wish to continue? [y/n]: y
Splunk username: admin
Password:
Bundle has been pushed successfully to all the cluster members.
Note : En fonction de la configuration les SH auront peut être besoin de redémarrer ce qui implique une indisponibilité des SH.
Vérifications :
Sur les SH :
$ ll /opt/splunk/etc/apps | grep splunk_app_infrastructure
drwx------. 10 vagrant vagrant 206 2021-08-09 22:59:14 splunk_app_infrastructure
Annexes :
Doc Officielle pour monter un SHC
Aplura - CheatSheet SHC