Introduzione
Continuiamo, con questa seconda parte, la realizzazione del cluster Linux automatizzando tutta la procedura dell’articolo precedente utilizzando Vagrant cosicché abbiamo anche qualche grado di libertà in più sulla gestione e flessibilità di modifica al cluster.
Per semplicità di esposizione consideriamo che Vagrant sia già installato nello stesso computer dov’è Virtualbox.
A chi interessa l’integrazione di Vagrant con Ansible può passare direttamente alla parte terza nell’articolo successivo.
Vagrantfile
Cartella di lavoro
Iniziamo creandoci la cartella del progetto Vagrant quindi entriamoci dentro:
mkdir linux-cluster-test
cd linux-cluster-test
Creazione password sicure per il cluster con vagrant
Per creare il file Vagrantfile normalmente si usa il comando “vagrant init” che ne crea quello di default, tuttavia in questo caso è più semplice partire da un file vuoto. Per far ciò apriamo il nostro editor preferito (io in genere utilizzo “vim“) sul file vuoto Vagrantfile ed aggiungiamo le seguenti righe al file:
# random_password method: return a 12 (or length) random characters for user password
$CHARS = ('0'..'9').to_a + ('A'..'Z').to_a + ('a'..'z').to_a + ('#'..'&').to_a + (':'..'?').to_a
def random_password(length=12)
p=''
(0..length).each do
p+=$CHARS[rand($CHARS.size)]
end
return p
end
$hacluster_pwd=random_password
$fencecluster_pwd=random_password
## ... Inserire la parte principale ... ##
La funzione “random_password” in Ruby non fa altro che generare una password casuale di 12 caratteri e restituirla in uscita in modo che nella variabile “$hacluster_pwd” ed in “$fencecluster_pwd” abbiamo 2 password distinte casuali e robuste per utilizzarle per l’utente hacluster e per l’utente fence rispettivamente.
Parte principale
Completiamo il Vagrantfile con la sua parte principale aggiungendo le seguenti righe in modo da completarlo:
Vagrant.configure("2") do |config|
[2, 3, 1].each do |i|
config.vm.define "cl-c7-node-#{i}" do |node|
node.vm.box = "generic/centos7"
## ... inserire la parte per la rete del cluster ... ##
node.vm.hostname = "cluster-cl-c7-node-#{i}"
node.vm.synced_folder ".", "/vagrant", disabled: true
node.vm.provider "virtualbox" do |vb, override|
vb.name = "cl-c7-node-#{i}"
vb.memory = "1024"
vb.customize ["modifyvm", :id, "--groups", "/cluster/centos7"]
end
## ... inserire la parte per il provisioning ... ##
end
end
end
In tal modo abbiamo la configurazione minima per le 3 vm che verranno inizializzate in sequenza a partire dalla 2 poi la 3 ed infine la 1.
In particolare disabilitiamo la cartella condivisa /vagrant che Vagrant abilità di default dato che non serve per i nostri test, assegniamo 1GB di ram per ogni vm ed infine con vb.customize mettiamo le 3 vm sotto il gruppo “centos7” dentro a “cluster” in Virtualbox.
Non ci resta che aggiungere la parte di configurazione della rete e l’ultima relativa al provisioning ovvero alla configurazione interna della vm come sistema operativo.
Configurazione delle reti per il cluster
Configuriamo le vm con 3 reti la prima automatica di NAT che Vagrant fa automaticamente per il suo funzionamento interno, la seconda per la rete di cluster (con rete 192.168.33.0/24) come rete privata ed infine la terza come rete per attivare un caso di fence (con rete 192.168.43.0/24) sempre come rete privata.
# Cluster private net for Carousync
node.vm.network "private_network", ip: "192.168.33.#{i + 10}", auto_config: false
# private net for fencing (pcs stonith)
node.vm.network "private_network", ip: "192.168.43.#{i + 10}", auto_config: false
Provisioning
Se siete interessati al provisioning di Vagrant con Ansible è possibile passare direttamente alla parte terza nell’articolo successivo.
Questa è divisa in 2 parti, la prima che lancia lo script “10-node_configuration.sh” valido per tutti e 3 i nodi del cluster e che quindi farà tutta la configurazione e l’installazione relativa al nodo e del software necessario per il cluster ovvero tutto quella che abbiamo già visto nell’articolo precedente sino a paragrafo “Configurazione cluster ed agents“.
La seconda parte, infine, verrà eseguita solo dal primo nodo, che è l’ultimo in sequenza ad essere inizializzato da Vagrant, tramite lo script “90-single-cluster_configuration.sh” in modo da occuparsi di creare il cluster autorizzando i 3 nodi, quindi di creare le risorse ed i gruppi di risorse ed infine di creare quelle di fence.
node.vm.provision "Update software and configure node",
type: "shell",
path: "provision_scripts/10-node_configuration.sh",
args: "'#{$hacluster_pwd}' '#{$fencecluster_pwd}'"
if i == 1
node.vm.provision "Configuring Cluster via pcs on all nodes",
type: "shell",
path: "provision_scripts/90-single-cluster_configuration.sh",
args: "'#{$hacluster_pwd}' '#{$fencecluster_pwd}'"
end
Il Vagrantfile completo ed i 2 script di provisioning si trovano su Github.
Creazione delle vm e del cluster con vagrant
Tutto è pronto per l’installazione delle 3 vm centos 7 quindi tramite il comando:
vagrant up
lanciamo il processo di installazione ed infine di provisioning il tutto come si può vedere dagli screenshot qui sotto con l’unico comando “vagrant up“.
Alternativa cluster vagrant con Ubuntu 18.04 LTS
Se fossimo interessati ad utilizzare e testare lo stesso ambiente ma con Ubuntu 18.04 LTS invece che Centos 7 bisognerebbe fare alcuni cambiamenti sia al file Vagrantfile che ai 2 file di provisioning.
Vagrantfile
Rispetto al Vagrantfile per Centos 7 dobbiamo modificare poche righe:
config.vm.define “cl-c7-node-#{i}”con config.vm.define “cl-u18-node-#{i}”;node.vm.box = “generic/centos7”con node.vm.box = “ubuntu/bionic64”;node.vm.hostname = “cluster-cl-c7-node-#{i}con node.vm.hostname = “cluster-cl-u18-node-#{i}”;vb.name = “cl-c7-node-#{i}”con vb.name = “cl-u18-node-#{i}”;vb.customize [“modifyvm”, :id, “–groups”, “/cluster/centos7”] con vb.customize [“modifyvm”, :id, “–groups”, “/cluster/ubuntu1804″]
File di provisioning
Anche i 2 file di provisioning vanno modificati per rispettare i comandi per Ubuntu 18.04 LTS, ad esempio:
- il comando “yum” va quindi sostituito con “apt“;
- i file di rete sotto /etc/sysconfig/network-scripts vanno sostituiti con quelli di netplan sotto /etc/netplan;
- il firewall “firewalld” quindi va sostituito con “ufw“;
- il file principale di config di apache passa da /etc/httpd/conf/httpd.conf a /etc/apache2/apache2.conf come pure il servizio gestito da “systemd” passa da “httpd” ad “apache2“
Ambiente cluster vagrant completo
Si può provare a completare da soli tale ambiente oppure in alternativa lo troviamo già completo su Github per Ubuntu 18.04 LTS.
Miglioramenti automazione cluster vagrant
Adesso che abbiamo l’ambiente completo sotto Centos 7 oppure sotto Ubuntu 18.04 LTS possiamo pensare a quali miglioramenti fare per testare i casi che vogliamo verificare:
- aggiungere oppure togliere dei nodi;
- testare il comportamento di soli 2 nodi in cluster senza avere mai un quorum;
- eliminare la rete e le risorse di fence;
- poter scegliere da Vagrantfile se installare un cluster con Centos 7 oppure con Ubuntu 18.04 LTS;
- poter cambiare agevolmente la rete di cluster e quella di fence;
Per far questo bisogna parametrizzare ciò che ci interessa nel Vagrantfile e passarlo come parametro agli script di provisioning.
Tutto ciò l’ho già predisposto nel progetto “linux-cluster-test” su GitHub dove si può scaricare e testare velocemente tutte le possibilità.
Per scaricarlo:
git clone https://github.com/eniocarboni/linux-cluster-test.git
cd linux-cluster-test/
Fatto ciò si può lanciare “vagrant up” in modo da avere un cluster Centos7 su 3 nodi oppure è possibile modificare il Vagrantfile in modo che si possa testare altre possibilità. Inoltre è possibile modificare il Vagrantfile anche successivamente e rilanciare di nuovo “vagrant up” per applicare i cambiamenti.
Per tutte le parametrizzazioni vedere la documentazione sulla pagina Github del progetto dove oltre a quelle già descritte c’è anche la possibilità di utilizzare LXD come ambiente di virtualizzazione invece che Virtualbox.
Articolo successivo: ansible
Da non perdere l’articolo successivo che utilizza Ansible come provisioner di Vagrant.
Riferimenti
- Articolo precedente ed articolo successivo;
- Vagrant per installare, configurare e gestire macchine virtuali;
- Virtualbox per la virtualizzazione di vm;
- LXD gestore di container Linux;
- Pacemaker per la creazione di risorse ad alta disponibilità, open source per piccoli e grandi cluster;
- Corosync insieme a Pacemaker aiuta per la parte di alta disponibilità;
- Agent di fence fence_ssh per testare la rete di fence del cluster;
- comandi di cluster pcs;
- linux-cluster-test su Github;
- Ansible;
- Ubuntu 18.04 LTS;
- Centos 7;
- RedHat;
- systemd;
- Ruby.