Artikkelissa kuvataan LAMP:n asennus Saltilla. Kirjoitus on kotitehtäväpalautus Haaga-Helian Tero Karvisen kurssille ICT4TN011 Linuxin keskitetty hallinta.

Tehtävänanto on seuraavanlainen:

  1. Tee oma Salt-tila, joka asentaa LAMP:n (Linux Apache MySQL PHP).

1 Lähtötilanne

Teen harjoituksen ja muutkin tulevat harjoitukset Digitalocean.com virtuaalipalvelimella jotta vältyn VirtualBoxin kanssa puljaamiselta ja voin tehdä harjoitukset joko työkoneella (MacBook Pro) tai kotikoneella (iMac) helposti ilman linuxin asennusta kumpaankaan. Haaga-Helian opiskelijana saa Githubin Student Developer Pack:n kautta 100$ krediittiä DigitalOceanin palveluun, joten tämä on käytännössä ilmaista.

Lähtötilanteessa on tehtynä jo seuraavaa:

  • Virtuaalikoneet 3kpl on luotu DigitalOceanin web-käyttöliittymän kautta Lontoon palvelinkeskukseen. Käyttöjärjestelmänä DigitalOceanin asentama Ubuntu 14.04 x64.
    • gru.jkw.fi (178.62.126.210)
    • kevin.jkw.fi (46.101.19.106)
    • bob.jkw.fi (178.62.108.191)
  • Olen luonut palvelimille omat käyttäjätunnukseni (jkw) ja asentanut julkiset avaimeni tiedostoon (~/.ssh/authorized_keys) jotta pääsen yhdistämään palvelimille ssh:lla ilman salasanan syöttämistä.
  • Ensimmäinen kotitehtävä on tehty eli:
    • salt-master on asennettu koneelle gru
    • salt-minion on asennettu koneille kevin ja bob
  • Yhteys koneiden välillä toimii, masterilta voi ajaa saltin “reseptejä” minion-koneille komentamalla esimerkiksi salt '*' state.sls nginx
  • Palvelimille on asennettu uusimmat päivitykset (sudo apt-get update && sudo apt-get dist-upgrade) ja palvelimet on sen jälkeen uudelleenkäynnistetty.

2 Apachen asennus

Aloitin tuttuun tapaan luomalla tilalleni hakemiston /srv/salt/lamp ja sinne tiedoston init.sls. Tiedoston sisältö:

apache2:
  pkg:
    - installed
  service.running:
    - enable: True

/var/www/html/index.html:
  file.managed:
    - source: salt://lamp/index.html.jinja
    - template: jinja

Lisäksi loin tuon hallitun default tiedoston templaten /srv/salt/lamp/index.html.jinja:

<!DOCTYPE html>
<html>
<head>
<title>This is apache</title>
</head>
<body>
<h1>Apache is this</h1>
<p>This is being served from:</p> <b></b>

<p>
<?php
phpinfo();
?>
</p>

</body>
</html>

Tarkoituksena on saada Apache asennettua, käyntiin ja kertomaan tiedot PHP:n asennuksesta julkisesti tuolla hallitulla oletussivulla. Toki nyt ei vielä asenneta PHP:ta, joten tuon ei pitäisi vielä toimia vaan näkyä tekstinä. Ennen tilan kokeilemista varmistin ettei ole muita web-palvelimia käynnissä (jossain aiemmassa tehtävässä asennettu nginx on poistettu ja aiemmin):

no webserver serving pages

Seuraavaksi ajoin tekemäni tilan komennolla sudo salt '*' state.sls lamp - kaikki näytti onnistuvan joten tarkistetaan tilanne uudelleen:

apache online

Näköjään PHP osuus jää kokonaan pois, kun sitä ei ole asennettu. Kokeillaan sitä seuraavaksi.

3 PHP:n asennus

Tarkistin ensimmäisenä mikä paketti yhdistää PHP:n ja Apachen, komennolla apt-cache search --names-only php5 | grep apache paketti löytyy kätevästi, todennäköisesti se on libapache2-mod-php5. Katsoin komennolla apt-cache show libapache2-mod-php5 että ko. paketti listaa riippuvuudekseen paketin php5-common, joten todennäköisesti tämän paketin asennus riittää, ja varsinainen php5 kirjasto asentuu riippuvuutena. Tämä on tietysti ehkä Väärä Tapa ™ mutta kokeillaan huvin ja urheilun vuoksi silti.

Lisäsin tiedostoon /srv/salt/lamp/init.sls toisenkin paketin asennuksen:

libapache2-mod-php5:
  pkg:
    - installed

Kokeillaan mitä tapahtuu kun ajetaan tila uudelleen (sudo salt ‘*’ state.sls lamp):

------------
Succeeded: 4 (changed=1)
Failed:    0
------------
Total states run:     4
Total run time:  19.255 s
bob:
----------
          ID: apache2
    Function: pkg.installed
      Result: True
     Comment: Package apache2 is already installed
     Started: 15:32:11.487694
    Duration: 1045.091 ms
     Changes:
----------
          ID: apache2
    Function: service.running
      Result: True
     Comment: The service apache2 is already running
     Started: 15:32:12.533725
    Duration: 43.042 ms
     Changes:
----------
          ID: /var/www/html/index.html
    Function: file.managed
      Result: True
     Comment: File /var/www/html/index.html is in the correct state
     Started: 15:32:12.578976
    Duration: 15.107 ms
     Changes:
----------
          ID: libapache2-mod-php5
    Function: pkg.installed
      Result: True
     Comment: The following packages were installed/updated: libapache2-mod-php5
     Started: 15:32:12.594256
    Duration: 19356.742 ms
     Changes:
              ----------
              libapache2-mod-php5:
                  ----------
                  new:
                      5.5.9+dfsg-1ubuntu4.14
                  old:
              php5-cli:
                  ----------
                  new:
                      5.5.9+dfsg-1ubuntu4.14
                  old:
              php5-common:
                  ----------
                  new:
                      5.5.9+dfsg-1ubuntu4.14
                  old:
              php5-json:
                  ----------
                  new:
                      1.3.2-2build1
                  old:
              php5-mhash:
                  ----------
                  new:
                      1
                  old:
              php5-readline:
                  ----------
                  new:
                      5.5.9+dfsg-1ubuntu4.14
                  old:
              phpapi-20121212:
                  ----------
                  new:
                      1
                  old:
              phpapi-20121212+lfs:
                  ----------
                  new:
                      1
                  old:

Summary for bob
------------
Succeeded: 4 (changed=1)
Failed:    0
------------
Total states run:     4
Total run time:  20.460 s

Näytti toimivan. Web-sivulle ei kuitenkaan ilmesty mitään uutta. Todennäköisesti koko Apachen “modi” php5 ei ole edes enabloitu. Tarkistetaan asia Saltin avulla (deb-apache moduuli):

jkw@gru:/srv/salt$ sudo salt '*' apache.check_mod_enabled php5
kevin:
    False
bob:
    False

Jos modin nimi vaan osui oikeaan niin eipä ole päällä. Yritetään Saltin avulla laittaa päälle:

kw@gru:/srv/salt$ sudo salt '*' apache.a2enmod php5
kevin:
    ----------
    Mod:
        php5
    Name:
        Apache2 Enable Mod
    Status:
        Mod php5 enabled
bob:
    ----------
    Mod:
        php5
    Name:
        Apache2 Enable Mod
    Status:
        Mod php5 enabled

Näyttää siltä että saattoi jopa toimia, mutta sivulle ei vieläkään ilmesty mitään. Todennäköisesti Apache pitää restartata tai reloadata jotta modi menee päälle. Kokeillaan moduulilla service:

jkw@gru:/srv/salt$ sudo salt '*' service.restart apache2
kevin:
    True
bob:
    True

Tämä kaikki pitäisi tietysti tehdä itse salt-tilassa, ei manuaalisilla komennoilla. Mutta tuleepa tutustuttua näihinkin.

Sivu ei vieläkään muuttunut ja tässä vaiheessa tajuan ettei Apache varmaankaan yritän näyttää PHP-sisältöä kun sivun pääte on .html - eipä ole tullut aikoihin PHP:n ja Apachen kanssa säädettyä. Vaihdetaan kohdetiedoston päätettä tiedostossa /srv/salt/lamp/init.sls ja ajetaan tila uudestaan:

bob:
----------
          ID: apache2
    Function: pkg.installed
      Result: True
     Comment: Package apache2 is already installed
     Started: 15:50:23.559237
    Duration: 1701.52 ms
     Changes:
----------
          ID: apache2
    Function: service.running
      Result: True
     Comment: The service apache2 is already running
     Started: 15:50:25.264098
    Duration: 173.208 ms
     Changes:
----------
          ID: /var/www/html/index.php
    Function: file.managed
      Result: True
     Comment: File /var/www/html/index.php updated
     Started: 15:50:25.447637
    Duration: 40.02 ms
     Changes:
              ----------
              diff:
                  New file
              mode:
                  0644
----------
          ID: libapache2-mod-php5
    Function: pkg.installed
      Result: True
     Comment: Package libapache2-mod-php5 is already installed
     Started: 15:50:25.487981
    Duration: 9.324 ms
     Changes:

Summary for bob
------------
Succeeded: 4 (changed=1)
Failed:    0
------------
Total states run:     4
Total run time:   1.924 s

Näyttäisi toimivan. Silti tiedän kyllä kokeilemattakin ettei sivu tule päivittymään. Ongelmaksi muodostuu nyt aiempi tiedosto index.html jota ei suinkaan nyt poistettu, vaan se on edelleen tallessa. Apache todennäköisesti defaulttaa .html tiedostoon. Tässä kohtaa en jaksa tutkia, miten tiedosto poistetaan, ja poistan sen käsin molemmilla minioneilla.

apache online, php shows info

Heti toimii! Tässä kohtaa on selkeä sudenkuoppa keskitetyn hallinnan järjestelmän kanssa, kun aina vaan lisätään olemassa olevan päälle eikä aloiteta alusta. Olen viime aikoinna työskennellyt Dockerin kanssa ohjelmointihommissa, ja siinä pidän paljon juuri siitä että aina aloitetaan alusta, ja on varmaa ettei mikään manuaalinen sähläys näy lopputuloksessa vaan aina mennään Dockerfilen mukaan. Jotenkin tähän oikeiden palvelinten hallintaan voisi saada samaa ideaa mukaan.

4 MySQL:n asennus

Todennäköisesi samainen phpinfo(); osaa muistaakseni näyttää tiedon myös MySQL:n asennuksesta, ainakin jos myös silta PHP:lta MySQL:ään toimii eli välissä toimiva paketti on asennettu myös. Etsitään taas oikea paketti, komento apt-cache search --names-only php | grep mysql löytää ensimmäisenä paketin php5-mysql ja se lienee ihan oikea. Lisätään vielä tuo paketti sekä mysql-server, koska tuo PHP:lle MySQL-yhteyden tarjoava paketti ei vaadi itse MySQL-palvelinta samalle palvelimelle, se on enemmänkin vaan mysql client PHP:n käyttöön.

mysql-server:
  pkg:
    - installed

php5-mysql:
  pkg:
    - installed

Ajoin tilan uudestaan ja kaikki näytti asentuvan ok:

bob:
----------
          ID: apache2
    Function: pkg.installed
      Result: True
     Comment: Package apache2 is already installed
     Started: 16:05:26.744211
    Duration: 1005.177 ms
     Changes:
----------
          ID: apache2
    Function: service.running
      Result: True
     Comment: The service apache2 is already running
     Started: 16:05:27.750298
    Duration: 44.051 ms
     Changes:
----------
          ID: /var/www/html/index.php
    Function: file.managed
      Result: True
     Comment: File /var/www/html/index.php is in the correct state
     Started: 16:05:27.796562
    Duration: 16.58 ms
     Changes:
----------
          ID: libapache2-mod-php5
    Function: pkg.installed
      Result: True
     Comment: Package libapache2-mod-php5 is already installed
     Started: 16:05:27.813275
    Duration: 4.294 ms
     Changes:
----------
          ID: mysql-server
    Function: pkg.installed
      Result: True
     Comment: Package mysql-server is already installed
     Started: 16:05:27.817688
    Duration: 3.664 ms
     Changes:
----------
          ID: php5-mysql
    Function: pkg.installed
      Result: True
     Comment: The following packages were installed/updated: php5-mysql
     Started: 16:05:27.821466
    Duration: 18569.832 ms
     Changes:
              ----------
              php5-mysql:
                  ----------
                  new:
                      5.5.9+dfsg-1ubuntu4.14
                  old:

Summary for bob
------------
Succeeded: 6 (changed=1)
Failed:    0
------------
Total states run:     6
Total run time:  19.644 s

Kokeilin MySQL:n toimivuutta käsin komentorivillä:

jkw@kevin:~$ mysql -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 55
Server version: 5.5.46-0ubuntu0.14.04.2 (Ubuntu)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> select VERSION();
+-------------------------+
| VERSION()               |
+-------------------------+
| 5.5.46-0ubuntu0.14.04.2 |
+-------------------------+
1 row in set (0.00 sec)