Pientä säätöä Saltilla

Tämä on palvelinten hallintakurssin harjoitus H1 tehtävä 6. Päätin kokeilumielessä tehdä tilakonfiguraation, joka pitää huolen siitä, että orjakoneella on Apache asennettuna ja käynnissä.

Orjakoneen status

Apache on jo asennettuna.

$ sudo systemctl status apache2

Uusi tilakonfiguraatio master koneelle

$ cd /srv/salt
$ sudoedit mkdir webservice
$ cd webservice
$ sudoedit init.sls
Make sure the apache service is running:
  service.running:
    - name: apache2

Testaus

$ sudo salt '*' state.apply webservice

Tulos

TOP.sls päälle automaattisesti

$ sudoedit /srv/salt/top.sls
base:
  'mono02':
    - webservice

Otetaan top.sls käyttöön saman tien, ja tila pitää huolen, että apache-palvelu on käynnissä orjakoneella.

$  sudo salt '*' state.highstate

Laitetietojen kerääminen koneilta saltin grains-mekanismilla

Harjoituksen koneet ovat kaksi virtuaaliserveriä, joista toinen on Master ja molemmilla koneilla on salt slave.

Salt grain-mekanismilla voi kerätä paljon erilaista tietoa orjakoneista. Alla käyty läpi omasta mielestä mielenkiintoisimpia teitoja, mitä koneista saa kerättyä Master-koneelle.

Grainien kerääminen

sudo salt '*' grains.items|less

Salt grain tarkemmin

Orjakoneelta löytyy tietoa mm.

 sudo salt '*' grains.item host

host:
ubuntu-mono-02

 $ sudo salt '*' grains.item osfinger

Ubuntu-18.04

 $ sudo salt '*' grains.item pythonversion

pythonversion:

– 3
– 6
– 6
– final
– 0

 

 

Salt state kokeilua

Kokeilin tässä harjoituksessa Salt tilaa, ja mallina käytin täältä löytyviä Salt tiloja. Tavoitteena tässä harjoituksessa on asentaa apache ja muokata apachen aloitussivu halutuksi.

Testiympäristönä käytin omaa Läppäriä, jossa Ubuntu 18.04. Asensin ensin samalle koneelle Salt Masterin ja Slaven.

Tilojen luonti

Luodaan hakemisto, jolle Salt tilojen konfigurointitiedostot tulevat.

$ sudo mkdir -p /srv/salt/

Luodaan hakemisto index.html tiedostolle. Luodaan myäs hAkemisto LAMP konfiguraatiolle, mutta aluksi konfiguraatioon tulee vain apache asennus.

$ sudo mkdir /webserver
$ sudo mkdir /lamp

Luodaan tilakonfiguraatiot

Webserver

Luodaan tänne pelkkä index.html tiedosto, tämän tiedoston orjat hakevat.

$ sudoedit /salt/srv/webserver/index.html

<!DOCTYPE html>
<html>
<body>
Hello kaikki!
</body>
</html>

LAMP tilan konfiguraatio

Tila sisältää Apache:n asentamisen, jos sitä ei ole orjakoneella jo asennettuna. Tila sisältää myös Apachen index.html tiedoston viemisen oikeaan hakemistoon.

$ sudoedit /salt/srv/lamp/init.sls

install_lamp:
pkg.installed:
- pkgs:
- apache2

/var/www/html/index.html:
file:
- managed
- source: salt://webserver/index.html
- require:
- pkg: install_lamp

LAMP tilan testaus

Testataan, että Apachen asennus ja index.html tiedoston vieminen oikeaan paikkaan orjakoneella toimivat.

sudo salt '*' state.apply lamp

Tulos

$ sudo salt '*' state.apply lamp

slave1:
----------
ID: install_lamp
Function: pkg.installed
Result: True
Comment: All specified packages are already installed
Started: 19:14:23.920089
Duration: 1030.893 ms
Changes: 
----------
ID: /var/www/html/index.html
Function: file.managed
Result: True
Comment: File /var/www/html/index.html updated
Started: 19:14:24.955357
Duration: 34.369 ms
Changes: 
----------
diff:
--- 
+++ 
@@ -1 +1,8 @@
-Moi
+ <!DOCTYPE html>
+<html>
+<body>
+
+Hello kaikki!
+
+</body>
+</html>

Summary for slave1
------------
Succeeded: 2 (changed=1)
Failed: 0
------------
Total states run: 2
Total run time: 1.065 s

LAMP tila toimii, Apache oli jo aiemmin asennettuna. Samoin index.html tiedosto, mutta se ylikirjoitettiin.

Apache palauttaa nyt oikean index.html sisällön

TOP tilan luominen

TOP tilalla voidaan konfiguroida mille kaikille orjakoneille kohdistuu mikäkin tila. Orjat myös pitävät itsensä automaattisesti tilan mukaisessa konfiguraatiossa.

$ sudoedit /srv/salt/top.sls

base:
  '*':
    - lamp

Testataan TOP konfiguraatio

juha@juha-HP:/srv/salt$ sudo salt '*' state.highstate
slave1:
----------
ID: install_lamp
Function: pkg.installed
Result: True
Comment: All specified packages are already installed
Started: 19:24:45.334768
Duration: 994.227 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: 19:24:46.333198
Duration: 20.692 ms
Changes:

Summary for slave1
------------
Succeeded: 2
Failed: 0
------------
Total states run: 2
Total run time: 1.015 s

TOP tila toimii myös.

Localhost

Salt Master ja Slave pull-arkkitehtuuri

Salt Master ja Slave pull-arkkitehtuuri testausta kurssilta palvelinten hallinta.

OS: Ubuntu 18.04 LTS Master ja Slave koneella.

Master on oma tietokone (läppäri), slave on virtuaalikone Digital Ocean palvelussa.

Master asennus

$ sudo apt-get -y install salt-master
$ hostname -I
192.168.10.52

Master koneella on palomuuri, avataan siihen reiät Saltia varten portteihin 4505/tcp and 4506/tcp.

$ sudo ufw allow 4505/tcp
$ sudo ufw allow 4506/tcp

Slave asennus

$ sudo apt-get -y install salt-minion

Jokaisella orjakoneella pitää olla yksilöivä id ja orjakoneen pitää tietää missä Master-kone sijaitsee. Määritys tehdään tiedostoon /etc/salt/minion

$ sudoedit /etc/salt/minion
master: 192.168.10.52
id: mono1

Jotta asetus tulisi voimaan, pitää tehdä Salt restart orjakoneella. Orjakone ilmoittaa Master-koneelle oman avaimensa, ja Master-koneella voidaan käydä hyväksymässä kone orjaksi.

$ sudo systemctl restart salt-minion.service

Slaven hyväksyntä Masterin hallinnoitavaksi

Orjakoneen avaimen hyväksyntä tapahtuu komennolla, jos kaikki on mennyt hyvin.

$ sudo salt-key -A
The key glob '*' does not match any unaccepted keys.

Jostain syystä Masterilla ei ole orjakoneen avainta tiedossa. Aloitetaan lokien tutkinta. Lähteenä https://docs.saltstack.com/en/latest/ref/configuration/logging/

Lokit löytyy

/var/log/salt/minion

siellä virheilmoitus

2018-10-26 11:46:40,696 [salt.minion :878 ][ERROR ][25772] Error while bringing up mini on for multi-master. Is master at 192.168.10.52 responding?

Loppupäätelmä on, että Master koneen IP on NAT takana. Elisa on ISP. Oman koneen ufw-lokista ei näy mitään yrityksiä päästä koneelle.

Jälkikäteen tajusin, että olisin voinut vaihtaa vain koneiden roolit ja kaikki olisi todennäköisesti toiminut. Mutta päätin asentaa uuden virtuaalipalvelimen Masteriksi.

Uusi Master-kone

Rakensin uuden Master-koneen tekemällä uuden virtuaalikoneen digitalOcean palveluun. Ohje on täällä.

Master koneen IP on 142.93.133.2.

Tehty tämän jälkeen uudella Master koneella

$ sudo apt-get -y install salt-master
$ hostname -I
142.93.133.2

Master koneella on palomuuri, avataan siihen reiät Saltia varten portteihin 4505/tcp and 4506/tcp.

$ sudo ufw allow 4505/tcp
$ sudo ufw allow 4506/tcp

Salt slave asetusten korjaus

$ sudoedit /etc/salt/minion
master: 142.93.133.2
id: mono02

Slaven hyväksyntä uudelle Masterille

$ sudo salt-key -A

Unaccepted Keys:
mono02
Proceed? [n/Y]
Key for minion mono02 accepted.

Kokeiluita

master$ sudo salt '*' cmd.run 'hostname -I'

sudo salt '*' grains.items|less
sudo salt '*' grains.items

$ sudo salt '*' grains.item virtual
$ sudo salt '*' pkg.install httpie
$ sudo salt '*' sys.doc|less

Lähde

http://terokarvinen.com/2018/salt-quickstart-salt-stack-master-and-slave-on-ubuntu-linux

 

Labraharjoitus

Valmistautumista labraharjoitukseen vanhan tehtävän avulla.

Tehtävä.

Asenna Linux

Asennetaan Linux USB-tikulta, siten että koneelle ladataan ensin Linux USB-tikulta. Tällöin voi käyttää nettiä asennuksen ajan tiedon hakuun.

Asennuksen aikana kirjoita ylös luodut salasanat.

Asennuksen jälkeen umounttaa USB-tikku ennen poistoa USB-asemasta.

Huomioita asennuksen aikana ja jälkeen

Oma WordPress sivustolle syötetyt tunnukset ja salasanat menevät http-yhteyden yli. Jatkossa pitää opetalla https-yhteyden tekeminen.

Päivitys

Muista päivittää Ubuntu

$ sudo apt-get update

$ sudp apt-get upgrade

Kuvakaappauksia varten shutter

$ sudo apt-get install shutter

Suorituskyvyn seuranta päälle

$ sudo apt-get -y install sysstat
$ sudoedit /etc/default/sysstat
$ cat /etc/default/sysstat
ENABLED="true"
$ sar

Palomuuri päälle

$ sudo ufw allow 22/tcp

$ sudo ufw allow 80/tcp

$ sudo ufw enable

Luodaan käyttäjät tehtävän mukaan

## Työntekijät

Työntekijöitämme ovat Joe Doe, Jorma Mähkylä, Pekka Hurme, Ronaldo Smith,
Håkan Petersson ja Einari Mikkonen.

Laita einarin käyttäjätunnukseksi "einari". 

Tee kullekin käyttäjälle esimerkkikotisivu.

Skeleton käyttäjien luontiin

Kokeillaan Skeletonin käyttöä, jotta saadaan käyttäjien asetusten luonti automatisoitua. Uusien käyttäjien (‘sudo adduser user’) kotihakemistoon kopioidaan automaattisesti tiedostot /etc/skel/ alta.

$ cd /etc/skel

$ sudoedit mkdir public_html

$ cd public_html

$sudoedit index.html

<!DocTYPE html>
<HTML lang=”en”>
<HEAD>
<meta charset=”utf-8″ />
<TITLE>kotisivu</TITLE>
</HEAD>
<BODY>
Hello World!
</BODY>
</HTML>

Asennetaan SSH ja salasanojen luontia helpottava pwgen

$ sudo apt-get install ssh

$ sudo apt-get install pwgen

Luodaan tiedosto harjoituksen salasanoja varten

$ cd

$pwd

$ touch sala.txt

$ chmod og-wrx sala.txt

$ ls -l

Testataan SSH

$ ssh juha@localhost

$ ssh juha@ip-osoite

Testataan käyttäjän luonti

$ sudo adduser einari

$ ssh einari@localhost

Tiedostot ovat einarin omistuksesssa.

Asennetaan LAMP

## LAMP

Asenna LAMP - Linux, Apache, MySQL, PHP. 

Tee einarin kotihakemistoon esimerkkisovellus, joka näyttää tietueita
tietokannasta.

Apache asennus

$ sudo apt-get install apache2

Testaus

$ echo Moi | sudo tee /var/www/html/index.html

Käyttäjän kotisivut näkyviin kotihakemistosta

$ sudo a2enmod userdir

$ sudo systemctl restart apache2

MariaDB asennus

$ sudo apt-get update
$ sudo apt-get -y install mariadb-client mariadb-server
$ sudo mysql_secure_installation

Set root password? [Y/n]
New password:
Re-enter new password:
Remove anonymous users? [Y/n] y
Disallow root login remotely? [Y/n] y
Remove test database and access to it? [Y/n] y
Reload privilege tables now? [Y/n] y

Kirjaudutaan sisään MariaDB rootina

$ sudo mariadb -u root

Luodaan tietokanta ja taulu tietokantaan

MariaDB [(none)]> CREATE DATABASE animals;

MariaDB [(none)]> USE animals;

MariaDB [animals]> CREATE TABLE animals (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(1024));

MariaDB [animals]> SHOW TABLES;

Tehdään käyttäjä

MariaDB [animals]> GRANT ALL ON animals.* TO animals@localhost IDENTIFIED BY ‘salainen’;

Kirjaudutaan normaalina käyttäjä kantaan

$ mariadb -u animals -p

Lisätään muutama rivi dataa tietokantaan

Database changed
MariaDB [animals]> INSERT INTO animals(name) VALUES (“Horse”);
MariaDB [animals]> INSERT INTO animals(name) VALUES (“Cat”);
MariaDB [animals]> INSERT INTO animals(name) VALUES (“Dog”);
MariaDB [animals]> INSERT INTO animals(name) VALUES (“Snake”);

Automatisoidaan sisäänkirjautuminen

$ touch .my.cnf
$ chmod og-wxr .my.cnf
$ ls -l .my.cnf$ nano .my.cnf

$ nano .my.cnf

user=”animals”
database=”animals”
password=”salainen”

PHP asennus

$ sudo apt-get install libapache2-mod-php php-mysql

Testaus

Sallitaan PHP käyttäjille

$ sudo /etc/apache2/mods-available/php7.2.conf

Kommentoidaan nämä pois

<IfModule mod_userdir.c>
<Directory /home/*/public_html>
php_admin_flag engine Off
</Directory>
</IfModule>

Tehdään testiohjelma

$ ssh einari@localhost

$ cd public_html

$ mv index.html index.php

$ nano index.php

<!DocTYPE html>
<HTML lang=”en”>
<HEAD>
<meta charset=”utf-8″ />
<TITLE>kotisivu</TITLE>
</HEAD>
<BODY>
Hello World!
<?php
print (2+2);
?>
</BODY>
</HTML>

Ajetaan testiohjelma

Tietokantaa käyttävä PHP-ohjelma

<?php

$user='animals';
$password='salainen';

$database=$user;
$dsn="mysql:host=localhost;charset=UTF8;dbname=$database";

$pdo=new PDO($dsn, $user, $password);

// Perform SQL Query
$pdoStatement=$pdo->prepare('SELECT * FROM animals;');
$pdoStatement->execute();
$hits=$pdoStatement->fetchAll();

// Print the $hits Array
foreach($hits as $row) {
 echo "<p>".$row['id']." ".$row['name']."</p>\n";
}
?>

Virtual host

Laita Einarin esimerkkisovellus näkymään osoitteesta

http://invis.example.com.

Voit simuloida nimipalvelun toimintaa hosts-tiedoston avulla.

sudoedit /etc/hosts

127.0.0.1 localhost
127.0.1.1 juha-HP
127.0.0.1 invis.example.com

Apachen konfigurointi

$ sudoedit /etc/apache2/sites-available/invis.example.com.conf

<VirtualHost *:80>

ServerName invis.example.com
ServerAlias www.invis.example.com
DocumentRoot /home/einari/public_html

<Directory /home/einari/public_html>

Require all granted

</Directory>

</VirtualHost>

$ sudo a2ensite invis.example.com

$ sudo systemctl restart apache2

Testaus

BASH-tehtävä

## mitakello

Tee uusi komento 'mitakello', joka tulostaa kellonajan. Komennon tulee
toimia kaikilla käyttäjillä, kaikista hakemistoista pelkällä nimellä
kutsuttuna.

$ nano juhatime.sh

#! /bin/bash
date –iso-8601=min

$ chmod u+x juhatime.sh

Ajetaan

./juhatime.sh

Kaikille käyttäjille

sudo cp juhatime.sh /usr/local/bin/juhatime.sh
[sudo] password for juha:

$ sudo chmod a+x juhatime.sh
/usr/local/bin$ ls -l juhatime.sh
-rwxr-xr-x 1 root root 33 loka 6 14:28 juhatime.sh

Metapaketti

Tee meille metapaketti, joka asentaa ohjelmat: git, httpie, curl, mitmproxy. 

Kuulemma "karvinen equivs" hakusanalla saattaisi löytyä ohjeita. Liitä
metapaketin
lähdekoodi palautettavan lab.txt:n loppuun.

Lähdekoodi tiedostossa juhas-pack.cfg

section: misc
Priority: optional
Standards-Version: 3.9.2
Package: juhas-pack
Version: 0.1
Depends: git, httpie, curl, mitmproxy
Description:
long description and info
.
second paragraph

 

PostgreSQL asennus

Tämä on jatkoa Linux kurssin harjoitustehtäville. Tavoitteena saada Python Flask kehitysympäristö toimimaan PostgreSQL tietokannan kanssa.

Seuraavaksi asennan PostgreSQL:n ja testaan SQL CRUD operaatiot.

Asennus

Asennetaan PostgreSQL

$ sudo apt-get -y install postgresql

Luodaan tietokanta käyttäjälle, joka on kirjautuneena.

$ sudo -u postgres createdb $(whoami)

Luodaan käyttäjä tietokantaan, siten että erillistä kirjautumista ei tarvita tietokantaan. Sama käyttäjä on siis unix- ja tietokantakäyttäjä.

$ sudo -u postgres createuser $(whoami)

Testaus

Kirjaudutaan sisään tietokantaan komennolla

$psql

Login onnistuu

CRUD operaatiot kannassa

Luodaan taulu (C: CREATE)

user => CREATE TABLE horses (id SERIAL PRIMARY KEY, name VARCHAR(200));

PRIMARY KEY id on luokseva numerosarja, eli rivin tunniste taulussa horses. Tietokanta genero isen automaatttisesti, kun uusi rivi lisätään tietokantaa horses-tauluun.

\d komennolla voi tutkia tietokannassa olevia tauluja.

\d horses näyttää taulun rakenteen / tiedot tarkemmin

Lisätään rivi tauluun (C:CREATE)

user=> INSERT INTO horses(name) VALUES (‘Lihapulla’);

user=> INSERT INTO horses(name) VALUES (‘Pasadoble’);

Jos halutaan INSERT lauseen palauttavan luodun rivin id:n, voidaan se tehdä komennolla

INSERT INTO horses(name) VALUES (‘Emir’) RETURNING id, name;

Luetaan tietoa tietokannan taulusta (SELECT)

SELECT lausella voidaan hakea tietoa

user=> SELECT * FROM horses;

Päivitetään tietoa taulussa (UPDATE)

UPDATE lauseella voidaan päivittää tietokannan tietoa.

user=> UPDATE horses SET name=’Ruuna’ WHERE name = ‘Lihapulla’;

SELECT lauseella voidaan tarkistaa tulos

user => SELECT * FROM horses;

Rivin poistaminen (DELETE)

user => DELETE * FROM horses WHERE name =’Ruuna’;

user => SELECT * FROM horses;

Lähde

 

 

 

 

Flask asennus

Jatketaan aiempaa Python3, Apache2, mod_wsgi harjoitusta, ja asennetaan Flask.

Flask asennus

$ sudo apt-get update
$ sudo apt-get -y install python3 ipython3 python3-flask curl

HelloWorld ohjelma testausta varten

$ nano moi.py

from flask import Flask
app = Flask(__name__)

@app.route(‘/’)
def hello_world():
return ‘Hello World by Flask at juhaimmonen.com!\n\n’

if __name__ == ‘__main__’:
app.run(host=’178.128.199.241′, port=80)

Luodaan WSGI-ohjelma

$ nano moi.wsgi

import sys

if sys.version_info[0]<3:       # require python3

raise Exception(“Python3 required! Current (wrong) version: ‘%s'” % sys.version_info)

sys.path.insert(0, ‘/home/vagrant/flask/’)
from moi import app as application

Muokataan Virtual Host asetuksia

$ sudoedit /etc/apache2/sites-available/juhawsgi.conf

<VirtualHost *:80>

ServerName juhawsgi.juhaimmonen.com

WSGIScriptAlias / /home/juhawsgi/public_wsgi/moi.wsgi

WSGIDaemonProcess moi user=juhawsgi group=juhawsgi threads=5

<Directory /home/juhawsgi/public_wsgi/>
WSGIProcessGroup moi
WSGIApplicationGroup %{GLOBAL}
WSGIScriptReloading On

Require all granted
</Directory>

</VirtualHost>

Testaus

Ajetaan wsgi-ohjelma: http://juhawsgi.juhaimmonen.com

Internal server error

Apachen error.log:ssa virheilmoitus

:49692] mod_wsgi (pid=22534, process=’moi’, application=”): Failed to parse WSGI script file ‘/home/juhawsgi/public_wsgi/moi.wsgi’.
[Mon Oct 01 13:23:55.127252 2018] [wsgi:error] [pid 22534] [remote
:49692] mod_wsgi (pid=22534): Exception occurred processing WSGI script ‘/home/juhawsgi/public_wsgi/moi.wsgi’.
[Mon Oct 01 13:23:55.132929 2018] [wsgi:error] [pid 22534] [remote
:49692] File “/home/juhawsgi/public_wsgi/moi.wsgi”, line 3
[Mon Oct 01 13:23:55.132952 2018] [wsgi:error] [pid 22534] [remote
:49692] if sys.version_info[0]<3:\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc
2\xa0 # require python3

Debugattu virettä python3 konsolissa, ja muutettu sisennyksiä ja kommentin paikkaa moi.wsgi tiedostossa:

import sys

#require python
if sys.version_info[0]<3:

raise Exception(“Python3 required! Current (wrong) version: ‘%s'” % sys$

sys.path.insert(0, ‘/home/juhawsgi/public_wsgi/’)
from moi import app as application

Testattu uudestaan, ja nyt ohjelma toimii. URL: http://juhawsgi.juhaimmonen.com

Testattaessa myös komentoriviltä, ohjelma toimii.

$ curl -sH ‘Host: juhawsgi.juhaimmonen.com’ juhaimmonen.com

Hello World by Flask at juhaimmonen.com!

Koodin muuttamisen testaaminen

Tavoite olisi saada koodiin tehtävät muutokset näkymään ilman Apachen restarttia. Tällöin ei myöskään tarvittaisi sudo-oikeuksia.

Apachen virtual host konfiguraatiossa on rivi, jonka pitäisi mahdollistaa se

WSGIScriptReloading On

Editoidaan moi.py-tiedostoa ja muutetaan tekstiä, jonka ohjelma tulostaa. Eli editoidaan riviä

return ‘Hello World by Flask at juhaimmonen.com!\n\n’

muotoon

return ‘Flask koodia at juhaimmonen.com!\n\n’

Tällä ei kuitenkaan ollut toivottua vaikutusta. Sama vanha teksti näkyy edelleen selaimessa.

Apachen restartin jälkeen tulostuu oikea teksti

Tämän jälkeen muutettu tiedoston moi.wsgi aikaleimaa komennolla touch ja muokattu moi.py:n tulostamaa tekstiä.

moi.py-muutos:

return ‘Flask koodia päivityksen jälkeen juhaimmonen.com!\n\n’

$ touch moi.wsgi (komentoriviltä, muuttaa tiedoston päivityksen aikaleimaa)

Nyt ohjelma toimii kuten pitääkin, ja päivityksiä voi tehdä ilman sudo-oikeuksia. Muutin siis aluksi väärän tiedoston aikaleimaa.