Palvelinhallintakurssi – harjoitukset 5

a) Säädä Windowsia Saltilla siten, että Windows on orja ja Linux on herra.

Nämä ovat harjoitustehtäviä palvelintenhallinta kurssille. Tehtävissä olen käyttänyt apuna Teron Karvisen sivuja.

Master – Minion Windows serverille

– Master on Digital Oceanin virtuaalipalvelimessa, jossa Ubuntu 18.04
– Minion on Windows server 2016. Kone on Haaga-Helian verkossa ja NATin takana.

Master tarkemmin
$ sudo salt --version
[sudo] password for mono:
salt 2017.7.4 (Nitrogen)

Minion tarkemmin

Yritin ensin hyödyntää Windows palvelimet kurssilla asennettuja Windows 2016 palvelimia. Ne ovat Haaga-Helian Cloud ympristössä. Windows minioksi yritin saada HH cloudissa oleva controller serverin.

Asensin täältä http://repo.saltstack.com/windows/ paketin
http://repo.saltstack.com/windows/Salt-Minion-2017.7.4-Py3-AMD64-Setup.exe

Windows 2016 serverille.

id: wminion02
master: 178.128.199.241

Asennusikkuna

Asennus onnistui, mutta en koskaan saanut Masterille Minionin avainta. Joten jouduin jatkamaan toisella Windows koneella.

Minion 2

– Win 10
– RAM 8GB
– CPU Intel i5

Asensin minion paketin http://repo.saltstack.com/windows/Salt-Minion-2017.7.4-Py3-AMD64-Setup.exe
Asennus meni ok, ja master sai minionilta avaimen.

b) Säädä Windowsia Saltilla ilman herra-orja rakennetta (salt-call –local)

Kokeilen ajaa minionilla lokaalisti yksinkertaisen ping testin.

Saltin lokaakomennot ajettin PowerShellissä, se aukeaa  ugly-X näppäinyhdsitelmällä. Valittiin “Windows PowerShell (Admin)”.

Lokaalisti komentoja ajetaan

> c:
> cd /salt/
> ls
> ./salt-call --local test.ping

Kokeilen myös salt-minionin uudelleenkäynnistystä lokaalisti, jotta voin tarvittaessa vaikka muuttaa minionin id:tä.

PS C:\salt> net stop salt-minion
The salt-minion service is stopping.
The salt-minion service was stopped successfully.
PS C:\salt> net start salt-minion
The salt-minion service is starting.
The salt-minion service was started successfully.

Olin aiemmin poistanut minionin avaimen Masterilta

$sudo salt-key -d winslave

Nyt Minion ilmoittautui uudestaan Masterille.

c) Muuta jonkin Windows-ohjelman asetuksia Saltilla

Monia ohjelmia voi säätää laittamalla asetustiedoston paikalleen, aivan kuten Linuxissa.

Haetaan Windows ohjelmistopaketit repositorysta

Ensin pitää antaa oikeudet kansioon /srv/salt/win/ salt-ryhmälle.

$ sudo mkdir /srv/salt/win
$ sudo chown root.salt /srv/salt/win
$ sudo chmod ug+rwx /srv/salt/win

Ajetaan Salt masterilla:

$ sudo salt-run winrepo.update_git_repos
$ sudo salt -G 'os:windows' pkg.refresh_db

Asennetaan ohjelma Minionille

$ sudo salt '*' pkg.install git

Testataan Git Windows-koneella

Muutetaan Windows-ohjelman asetuksia Saltilla

Kokeilin tehdä Firefoxille asetusten muutoksia, apuna käytin Teron ohjetta.

Yritin löytää Windosilta Firefox ESRn syspref.js-tiedostoa, mutta en löytänyt sitä. Löysin tiedoston channel-prefs.js. Kokeilen sen muuttamista Salt tilalla, vaikka ei ole luultavasti oikea tiedosto…

Toisaalta jossain asetukset ovat, koska about:config FFssa näyttää:

Tein tilan joka asentaa Firefox ESRn Windows Minonille, ja vie sille konfiguraation channel-prefs.js Windowsille.

firefox-esr:
pkg.installed

firefox_config:
file.managed:
- name: C:\Program Files (x86)\Mozilla Firefox\defaults\pref\channel-prefs.js
- source: salt://ff/channel-prefs.js

ff_service:
service.running:
- name: firefox-esr
- watch:
- file: C:\Program Files (x86)\Mozilla Firefox\defaults\pref\channel-prefs.js

Asennus onnistui, ja konfiguraatiotiedosto vietiin paikalleen, mutta virhettä tuli service.restart osiossa. Eikä konfiguraatiotiedostokaan ollut oikea, etusivu ei vaihtunut.

winslave:
----------
ID: firefox-esr
Function: pkg.installed
Result: True
Comment: All specified packages are already installed
Started: 18:53:04.350912
Duration: 47194.644 ms
Changes:
----------
ID: firefox_config
Function: file.managed
Name: C:\Program Files (x86)\Mozilla Firefox\defaults\pref\channel-prefs.js
Result: True
Comment: File C:\Program Files (x86)\Mozilla Firefox\defaults\pref\channel-prefs.js updated
Started: 18:53:51.545556
Duration: 265.649 ms
Changes:
----------
diff:
---
+++
@@ -1,5 +1,6 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+pref("app.update.channel", "esr");
+pref('browser.startup.homepage', "http://juhaimmonen.com");

-pref("app.update.channel", "esr");
----------
ID: ff_service
Function: service.running
Name: firefox-esr
Result: False
Comment: An exception occurred in this state: Traceback (most recent call last):
File "c:\salt\bin\lib\site-packages\salt\modules\win_service.py", line 298, in info
win32service.SERVICE_QUERY_STATUS)
pywintypes.error: (1060, 'OpenService', 'The specified service does not exist as an installed service.')

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "c:\salt\bin\lib\site-packages\salt\state.py", line 1851, in call
**cdata['kwargs'])
File "c:\salt\bin\lib\site-packages\salt\loader.py", line 1795, in wrapper
return f(*args, **kwargs)
File "c:\salt\bin\lib\site-packages\salt\states\service.py", line 856, in mod_watch
if __salt__['service.status'](name, sig):
File "c:\salt\bin\lib\site-packages\salt\modules\win_service.py", line 547, in status
if info(name)['Status'] in ['Running', 'Stop Pending']:
File "c:\salt\bin\lib\site-packages\salt\modules\win_service.py", line 301, in info
'Failed To Open {0}: {1}'.format(name, exc[2]))
TypeError: 'error' object does not support indexing
Started: 18:53:51.811205
Duration: 15.596 ms
Changes:

Summary for winslave
------------
Succeeded: 2 (changed=1)
Failed: 1

Uusi tila Firefoxin konfiguroimiseen

Tutkittu ohjeita ja muutettu tilaa seuraavasti

init.sls

firefox-esr:
  pkg.installed

firefox_autoconfig:
  file.managed:
    - name: C:\Program Files (x86)\Mozilla Firefox\defaults\pref\autoconfig.js
    - source: salt://ff/autoconfig.js

firefox_config:
  file.managed:
    - name: C:\Program Files (x86)\Mozilla Firefox\mozilla.cfg
    - source: salt://ff/mozilla.cfg
autoconfig.js

// Any comment. You must start the file with a single-line comment!
pref("general.config.filename", "mozilla.cfg");
pref("general.config.obscure_value", 0);
mozilla.cfg

// Any comment. You must start the file with a comment!

// Set default homepage - users can change
// Requires a complex preference
defaultPref("browser.startup.homepage","data:text/plain,browser.startup.homepage=http://juhaimmonen.com");

Tulos:

mono@ubuntu-mono-02:/srv/salt/ff$ sudo salt 'winslave' state.apply ff
winslave:
----------
ID: firefox-esr
Function: pkg.installed
Result: True
Comment: All specified packages are already installed
Started: 19:47:22.055888
Duration: 49485.487 ms
Changes:
----------
ID: firefox_autoconfig
Function: file.managed
Name: C:\Program Files (x86)\Mozilla Firefox\defaults\pref\autoconfig.js
Result: True
Comment: File C:\Program Files (x86)\Mozilla Firefox\defaults\pref\autoconfig.js updated
Started: 19:48:11.541375
Duration: 265.626 ms
Changes:
----------
diff:
New file
----------
ID: firefox_config
Function: file.managed
Name: C:\Program Files (x86)\Mozilla Firefox\mozilla.cfg
Result: True
Comment: File C:\Program Files (x86)\Mozilla Firefox\mozilla.cfg updated
Started: 19:48:11.807001
Duration: 250.006 ms
Changes:
----------
diff:
New file

Summary for winslave
------------
Succeeded: 3 (changed=2)
Failed: 0
------------
Total states run: 3
Total run time: 50.001 s

Etusivu on vaihtunut:

Flask ja tietokantasovellus

Tässä harjoituksessa toteutan palvelinpuolen ohjelman Python Flaskilla, tietokantana on PostgreSQL. Harjoitus on jatko mod_wsgi , PostgreSQL ja Flask-asennuksille. Mallia otettu täältä.

Asennetaan tarvittavat paketit

$ sudo apt-get -y install python3-flask-sqlalchemy python3-psycopg2

Pääohjelma testaamista vartan

# kanta.py
# modified from http://terokarvinen.com/2017/database-connection-from-python-flask-to-postgre-using-raw-sql
# done 3.10.2018

from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
db = SQLAlchemy(app)
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql:///juhawsgi'
app.config['SECRET_KEY'] = 'dfgdfgdfDFGDFGrteERTewasFRdasFGRd'

def sql(rawSql, sqlVars={}):
assert type(rawSql)==str
assert type(sqlVars)==dict
res=db.session.execute(rawSql, sqlVars)
db.session.commit()
return res

@app.before_first_request
def initDBforFlask():
sql("CREATE TABLE IF NOT EXISTS horses (id SERIAL PRIMARY KEY, name VARCHAR(160) UNIQUE);")
sql("INSERT INTO horses(name) VALUES ('Tanhupallo') ON CONFLICT (name) DO NOTHING;")
sql("INSERT INTO horses(name) VALUES ('Kira') ON CONFLICT (name) DO NOTHING;")
sql("INSERT INTO horses(name) VALUES ('Juha') ON CONFLICT (name) DO NOTHING;")
sql("INSERT INTO horses(name) VALUES ('Luumu') ON CONFLICT (name) DO NOTHING;"
)

@app.route("/")
def hello():
return "See you at JuhaImmonen.com! <a href='/horses'>List horses</a>\n"

@app.route("/horses")
def horses():
horses=sql("SELECT * FROM horses;")
return render_template("horses.html", horses=horses)

if __name__ == "__main__":
from flask_sqlalchemy import get_debug_queries
app.run(debug=True)

Templates

templates/horses.html

{% extends "base.html" %}

{%block title%} Horses {%endblock title%}

{% block contents %}
<h1>Horses</h1>
{% for horse in horses %}
<p>{{ horse.name }}</p>
{% endfor %}
{% endblock contents %}

templates/base.html

<!doctype html>
<html>
<head>
<title>
{%block title%}
Hello World
{%endblock title%}
</title>
<meta charset="utf-8" />
</head>
<body>
{% block contents %}
<h1>Hello World</h1>
<p>Let's test UTF-8 with "päivää"</p>
{% endblock contents %}
</body>
</html>

Testaus

Ajettu ohjelma menemällä URL: http://juhawsgi.juhaimmonen.com/

Ohjelma ei toimi, tulostuu “Internal Server Error”

Apachen error.log:ssa on paljon lokitusta. En tiedä tässä vaiheessa mikä on todellinen syy. Onko se tämä:

3
6] sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) FATAL: role “juhawsgi” does not exist

Pitää luoda tietokanta ja käyttäjä, helpointa on käyttää teknistä käyttäjää juhawsgi, jolloin login PostgreSQL kantaan toimii automaattisesti.

Luodaan tietokanta ja käyttäjä

$ sudo -u postgres createdb juhawsgi
$ sudo -u postgres createuser juhawsgi

Ajettu uudelleen ohjelma menemällä URL: http://juhawsgi.juhaimmonen.com/

Nyt toimii ja tietokannasta saadaan myös dataa

Palvelinten hallinta – harjoitus 2

Harjoitustehtävien tekemistä kurssille palvelinten hallinta. Varsinaiset tehtävät ovat täällä.

Tehtävät on tehty omalla  Hewlett-Packard kotikoneella, jossa Ubuntu 18.04. Muistia 6 GB ja CPU on Intel i5 M 450 @ 2.40GHz.

Salt ympäristön asennus

Ympäristö oli asennettu jo aiemmin, tässä vielä lyhyesti Salt Master ja Slave asennus. Asennusohjeet on saatu täältä.

Master asennus

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

Orjakoneen asennus

$ sudo apt-get -y install salt-minion

Määritellään orjakoneelle, missä master palvelin sijaitsee.

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

Otetaan asetus käytöön

$ sudo systemctl restart salt-minion.service

Hyväksytään orjakone msterkoneella

$ sudo salt-key -A

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

Testaus

juha@juha-HP:~$ sudo salt '*' cmd.run whoami
[sudo] password for juha: 
slave1:
root

1. Laita käyttäjien kotisivut toimimaan Apachella

Tehdään asennus ensin käsin, eli asennataan Apache ja sen jälkeen konfiguroidaan kotisivut toimimaan käyttäjien omista kotihakemistoista.

Lähteenä ovat kurssin ohjeet.

Manuaalinen asennus

Koska koneella oli jo Apache, poistan sen asennuksen ensin. Poistaminen vaatii sen selvittämistä, mistä paketeista (riippuvuuksia) Apache2:lla on.

Yritin saada niitä elvilel komennolla

$ apt-cache show apache2

Ja löytyi rivit:

Depends: lsb-base, procps, perl, mime-support, apache2-bin (= 2.4.29-1ubuntu4), apache2-utils (= 2.4.29-1ubuntu4), apache2-data (= 2.4.29-1ubuntu4), perl:any
....
Conflicts: apache2.2-bin, apache2.2-common
Replaces: apache2.2-bin, apache2.2-common
Poistin sitten seuraavat paketit
$ sudo apt-get purge apache2 apache2-utils apache2-bin apache2.2-common

Kokeiltu tämän jälkeen selaimella localhost, ja tulee “Unable to connect” virheilmoitus. Yllä oelva poisto ei kuitenkaan poista kaikkea, vielä jäi esim. oletussivu /var/www/html/index.html

Apachen asennus koneelle

$ sudo apt-get install apache2

Tämän jälkeen pitäisi aueta Apache oletusaloitussivu, mutta poisto ei ollut poistanut aivan kaikkea Apache dataa. Jatkoin kuitenkin harjoituksen tekemistä.

Muutetaan seuraavaksi oletussivun tekstit.

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

Käyttäjien kotihakemistosta ei vielä voi näyttää Web-sivuja. Joten luodaan public_html hakemisto käyttäjälle.

$ pwd
/home/juha$ mkdir public_html$ nano index.html
Tämä on xubuntun kotihakemisto

Kytketään kotisivut toimimaan ja tehdään apache restart

$ sudo a2enmod userdir
$ sudo systemctl restart apache2

Testataan

Seuraavaksi on siivottava apache2 asennus pois koneelta, jotta päästään kokeilemaan Apache2 asennusta ja kotisivujen sallimista Saltin avulla.

$ sudo apt-get purge apache2 apache2-utils apache2-bin apache2.2-common

Masterin asennus ja käyttäjän kotisivut toimimaan

Käytetään cmd.run komentoa

Tehdään tila Apachen asentamiseksi, ja testataan askel kerrallaan.

$ sumkdir /do srv/salt/apache
$ sudoedit /srv/salt/apache/init.sls

apache2:
  pkg.installed

Ajetaan Salt tila

$ sudo salt '*' state.apply apache

Testataan orjakoneella selaimella localhost, ja apache toimii. Selaimelle tulostuu Moi, kuten index.html on kirjoitettu.

Seuraavaksi muokataan Apachen aloitussivu halutuksi. Tehdään oma index.html tiedosto. Lisätään init.sls tiedostoon seuraavat rivit.

$ echo Terve Salt |sudo tee index.html
$ sudoedit /srv/salt/apache/init.sls

/var/www/html/index.html
  file.managed:
    - source: salt://apache/index.html

apache2service
  service.running: 
    - watch: 
      - file: /etc/


Kokeillaan

$ sudo salt '*' state.apply apache

Testataan selaimella localhost ja toimii.

Seuraavaksi tehdään tila, jolla sallitaan käyttäjien kotisivut. Ensimmäinen komento ajaa a2enmod userdir ja toinen tekee apachen restartin kun komento ajetaan.

a2enmod userdir:
 cmd.run:
   - creates: /etc/apache2/mods-enabled/userdir.conf

apache2restart: 
  service.running: 
    - name: apache2 
    - watch: 
       - cmd: 'a2enmod userdir'

Ajetaan komento

$ sudo salt '*' state.apply apache

Testataan ja toimii.

 

Tehdään sama symlinkin / tiedostojen avulla

Malli otettu Teron esimerkistä.

Muokataan init.sls tilaa seuraavaksi.

apache2:
 pkg.installed

/var/www/html/index.html:
 file.managed:
   - source: salt://apache/index.html

/etc/apache2/mods-enabled/userdir.conf:
 file.symlink:
   - target: ../mods-available/userdir.conf

/etc/apache2/mods-enabled/userdir.load:
 file.symlink:
   - target: ../mods-available/userdir.load

apache2restart:
 service.running:
   - name: apache2
   - watch:
     - file: /etc/apache2/mods-enabled/userdir.conf
     - file: /etc/apache2/mods-enabled/userdir.load

Poistetaan apachen asennus.

$ sudo apt-get purge apache2 apache2-utils apache2-bin apache2.2-common

Ajetaan tila

$ sudo salt '*' state.apply apache

Testataan ja toimii.

2. Laita PHP toimimaan käyttäjien kotisivuilla

Tehdään ensin käsin, ja sitten Saltilla.

Manuaalinen asennus

$ sudo apt-get install libapache2-mod-php

Testisivun tekeminen

$ 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>

PHP sallitaan käyttäjille muokkaamalla konfigurointitiedostoa:  /etc/apache2/mods-available/php7.2.conf. Komentoidaan <IfModule> osuus pois.

Apachen restart

$ sudo systemctl restart apache2

Testataan ja toimii.

 PHP asennus Saltilla

Tarvitaan /etc/apache2/mods-available/php7.2.conf tiedosto malliksi, ja kopioidaan se Salt tilan käyttöön.

Selvitetään mitä PHP manuaaliasennuksessa tapahtui ts. mitä tiedostoja muutettiin. Paketin asennus siis tekee tarvittavat symlinkit.

find -printf "%T+ %p\n"|sort
2018-11-03+15:52:46.1631412840 ./php7.2.conf 2018-11-03+15:52:46.1631412840 ./php7.2.load

Poistetaan libapache2-mod-php, jotta voidaan testata. Sen poistaminen ei kuitenkaan riitä, symboliset linkit jäävät jäljelle. Eli poistetaan Apache kokonaan.

$ sudo apt-get purge -y libapache2-mod-php

Asennetaan Apache

$ sudo salt '*' state.apply apache

Tehdään uusi tila

libapache2-mod-php:
  pkg.installed

/etc/apache2/mods-enabled/php7.2.conf:
  file.managed:
    - source: salt://php/php7.2.conf

apache2restart:
  service.running:
    - name: apache2
    - watch:
      - file: /etc/apache2/mods-enabled/php7.2.conf

Ajetaan PHP tila

$ sudo salt '*' state.apply php

Testataan ja toimii.

3. Rakenna tila (state), joka tekee Apachelle uuden nimipohjaisen virtuaalipalvelimen

Virtuaalihostia varten tarvitaan tiedostot.

/etc/hosts
/etc/apache2/sites-available/000-default.conf

Kopioidaan ne hakemistoon

/srv/salt/virtual

Muokataan tiedostoihin tarvittavat asetukset.

Tiedostoon hosts lisätään rivi

127.0.0.1 juha.example.com

Tiedosto 000-default.conf uudelleen nimetään juha.example.com ja sisältö

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

<VirtualHost *:80>

ServerName juha.example.com
ServerAlias www.juha.example.com
DocumentRoot /home/juha/public_html

<Directory /home/juha/public_html>

Require all granted

</Directory>

</VirtualHost>

Virtuaalihostin asennus tehdään komennolla, vaatii Apachen restartin.

$ sudo a2ensite invis.example.com
$ sudo systemctl restart apache2

Tila nimipohjaisen virtuaalipalvelimen hallintaan

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

apache2:
  pkg.installed

/etc/hosts:
  file.managed:
    - source: salt://virtual/hosts

/etc/apache2/sites-available/juha.example.com.conf:
  file.managed:
    - source: salt://virtual/juha.example.com.conf

a2ensite juha.example.com.conf:
  cmd.run

apache2restart:
  service.running:
    - name: apache2
    - watch:
      - file: /etc/apache2/sites-available/juha.example.com.conf

Ajetaan tila

$ sudo salt '*' state.apply virtual

Toimii.

4. Tee tila, joka laittaa esimerkkikotisivun uusille käyttäjille

Laitetaan esimerkkikotisivu /etc/skel/:iin, niin se tulee automaattisesti adduser komennolla käyttäjiä luodessa.

Manuaalisesti tehtynä.

$ 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>

Master osuus

Luodaan index.html tiedosto kansioon /srv/salt/user. Sisältö edellisessä kappaleessa.

$ sudoedit /srv/salt/user

/etc/skel/public_html:
  file.directory:
    - makedirs: True

/etc/skel/public_html/index.html:
  file.manager:
    - source: salt://user/index.html

Ajetaan tila

$ sudo salt '*' state.apply user

Testataan luomalla uusi käyttäjä, ja surffartaan hänen kotisivulleen.

$ sudo adduser matti

Selaimessa näkyy oikea teksti.

5. Eri asetukset. Tee Package-File-Service tilalla eri asetuksia kuin ne, mitä tehtiin tunnilla

Muutetaan tässä harjoituksessa SSH-demonin asetuksia siten, että banner tekstinä tulostuu “Tervetuloa”

Mallia otettu täällä.

Tila ssh:n hallintaan

openssh-server:
 pkg.installed

/etc/ssh/sshd_config:
 file.managed:
   - source: salt://sshd_config

sshd:
 service.running:
   - watch:
     - file: /etc/ssh/sshd_config

Kopioidaan sshd_config tiedosto hakemistoon /srv/salt/ssh.

$ sudo cp  /etc/ssh/sshd_config /srv/salt/ssh

Tehdään banner tiedosto

$ sudoedit /etc/ssh/sshd-banner

Tervetuloa

Muokataan sshd_config tiedostoa

$ sudoedit /srv/salt/ssh/sshd_config
Lisätään rivi
Banner /etc/ssh/sshd-banner

Ajetaan tila

$ sudo salt '*' state.apply ssh

Testataan ssh:ta