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