Instalace HA LAMP/Moodle na virtualmasteru

Cílem dnešního článku je představit instalaci a správu klasického LAMP řešení v High Availability (HA) konfiguraci do cloudového protředí. Představíme řešení, jak jednoduše spravovat e-learningový systém Moodle[1].

V dnešní době nestačí pouze napsat dobrou aplikaci, ale je nutné zajistit i její instalaci a aktualizace na produkčních serverech, kde je prostředí nezbytné pro běh naší aplikace. Pro HA je třeba mít servery nejlépe v oddělených lokalitách, pro případ selhání infrastruktry vlastního datového centra. Poskytovatelů cloudových řešení je na našem trhu hodně: BeeScale, Virtualmaster, Linode, Rackspace, Amazon a mnoho jiných. V našem článku popíšeme, jak infrastrukturu nainstalovat na platformě Virtualmaster.

Pro automatizaci konfigurace serverů máme k dispozici řadu nástrojů: Puppet, Chef, Salt z těch známějších. Ve virtualmasteru používáme pro konfigurace primárně Puppet, ale pro konfiguraci infrastruktury nutné pro běh Moodle aplikace použijeme nástroj Salt[2]. Salt je nový kongirační manažer v pythonu, kterým lze jednoduše deklarativně konfigurovat servery, ale i imperativně ovládat pomocí již relativně rozsáhlé knihovny modulů a stavů[3].

Pro load/fault balancing použijeme Round Robin DNS[4], kde pro jméno naší domény vytvoříme více záznamů, které odkazují na oba servery.

Následující obrázek ukazuje, jak by mohla vypadat HA konfigurace naší Moodle aplikace.

 

Connect-MsolService-Credential $(New-Object-TypeNameSystem.Management.Automation.PSCredential-ArgumentList $("csbadmin@o2csb.onmicrosoft.com"), $(ConvertTo-SecureString-String"Pisek"-AsPlainText-Force))

Get-MsolUser

Vytvoreni serveru

Servery tedy budeme instalovat na platformě Virtualmaster. Použijeme pro to ovládací aplikaci v příkazové řádce, ne webové administrační rozhraní. Pro využití CLI přístupu si musíme nainstalovat a nakonfigurovat nástroj virtualmaster. Ten jednoduše získáme přes RubyGem v balíčku virtualmaster. Nesmíme zapomenout nainstalovat nezbytné knihovny. [5]

# curl -L https://get.rvm.io | bash -s stable --ruby

# apt-get install libxslt-dev libxml2-dev

# gem install virtualmaster

Aplikaci virtualmaster spárujeme s existujícím účtem. Na adrese http://www.virtualmaster.cz/en/api#settings jsou po příhlášení všechny potřebné informace pro nastavení CLI klienta.

# virtualmaster config
Running virtualmaster for first time.
Setting up environment.

Your API credentials are available from http://www.virtualmaster.cz/en/api#settings

Enter API username:
*****
Enter API password:
***************************************
Setting stored under /home/newt/.virtualmaster

Nyní můžeme přejít k vytvoření vlastních serverů. Nejdřív vytvoříme konfigurační server, poté vlastní Moodle servery, které na něj napojíme. Konfigurační server získává nastavení Salt stavů z repozitáře a ovládá se přes SSH. Z následujícího obrázku vyplývá, že konfigurační server konfiguruje nejen Moodle servery ale i sám sebe. Tuto vlastnost můžeme využít pro jednoduché vynucení nových stavů na konfiguračním serveru po aktualizaci repozitáře na github.com.

Konfigurační server

Vytvoříme konfigurační server, kterým nám oba Moodle servery nastaví. Použijeme příkaz virtualmaster create s použitím několika parametrů, kterým server oživíme. Nejprve si na lokálním disku vytvoříme soubor bootstrap_master.sh s následujícím obsahem[6]:

#!/bin/bash# Install salt master
apt-get install python-software-properties -y
add-apt-repository ppa:saltstack/salt -y
apt-get update -y
apt-get install salt-minion -y
apt-get install salt-master -y
apt-get upgrade -y

# Set salt master location and start master
cp /etc/salt/minion.template /etc/salt/minion
sed -e 's/^#master: salt/master: localhost/' -i /etc/salt/minion
service salt-minion restart
service salt-master restart

Poté provedeme inicializaci konfiguračního serveru příkazem virtualmaster create a s parametry:

  • image: Název zdrojového disku
  • script: Skript, který se spustí po prvním startu serveru
  • zone: Datacentrum, kde se server nainstaluje
  • profile: Velikost serveru - paměť a pevné disky
# virtualmaster create salt1.fqdn.cz --image ubuntu_precise --script ~/bootstrap_master.sh 
  --zone vm-prague-l1 --profile micro
Using image 'ubuntu_precise' with ID 2747
Creating 'micro' instance (512 MB memory/10 GB storage)
Instance launch request accepted. Instance ID ******

Default password '**********'

Waiting for instance...........................
Instance ready.

Try to login using `ssh root@salt_master_ip'

Konfigurovaní klienti

Každý server je klientem konfiguračního serveru, který kompletně ovládá jeho prostředí. Na lokálním disku vytvoříme soubor bootstrap_minion.sh s následujícím obsahem, kde nahradíme {{ salt_master_ip }} skutečnou IP adresou tohoto serveru.

#!/bin/bash# Install salt minion
apt-get install python-software-properties -y
add-apt-repository ppa:saltstack/salt -y
apt-get update -y
apt-get install salt-minion -y
apt-get upgrade -y

# Set salt master location and start minion
cp /etc/salt/minion.template /etc/salt/minion
sed -e 's/^#master: salt/master: {{ salt_master_ip }}/' -i /etc/salt/minion
service salt-minion restart

Poté provedeme inicializaci Moodle serverů obdobně jak u konfiguračního serveru.

virtualmaster create moodle1.fqdn.cz --image ubuntu_precise --script ~/bootstrap_minion.sh
  --zone vm-prague-l1 --profile micro
virtualmaster create lamp2.fqdn.cz --image ubuntu_precise --script ~/bootstrap_minion.sh
  --zone vm-prague-l2 --profile micro

Potvrzení klientů

Na konfiguračním serveru potvrdíme klienty příkazem salt-key.

# salt-key
Unaccepted Keys:
moodle1.fqdn.cz
moodle2.fqdn.cz
salt1.fqdn.cz
Accepted Keys:
Rejected:

# salt-key -A
Key for salt1.fqdn.cz accepted.
Key for moodle1.fqdn.cz accepted.
Key for moodle2.fqdn.cz accepted.

# salt-key
Unaccepted Keys:
Accepted Keys:
moodle1.fqdn.cz
moodle2.fqdn.cz
salt1.fqdn.cz
Rejected:

Konfigurační server ovládáme pomocí příkazu salt, kterým posíláme příkazy na připojené klienty (miniony v terminologii Salt).

salt '*' modul.funkce parametry

Otestování správné funčnosti Salt serveru můžeme príkazem test.ping, který zobrazí všechny připojené klienty:

# salt '*' test.ping
salt1.fqnd.cz: True
moodle1.fqdn.cz: True
moodle2.fqdn.cz: True

Konfigurace sluzeb

Nyní máme připravené servery, které je třeba nakonfigurovat. Jádrem našeho HA Moodle řešení jsou 2 stejné LAMP servery s Moodle aplikací, které se vzájemně replikují na úrovni databáze i souborového systému. Architekturu systému demonstruje následují obrázek:

Provedeme nastavení našeho konfiguračního serveru. Musíme vytvořit základní konfigurační soubory:

  • /opt/salt/files/top.sls: Definice základních stavů pro jednotlivé servery
  • /opt/salt/pillar/top.sls: Definice vlastností pro jednotlivé servery
  • /opt/salt/pillar/base.sls: Definice SSH serveru a Salt minionu
  • /opt/salt/pillar/salt1.sls: Definice vlastností konfiguračního serveru
  • /opt/salt/pillar/lamp1.sls: Definice vlastností prvního LAMP serveru
  • /opt/salt/pillar/lamp2.sls: Definice vlastností druhého LAMP serveru

Pro všechny servery je třeba:

  • Nahrát SSH klíče správců a nastavit SSH službu, nastavit apt a Salt-minion službu.

U salt serveru:

  • Nastavit automatické nahrávání stavů z Github repozitáře

Pro Moodle servery:

  • Apache s potřebnými virtualhosty pro moodle aplikace
  • Moodle aplikace synchronizovaná s moodle git repozitářem a správným konfiguračním souborem
  • MySQL s uživateli, databázemi a právy pro aplikaci i replikaci
  • Lsync server s konfigurovaným adresářem pro replikaci

Kvůli základním datům, které se nahrávají do databáze při instalaci Moodle aplikace, je nutné zapnout MySQL replikaci až po prvotní inicializaci moodle instance. Lyncd replikace souborů je bez omezení. Následují detaily jednotlivých konfiguračních souborů:

/opt/salt/files/top.sls

base:
  '*':
    - ubuntu.service
    - openssh.service
    - salt.service
  'salt*':
    - salt_master.service
  'moodle*':
    - apache.service
    - moodle.service
    - mysql.service
    - lsync.service

/opt/salt/pillar/top.sls

base:
  '*':
    - base
  'salt1':
    - salt1
  'moodle1':
    - moodle1
  'moodle2':
    - moodle2

/opt/salt/pillar/base.sls

apt:
  ppas:
  - name: 'saltstack-salt'
    ppa_path: 'saltstack/salt'
ubuntu:
  enabled: true
  environment: production
  users:
  - name: 'username'
    enabled: true
    sudo: true
    full_name: 'Jmeno Prijmeni'
    home: '/home/username'
salt:
  enabled: true
  master: '{{ salt_master_ip }}'
openssh:
  enabled: true
  users:
  - name: 'username'
    enabled: true
    auth_keys:
    - enabled: true
      key: 'ssh-rsa AAAAB3NzaC1y... ...WwznKawZ username@dev1'

/opt/salt/pillar/salt1.sls

salt_master:
  enabled: true
  worker_threads: 5
  states_source: ssh://hg@repo1.htfs.info/salt/states

/opt/salt/pillar/moodle1.sls

apache-php-server: true
apache-php-hosts:
- {app-env: 'moodle-2.3', app-name: 'project', config-name: 'moodle_project',
  host-alias: [], host-name: 'moodle.htfs.info'}
moodle-server: true
moodle-apps:
- config:
    database: {engine: 'mysql', host: '127.0.0.1',
      name: 'moodle_project', password: 'sqlheslo23',
      user: 'moodle_project'}
    vhost: moodle.htfs.info
  name: 'project'
moodle-version: '2.3'
mysql-server: true
mysql-bind-ip: '0.0.0.0'
mysql-replication: true
mysql-replication-server-id: 1
mysql-replication-offset: 1
mysql-replication-master:
  host: '195.140.253.34'
  user: 'replicator'
  password: 'pass23'
mysql-replication-slave:
  host: '195.140.253.34'
  user: 'replicator'
  password: 'pass45'
mysql-version: '5.5'
mysql-databases:
- {'database': 'moodle_project', 'password': 'sqlheslo23',
  'user': 'moodle_project'}
lsync-server: true
lsync-syncs:
- engine: 'rsync'
  source_folder: '/srv/app/moodle-2.3/sites/project/data'
  target_folder: '/srv/app/moodle-2.3/sites/project/data'
  target_host: '195.140.253.34'

Otestujeme správné nastavení serverů příkazem pillar.data, kterým zjistíme, jaké vlastnosti jsou nastavené pro daný server a příkazem state.show_highstate, který zobrazí aktuální nastavení stavů jednotlivých serverů.

# salt '*' pillar.data
# salt '*' state.show_highstates

Pokud vše vypadá v pořádku můžeme přejít na vynucení stavů na klientské servery. První běh bude trvat delší dobu, protože se bude instalovat všechny potřebné balíky, upravovat všechny soubory a ostatní akce potřebné k dosažení požadovaného prostředí.

# salt '*' state.highstates

Inicializace stacku

Nyní máme inicializované oba Moodle servery a můžeme přejít k instalaci Moodle aplikace. Přes webový prohlížeč načteme adresu prvního Moodle serveru a skript v 2. kroku vytvoří potřebné databázové tabulky nahraje základní data. Pak vyplníme další požadované údaje a klikáme na tlačítko další, dokud se nedostaneme na úvodní stranu Moodle aplikace.

Nyní můžeme spustit replikaci MySQL databáze v konfiguraci master <-> master. Provedeme dump MySQL databáze na prvním serveru, ten pak nahrajeme na druhý server, importujeme do databáze a spustíme replikaci.

Nyní máme aplikaci spuštěnou aplikaci v HA konfiguraci. V případě havárie jednoho serveru je třeba provést resynchronizaci replikace databáze.