Cluster linux Pacemaket Corosync Virtualbox Vagrant

Cluster vagrant Linux in test con Pacemaker, Corosync e pcs: parte 2

See the article in English

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

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

7 + 3 =