Ostatnim elementem serwera LAMP, który konfigurujemy jest baza danych MySQL lub MariaDB. W związku z czym, wzbogacimy konfigurację z poprzednich wpisów o instalację i konfigurację bazy danych. Co pod koniec wpisu da nam w pełni działający serwer LAMP pod nasze przyszłe projekty.
Zanim jednak przejdziemy do samego procesu instalacji i konfiguracji bazy danych dokonamy kilku modyfikacji już istniejącego rozwiązania.
Zaczniemy od pliku Vagrantfile, gdzie przed procesem instalacji Puppet-a dodamy aktualizacją repozytoriów co powinno wyeliminować poniższy błąd z którym możemy się spotkać.
Polecenie aktualizacji listy pakietów z repozytoriów dodajemy przed poleceniem instalacji Puppet-a:
sudo apt-get -y update
Kolejną modyfikacją jest wyłączenie automatycznego sprawdzania, czy jest zainstalowana najnowsza wersja VirtualBox Guest Additions. Potrafi to znacznie spowolnić proces budowania maszyny więc wyłączymy tę opcję. Do konfiguracji dodajemy:
if Vagrant.has_plugin?('vagrant-vbguest')
config.vbguest.auto_update = false
end
Wyłączenie jak widzicie jest warunkowe i uzależnione od zainstalowanego plugin-u Vagrant-a. Jeśli takowego nie macie w systemie to bardzo prosto możecie go zainstalować poleceniem:
vagrant gem install vagrant-vbguest
Po wprowadzonych modyfikacjach plik Vagrantfile powinien wyglądać następująco:
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/xenial64"
config.vm.network :private_network, ip: "192.168.33.10"
if Vagrant.has_plugin?('vagrant-vbguest')
config.vbguest.auto_update = false
end
config.vm.provider "virtualbox" do |vb|
vb.name = "WebServerPuppet"
vb.cpus = 1
vb.memory = 1024
vb.gui = false
end
$provision_script= <<SCRIPT if [[ $(which puppet) != '/usr/bin/puppet' ]]; then sudo apt-get -y update sudo apt-get install -y puppet fi SCRIPT config.vm.provision :shell, :inline => $provision_script
config.vm.provision "puppet" do |puppet|
puppet.manifests_path = "manifests"
puppet.manifest_file = "default.pp"
puppet.module_path = "modules"
end
end
Tutaj zmiany będą bardziej kosmetyczne jednak warto wiedzieć że mamy więcej możliwości jeśli chodzi o instalację pakietów. W poprzednich wpisach posługiwaliśmy się zapisem ensure => installed, który nie jest jedyną możliwością instalacji pakietów. Do dyspozycji mamy jeszcze opcje:
Tak więc po zmianach plik manifests/default.pp
będzie wyglądał następująco:
package { 'nginx':
ensure => present
}
package { 'php7.0':
ensure => present,
require => Package['nginx']
}
package { 'apache2.2-common':
ensure => absent
}
service { 'nginx':
ensure => running,
require => Package['nginx']
}
file { '/etc/nginx/sites-enabled/default':
source => 'puppet:///modules/nginx/site.conf',
notify => Service['nginx']
}
file { '/var/www/html/index.html':
source => 'puppet:///modules/nginx/index.html',
require => File['/etc/nginx/sites-enabled/default']
}
file { '/var/www/html/index.php':
source => 'puppet:///modules/nginx/index.php',
require => File['/etc/nginx/sites-enabled/default']
}
Poza zmianą installed
na present
dokonałem poprawy formatowania kodu, wyrównując => w ramach poszczególnych sekcji.
Jako że poprawki mamy naniesione czas zainstalować ostatni składnik serwera LAMP czyli serwer bazodanowy. Do wyboru mamy wiele baz danych przy czym najpopularniejsza w tego typu konfiguracjach jest MySQL lub jej fork, czyli MariaDB. Oczywiście nic nie stoi na przeszkodzie, aby zainstalować Postgres-a czy inną bazę jaka będzie wam potrzebna.
W zależności o dystrybucji pod nazwą pakietu mysql-server
będzie się kryła baza MySQL lub MariaDB. Na potrzeby tego opisu przyjmiemy, że nie robi nam to różnicy, gdyż proces samej instalacji i konfiguracji nie będzie się różnił.
Zaczynamy oczywiście od instalacji odpowiedniego pakietu dodając wpis w pliku manifests/default.pp
package { 'mysql-server':
ensure => present
}
Zapis powinien odwołuje się do pakietu o nazwie mysql-server
i wymaga, aby ów pakiet był zainstalowany w systemie. Następnie musimy się upewnić, że pakiet będzie uruchomiony w związku z czym tworzymy wpis serwisu.
service { 'mysql':
ensure => true,
enable => true,
require => Package['mysql-server'],
}
Kiedy mamy te dwa wpisy dodane do naszej receptury pozostaje jedynie zbudować maszynę z jej uwzględnieniem i cieszyć się serwerem LAMP. Niestety nie do końca 😉 Otóż jest mały haczyk, mianowicie nie posiadamy użytkownika i hasła na którego mogli byśmy się logować. Tu z pomocą przyjedzie nam aplikacja mysqladmin
, dzięki której możemy ustawić nowe hasło dla użytkownika root
.
Dodajemy wpis do receptury:
exec { "set-mysql-password":
unless => "mysqladmin -uroot -p$mysql_password status",
path => ["/bin", "/usr/bin"],
command => "mysqladmin -uroot password $mysql_password",
require => Service["mysql"],
}
Jako że mamy do czynienia z zasobem typu exec
, którego wcześniej nie omawiałem to przyjrzymy się temu fragmentowi nieco dokładniej. Zapewne po samej nazwie typu wywnioskowaliście, że typ ten służy do uruchamiania zewnętrznych aplikacji. Zatem zapoznajmy się z parametrami jakie zostały tutaj zdefiniowane:
mysqladmin
, gdy użytkownik root
ma ustawione inne hasło niż to znajdujące się w zmiennej $mysql_password
, czyli unless
daje nam możliwość uruchomienia aplikacji, gdy warunek jest nie spełniony. Innymi parametrami tożsamymi z unless
są parametry onlyif
oraz creates
.mysqladmin
zmieniła hasło użytkownika root
mysql
,Ostatni niezbędny element, czyli dodanie zmiennej wraz z hasłem do naszego serwera:
$mysql_password status = 'tajne_haslo'
Na chwilę pominę kwestię, że rozwiązanie to jest słabe. Ponieważ przechowywanie haseł w plikach, które wyślemy do repozytorium jest wyjątkowo złym pomysłem i może się zemścić w przyszłości. Jednak na potrzeby tego przykładu zostawimy to rozwiązanie, które później zmienimy na coś lepszego 😉
Po instalacji bazy danych należało by się upewnić, że baza działa i można z nią się połączyć używając użytkownika i hasła. Najprostszym sposobem będzie oczywiście zalogowanie się do maszyny wirtualnej poleceniem:
vagrant ssh
Następnie przelogowujemy się na root-a poleceniem:
sudo su
I teraz możemy sprawdzić czy serwer żyje poleceniem z receptury:
mysqladmin -uroot -ptajne_haslo status
Jeśli podaliście użyliście inne hasło niż te z przykładu to po fladze -p
musicie wpisać swoje hasło. Po wywołaniu tego polecenia powinniście otrzymać komunikat podobny do tego poniżej.
Początek nas ostrzega przed podawaniem hasła bezpośrednio w linii komend co możemy w tym momencie zignorować. Nas interesuje dalsza część, gdzie mamy Uptime mówiący o czasie działania serwera. Jeśli serwer działa to super, jeśli nie to musicie poszukać błędu czy to w recepturze czy też w systemie.
Powyższy sposób wymaga naszej interakcji, a my dążymy do pełnej automatyzacji więc lepszym rozwiązaniem będzie sprawdzenie tego z poziomu PHP. W tym celu tworzymy prosty skrypt php łączący się z bazą danych. Dodajemy plik mysql.php
w katalogu modules/nginx/files
z zawartością:
<?php
$dbname = 'test';
$dsn = 'mysql:host=localhost;dbname='.$dbname;
$username = 'test';
$password = 'test123';
$options = array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
);
try
{
$dbh = new PDO($dsn, $username, $password, $options);
echo 'Connected';
}
catch(Exception $e)
{
echo 'Error: ' . $e->getMessage();
}
Plik ten odpowiada za połączenie z bazą danych o nazwie test
, chce dokonać połączenia wykorzystując nazwę użytkownika test
oraz hasło test123
. Oczywiście w systemie takiej bazy danych nie mamy, a także takiego użytkownika z takim hasłem w związku z czym przechodzimy do receptury manifest/default.pp
i dodajemy dodatkowe wpisy. Zaczniemy od dodania bazy i użytkownika.
$dbname = 'test'
$dbuser = 'test'
$dbpassword = 'test123'
exec { "create-db":
unless => "/usr/bin/mysql -u${dbuser} -p${dbpassword} ${dbname}",
command => "/usr/bin/mysql -uroot -p$mysql_password -e \"create database ${dbname}; grant all on ${dbname}.* to ${dbuser}@localhost identified by '$dbpassword';\"",
require => Service["mysql"],
}
Następnie dodajemy wpis instalujący dodatkowy pakiet umożliwiający php łączenie się z bazą MySQL:
package { 'php7.0-mysql':
ensure => present,
require => Package['php7.0']
}
Kolejny wpis to przekopiowanie przygotowanego pliku php do odpowiedniego katalogu na maszynie wirtualnej.
file { '/var/www/html/mysql.php':
source => 'puppet:///modules/nginx/mysql.php',
require => File['/etc/nginx/sites-enabled/default']
}
Teraz po zbudowaniu maszyny wirtualnej pod adresem: http://192.168.33.10/mysql.php
powinniśmy zobaczyć komunikat:
Po zainstalowaniu bazy danych i sprawdzeniu, że proces ten jest wykonany prawidłowo mamy recepturę, która buduje nam serwer LAMP. Dodatkowo w tym wpisie poznaliśmy nowy typ zasobu exec, który pozwala uruchamiać zewnętrzne aplikacje co może nam się niejednokrotnie przydać. Cały przedstawiony tutaj kod jak zwykle znajdziecie na GitHub-ie.