Browse Source

Move exercises to their own subfolder

master
Fincer 5 years ago
parent
commit
9330819755
9 changed files with 3917 additions and 8 deletions
  1. +7
    -7
      README.md
  2. +664
    -0
      exercises/h1.md
  3. +1064
    -0
      exercises/h2.md
  4. +836
    -0
      exercises/h3.md
  5. +504
    -0
      exercises/h4.md
  6. +148
    -0
      exercises/h5.md
  7. +107
    -0
      exercises/h6.md
  8. +587
    -0
      exercises/module.md
  9. +0
    -1
      images/.gitignore

+ 7
- 7
README.md View File

@ -11,16 +11,16 @@ README
# Table of contents
- [Exercise 1](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/h1.md)
- [Exercise 1](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/exercises/h1.md)
- [Exercise 2](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/h2.md)
- [Exercise 2](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/exercises/h2.md)
- [Exercise 3](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/h3.md)
- [Exercise 3](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/exercises/h3.md)
- [Exercise 4](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/h4.md)
- [Exercise 4](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/exercises/h4.md)
- [Exercise 5](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/h5.md)
- [Exercise 5](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/exercises/h5.md)
- [Exercise 6](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/h6.md)
- [Exercise 6](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/exercises/h6.md)
- [Course module](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/module.md)
- [Course module](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/exercises/module.md)

+ 664
- 0
exercises/h1.md View File

@ -0,0 +1,664 @@
Palvelinten hallinta - Harjoitus 1
==============
*Disclaimer:*
--------------
Tämä harjoitus on tehty osana Haaga-Helian Tietojenkäsittelyn koulutusohjelman kurssia [Palvelinten hallinta (ICT4TN022, kevät 2018)](http://www.haaga-helia.fi/fi/opinto-opas/opintojaksokuvaukset/ICT4TN022). Kurssin pitäjänä toimii [Tero Karvinen](http://terokarvinen.com/), joka on määritellyt tämän harjoituksen tehtävänkuvaukset. Tehtävien vastaukset ovat Pekka Heleniuksen (allekirjoittanut) tuottamia.
*SISÄLLYSLUETTELO*
--------------
- [c) Asenna Salt Master ja Slave pull-arkkitehtuurilla (eli master on server). Voit laittaa herran ja orjan myös samalle koneelle. Kokeile suorittamalla salt:illa komentoja etänä.](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/h1.md#c-asenna-salt-master-ja-slave-pull-arkkitehtuurilla-eli-master-on-server-voit-laittaa-herran-ja-orjan-my%C3%B6s-samalle-koneelle-kokeile-suorittamalla-saltilla-komentoja-et%C3%A4n%C3%A4)
- [d) Kokeile jotain Laineen esimerkistä lainattua tilaa tai tee jostain tilasta oma muunnelma. Muista testata lopputuloksen toimivuus. Huomaa, että varastossa on myös keskeneräisiä esimerkkejä, kuten Battlenet-asennus Windowsille.](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/h1.md#d-kokeile-jotain-laineen-esimerkist%C3%A4-lainattua-tilaa-tai-tee-jostain-tilasta-oma-muunnelma-muista-testata-lopputuloksen-toimivuus-huomaa-ett%C3%A4-varastossa-on-my%C3%B6s-keskener%C3%A4isi%C3%A4-esimerkkej%C3%A4-kuten-battlenet-asennus-windowsille)
- [e) Kerää laitetietoja koneilta saltin grains-mekanismilla.](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/h1.md#e-ker%C3%A4%C3%A4-laitetietoja-koneilta-saltin-grains-mekanismilla)
- [f) Oikeaa elämää. Säädä Saltilla jotain pientä, mutta oikeaa esimerkiksi omalta koneeltasi tai omalta virtuaalipalvelimelta. (Kannattaa kokeilla Saltia oikeassa elämässä, mutta jos se ei onnistu, rakenna jotain oikeaa konettasi vastaava virtuaaliympäristö ja tee asetus siinä).](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/h1.md#f-oikeaa-el%C3%A4m%C3%A4%C3%A4-s%C3%A4%C3%A4d%C3%A4-saltilla-jotain-pient%C3%A4-mutta-oikeaa-esimerkiksi-omalta-koneeltasi-tai-omalta-virtuaalipalvelimelta-kannattaa-kokeilla-saltia-oikeassa-el%C3%A4m%C3%A4ss%C3%A4-mutta-jos-se-ei-onnistu-rakenna-jotain-oikeaa-konettasi-vastaava-virtuaaliymp%C3%A4rist%C3%B6-ja-tee-asetus-siin%C3%A4)
**c)** Asenna Salt Master ja Slave pull-arkkitehtuurilla (eli master on server). Voit laittaa herran ja orjan myös samalle koneelle. Kokeile suorittamalla salt:illa komentoja etänä.
--------------
**Vastaus:**
```
sudo apt-get update && sudo apt-get install salt-common salt-master salt-minion salt-ssh ssh
```
Näistä salt-master ja salt-ssh (sekä ssh-palvelin) tulee asentaa isäntäkoneelle, salt-minion ja ssh-asiakasohjelma taas asiakaskoneelle. Tässä tapauksessa asennamme molemmat samalle koneelle.
Käynnistetään salt-master:
```
sudo systemctl enable salt-master.service
sudo systemctl start salt-master.service
```
Tarkistetaan salt-masterin status:
```
systemctl status salt-master.service
```
Käynnistetään salt-minion:
```
sudo systemctl enable salt-minion.service
sudo systemctl start salt-minion.service
```
Tarkistetaan salt-minionin status:
```
systemctl status salt-minion.service
```
Haetaan salt-masterin IP-osoite komennolla ifconfig*. IP-osoitetta indikoi tulosteen kohta inet.
*En käytä tässä Debian-pohjaisista jakeluista löytyvää [hostname -I](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=562830) -komentoa, koska sitä ei ole muissa jakeluperheissä laajalti saatavilla oletuksena.
Kerrotaan salt-minionille salt-masterin IP-osoite (tai koneen nimi) luotuun salt-minionin konfiguraatiotiedostoon /etc/salt/minion.
Lisätään minionille ID-tunnus "orja".
Lisätään seuraavat kentät (/etc/salt/minion):
```
master: 127.0.0.1
id: orja
```
Käynnistetään salt-minion uudelleen:
```
sudo systemctl restart salt-minion.service
```
Ajetaan master-koneella komennot:
```
sudo salt-key
sudo salt-key -A
```
Esimerkkituloste:
```
fincer@computer:~$ sudo salt-key
Accepted Keys:
Denied Keys:
Unaccepted Keys:
orja
Rejected Keys:
fincer@computer:~$ sudo salt-key -A
The following keys are going to be accepted:
Unaccepted Keys:
orja
Proceed? [n/Y] y
Key for minion orja accepted.
```
Käynnistetään vielä salt-minion uudelleen:
```
sudo systemctl restart salt-minion.service
```
Ajetaan esimerkkikomento:
```
fincer@computer:~$ sudo salt '*' cmd.run "ls /boot"
orja:
System.map-4.15.0-13-generic
abi-4.15.0-13-generic
config-4.15.0-13-generic
grub
initrd.img-4.15.0-13-generic
memtest86+.bin
memtest86+.elf
memtest86+_multiboot.bin
retpoline-4.15.0-13-generic
vmlinuz-4.15.0-13-generic
```
**d)** Kokeile jotain Laineen esimerkistä lainattua tilaa tai tee jostain tilasta oma muunnelma. Muista testata lopputuloksen toimivuus. Huomaa, että varastossa on myös keskeneräisiä esimerkkejä, kuten Battlenet-asennus Windowsille.
--------------
**Vastaus:**
Luodaan master-koneelle kansiopolku /srv/salt
```
sudo mkdir -p /srv/salt
```
Lisätään tiedosto /srv/salt/top.sls ja /srv/salt/firewall.sls
```
sudo touch /srv/salt/{top.sls,firewall.sls}
```
Lisätään firewall.sls:een seuraava sisältö (sudoedit /srv/salt/firewall.sls):
```
ufw:
pkg.installed
ufw-enable:
cmd.run:
- name: 'ufw --force enable'
- require:
- pkg: ufw
```
Lähde: [joonaleppalahti - firewall.sls](https://github.com/joonaleppalahti/CCM/blob/master/salt/srv/salt/firewall.sls)
Lisätään top.sls:een seuraava sisältö:
```
base:
'orja':
- firewall
```
missä 'orja' on minionin (tai minioneiden, jos regex) ID-tunnus verkossa, ja 'firewall' viittaa masterin kansiossa /srv/salt olevaan tiedostoon firewall.sls, jonka sisältö orjalle ajetaan.
Ajetaan masterilla komento:
```
sudo salt '*' state.highstate
```
jonka output on seuraavaa:
```
fincer@computer:~$ sudo salt '*' state.highstate
orja:
----------
ID: ufw
Function: pkg.installed
Result: True
Comment: All specified packages are already installed
Started: 13:28:16.290668
Duration: 858.482 ms
Changes:
----------
ID: ufw-enable
Function: cmd.run
Name: ufw --force enable
Result: True
Comment: Command "ufw --force enable" run
Started: 13:28:17.190531
Duration: 843.309 ms
Changes:
----------
pid:
10265
retcode:
0
stderr:
stdout:
Firewall is active and enabled on system startup
Summary for orja
------------
Succeeded: 2 (changed=1)
Failed: 0
------------
Total states run: 2
Total run time: 1.718 s
```
UFW-palomuuri oli jo orjakoneelle asennettuna, mutta ei kytkettynä päälle. Täten suoritettiin vain yksi muutos, joskin ajettiin kaksi komentoa orjalle.
**e)** Kerää laitetietoja koneilta saltin grains-mekanismilla.
--------------
**Vastaus:**
Kaikkien masterin hyväksymien minion-koneiden kaikki grains:t saa esille master-koneella ajettavalla komennolla:
```
sudo salt '*' grains.ls
```
Minioneiden salt:sta saa tietoja esimerkiksi seuraavasti (koskee kaikkia minion-koneita verkossa, ks. tähtimerkki):
```
fincer@computer:~$ sudo salt '*' grains.items | grep saltversion -C 4
- candidate
- 1
saltpath:
/usr/lib/python3/dist-packages/salt
saltversion:
2017.7.4
saltversioninfo:
- 2017
- 7
- 4
- 0
```
ja systemd:n pakettitietoja (flags) sekä versionumero:
```
fincer@computer:~$ sudo salt '*' grains.item systemd
orja:
----------
systemd:
----------
features:
+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD -IDN2 +IDN -PCRE2 default-hierarchy=hybrid
version:
237
```
Jne.
**f)** Oikeaa elämää. Säädä Saltilla jotain pientä, mutta oikeaa esimerkiksi omalta koneeltasi tai omalta virtuaalipalvelimelta. (Kannattaa kokeilla Saltia oikeassa elämässä, mutta jos se ei onnistu, rakenna jotain oikeaa konettasi vastaava virtuaaliympäristö ja tee asetus siinä).
--------------
**Vastaus:**
**HUOM!** Tehtävässä ei käytetty salt-ssh:ta!
Asetetaan kaksi konetta samaan verkkoon. Toinen koneista on master, toinen minion.
- Master-koneen saman verkon IP-osoite on (ifconfig) 10.11.11.101
- Minion-koneen saman verkon IP-osoite on (ifconfig) 10.11.11.102
- IP-osoitteet määriteltiin koneille DHCP-palvelimella
Asennetaan Master ja Minion -konfiguraatiot kohdan c) -ohjeita mukaillen. Minion-koneella /etc/salt/minion -tiedostoon annetaan masterin IP-osoite ja orjakoneen ID muodossa
```
master: 10.11.11.101
id: orjakone
```
minkä jälkeen ajetaan master-koneella komennot (HUOM! minion-kone ei heti näy salt-key:n listauksessa):
```
sudo salt-key && sudo salt-key -A
```
Output:
```
fincer@master:~$ sudo salt-key && sudo salt-key -A
Accepted Keys:
Denied Keys:
Unaccepted Keys:
orjakone
Rejected Keys:
The following keys are going to be accepted:
Unaccepted Keys:
orjakone
Proceed? [n/Y] y
Key for minion orjakone accepted.
```
Asennetaan LAMP-ympäristö ja /var/www/html/index.php orjakoneelle. Ajetaan masterilla seuraavat komennot:
```
sudo mkdir -p /srv/salt
echo "<?php phpinfo(); ?>" | sudo tee /srv/salt/index.php
sudo wget https://raw.githubusercontent.com/joonaleppalahti/CCM/master/salt/srv/salt/lamp.sls -O /srv/salt/lamp.sls
sudo sed -i '14,18d; s/salt\:\/\/webserver\//salt\:\/\//' /srv/salt/lamp.sls
sudo salt 'orja*' state.apply lamp
```
Wget:llä ladattu tiedosto sisältää määritykset myös index.html:lle, joita ei tässä laiteta. Siksi kys. tiedostoa koskevat rivit poistetaan em. sed-komennolla. Sed-komennolla poistetaan myös viittaus alihakemistoon webserver.
Output onnistuneesta salt-komennosta (masterilla):
```
fincer@master:~$ cat /srv/salt/lamp.sls
install_lamp:
pkg.installed:
- pkgs:
- apache2
- libapache2-mod-php
/var/www/html/index.php:
file:
- managed
- source: salt://index.php
- require:
- pkg: install_lamp
fincer@master:~$ sudo salt 'orja*' state.apply lamp
orjakone:
----------
ID: install_lamp
Function: pkg.installed
Result: True
Comment: 2 targeted packages were installed/updated.
Started: 15:07:24.960653
Duration: 50817.827 ms
Changes:
----------
apache2:
----------
new:
2.4.29-1ubuntu4
old:
apache2-api-20120211:
----------
new:
1
old:
apache2-api-20120211-openssl1.1:
----------
new:
1
old:
apache2-bin:
----------
new:
2.4.29-1ubuntu4
old:
apache2-data:
----------
new:
2.4.29-1ubuntu4
old:
apache2-utils:
----------
new:
2.4.29-1ubuntu4
old:
httpd:
----------
new:
1
old:
httpd-cgi:
----------
new:
1
old:
libapache2-mod-php:
----------
new:
1:7.2+60ubuntu1
old:
libapache2-mod-php7.2:
----------
new:
7.2.3-1ubuntu1
old:
libapr1:
----------
new:
1.6.3-2
old:
libaprutil1:
----------
new:
1.6.1-2
old:
libaprutil1-dbd-sqlite3:
----------
new:
1.6.1-2
old:
libaprutil1-ldap:
----------
new:
1.6.1-2
old:
liblua5.2-0:
----------
new:
5.2.4-1.1build1
old:
php-calendar:
----------
new:
1
old:
php-cli:
----------
new:
1
old:
php-common:
----------
new:
1:60ubuntu1
old:
php-ctype:
----------
new:
1
old:
php-exif:
----------
new:
1
old:
php-fileinfo:
----------
new:
1
old:
php-ftp:
----------
new:
1
old:
php-iconv:
----------
new:
1
old:
php-json:
----------
new:
1
old:
php-opcache:
----------
new:
1
old:
php-pdo:
----------
new:
1
old:
php-phar:
----------
new:
1
old:
php-posix:
----------
new:
1
old:
php-readline:
----------
new:
1
old:
php-shmop:
----------
new:
1
old:
php-sockets:
----------
new:
1
old:
php-sysvmsg:
----------
new:
1
old:
php-sysvsem:
----------
new:
1
old:
php-sysvshm:
----------
new:
1
old:
php-tokenizer:
----------
new:
1
old:
php7.2-calendar:
----------
new:
1
old:
php7.2-cli:
----------
new:
7.2.3-1ubuntu1
old:
php7.2-common:
----------
new:
7.2.3-1ubuntu1
old:
php7.2-ctype:
----------
new:
1
old:
php7.2-exif:
----------
new:
1
old:
php7.2-fileinfo:
----------
new:
1
old:
php7.2-ftp:
----------
new:
1
old:
php7.2-gettext:
----------
new:
1
old:
php7.2-iconv:
----------
new:
1
old:
php7.2-json:
----------
new:
7.2.3-1ubuntu1
old:
php7.2-opcache:
----------
new:
7.2.3-1ubuntu1
old:
php7.2-pdo:
----------
new:
1
old:
php7.2-phar:
----------
new:
1
old:
php7.2-posix:
----------
new:
1
old:
php7.2-readline:
----------
new:
7.2.3-1ubuntu1
old:
php7.2-shmop:
----------
new:
1
old:
php7.2-sockets:
----------
new:
1
old:
php7.2-sysvmsg:
----------
new:
1
old:
php7.2-sysvsem:
----------
new:
1
old:
php7.2-sysvshm:
----------
new:
1
old:
php7.2-tokenizer:
----------
new:
1
old:
phpapi-20170718:
----------
new:
1
old:
----------
ID: /var/www/html/index.php
Function: file.managed
Result: True
Comment: File /var/www/html/index.php updated
Started: 15:08:15.783571
Duration: 67.439 ms
Changes:
----------
diff:
New file
mode:
0644
Summary for orjakone
------------
Succeeded: 2 (changed=2)
Failed: 0
------------
Total states run: 2
Total run time: 50.885 s
```
Sekä:
```
fincer@master:~$ sudo salt 'orjakone' cmd.run 'dpkg --get-selections | grep apache'
orjakone:
apache2 install
apache2-bin install
apache2-data install
apache2-utils install
libapache2-mod-php install
libapache2-mod-php7.2 install
```

+ 1064
- 0
exercises/h2.md
File diff suppressed because it is too large
View File


+ 836
- 0
exercises/h3.md View File

@ -0,0 +1,836 @@
Palvelinten hallinta - Harjoitus 3
==============
*Disclaimer:*
--------------
Tämä harjoitus on tehty osana Haaga-Helian Tietojenkäsittelyn koulutusohjelman kurssia [Palvelinten hallinta (ICT4TN022, kevät 2018)](http://www.haaga-helia.fi/fi/opinto-opas/opintojaksokuvaukset/ICT4TN022). Kurssin pitäjänä toimii [Tero Karvinen](http://terokarvinen.com/), joka on määritellyt tämän harjoituksen tehtävänkuvaukset. Tehtävien vastaukset ovat Pekka Heleniuksen (allekirjoittanut) tuottamia.
*SISÄLLYSLUETTELO*
--------------
- [b) Tiedosto muotista: tee yksinkertainen SLS-tilatiedosto, joka laittaa muuttujan tiedostoon. Käytä jinjan kontekstimuuttujaa (template: jinja, context: ...)](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/h3.md#b-tiedosto-muotista-tee-yksinkertainen-sls-tilatiedosto-joka-laittaa-muuttujan-tiedostoon-k%C3%A4yt%C3%A4-jinjan-kontekstimuuttujaa-template-jinja-context-)
- [c) SLS tilaa Jinjalla: tee yksinkertainen SLS-tilatiedosto, joka käyttää for-in -silmukaa. Voit esimerkiksi tehdä kolme tiedostoa silmukalla. (Tässä tehtävässä siis käytetään jinjaa vain SLS-tiedoston sisällä, älä sotke samaan esimerkkiin tekstitiedostojen sisällön muuttamista.)](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/h3.md#c-sls-tilaa-jinjalla-tee-yksinkertainen-sls-tilatiedosto-joka-k%C3%A4ytt%C3%A4%C3%A4-for-in--silmukaa-voit-esimerkiksi-tehd%C3%A4-kolme-tiedostoa-silmukalla-t%C3%A4ss%C3%A4-teht%C3%A4v%C3%A4ss%C3%A4-siis-k%C3%A4ytet%C3%A4%C3%A4n-jinjaa-vain-sls-tiedoston-sis%C3%A4ll%C3%A4-%C3%A4l%C3%A4-sotke-samaan-esimerkkiin-tekstitiedostojen-sis%C3%A4ll%C3%B6n-muuttamista)
- [d) SSH-demonin portti: tee tila, joka asentaa SSH-demonin valittuun porttiin. Käytä portin valintaan Jinjaa, siten että sshd_config:issa “Port:”-kohdan arvo tulee Jinjan muuttujasta.](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/h3.md#d-ssh-demonin-portti-tee-tila-joka-asentaa-ssh-demonin-valittuun-porttiin-k%C3%A4yt%C3%A4-portin-valintaan-jinjaa-siten-ett%C3%A4-sshd_configissa-port-kohdan-arvo-tulee-jinjan-muuttujasta)
- [e) Kokeile jonkun toisen opiskelijan tekemää Salt-tilaa. Kokeiltava tila voi olla mistä vain harjoituksesta. Opiskelijoiden raportteja ja koodeja löydät tämän sivun perästä kommenteista.](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/h3.md#e-kokeile-jonkun-toisen-opiskelijan-tekem%C3%A4%C3%A4-salt-tilaa-kokeiltava-tila-voi-olla-mist%C3%A4-vain-harjoituksesta-opiskelijoiden-raportteja-ja-koodeja-l%C3%B6yd%C3%A4t-t%C3%A4m%C3%A4n-sivun-per%C3%A4st%C3%A4-kommenteista)
**b)** Tiedosto muotista: tee yksinkertainen SLS-tilatiedosto, joka laittaa muuttujan tiedostoon. Käytä jinjan kontekstimuuttujaa (template: jinja, context: ...).
--------------
**Vastaus:**
Luodaan tiedosto _/srv/salt/firstninja.sls_ seuraavalla sisällöllä (sudo nano /srv/salt/firstninja.sls):
(Tehtävänannon vaatimus täyttyy state:ssa _put_my_foo_stuff_)
```
# Author: Pekka Helenius (~Fincer), 2018
hostile_secondgroup:
group.present:
- name: foobar
- gid: 666
- system: True
hostile_user:
user.present:
- name: evilninja
- fullname: Evil Ninja
- uid: 666
- gid: 666
- shell: /bin/bash
- home: /home/foo
- groups:
- foobar
- require:
- group: hostile_secondgroup
put_my_foo_stuff:
file.managed:
- name: /foo/mysecretfoo
- source: salt://foofile
- makedirs: True
- user: 666
- group: 666
- mode: 0744
- template: jinja
- context:
supersecretfoo: 'you never know where this came from'
notsosecretbar: 'wanna beer?'
- require:
- user: hostile_user
foo_executable:
file.symlink:
- name: /usr/local/bin/mysecretfoo
- target: /foo/mysecretfoo
- require:
- file: put_my_foo_stuff
evil_nullfiles:
cmd.run:
- name: 'touch ./foo_everywhere'
- cwd: /foo
- creates: foo_everywhere
- creates: foofoo
- require:
- file: put_my_foo_stuff
identity_crisis:
cmd.run:
- name: /usr/bin/id -a
- runas: evilninja
- require:
- user: hostile_user
haha_execute:
cmd.run:
- shell: /bin/sh
- name: mysecretfoo
- require:
- user: hostile_user
- file: foo_executable
```
Lisätään masterille tiedosto _/srv/salt/foofile_ seuraavalla sisällöllä (sudo nano /srv/salt/foofile):
```
#!/bin/sh
echo -e "{{ supersecretfoo }}\n{{ notsosecretbar }}"
```
Tämä tiedosto kirjoitetaan minionin/minioneiden kohteeseen _/foo/mysecretfoo_ ja luodaan symbolinen linkki _/usr/local/bin/mysecretfoo_.
Testataan toimivuus harjoituksessa 1 ja 2 käytetyllä master-minion -tietokonekokoonpanolla (master: master, minion: orjakone):
```
sudo salt 'orjakone' state.apply firstninja
```
Masterilla tulostettu output:
```
orjakone:
----------
ID: hostile_secondgroup
Function: group.present
Name: foobar
Result: True
Comment: Group foobar is present and up to date
Started: 21:52:22.010941
Duration: 1.317 ms
Changes:
----------
ID: hostile_user
Function: user.present
Name: evilninja
Result: True
Comment: User evilninja is present and up to date
Started: 21:52:22.012741
Duration: 13.69 ms
Changes:
----------
ID: put_my_foo_stuff
Function: file.managed
Name: /foo/mysecretfoo
Result: True
Comment: File /foo/mysecretfoo is in the correct state
Started: 21:52:22.027375
Duration: 10.438 ms
Changes:
----------
ID: foo_executable
Function: file.symlink
Name: /usr/local/bin/mysecretfoo
Result: True
Comment: Created new symlink /usr/local/bin/mysecretfoo -> /foo/mysecretfoo
Started: 21:52:22.038030
Duration: 26.087 ms
Changes:
----------
new:
/usr/local/bin/mysecretfoo
----------
ID: evil_nullfiles
Function: cmd.run
Name: touch ./foo_everywhere
Result: True
Comment: Command "touch ./foo_everywhere" run
Started: 21:52:22.066037
Duration: 8.669 ms
Changes:
----------
pid:
3426
retcode:
0
stderr:
stdout:
----------
ID: identity_crisis
Function: cmd.run
Name: /usr/bin/id -a
Result: True
Comment: Command "/usr/bin/id -a" run
Started: 21:52:22.074865
Duration: 158.997 ms
Changes:
----------
pid:
3450
retcode:
0
stderr:
stdout:
uid=666(evilninja) gid=666(foobar) groups=666(foobar)
----------
ID: haha_execute
Function: cmd.run
Name: mysecretfoo
Result: True
Comment: Command "mysecretfoo" run
Started: 21:52:22.234242
Duration: 14.473 ms
Changes:
----------
pid:
3455
retcode:
0
stderr:
stdout:
-e you never know where this came from
wanna beer?
Summary for orjakone
------------
Succeeded: 7 (changed=4)
Failed: 0
------------
Total states run: 7
Total run time: 233.671 ms
```
**c)** SLS tilaa Jinjalla: tee yksinkertainen SLS-tilatiedosto, joka käyttää for-in -silmukaa. Voit esimerkiksi tehdä kolme tiedostoa silmukalla. (Tässä tehtävässä siis käytetään jinjaa vain SLS-tiedoston sisällä, älä sotke samaan esimerkkiin tekstitiedostojen sisällön muuttamista.)
--------------
**Vastaus:**
Luodaan master:lle tiedosto _/srv/salt/first_jinjaloop.sls_ seuraavalla sisällöllä (sudo nano /srv/salt/first_jinjaloop.sls):
```
# Author: Pekka Helenius (~Fincer), 2018
{% for loplop in ['round_1', 'round_2', 'round_3', 'round_4'] %}
loopsloops_noops{{ loop.index }}:
file.managed:
- name: /tmp/loopnoops/{{ loplop }}
- source: salt://loops/jinjaninja_loop
- makedirs: True
- template: jinja
- context:
filenumber: {{ loplop }}
run_fatboy_run_{{ loop.index }}:
cmd.run:
- name: cat /tmp/loopnoops/{{ loplop }}
- require:
- file: loopsloops_noops{{ loop.index }}
{% endfor %}
```
Luodaan masterilla tiedosto */srv/salt/loops/jinjaninja_loop*:
```
sudo mkdir -p /srv/salt/loops
echo "Loops loops noops {{ filenumber }}" | sudo tee /srv/salt/loops/jinjaninja_loop
```
Ajetaan luotu state-tiedosto masterilta orjakone-minionille:
```
sudo salt 'orjakone' state.apply first_jinjaloop
```
Masterilta saatu output:
```
orjakone:
----------
ID: loopsloops_noops1
Function: file.managed
Name: /tmp/loopnoops/round_1
Result: True
Comment: File /tmp/loopnoops/round_1 updated
Started: 22:15:48.402678
Duration: 22.99 ms
Changes:
----------
diff:
New file
mode:
0644
----------
ID: run_fatboy_run_1
Function: cmd.run
Name: cat /tmp/loopnoops/round_1
Result: True
Comment: Command "cat /tmp/loopnoops/round_1" run
Started: 22:15:48.426279
Duration: 9.155 ms
Changes:
----------
pid:
3654
retcode:
0
stderr:
stdout:
Loops loops noops round_1
----------
ID: loopsloops_noops2
Function: file.managed
Name: /tmp/loopnoops/round_2
Result: True
Comment: File /tmp/loopnoops/round_2 updated
Started: 22:15:48.435550
Duration: 18.288 ms
Changes:
----------
diff:
New file
mode:
0644
----------
ID: run_fatboy_run_2
Function: cmd.run
Name: cat /tmp/loopnoops/round_2
Result: True
Comment: Command "cat /tmp/loopnoops/round_2" run
Started: 22:15:48.454122
Duration: 5.179 ms
Changes:
----------
pid:
3656
retcode:
0
stderr:
stdout:
Loops loops noops round_2
----------
ID: loopsloops_noops3
Function: file.managed
Name: /tmp/loopnoops/round_3
Result: True
Comment: File /tmp/loopnoops/round_3 updated
Started: 22:15:48.459403
Duration: 19.723 ms
Changes:
----------
diff:
New file
mode:
0644
----------
ID: run_fatboy_run_3
Function: cmd.run
Name: cat /tmp/loopnoops/round_3
Result: True
Comment: Command "cat /tmp/loopnoops/round_3" run
Started: 22:15:48.479414
Duration: 6.602 ms
Changes:
----------
pid:
3658
retcode:
0
stderr:
stdout:
Loops loops noops round_3
----------
ID: loopsloops_noops4
Function: file.managed
Name: /tmp/loopnoops/round_4
Result: True
Comment: File /tmp/loopnoops/round_4 updated
Started: 22:15:48.486128
Duration: 18.883 ms
Changes:
----------
diff:
New file
mode:
0644
----------
ID: run_fatboy_run_4
Function: cmd.run
Name: cat /tmp/loopnoops/round_4
Result: True
Comment: Command "cat /tmp/loopnoops/round_4" run
Started: 22:15:48.505300
Duration: 9.609 ms
Changes:
----------
pid:
3660
retcode:
0
stderr:
stdout:
Loops loops noops round_4
Summary for orjakone
------------
Succeeded: 8 (changed=8)
Failed: 0
------------
Total states run: 8
Total run time: 110.429 ms
```
**d)** SSH-demonin portti: tee tila, joka asentaa SSH-demonin valittuun porttiin. Käytä portin valintaan Jinjaa, siten että sshd_config:issa “Port:”-kohdan arvo tulee Jinjan muuttujasta.
--------------
**Vastaus:**
**HUOM!** Koska tehtävänannossa ei pyydetty käyttämään master-koneella sijaitsevaa esimääritettyä SSHD:n konfiguraatiotiedostoa ja pyydettiin vaihtamaan pelkkä SSHD:n yhteysportti minionille/minioneille, on SLS-tiedosto rakennettu tämän esivaatimuksen pohjalta. Yleisesti voidaan haluta samat asetukset kaikille minioneille, jolloin tulee käyttää esimääritettyä SSHD:n konfiguraatiotiedostoa, joka korvaa minionilla/minioneilla olevan tiedoston.
Halusin kokeilla jinja:lla lukujen generointia tässä tehtävässä. Olisi voitu toki käyttää ennalta määriteltyä porttia, mutta hauskempaa generoida jotain satunnaista. Soveltuuko tämä käyttökohteeseen, it's up to you.
SSH-portti generoidaan väliltä 23-600. Käytetään seuraavaa sisältöä uuteen state-tiedostoon.
Luodaan masterille tiedosto _srv/salt/ssh_random/init.sls_ (sudo mkdir -p /srv/salt/ssh_random && sudo nano /srv/salt/ssh_random/init.sls):
```
# Author: Pekka Helenius (~Fincer), 2018
{% set supersecret_ssh_port = range(23, 600) | random %}
check_sshd_install:
pkg.installed:
- pkgs:
- openssh-server # Ubuntu specific
check_sshd_config:
file.managed:
- name: /etc/ssh/sshd_config
- require:
- pkg: check_sshd_install
check_sshd_current_port:
cmd.run:
- name: 'echo "current SSH daemon port for $(hostname) (Salt ID: {{ grains['id'] }}) is: $(grep -E ^[#P]+ort /etc/ssh/sshd_config)"'
- require:
- file: check_sshd_config
prevent_if_ssh_sessions_open:
cmd.run:
- names:
- 'SSH_SESSIONS=$(/bin/netstat -ntpa | grep "ESTABLISHED.*sshd"); if [ $(echo $SSH_SESSIONS | wc -w) -gt 1 ]; then echo -e "$(hostname) (Salt ID: {{ grains['id'] }}): The following established SSH session were found:\n$SSH_SESSIONS\n\nNot changing SSH daemon port." && false; fi'
- unset SSH_SESSIONS
- require:
- file: check_sshd_config
- cmd: check_sshd_current_port
new_ssh_port:
file.replace:
- name: /etc/ssh/sshd_config
- pattern: '^[#P]+ort [0-9][0-9]*'
- repl: 'Port {{ supersecret_ssh_port }}'
- require:
- cmd: prevent_if_ssh_sessions_open
sshd_restart:
service.running:
- name: ssh.service # Yes, this is the daemon process
- watch:
- file: new_ssh_port
ssh_new_port_inform:
cmd.run:
- name: 'echo "new SSH daemon port for $(hostname) (Salt ID: {{ grains['id'] }}) is {{ supersecret_ssh_port }}"'
- require:
- service: sshd_restart
- file: new_ssh_port
```
Ajetaan ssh_random -state masterilta kaikille yhteydessä oleville minioneille:
```
sudo salt '*' state.apply ssh_random
```
Masterilla saatu output minionille "orjakone":
```
orjakone:
----------
ID: check_sshd_install
Function: pkg.installed
Result: True
Comment: All specified packages are already installed
Started: 14:26:13.249172
Duration: 416.921 ms
Changes:
----------
ID: check_sshd_config
Function: file.managed
Name: /etc/ssh/sshd_config
Result: True
Comment: File /etc/ssh/sshd_config exists with proper permissions. No changes made.
Started: 14:26:13.668542
Duration: 1.195 ms
Changes:
----------
ID: check_sshd_current_port
Function: cmd.run
Name: echo "current SSH daemon port for $(hostname) (Salt ID: orjakone) is: $(grep -E ^[#P]+ort /etc/ssh/sshd_config)"
Result: True
Comment: Command "echo "current SSH daemon port for $(hostname) (Salt ID: orjakone) is: $(grep -E ^[#P]+ort /etc/ssh/sshd_config)"" run
Started: 14:26:13.671432
Duration: 4.479 ms
Changes:
----------
pid:
2813
retcode:
0
stderr:
stdout:
current SSH daemon port for minion (Salt ID: orjakone) is: Port 22
----------
ID: prevent_if_ssh_sessions_open
Function: cmd.run
Name: SSH_SESSIONS=$(/bin/netstat -ntpa | grep "ESTABLISHED.*sshd"); if [ $(echo $SSH_SESSIONS | wc -w) -gt 1 ]; then echo -e "$(hostname) (Salt ID: orjakone): The following established SSH session were found:\n$SSH_SESSIONS\n\nNot changing SSH daemon port." && false; fi
Result: True
Comment: Command "SSH_SESSIONS=$(/bin/netstat -ntpa | grep "ESTABLISHED.*sshd"); if [ $(echo $SSH_SESSIONS | wc -w) -gt 1 ]; then echo -e "$(hostname) (Salt ID: orjakone): The following established SSH session were found:\n$SSH_SESSIONS\n\nNot changing SSH daemon port." && false; fi" run
Started: 14:26:13.676350
Duration: 13.544 ms
Changes:
----------
pid:
2816
retcode:
0
stderr:
stdout:
----------
ID: prevent_if_ssh_sessions_open
Function: cmd.run
Name: unset SSH_SESSIONS
Result: True
Comment: Command "unset SSH_SESSIONS" run
Started: 14:26:13.690114
Duration: 3.341 ms
Changes:
----------
pid:
2823
retcode:
0
stderr:
stdout:
----------
ID: new_ssh_port
Function: file.replace
Name: /etc/ssh/sshd_config
Result: True
Comment: Changes were made
Started: 14:26:13.693988
Duration: 4.119 ms
Changes:
----------
diff:
---
+++
@@ -10,7 +10,7 @@
# possible, but leave them commented. Uncommented options override the
# default value.
-Port 22
+Port 199
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
----------
ID: sshd_restart
Function: service.running
Name: ssh.service
Result: True
Comment: Service restarted
Started: 14:26:13.724516
Duration: 31.875 ms
Changes:
----------
ssh.service:
True
----------
ID: ssh_new_port_inform
Function: cmd.run
Name: echo "new SSH daemon port for $(hostname) (Salt ID: orjakone) is 199"
Result: True
Comment: Command "echo "new SSH daemon port for $(hostname) (Salt ID: orjakone) is 199"" run
Started: 14:26:13.756793
Duration: 7.15 ms
Changes:
----------
pid:
2832
retcode:
0
stderr:
stdout:
new SSH daemon port for minion (Salt ID: orjakone) is 199
Summary for orjakone
------------
Succeeded: 8 (changed=6)
Failed: 0
------------
Total states run: 8
Total run time: 482.624 ms
```
Näyttäisi siltä, että portti 199 on generoitu uudeksi SSH daemonin yhteysportiksi koneelle 'orjakone'. Varmistetaan tietojen oikeellisuus. Tämän voi tehdä etänä SSH-yhteyden avulla muultakin koneelta (testataan yhteyden toimivuus orjakoneen IP:een SSH clientilla porttia 199 käyttäen),
mutta tässä varmistamme SSH-yhteyden toimivuuden portissa 199 suoraan minionin näkymästä:
/etc/ssh/sshd_config -tiedoston sisältöä SSH-client testauksineen orjakoneen näkymästä ylläolevan ajon jälkeen:
![randomport-from-master](https://raw.githubusercontent.com/Fincer/central-management-of-multiple-servers/master/images/ssh_randomport_for_minion_2.png)
Toinen esimerkki:
![randomport-from-master](https://raw.githubusercontent.com/Fincer/central-management-of-multiple-servers/master/images/ssh_randomport_for_minion.png)
**Lisänä - SSH-portin vaihtamisen estäminen, jos SSH-yhteyksiä on muodostettu minionille**
Jos SSH-yhteyksiä on minionilla auki, voimme haluta estää portin vaihtamisen kesken kaiken. Yllä olevassa SLS-tiedostossa tämä on määritetty state:lla _prevent_if_ssh_sessions_open_.
Masterin output, jos minionilla on SSH-yhteyksiä auki:
```
orjakone:
----------
ID: check_sshd_install
Function: pkg.installed
Result: True
Comment: All specified packages are already installed
Started: 14:29:50.043605
Duration: 390.748 ms
Changes:
----------
ID: check_sshd_config
Function: file.managed
Name: /etc/ssh/sshd_config
Result: True
Comment: File /etc/ssh/sshd_config exists with proper permissions. No changes made.
Started: 14:29:50.436782
Duration: 1.099 ms
Changes:
----------
ID: check_sshd_current_port
Function: cmd.run
Name: echo "current SSH daemon port for $(hostname) (Salt ID: orjakone) is: $(grep -E ^[#P]+ort /etc/ssh/sshd_config)"
Result: True
Comment: Command "echo "current SSH daemon port for $(hostname) (Salt ID: orjakone) is: $(grep -E ^[#P]+ort /etc/ssh/sshd_config)"" run
Started: 14:29:50.438437
Duration: 3.965 ms
Changes:
----------
pid:
2987
retcode:
0
stderr:
stdout:
current SSH daemon port for minion (Salt ID: orjakone) is: Port 379
----------
ID: prevent_if_ssh_sessions_open
Function: cmd.run
Name: SSH_SESSIONS=$(/bin/netstat -ntpa | grep "ESTABLISHED.*sshd"); if [ $(echo $SSH_SESSIONS | wc -w) -gt 1 ]; then echo -e "$(hostname) (Salt ID: orjakone): The following established SSH session were found:\n$SSH_SESSIONS\n\nNot changing SSH daemon port." && false; fi
Result: False
Comment: Command "SSH_SESSIONS=$(/bin/netstat -ntpa | grep "ESTABLISHED.*sshd"); if [ $(echo $SSH_SESSIONS | wc -w) -gt 1 ]; then echo -e "$(hostname) (Salt ID: orjakone): The following established SSH session were found:\n$SSH_SESSIONS\n\nNot changing SSH daemon port." && false; fi" run
Started: 14:29:50.442778
Duration: 11.447 ms
Changes:
----------
pid:
2990
retcode:
1
stderr:
stdout:
-e minion (Salt ID: orjakone): The following established SSH session were found:
tcp6 0 0 ::1:379 ::1:36896 ESTABLISHED 2869/sshd: fincer [
Not changing SSH daemon port.
----------
ID: prevent_if_ssh_sessions_open
Function: cmd.run
Name: unset SSH_SESSIONS
Result: True
Comment: Command "unset SSH_SESSIONS" run
Started: 14:29:50.454451
Duration: 3.132 ms
Changes:
----------
pid:
2998
retcode:
0
stderr:
stdout:
----------
ID: new_ssh_port
Function: file.replace
Name: /etc/ssh/sshd_config
Result: False
Comment: One or more requisite failed: ssh_random.prevent_if_ssh_sessions_open
Changes:
----------
ID: sshd_restart
Function: service.running
Name: ssh.service
Result: False
Comment: One or more requisite failed: ssh_random.new_ssh_port
Changes:
----------
ID: ssh_new_port_inform
Function: cmd.run
Name: echo "new SSH daemon port for $(hostname) (Salt ID: orjakone) is 258"
Result: False
Comment: One or more requisite failed: ssh_random.sshd_restart, ssh_random.new_ssh_port
Changes:
Summary for orjakone
------------
Succeeded: 4 (changed=3)
Failed: 4
------------
Total states run: 8
Total run time: 410.391 ms
ERROR: Minions returned with non-zero exit code
```
![prevent-ssh-portchange_](https://raw.githubusercontent.com/Fincer/central-management-of-multiple-servers/master/images/salt_ssh-prevent-portchange.png)
**e)** Kokeile jonkun toisen opiskelijan tekemää Salt-tilaa. Kokeiltava tila voi olla mistä vain harjoituksesta. Opiskelijoiden raportteja ja koodeja löydät tämän sivun perästä kommenteista.
--------------
**Vastaus:**
Valitaan henkilön Oliver Siren harjoitus 3:n [Salt state, Jinja for-in loop](https://github.com/Oliver-Siren/palvelinten-hallinta-ict4tn022-4/blob/master/assignments/h3.md#salt-state-jinja-for-in-loop) -tehtävän vastaus.
Ladataan wget-komennolla init.sls-tiedosto masterilla paikalliseen kansioon _/srv/salt/student_sample_:
SLS-tiedostossa on oletettu, että tiedosto _/srv/salt/jinja/fool.txt_ on olemassa masterilla. Koska sitä ei ole, me luomme sen alla olevassa komentorimpsussa.
```
sudo -- sh -c ' \
mkdir -p /srv/salt/student_sample && mkdir -p /srv/salt/jinja && \
wget https://raw.githubusercontent.com/Oliver-Siren/palvelinten-hallinta-ict4tn022-4/master/assignments/h3.md -O /srv/salt/student_sample/init.sls && \
sed -i '51,61!d' /srv/salt/student_sample/init.sls && \
echo "This is your {{ file }}" > /srv/salt/jinja/fool.txt
'
```
Ajetaan tila masterilta kaikille saataville orja-alkuisille minioneille:
```
sudo salt 'orja*' state.apply student_sample
```
Masterilla saatu output:
```
orjakone:
----------
ID: /tmp/fool/first.txt
Function: file.managed
Result: True
Comment: File /tmp/fool/first.txt updated
Started: 00:16:20.842493
Duration: 25.759 ms
Changes:
----------
diff:
New file
mode:
0644
----------
ID: /tmp/fool/second.txt
Function: file.managed
Result: True
Comment: File /tmp/fool/second.txt updated
Started: 00:16:20.868344
Duration: 19.281 ms
Changes:
----------
diff:
New file
mode:
0644
----------
ID: /tmp/fool/third.txt
Function: file.managed
Result: True
Comment: File /tmp/fool/third.txt updated
Started: 00:16:20.887697
Duration: 17.221 ms
Changes:
----------
diff:
New file
mode:
0644
----------
ID: /tmp/fool/fourth.txt
Function: file.managed
Result: True
Comment: File /tmp/fool/fourth.txt updated
Started: 00:16:20.904989
Duration: 19.971 ms
Changes:
----------
diff:
New file
mode:
0644
Summary for orjakone
------------
Succeeded: 4 (changed=4)
Failed: 0
------------
Total states run: 4
Total run time: 82.232 ms
```
Wget:llä ladatun ja sed:llä parsitun esimerkki-SLS -tiedoston sisältö:
```
{% for tiedosto in ['first.txt', 'second.txt', 'third.txt', 'fourth.txt'] %}
/tmp/fool/{{ tiedosto }}:
file.managed:
- source: salt://jinja/fool.txt
- makedirs: True
- template: jinja
- context:
file: {{ tiedosto }}
{% endfor %}
```

+ 504
- 0
exercises/h4.md View File

@ -0,0 +1,504 @@
Palvelinten hallinta - Harjoitus 4
==============
*Disclaimer:*
--------------
Tämä harjoitus on tehty osana Haaga-Helian Tietojenkäsittelyn koulutusohjelman kurssia [Palvelinten hallinta (ICT4TN022, kevät 2018)](http://www.haaga-helia.fi/fi/opinto-opas/opintojaksokuvaukset/ICT4TN022). Kurssin pitäjänä toimii [Tero Karvinen](http://terokarvinen.com/), joka on määritellyt tämän harjoituksen tehtävänkuvaukset. Tehtävien vastaukset ovat Pekka Heleniuksen (allekirjoittanut) tuottamia.
*SISÄLLYSLUETTELO*
--------------
- [Harjoituksen esivaatimus - kahden minion-koneen asentaminen Vagrantilla](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/h4.md#harjoituksen-esivaatimus---kahden-minion-koneen-asentaminen-vagrantilla)
- [b) Tee kahdella orjalla esimerkki, jossa orjat saavat eri muuttujan pilarista. Tarkista ‘pillars.items’, että kummalekin orjalle mene eri tieto. Tee jokin muu kuin tunnilla tehty sshd-esimerkki.](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/h4.md#b-tee-kahdella-orjalla-esimerkki-jossa-orjat-saavat-eri-muuttujan-pilarista-tarkista-pillarsitems-ett%C3%A4-kummalekin-orjalle-mene-eri-tieto-tee-jokin-muu-kuin-tunnilla-tehty-sshd-esimerkki)
- [c) Tee kahdella orjalla esimerkki, jossa toinen orja saa muuttujan pilarista ja toinen käyttää oletusarvoa (pillar.get). Tee jokin muu kuin tunnilla tehty sshd-esimerkki.](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/h4.md#c-tee-kahdella-orjalla-esimerkki-jossa-toinen-orja-saa-muuttujan-pilarista-ja-toinen-k%C3%A4ytt%C3%A4%C3%A4-oletusarvoa-pillarget-tee-jokin-muu-kuin-tunnilla-tehty-sshd-esimerkki)
Harjoituksen esivaatimuksena on käyttää useampaa Minion-konetta Salt:lla. Useamman Salt-minionin luomiseen on monta eri tapaa, kuten
- 1) luodaan jokaiselle minionille oma virtuaalikoneensa (Oracle VirtualBox, VMWare, Vagrant...), jotka kykenevät muodostamaan yhteyden Master-koneeseen
- 2) luodaan jokaiselle minionille oma konttinsa (docker, systemd-nspawn), jotka kykenevät muodostamaan yhteyden Master-koneeseen
- 3) käytetään olemassa olevia virtuaalikoneita, jotka pyörivät esimerkiksi palvelinsaleissa
- 4) luodaan joko fyysiselle tai virtuaaliselle tietokoneelle useampi minion-konfiguraatio omine ID:ineen (huonoin!)
Toteutetaan vaihtoehto 1) Vagrantilla.
Harjoituksen esivaatimus - kahden minion-koneen asentaminen Vagrantilla
--------------
Toteutetaan minion-koneet [Vagrant-virtualisoinnilla](https://en.wikipedia.org/wiki/Vagrant_(software)).
Tässä vaiheessa oletetaan, että koneelta löytyy Salt-master jo valmiina (ks. mm. [harjoitus 1](https://raw.githubusercontent.com/Fincer/central-management-of-multiple-servers/master/h1.md)).
Asennetaan vagrant
```
sudo apt-get -y install vagrant
```
Tietokoneelta löytyy ennestään _virtualbox_ asennettuna, mutta se voidaan asentaa myös:
```
sudo apt-get -y install virtualbox
```
Vagrant käyttää laatikoita (boxes) virtualisoitujen ympäristöjen toteuttamisessa. Käytän harjoituksessa laatikkoa [debian/jessie64](https://app.vagrantup.com/debian/boxes/jessie64). Tässä täytyy olla tarkkana, ettei käytettyjen Salt:ien versiot ja API:t rikkoonnu! Tuotantoympäristössä nämä on tarkistettava ja katsottava huolella!
Luodaan kaksi Salt minion -konetta ajamalla seuraava Vagrantfile Master-koneen myöhemmin valittavassa alihakemistossa:
[Vagrantfile - Multiple Salt minions](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/scripts/vagrant_salt-minions/Vagrantfile)
**HUOM!** Vagrant-ratkaisu ei toimi hyvin jo-virtualisoiduissa työympäristöissä, eli Vagrantia tulisi ajaa "fyysisellä" koneella.
Ladataan yllä mainittu Vagrantfile master-koneen alihakemistoon /srv/salt/vagrant_minions:
```
sudo mkdir -p /srv/salt/vagrant_minions
sudo wget https://raw.githubusercontent.com/Fincer/central-management-of-multiple-servers/master/scripts/vagrant_salt-minions/Vagrantfile -O /srv/salt/vagrant_minions/Vagrantfile
```
Ladatussa Vagrantfile:ssä on jo ennestään määritetty luotavaksi kaksi Salt-minionia: minion_1 ja minion_2 laatikkotemplatella debian/jessie64.
**HUOM!** Monet _vagrant_ -komennot on sidottu työhakemistoon. Ennestään luodut virtuaalikoneet tulee ne tuhota siitä hakemistosta käsin, jossa koneet on luotu (ja siis jossa Vagrantfile sijaitsee). Vagrant luo tähän hakemistoon piilohakemiston _.vagrant/machines_, johon koneet on luotu.
Annetaan master-koneen normaalille ylläpitäjälle (UID: 1000, GID: 1000 ja kuuluu sudo-ryhmään) omistusoikeus kansioon /srv/salt/vagrant_minions:
```
sudo chown 1000:1000 -R /srv/salt/vagrant_minions
```
Luodaan tällä käyttäjällä tuohon hakemistoon viittaava symbolinen linkki kys. käyttäjän kotihakemistoon:
```
ln -s /srv/salt/vagrant_minions $HOME/vagrant-minions
```
**HUOM!** Edellä olevaa ei ole pakko tehdä, ja se on täysin vapaaehtoista. Halusin tehdä sen selkeyden vuoksi.
Ajetaan ladattu Vagrantfile:
```
cd $HOME/vagrant-minions
vagrant up
```
Testataan laatikoiden minion_1 ja minion_2 SSH-toimivuus ajamalla:
```
vagrant ssh minion_1
vagrant ssh minion_2
```
![vagrant-connection-test](https://raw.githubusercontent.com/Fincer/central-management-of-multiple-servers/master/images/vagrant-connection-test.png)
Hyväksytään nämä minion-koneet masterilla:
```
[23/04/2018 19:24:57 - fincer: vagrant ]$ sudo salt-key -A
The following keys are going to be accepted:
Unaccepted Keys:
minion_1
minion_2
Proceed? [n/Y] y
Key for minion minion_1 accepted.
Key for minion minion_2 accepted.
```
**b)** Tee kahdella orjalla esimerkki, jossa orjat saavat eri muuttujan pilarista. Tarkista ‘pillars.items’, että kummalekin orjalle mene eri tieto. Tee jokin muu kuin tunnilla tehty sshd-esimerkki.
--------------
**Vastaus:**
Ajetaan root-käyttäjänä (sudo-komento) seuraava shell-skripti master-koneella:
[Pekka Helenius - salt_pillar_sample.sh](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/scripts/salt_pillar_sample.sh)
Masterilta saatu output:
```
[23/04/2018 19:41:45 - fincer: vagrant ]$ sudo sh pillar_sample.sh
base:
'minion_1':
- minion-1
'minion_2':
- minion-2
test_variable: 'secret like coffee shop wants to say hello to the world'
test_variable: 'hidden miniart: superman vs. hulk figures'
This is my pillarfile which has the following content:
{{ pillar['test_variable'] }}
pillar_file:
file.managed:
- user: 1000
- group: 1000
- name: /tmp/pillarfile_for_{{ grains['id'] }}
- source: salt://files/pillarfile
- makedirs: True
- template: jinja
minion_2:
True
minion_1:
True
**Salt -- pillar.items output**
minion_2:
----------
test_variable:
hidden miniart: superman vs. hulk figures
minion_1:
----------
test_variable:
secret like coffee shop wants to say hello to the world
**Salt -- state.apply output**
minion_1:
----------
ID: pillar_file
Function: file.managed
Name: /tmp/pillarfile_for_minion_1
Result: True
Comment: File /tmp/pillarfile_for_minion_1 is in the correct state
Started: 16:42:18.786164
Duration: 54.806 ms
Changes:
Summary for minion_1
------------
Succeeded: 1
Failed: 0
------------
Total states run: 1
Total run time: 54.806 ms
minion_2:
----------
ID: pillar_file
Function: file.managed
Name: /tmp/pillarfile_for_minion_2
Result: True
Comment: File /tmp/pillarfile_for_minion_2 is in the correct state
Started: 16:42:18.886370
Duration: 57.26 ms
Changes:
Summary for minion_2
------------
Succeeded: 1
Failed: 0
------------
Total states run: 1
Total run time: 57.260 ms
**Salt -- get file output with head command**
minion_2:
This is my pillarfile which has the following content:
hidden miniart: superman vs. hulk figures
minion_1:
This is my pillarfile which has the following content:
secret like coffee shop wants to say hello to the world
```
**c)** Tee kahdella orjalla esimerkki, jossa toinen orja saa muuttujan pilarista ja toinen käyttää oletusarvoa (pillar.get). Tee jokin muu kuin tunnilla tehty sshd-esimerkki.
--------------
**Vastaus:**
Asennetaan molemmille orjille Apache HTTP daemon seuraavaa shell-skriptiä käyttäen:
[salt_pillar_apache_sample.sh](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/scripts/salt_pillar_apache_sample.sh)
Masterilta saatu output:
```
[24/04/2018 01:57:10 - fincer: vagrant ]$ sudo sh apache_sample.sh
{% if grains['id'] == 'minion_2' %}
site_data: '{{ salt['cmd.run']('uname -a') }}'
{% endif %}
<VirtualHost *:80>
ServerName {{ servername }}
ServerAlias {{ serveralias }}
ServerAdmin webmaster@localhost
DocumentRoot {{ ('/var/www/html/' + grains['id'] + '/') }}
ErrorLog /error.log
CustomLog /access.log combined
</VirtualHost>
{{ pillar.get('site_data','Nothing interesting here') }}
{% set servername = grains['os'].lower() + '.' + grains['id'] + '.com' %}
{% set serveralias = 'www.' + grains['os'].lower() + '.' + grains['id'] + '.com' %}
apache_install:
pkg.installed:
- pkgs:
- apache2
- curl
sample_page_conf:
file.managed:
- name: /etc/apache2/sites-available/{{ grains['id'] }}.conf
- source: salt://apache/samplesite.conf
- mode: 0644
- user: root
- group: root
- template: jinja
- context:
servername: {{ servername }}
serveralias: {{ serveralias }}
- require:
- pkg: apache_install
enable_sample_page:
cmd.run:
- name: 'a2ensite {{ grains['id'] }}.conf'
- require:
- file: sample_page_conf
sample_page_content:
file.managed:
- mode: 0644
- user: root
- group: root
- makedirs: True
- template: jinja
- name: {{ ('/var/www/html/' + grains['id'] + '/index.html') }}
- source: salt://apache/sampleindex.html
- require:
- cmd: enable_sample_page
add_vhost_domain:
file.append:
- name: /etc/hosts
- text: 127.0.0.1 {{ servername }}
- require:
- file: sample_page_content
restart_httpd:
service.running:
- name: apache2.service
- watch:
- file: add_vhost_domain
- cmd: enable_sample_page
test_page:
cmd.run:
- name: 'curl -s {{ servername }}'
- require:
- service: restart_httpd
**Salt -- pillar.items output**
minion_1:
----------
test_variable:
secret like coffee shop wants to say hello to the world
minion_2:
----------
site_data:
Linux fincer-laptop 4.15.10-1-ARCH #1 SMP PREEMPT Thu Mar 15 12:24:34 UTC 2018 x86_64 GNU/Linux
test_variable:
hidden miniart: superman vs. hulk figures
**Salt -- state.apply output**
minion_1:
----------
ID: apache_install
Function: pkg.installed
Result: True
Comment: All specified packages are already installed
Started: 22:59:25.325084
Duration: 273.26 ms
Changes:
----------
ID: sample_page_conf
Function: file.managed
Name: /etc/apache2/sites-available/minion_1.conf
Result: True
Comment: File /etc/apache2/sites-available/minion_1.conf is in the correct state
Started: 22:59:25.599368
Duration: 51.619 ms
Changes:
----------
ID: enable_sample_page
Function: cmd.run
Name: a2ensite minion_1.conf
Result: True
Comment: Command "a2ensite minion_1.conf" run
Started: 22:59:25.651513
Duration: 20.174 ms
Changes:
----------
pid:
13401
retcode:
0
stderr:
stdout:
Site minion_1 already enabled
----------
ID: sample_page_content
Function: file.managed
Name: /var/www/html/minion_1/index.html
Result: True
Comment: File /var/www/html/minion_1/index.html is in the correct state
Started: 22:59:25.671991
Duration: 9.937 ms
Changes:
----------
ID: add_vhost_domain
Function: file.append
Name: /etc/hosts
Result: True
Comment: File /etc/hosts is in correct state
Started: 22:59:25.682126
Duration: 1.011 ms
Changes:
----------
ID: restart_httpd
Function: service.running
Name: apache2.service
Result: True
Comment: Service restarted
Started: 22:59:25.697483
Duration: 2145.224 ms
Changes:
----------
apache2.service:
True
----------
ID: test_page
Function: cmd.run
Name: curl -s ubuntu.minion_1.com
Result: True
Comment: Command "curl -s ubuntu.minion_1.com" run
Started: 22:59:27.842981
Duration: 9.994 ms
Changes:
----------
pid:
13523
retcode:
0
stderr:
stdout:
Nothing interesting here
Summary for minion_1
------------
Succeeded: 7 (changed=3)
Failed: 0
------------
Total states run: 7
Total run time: 2.511 s
minion_2:
----------
ID: apache_install
Function: pkg.installed
Result: True
Comment: All specified packages are already installed
Started: 22:59:25.453349
Duration: 273.908 ms
Changes:
----------
ID: sample_page_conf
Function: file.managed
Name: /etc/apache2/sites-available/minion_2.conf
Result: True
Comment: File /etc/apache2/sites-available/minion_2.conf is in the correct state
Started: 22:59:25.728257
Duration: 10.512 ms
Changes:
----------
ID: enable_sample_page
Function: cmd.run
Name: a2ensite minion_2.conf
Result: True
Comment: Command "a2ensite minion_2.conf" run
Started: 22:59:25.739209
Duration: 18.428 ms
Changes:
----------
pid:
13160
retcode:
0
stderr:
stdout:
Site minion_2 already enabled
----------
ID: sample_page_content
Function: file.managed
Name: /var/www/html/minion_2/index.html
Result: True
Comment: File /var/www/html/minion_2/index.html is in the correct state
Started: 22:59:25.757909
Duration: 8.736 ms
Changes:
----------
ID: add_vhost_domain
Function: file.append
Name: /etc/hosts
Result: True
Comment: File /etc/hosts is in correct state
Started: 22:59:25.766840
Duration: 0.933 ms
Changes:
----------
ID: restart_httpd
Function: service.running
Name: apache2.service
Result: True
Comment: Service restarted
Started: 22:59:25.779507
Duration: 2102.595 ms
Changes:
----------
apache2.service:
True
----------
ID: test_page
Function: cmd.run
Name: curl -s ubuntu.minion_2.com
Result: True
Comment: Command "curl -s ubuntu.minion_2.com" run
Started: 22:59:27.882439
Duration: 11.578 ms
Changes:
----------
pid:
13282
retcode:
0
stderr:
stdout:
Linux fincer-laptop 4.15.10-1-ARCH #1 SMP PREEMPT Thu Mar 15 12:24:34 UTC 2018 x86_64 GNU/Linux
Summary for minion_2
------------
Succeeded: 7 (changed=3)
Failed: 0
------------
Total states run: 7
Total run time: 2.427 s
```
Luotujen HTML-sivustojen sisältö:
```
[24/04/2018 01:59:28 - fincer: vagrant ]$ sudo salt 'minion_1' cmd.run 'curl -s ubuntu.minion_1.com'
minion_1:
Nothing interesting here
[24/04/2018 02:00:47 - fincer: vagrant ]$ sudo salt 'minion_2' cmd.run 'curl -s ubuntu.minion_2.com'
minion_2:
Linux fincer-laptop 4.15.10-1-ARCH #1 SMP PREEMPT Thu Mar 15 12:24:34 UTC 2018 x86_64 GNU/Linux
```

+ 148
- 0
exercises/h5.md View File

@ -0,0 +1,148 @@
Palvelinten hallinta - Harjoitus 5
==============
*Disclaimer:*
--------------
Tämä harjoitus on tehty osana Haaga-Helian Tietojenkäsittelyn koulutusohjelman kurssia [Palvelinten hallinta (ICT4TN022, kevät 2018)](http://www.haaga-helia.fi/fi/opinto-opas/opintojaksokuvaukset/ICT4TN022). Kurssin pitäjänä toimii [Tero Karvinen](http://terokarvinen.com/), joka on määritellyt tämän harjoituksen tehtävänkuvaukset. Tehtävien vastaukset ovat Pekka Heleniuksen (allekirjoittanut) tuottamia.
*SISÄLLYSLUETTELO*
--------------
- [b) Julkaise raportti MarkDownilla. Jos käytät GitHub:ia, se tekee muotoilun automaattisesti “.md”-päätteisiin dokumentteihin.](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/h5.md#b-julkaise-raportti-markdownilla-jos-k%C3%A4yt%C3%A4t-githubia-se-tekee-muotoilun-automaattisesti-md-p%C3%A4%C3%A4tteisiin-dokumentteihin)
- [c) Aja oma Salt-tila suoraa git-varastosta. Voit joko tehdä tilan alusta lähtien itse tai forkata sirottimen.](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/h5.md#c-aja-oma-salt-tila-suoraa-git-varastosta-voit-joko-tehd%C3%A4-tilan-alusta-l%C3%A4htien-itse-tai-forkata-sirottimen)
- [1) Git-varaston alustus](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/h5.md#1-git-varaston-alustus)
- [2) Salt-tila suoraan varastosta - skripti](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/h5.md#2-salt-tila-suoraan-varastosta---skripti)
b) Julkaise raportti MarkDownilla. Jos käytät GitHub:ia, se tekee muotoilun automaattisesti “.md”-päätteisiin dokumentteihin.
--------------
**Vastaus:**
Kaikki raportit Git-varastoissa '[Central Management of Multiple Servers](https://github.com/Fincer/central-management-of-multiple-servers)' sekä '[Basics of a Linux Server](https://github.com/Fincer/basics-of-a-linux-server-school-course-)' tehty tähän mennessä MarkDownilla.
**c)** Aja oma Salt-tila suoraa git-varastosta. Voit joko tehdä tilan alusta lähtien itse tai forkata [sirottimen](https://github.com/terokarvinen/sirotin).
--------------
**Vastaus:**
### 1) Git-varaston alustus
Alustetaan uusi git-varasto, Ubuntu 18.04 LTS. Ajetaan normaalikäyttäjänä tietokoneella:
```
sudo apt-get update && sudo apt-get -y install git
mkdir -p ~/harjoitus_5
```
Luodaan tässä vaiheessa uusi varasto esimerkiksi GitHub:iin. Uudella käyttäjällä aloitetaan uusi projekti (New project), jolle annetaan nimi (tässä tapauksessa salt_testrun).
Kun uusi varasto on luotu, ladataan se paikalliselle koneelle:
```
cd ~/harjoitus_5
git clone https://github.com/Fincer/salt_testrun.git
cd salt_testrun
```
**HUOM!** Mikäli git-komento pyytää, on komennon tulostamien ohjeiden mukaan asetettava sähköpostiosoite ja käyttäjätunnus git:iä varten. Testikoneella nämä oli määritelty jo ennalta.
Luodaan GitHub:sta ladattuun git-varastoon alikansiot scripts ja data:
```
mkdir -p ~/harjoitus_5/salt_testrun/{scripts,data,images}
```
Seuraavat tiedostot oli tehty harjoitusta varten jo ennalta. Kopioidaan valmiit tiedostot oikeisiin paikkoihin git-varastossa.
**HUOM!** Mikäli muokkaat git-varastoon kuuluvia tiedostoja, tee tämä aina git-varaston (~kansion) sisällä!
```
GIT_VARASTO=$HOME/harjoitus_5/salt_testrun
cp ~/salt_testrun.sh ${GIT_VARASTO}/
cp ~/salt_pillar_apache_sample.sh ${GIT_VARASTO}/scripts/
cp ~/{sampleindex.html,sampleindex_functions.js} ${GIT_VARASTO}/data/
touch ${GIT_VARASTO}/images/.gitignore
unset GIT_VARASTO
```
Lisätään tiedostot git-puuhun:
```
cd ~/harjoitus_5/salt_testrun
git add *
git commit -m "Initial content"
```
Output:
```
[04/05/2018 04:14:37 - fincer: salt_testrun ]$ git commit -m "Initial content"
[master 9cc3aab] Initial content
5 files changed, 1384 insertions(+)
create mode 100755 data/sampleindex.html
create mode 100755 data/sampleindex_functions.js
create mode 100644 images/.gitignore
create mode 100644 salt_testrun.sh
create mode 100644 scripts/salt_pillar_apache_sample.sh
```
**HUOM!** Tiedostojen poisto seuraavasti, esimerkki:
```
[04/05/2018 04:13:50 - fincer: salt_testrun ]$ git rm -rf .gitignore
rm '.gitignore/.gitignore'
[04/05/2018 04:14:01 - fincer: salt_testrun ]$ git commit -m "Delete gitignore"
[master fd87536] Delete gitignore
1 file changed, 1 deletion(-)
delete mode 100644 .gitignore/.gitignore
```
Julkaistaan muutokset GitHub:ssa:
```
git push
```
Output:
```
[04/05/2018 04:19:40 - fincer: salt_testrun ]$ git push
Counting objects: 12, done.
Compressing objects: 100% (9/9), done.
Writing objects: 100% (12/12), 14.38 KiB | 2.40 MiB/s, done.
Total 12 (delta 0), reused 0 (delta 0)
To https://github.com/Fincer/salt_testrun.git
c72f9b7..1be1fb5 master -> master
```
**HUOM!** Mikäli git-varasto käyttää useampaa haaraa, on _git push_ -komennossa määriteltävä, mihin haaraan muutokset kohdistetaan (esim. _git push origin master_)
**HUOM!** Mikäli kyseessä on useamman tekijän git-varasto ja mikäli ei voida olla varmoja, onko git-puuta päivitetty jonkun toisen tekijän toimesta omien muutostöiden välissä, on suositeltavaa käyttää _git push_ -komennon edellä _git pull_ -komentoa. Yleensä git osaa varoittaa, mikäli välissä muutettuun varastoon ollaan tekemässä muutoksia, mutta hyvän työskentelykäytännön takia _git pull:ia_ on hyvä käyttää.
### 2) Salt-tila suoraan varastosta - skripti
Seuraava komentosarja on testattu Ubuntu 18.04 LTS:ssä:
```
wget https://raw.githubusercontent.com/Fincer/salt_testrun/master/salt_testrun.sh
sudo bash ./salt_testrun.sh
```
- asentaa yhdelle koneelle Salt Master/Minion -arkkitehtuurin (Minion-koneen ID on defaultMinion)
- asentaa Apachen Salt-minionille (Salt-tiloja käyttäen)
- konfiguroi esimerkkisivun Apachelle (Salt-tiloja käyttäen)
- avaa esimerkkisivun käyttäjän 1000 (UID) oletusselaimessa
Git-varasto löytyy kokonaisuudessaan seuraavasta osoitteesta:
[Fincer - salt_testrun](https://github.com/Fincer/salt_testrun/tree/master)

+ 107
- 0
exercises/h6.md View File

@ -0,0 +1,107 @@
Palvelinten hallinta - Harjoitus 6
==============
*Disclaimer:*
--------------
Tämä harjoitus on tehty osana Haaga-Helian Tietojenkäsittelyn koulutusohjelman kurssia [Palvelinten hallinta (ICT4TN022, kevät 2018)](http://www.haaga-helia.fi/fi/opinto-opas/opintojaksokuvaukset/ICT4TN022). Kurssin pitäjänä toimii [Tero Karvinen](http://terokarvinen.com/), joka on määritellyt tämän harjoituksen tehtävänkuvaukset. Tehtävien vastaukset ovat Pekka Heleniuksen (allekirjoittanut) tuottamia.
*SISÄLLYSLUETTELO*
--------------
- [a) Kultainen polku. Tee ensimmäinen versio modulistasi, joka toimii ainakin optimiolosuhteissa. Jos jokin säätö on poikkeuksellisen hankala, voit tehdä sen tässä versiossa käsin, ja dokumentoida ajamasi käskyt. (Valmis moduli tarvitaan vasta esitykseen ensi viikolla).](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/h6.md#a-kultainen-polku-tee-ensimm%C3%A4inen-versio-modulistasi-joka-toimii-ainakin-optimiolosuhteissa-jos-jokin-s%C3%A4%C3%A4t%C3%B6-on-poikkeuksellisen-hankala-voit-tehd%C3%A4-sen-t%C3%A4ss%C3%A4-versiossa-k%C3%A4sin-ja-dokumentoida-ajamasi-k%C3%A4skyt-valmis-moduli-tarvitaan-vasta-esitykseen-ensi-viikolla)
- [b) Kokeile moduliasi tyhjässä koneessa. Voit käyttää virtualboxia, vagranttia tai livetikkua.](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/h6.md#b-kokeile-moduliasi-tyhj%C3%A4ss%C3%A4-koneessa-voit-k%C3%A4ytt%C3%A4%C3%A4-virtualboxia-vagranttia-tai-livetikkua)
- [c) Käyttäjätarina (user story): ketkä ovat modulisi käyttäjät? Mitä he haluavat saada aikaan modulillasi? Missä tilanteessa he sitä käyttävät? Mitkä ovat tärkeimmät parannukset käyttäjän kannalta, joita moduliin pitäisi vielä tehdä? Tähän c-kohtaan vain sanallinen vastaus, tämä kohta ei poikkeuksellisesti edellytä testejä tietokoneella.](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/h6.md#c-k%C3%A4ytt%C3%A4j%C3%A4tarina-user-story-ketk%C3%A4-ovat-modulisi-k%C3%A4ytt%C3%A4j%C3%A4t-mit%C3%A4-he-haluavat-saada-aikaan-modulillasi-miss%C3%A4-tilanteessa-he-sit%C3%A4-k%C3%A4ytt%C3%A4v%C3%A4t-mitk%C3%A4-ovat-t%C3%A4rkeimm%C3%A4t-parannukset-k%C3%A4ytt%C3%A4j%C3%A4n-kannalta-joita-moduliin-pit%C3%A4isi-viel%C3%A4-tehd%C3%A4-t%C3%A4h%C3%A4n-c-kohtaan-vain-sanallinen-vastaus-t%C3%A4m%C3%A4-kohta-ei-poikkeuksellisesti-edellyt%C3%A4-testej%C3%A4-tietokoneella)
**a)** Kultainen polku. Tee ensimmäinen versio modulistasi, joka toimii ainakin optimiolosuhteissa. Jos jokin säätö on poikkeuksellisen hankala, voit tehdä sen tässä versiossa käsin, ja dokumentoida ajamasi käskyt. (Valmis moduli tarvitaan vasta esitykseen ensi viikolla).
--------------
**Vastaus:**
Ensimmäinen versio moduulistani löytyy git-varastostani [salt_gisworkstation](https://github.com/Fincer/salt_gisworkstation). Moduulia on testattu Lubuntu 18.04 LTS Salt Master/Minion -konfiguraatiolla.
Suurimmat puutteet liittyvät ei-implementoituihin logiikoihin sekä hyvin rajattuun käyttöympäristöön. Olen sisällyttänyt TODO-listan varaston pääskriptiin [runme.sh:een](https://github.com/Fincer/salt_gisworkstation/blob/master/runme.sh).
Moduulin testauksesta lisää kohdassa b).
**b)** Kokeile moduliasi tyhjässä koneessa. Voit käyttää virtualboxia, vagranttia tai livetikkua.
--------------
**Vastaus:**
Käyttötestaus tehtiin Oracle VirtualBox:ssa [Lubuntu 18.04 LTS:llä](http://cdimage.ubuntu.com/lubuntu/releases/18.04/release/lubuntu-18.04-desktop-amd64.iso). Käyttöjärjestelmä asennettiin Oracle VirtualBoxiin oletusasetuksilla testausta varten.
Virtuaalikoneessa moduuli ladattiin GitHub:sta ja suoritettiin seuraavilla komennoilla:
```
sudo apt-get update && sudo apt-get install git
git clone https://github.com/Fincer/salt_gisworkstation.git
cd salt_gisworkstation
bash runme.sh
```
![salt_gisworkstation_0](https://raw.githubusercontent.com/Fincer/central-management-of-multiple-servers/master/images/salt-testing_0.png)
_GIS Workstation -skriptin alkuvaiheen ajoa_
![salt_gisworkstation_1](https://raw.githubusercontent.com/Fincer/central-management-of-multiple-servers/master/images/salt-testing_1.png)
_Kaikkia moduulin vaatimia paketteja ei ole missään pakettivarastoissa uusimmille Ubuntu-jakeluille. Lisäksi jakeluissa olevat versiot CloudComparesta ovat vanhentuneita. Ohjelman kasaus master-koneella vie aikaa, joten se kannattaa tehdä vain kerran, mikäli suinkin mahdollista. Ohjelman kasaus kasvattaa asennusprosessin virheriskiä selkeästi._
![salt_gisworkstation_2](https://raw.githubusercontent.com/Fincer/central-management-of-multiple-servers/master/images/salt-testing_2.png)
_GIS Workstation -skriptien suorittamisen jälkeinen tila, jonka Salt master raportoi käyttäjälle. Myöhemmällä tarkastelulla huomataan, että kaikki asennukset ovat menneet testiajossa onnistuneesti sisään kohdetietokoneeseen konfigurointeineen._
Testiajon aikana ei havaittu merkittäviä virhetilanteita.
Ohjelmakasauksen (ennen kaikkea CloudCompare) takia testiajo kestää jonkin aikaa.
Ohjelmien kasaus moduulissa on hieman ongelmallista, koska se voi rikkoontua helposti eikä välttämättä skaalaudu kovin monelle koneelle virheettömästi. Kuitenkaan CloudComparea ei ole saatavilla esimerkiksi Ubuntu 18.04 -jakeluille missään PPA-varastossa, joten toistaiseksi kasaus on välttämätön. LASTools ei todennäköisesti rikkoudu niin helposti, koska kasauksessa vaadittavat kehittäjäpaketit (makedepends) ovat paljon rajatumpia.
CloudCompare, QGis ja LASTools ovat saatavilla myös Windows:lle. Muiden ohjelmien saatavuutta Windows:lle ei ole tässä vaiheessa vielä tutkittu riittävästi.
Virtuaalikoneelle osoitettujen CPU:iden määrää olisi voinut kasvattaa, tämä tuli huomattua erityisesti CloudComparen kasauksessa. Skriptissä ytimien hyödyntäminen on otettu huomioon (make-parametri _-j$(nproc --ignore 1)_)
**c)** Käyttäjätarina (user story): ketkä ovat modulisi käyttäjät? Mitä he haluavat saada aikaan modulillasi? Missä tilanteessa he sitä käyttävät? Mitkä ovat tärkeimmät parannukset käyttäjän kannalta, joita moduliin pitäisi vielä tehdä? Tähän c-kohtaan vain sanallinen vastaus, tämä kohta ei poikkeuksellisesti edellytä testejä tietokoneella.
--------------
**Vastaus:**
Moduuli on tarkoitettu pieneen käyttöympäristöön (suuruusluokka 7-13 konetta) paikkatiedon prosessointiin. Moduulin käyttäjät koostuvat paikkatietoasiantuntijoista, jotka haluavat saada avoimen lähdekoodin paikkatietotyökaluja. Käyttötarkoitus rajautuu asennettavien ohjelmien mukaan: LASTools, QGIS, gpsbabel, CloudCompare jne. Näitä ohjelmia käytetään rasteri- ja vektorimuotoisten paikkatietoaineistojen sekä laserkeilausaineistojen prosessointiin sekä analytiikkaan.
Tärkeimmät moduulin parannukset ovat
- laajempi käyttöjärjestelmätuki
- laajempi skaalautuvuus
- _vakaa tuki_ laajalle konekannalle (edellyttää huolellista testausta)
- ohjelmien lisäkonfigurointi ja asentaminen käyttäjien tarpeiden mukaan
- Salt:n pillars:ien avulla esimerkiksi
- logiikoiden ja virheentarkastuksen lisäys
- parempi lähestymistapa LASTools:n ja CloudComparen jakeluun sekä QGIS2.conf -tiedoston jakeluun koneille
- lähtötilanteen parempi huomiointi: esimerkiksi kaikki kohdekoneet PXE-boottausta tukevia tyhjiä työasemia
**HUOM!** Alkuskenaarioon liittyvä haaste:
Moduulin toteuttamisessa haastavin kysymys liittyy alkuskenaarioon. Mikä on ennen kaikkea minion-tietokoneiden ja verkon rakenteen alkuskenaario?
- A) Ei käyttöjärjestelmää lainkaan
- B) Osassa tietokoneita Windows, osassa Ubuntu
- C) Kaikissa koneissa Ubuntu/Windows
- D) Kuinka Salt Minion -asennetaan? SSH-yhteyden yli? Jos kyllä, niin tarvitaan toimiva SSH-konfiguraatio minion-koneelle. Onko se asennettu etukäteen vai täytyy konfiguroida koneelle? Tapahtuuko SSH:n asennus käyttöjärjestelmä-imagen asennuksen yhteydessä automaattisesti?
- E) Onko kaikki koneet verkossa jatkuvasti olevia staattisia työasemia vai onko verkossa myös kannettavia tietokoneita, joille edellytetään Salt-konfigurointia?
Pienellä konekannalla tämä ei välttämättä ole kovinkaan ihmeellinen kysymys, mutta useammalla kymmenellä tai sadalla tietokoneella, jos alkuskenaarioon ei ole varauduttu, asiasta muodostuu ongelma.

+ 587
- 0
exercises/module.md View File

@ -0,0 +1,587 @@
# Kurssimoduuli
- Linkki moduuliin: [Fincer - Salt, GIS Workstation](https://github.com/Fincer/salt_gisworkstation)
Tämä kurssimoduuli on tehty osana Haaga-Helian Tietojenkäsittelyn koulutusohjelman kurssia [Palvelinten hallinta (ICT4TN022, kevät 2018)](http://www.haaga-helia.fi/fi/opinto-opas/opintojaksokuvaukset/ICT4TN022).
Kurssimoduuli käsittelee SaltStack:n käyttöä usean tietokoneen työympäristössä. Yksinkertaistettuna periaatteena yksi tietokone toimii Master-roolissa, ja käskyttää kytkennässä olevia, Minion-roolissa olevia tietokoneita ohjelmien konfiguraatioiden, asennusten, käyttäjänhallinnan jne. suhteen.
## SISÄLLYSLUETTELO
- [Järjestelmävaatimukset](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/module.md#j%C3%A4rjestelm%C3%A4vaatimukset)
- [Moduulin toteutusperiaatteista](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/module.md#moduulin-toteutusperiaatteista)
- [Moduulin shell-skriptivaatimukset](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/module.md#moduulin-shell-skriptivaatimukset)
- [Asennettavat ohjelmat](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/module.md#asennettavat-ohjelmat)
- [Asennettavat binääritiedostot](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/module.md#asennettavat-bin%C3%A4%C3%A4ritiedostot)
- [Asennettavat konfiguraatiot](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/module.md#asennettavat-konfiguraatiot)
- [Moduulin rakenne](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/module.md#moduulin-rakenne)
- [Moduulin ajo](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/module.md#moduulin-ajo)
- [Miltä näyttää minion-koneilla?](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/module.md#milt%C3%A4-n%C3%A4ytt%C3%A4%C3%A4-minion-koneilla)
- [Huomioita moduulin ajosta](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/module.md#huomioita-moduulin-ajosta)
- [Moduulin hyvät puolet](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/module.md#moduulin-hyv%C3%A4t-puolet)
- [Moduulin huonot puolet](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/module.md#moduulin-huonot-puolet)
- [Moduulin kehittämistarpeet](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/module.md#moduulin-kehitt%C3%A4mistarpeet)
-------------------
## Aihe
Moduulin aihekuvaus löytyy [harjoituksen 6 yhteydestä](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/h6.md#c-k%C3%A4ytt%C3%A4j%C3%A4tarina-user-story-ketk%C3%A4-ovat-modulisi-k%C3%A4ytt%C3%A4j%C3%A4t-mit%C3%A4-he-haluavat-saada-aikaan-modulillasi-miss%C3%A4-tilanteessa-he-sit%C3%A4-k%C3%A4ytt%C3%A4v%C3%A4t-mitk%C3%A4-ovat-t%C3%A4rkeimm%C3%A4t-parannukset-k%C3%A4ytt%C3%A4j%C3%A4n-kannalta-joita-moduliin-pit%C3%A4isi-viel%C3%A4-tehd%C3%A4-t%C3%A4h%C3%A4n-c-kohtaan-vain-sanallinen-vastaus-t%C3%A4m%C3%A4-kohta-ei-poikkeuksellisesti-edellyt%C3%A4-testej%C3%A4-tietokoneella)
*"Moduuli on tarkoitettu pieneen käyttöympäristöön (suuruusluokka 7-13 konetta) paikkatiedon prosessointiin. Moduulin käyttäjät koostuvat paikkatietoasiantuntijoista, jotka haluavat saada avoimen lähdekoodin paikkatietotyökaluja."*
*"Käyttötarkoitus rajautuu asennettavien ohjelmien mukaan: LASTools, QGIS, gpsbabel, CloudCompare jne. Näitä ohjelmia käytetään rasteri- ja vektorimuotoisten paikkatietoaineistojen sekä laserkeilausaineistojen prosessointiin sekä analytiikkaan."*
-------------------
## Järjestelmävaatimukset
Moduuli edellyttää tietokoneiden käyttöjärjestelmiltä seuraavia vaatimuksia.
- Salt Master -tietokone: Ubuntu 18.04 LTS tai variantti
- Salt Minions -tietokoneet:
- Ubuntu 18.04 LTS tai variantti
- Microsoft Windows (versio 7 testattu)
### Moduulin toteutusperiaatteista
- Salt Masteria ei ole kokeiltu Microsoft Windowsilla, vaan se on toteutettu kohdistuneena asennuksena yksinoikeudella Linux Ubuntu 18.04 LTS -käyttöjärjestelmälle.
- Tavoitteena on ollut mahdollisimman automatisoitu asennustoimenpide, joka voidaan suorittaa "tyhjille" käyttöjärjestelmille kylmiltään.
- Moduulin ajaminen on tarkoitettu tapahtuvaksi pääsääntöisesti yhdellä komennolla (pois lukien minion-koneiden esikonfigurointi).
-------------------
## Moduulin shell-skriptivaatimukset
Moduuli tukeutuu vahvasti Unix-ympäristöjen Bash-shelliin, mitä vaaditaan moduulin onnistuneessa ajosuorituksessa.
Moduulin mukana tulevissa shell-skripteissä on lisäksi määritelty lisävaatimuksia ajoympäristön suhteen. Näitä vaatimuksia ovat mm.:
- kriittisten binäärien olemassaolo Salt Master -tietokoneella
- verkkoyhteyden saatavuus
- moduuli ajettava pääkäyttäjän oikeuksin
- Minioneiden käyttöjärjestelmään, yhteyteen ja raportoituun tilaan liittyvät määrittelyt
- jne.
-------------------
## Asennettavat ohjelmat
Moduuli asentaa alla luetellut ohjelmat Microsoft Windows - ja Linux Ubuntu 18.04 LTS -käyttöympäristöihin.
### Microsoft Windows
- [Visual Runtime 2013](https://www.microsoft.com/en-us/download/details.aspx?id=40784)
- [CloudCompare](cloudcompare.org)
- [Merkaartor](merkaartor.be)
- Kuvaus: *"map editor for OpenStreetMap.org"*
- [QGIS](qgis.org)
- Kuvaus: *"A Geographic Information System (GIS) manages, analyzes, and displays databases of geographic information."*
- [QuickRoute GPS](http://www.matstroeng.se/quickroute/en/)
- Kuvaus: *"GPS analysis software for getting your route on the map"*
- Ohjelmaa [GPSd](https://code.google.com/archive/p/gpsd-4-win/) ei onnistuttu asentamaan automaattisesti MS Windows -alustalle. Ohjelmakuvaus löytyy seuraavan otsikon alta.
### Linux Ubuntu 18.04 LTS
- [cloudcompare](cloudcompare.org)
- Kuvaus: *"3D point cloud and mesh processing software"*
- [gpx2shp](gpx2shp.osdn.jp)
- Kuvaus: *"convert GPS or GPX file to ESRI Shape file"*
- [rel2gpx](https://directory.fsf.org/wiki/Rel2gpx)
- Kuvaus: *"create GPX-track from OSM relation"*
- [quickroute-gps](http://www.matstroeng.se/quickroute/en/)
- Kuvaus: *"GPS analysis software for getting your route on the map"*
- [python-gpxpy](https://github.com/tkrajina/gpxpy)
- Kuvaus: *"GPX file parser and GPS track manipulation library (Python 2)"*
- [obdgpslogger](https://github.com/oesmith/obdgpslogger)
- Kuvaus: *"suite of tools to log OBDII and GPS data"*
- [merkaartor](merkaartor.be)
- Kuvaus: *"map editor for OpenStreetMap.org"*
- [gpsbabel](gpsbabel.org)
- Kuvaus: *"GPS file conversion plus transfer to/from GPS units"*
- [gpsbabel-gui](gpsbabel.org)
- Kuvaus: *" GPS file conversion plus transfer to/from GPS units - GUI"*
- [gis-gps]( https://pkg-grass.alioth.debian.org/)
- Kuvaus: *"GPS related programs"*
- [qgis](qgis.org)
- Kuvaus: *"A Geographic Information System (GIS) manages, analyzes, and displays databases of geographic information."*
- [qgis-server](qgis.org)
- Kuvaus: *"QGIS server providing various OGC services"*
- [qgis-providers](qgis.org)
- Kuvaus: *"collection of data providers to QGIS"*
- [qgis-plugin-grass](qgis.org)
- Kuvaus: *"GRASS plugin for QGIS"*
- [gpsd](http://www.catb.org/gpsd/)
- Kuvaus: *"The gpsd service daemon can monitor one or more GPS devices connected to a host computer, making all data on the location and movements of the sensors available to be queried on TCP port 2947."*
## Asennettavat binääritiedostot
Moduuli asentaa seuraavat suoritettavat tiedostot Microsoft Windows - ja Linux Ubuntu 18.04 LTS -käyttöympäristöihin.
### Microsoft Windows
LAStools - yhteensä 49 suoritettavaa tiedostoa. Osa on suljettua lähdekoodia, osa avointa.
Nämä tiedostot asennetaan Salt minion-koneen järjestelmäpolkuun C:\lastools\
- las2las
- las2txt
- lasdiff
- lasindex
- lasinfo
- lasmerge
- lasprecision
- laszip
- txt2las
- blast2dem
- blast2iso
- bytecopy
- bytediff
- e572las
- las2dem
- las2iso
- las2shp
- las2tin
- lasboundary
- lascanopy
- lasclassify
- lasclip
- lascolor
- lascontrol
- lascopy
- lasduplicate
- lasgrid
- lasground
- lasground_new
- lasheight
- laslayers
- lasnoise
- lasoptimize
- lasoverage
- lasoverlap
- lasplanes
- laspublish
- lasreturn
- lassort
- lassplit
- lasthin
- lastile
- lastool
- lastrack
- lasvalidate
- lasview
- lasvoxel
- shp2las
- sonarnoiseblaster
- Lisäksi asennetaan suoritettava tiedosto gpx2shp.exe, myös polkuun C:\lastools\
### Linux Ubuntu 18.04 LTS
LAStools - yhteensä 9 suoritettavaa tiedostoa. Kaikki ovat avointa lähdekoodia.
Nämä tiedostot asennetaan Salt minion -koneen järjestelmäpolkuun /usr/local/bin/
- las2las
- las2txt
- lasdiff
- lasindex
- lasinfo
- lasmerge
- lasprecision
- laszip
- txt2las
-------------------
## Asennettavat konfiguraatiot
Seuraavat muutostoimenpiteet on toteutettu Salt:n _file.managed_ -toiminnolla eli tiedoston korvauksella.
### Microsoft Windows
- QGIS -konfiguraatio, joka kytkee QGIS-ohjelmasta automaattisesti päälle laserkeilausdatan prosessoinnissa tarvittavat LAStools -työkalut, jotka on asennettu järjestelmäkansioon C:\lastools\
- QGIS käyttää Windowsissa käyttäjäkohtaisia rekisteriavaimia ohjelma-asetusten muutoksiin. Ohjelman kehittäjien maililistoja ja ohjelmarakennetta tutkimalla tulin johtopäätökseen, jossa ainoa ratkaisu konfiguroida LAStools päälle QGIS:stä automaattisesti ilman käyttäjän toimenpiteitä on tehdä muutokset ohjelman käyttämään [LidarToolsAlgorithmProvider.py](https://searchcode.com/file/115836660/python/plugins/processing/algs/lidar/LidarToolsAlgorithmProvider.py) -tiedostoon. Globaalia konfiguraatiotiedostoa (.conf, .ini tms.) ei ohjelmalle näytä olevan Windows-ympäristössä.
![lastool-pydiffs](https://raw.githubusercontent.com/Fincer/central-management-of-multiple-servers/master/images/saltstack_module/lastool-py_diffs.png)
*LidarToolsAlgorithmProvider.py -tiedostoon toteutetut muutokset oikealla*
### Linux Ubuntu 18.04 LTS
- Sama QGIS-konfiguraatio kuin Windowsissa (kuvailtu ylhäällä)
- Linux-ympäristössä QGIS kirjoittaa Windows-rekisterin sijaan asetustiedostot oletuksena tiedostoon $HOME/.config/QGIS/QGIS2.conf. Linux:ssa QGIS kirjoittaa myös tiedoston /etc/default/qgis, jota muuttamalla en saanut LAStools-työkaluja kytkettyä päälle. Päädyin yhteneväisyyden ja konfiguraation minimoimisen takia käyttämään samaa muokattua [LidarToolsAlgorithmProvider.py](https://searchcode.com/file/115836660/python/plugins/processing/algs/lidar/LidarToolsAlgorithmProvider.py) -tiedostoa myös Linux-ympäristössä
-------------------
## Moduulin rakenne
Moduuli sisältää seuraavat tiedostot saatavilla GitHub-varastosta [Fincer - salt_gisworkstation](https://github.com/Fincer/salt_gisworkstation).
| Data | Kuvaus |
|--------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [saltscripts](https://github.com/Fincer/salt_gisworkstation/tree/master/saltscripts) | Alaskriptien pääkansio |
| [saltscripts/1-setup-salt-env.sh](https://github.com/Fincer/salt_gisworkstation/blob/master/saltscripts/1-setup-salt-env.sh) | Alaskripti - esiasenna Salt Master & Salt Minion nykyiselle tietokoneelle |
| [saltscripts/2-get-programs-on-master.sh](https://github.com/Fincer/salt_gisworkstation/blob/master/saltscripts/2-get-programs-on-master.sh) | Alaskripti - asenna ja lataa vaadittava ympäristö GIS-ohjelmien asentamiseen minion-tietokoneille |
| [sample_images](https://github.com/Fincer/salt_gisworkstation/tree/master/sample_images) | Esimerkkikuvien pääkansio |
| [sample_images/screen_ubuntu-final.png](https://github.com/Fincer/salt_gisworkstation/blob/master/sample_images/screen_ubuntu-final.png) | Esimerkkikuva - Salt:n tilan ajonjälkeinen tilanne Lubuntu 18.04 LTS -minion-tietokoneella |
| [sample_images/screen_ubuntu-master-final.png](https://github.com/Fincer/salt_gisworkstation/blob/master/sample_images/screen_ubuntu-master-final.png) | Esimerkkikuva - Salt:n tilan ajonjälkeinen tilanne Lubuntu 18.04 LTS -master-tietokoneella |
| [sample_images/screen_windows-final.png](https://github.com/Fincer/salt_gisworkstation/blob/master/sample_images/screen_windows-final.png) | Esimerkkikuva - Salt:n tilan ajonjälkeinen tilanne MS Windows 7 -minion-tietokoneella |
| [sample_images/screen_windows-final-2.png](https://github.com/Fincer/salt_gisworkstation/blob/master/sample_images/screen_windows-final-2.png) | Esimerkkikuva - Salt:n tilan ajonjälkeinen tilanne MS Windows 7 -minion-tietokoneella |
| [srv_pillar](https://github.com/Fincer/salt_gisworkstation/tree/master/srv_pillar) | Pääkansio, josta tuotetaan Salt Master -tietokoneen järjestelmäkansio /srv/pillar |
| [srv_pillar/top.sls](https://github.com/Fincer/salt_gisworkstation/blob/master/srv_pillar/top.sls) | Salt Master -tietokoneella sijaitsevan Salt:n pilarirakenteen päällimmäinen tilatiedosto |
| [srv_pillar/stones.sls](https://github.com/Fincer/salt_gisworkstation/blob/master/srv_pillar/stones.sls) | Salt Master -tietokoneella sijaitsevan Salt:n pilarirakenteen sekundaarinen stones-tilatiedosto |
| [srv_salt](https://github.com/Fincer/salt_gisworkstation/tree/master/srv_salt) | Pääkansio, josta tuotetaan Salt Master -tietokoneen järjestelmäkansio /srv/salt |
| [srv_salt/top.sls](https://github.com/Fincer/salt_gisworkstation/blob/master/srv_salt/top.sls) | Salt Master -tietokoneella sijaitsevan Salt:n Master -palvelun päällimmäinen tilatiedosto |
| [srv_salt/stone_file](https://github.com/Fincer/salt_gisworkstation/tree/master/srv_salt/stone_file) | Salt Master -tietokoneelle tuotettava kansiopolku /srv/salt/stone_file (liittyy pilarin stones-tilaan) |
| [srv_salt/stone_file/init.sls](https://github.com/Fincer/salt_gisworkstation/blob/master/srv_salt/stone_file/init.sls) | Salt Master -tietokoneelle tuotettavan tilan /srv/salt/stone_file päällimmäinen tilatiedosto |
| [srv_salt/stone_file/granite.txt](https://github.com/Fincer/salt_gisworkstation/blob/master/srv_salt/stone_file/granite.txt) | Salt Master -tietokoneelle tuotettavan Salt-tilan stone_file muottitiedosto minion-tietokoneille |
| [srv_salt/gis_windows](https://github.com/Fincer/salt_gisworkstation/tree/master/srv_salt/gis_windows) | Salt Master -tietokoneelle osoitettu Salt:n tilakansio gis_windows, jonka sisällä on määritelty MS Windows -Salt-minion -koneille kohdistetut muutokset |
| [srv_salt/gis_windows/init.sls](https://github.com/Fincer/salt_gisworkstation/blob/master/srv_salt/gis_windows/init.sls) | Salt:n kansion gis_windows päällimmäinen Salt-tilatiedosto |
| [srv_salt/gis_ubuntu-1804](https://github.com/Fincer/salt_gisworkstation/tree/master/srv_salt/gis_ubuntu-1804) | Salt Master -tietokoneelle osoitettu Salt:n tilakansio gis_ubuntu-1804, jonka sisällä on määritelty Ubuntu 18.04 LTS -Salt-minion -koneille kohdistetut muutokset |
| [srv_salt/gis_ubuntu-1804/init.sls](https://github.com/Fincer/salt_gisworkstation/blob/master/srv_salt/gis_ubuntu-1804/init.sls) | Salt:n kansion gis_ubuntu-1804 päällimmäinen Salt-tilatiedosto |
| [srv_salt/common/qgis_lastools](https://github.com/Fincer/salt_gisworkstation/tree/master/srv_salt/common/qgis_lastools) | Salt Master -tietokoneelle generoitava kansiopolku /srv/salt/common/qgis_lastools, jonka sisällä on määritelty [QGIS -ohjelmaa](https://qgis.org/) koskevat muutostiedostot minion-tietokoneille |
| [srv_salt/common/qgis_lastools/LidarToolsAlgorithmProvider.py](https://github.com/Fincer/salt_gisworkstation/blob/master/srv_salt/common/qgis_lastools/LidarToolsAlgorithmProvider.py) | Salt Minion -tietokoneille osoitettu, QGIS:n moduulia [LAStools](https://rapidlasso.com/lastools/) koskeva GPL-lisensoitu [Python-kooditiedosto](https://searchcode.com/file/115836660/python/plugins/processing/algs/lidar/LidarToolsAlgorithmProvider.py) |
| [srv_salt_winrepo](https://github.com/Fincer/salt_gisworkstation/tree/master/srv_salt_winrepo) | Salt Master -tietokoneelle luotava kansiopolku /srv/salt/winrepo, johon tuotetaan MS Windows -ohjelmien asennuspakettien vaatimat Salt-tilatiedostot |
| [srv_salt_winrepo/cloudcompare.sls](https://github.com/Fincer/salt_gisworkstation/blob/master/srv_salt_winrepo/cloudcompare.sls) | [CloudCompare -ohjelman](cloudcompare.org) asennusta koskeva Salt-tilatiedosto MS Windows -minion-tietokoneille |
| [srv_salt_winrepo/gpsd.sls](https://github.com/Fincer/salt_gisworkstation/blob/master/srv_salt_winrepo/gpsd.sls) | [GPSd -ohjelman](http://www.catb.org/gpsd/) asennusta koskeva Salt-tilatiedosto MS Windows -minion-tietokoneille |
| [srv_salt_winrepo/merkaartor.sls](https://github.com/Fincer/salt_gisworkstation/blob/master/srv_salt_winrepo/merkaartor.sls) | [Merkaartor -ohjelman](http://merkaartor.be/) asennusta koskeva Salt-tilatiedosto MS Windows -minion-tietokoneille |
| [srv_salt_winrepo/qgis.sls](https://github.com/Fincer/salt_gisworkstation/blob/master/srv_salt_winrepo/qgis.sls) | [QGIS -ohjelman](qgis.org) asennusta koskeva Salt-tilatiedosto MS Windows -minion-tietokoneille |
| [srv_salt_winrepo/quickroute-gps_x86.sls](https://github.com/Fincer/salt_gisworkstation/blob/master/srv_salt_winrepo/quickroute-gps_x86.sls) | [QuickRoute GPS -ohjelman (x86)](http://www.matstroeng.se/quickroute/en/) asennusta koskeva Salt-tilatiedosto MS Windows -minion-tietokoneille |
| [srv_salt_winrepo/vcrun2013.sls](https://github.com/Fincer/salt_gisworkstation/blob/master/srv_salt_winrepo/vcrun2013.sls) | [Visual Studio 2013 -ohjelman](https://www.microsoft.com/en-us/download/details.aspx?id=40784) asennusta koskeva Salt-tilatiedosto MS Windows -minion-tietokoneille |
-------------------
## Moduulin ajo
### Ajoympäristö
**Testikoneet:**
Moduulia testattiin pääsääntöisesti Oracle VirtualBox:ssa seuraavilla asetuksilla:
- 1x Linux Lubuntu 18.04 LTS Salt Master -tietokone
- 1x Microsoft Windows 7 Salt Minion -tietokone
- 1x Linux Lubuntu 18.04 LTS Salt Minion -tietokone
**Verkkoasetukset:**
Kaikki virtuaalitietokoneet oli kytketty julkiseen verkkoon (NAT) sekä keskenään samaan verkkoon (Internal Network, intnet). Julkinen verkko tarvittiin asennuspakettien latausta varten, yksityinen verkko taas Salt Masterin ja minioneiden keskinäiseen kommunikointiin.
**Lähtötilanne:**
![vbox-initial-conf](https://raw.githubusercontent.com/Fincer/central-management-of-multiple-servers/master/images/saltstack_module/0-initial-conf-vbox.png)
**Minionit käsinsäätöä:**
Moduulin huono puoli tällä hetkellä on, että se vaatii Salt Minion -koneiden käsin konfiguroinnin. Salt Minioneiden asennusta ei ole siis automatisoitu, mutta se olisi hyvinkin potentiaalinen kehityskohde.
Ennen moduulin ajoa halusin varmistua, että kaikki _intnet_-verkossa olleet minion-tietokoneet näkevät masterin. Moduuli on tarkoitettu ajettavaksi ilman tätä varmistusta, mutta testin tarkoituksena oli varmistua yhteydestä luotettavasti, jotta GIS-ohjelmien sisäänajon voitiin varmistua onnistuneen "kylmiltään".
Yhteyden testauksen ajaksi Salt Master -koneelle asennettiin Salt Master ja minion-tietokoneet konfiguroitiin myös kuntoon.
![minion-confs](https://raw.githubusercontent.com/Fincer/central-management-of-multiple-servers/master/images/saltstack_module/0-minion-confs.png)
*Moduulin tämän hetken huono puoli on, että Salt Minion -tietokoneet täytyy konfiguroida käsin ottamaan yhteys Salt Master -koneeseen. Salt Masterin IP-osoite sisäisessä verkossa intnet oli kuvassa näkyvä 10.13.13.105. Kuvassa ruutukaappaus Lubuntu- ja Windows -minion-tietokoneista*
![connectiontest](https://raw.githubusercontent.com/Fincer/central-management-of-multiple-servers/master/images/saltstack_module/1-test-config.png)
*Moduulin ajossa haluttiin olla 100% varmoja määriteltyjen Salt minion-tietokoneiden yhteydestä Salt Master -tietokoneeseen. Moduuli on rakennettu siten, että se hyppää sellaisten hyväksyttyjen koneiden (ID) yli, joihin se ei saa yhteyttä yrityksistä huolimatta. Koska koneita oli hyvin vähäinen määrä ja koska GIS-pakettien asennus haluttiin toteuttaa kylmiltään, haluttiin yhteydestä varmistua kuvassa näkyvällä toimenpiteellä. Testin jälkeen Salt Master -daemoni poistettiin Master-koneelta, koska moduulin mukana tuleva shell-skripti asentaa sen automaattisesti Master-koneelle*
### Moduulin ajovaiheet - ruutukaappaukset
![salt-readytogo](https://raw.githubusercontent.com/Fincer/central-management-of-multiple-servers/master/images/saltstack_module/2-execute-script.png)
*Yhteystestailun jälkeen oli aika laittaa moduuli laulamaan. Moduuli suoritetaan ajamalla halutulla Master-koneella kuvassa näkyvä komento 'sudo bash runme.sh' moduulin pääkansiossa*
![screen3](https://raw.githubusercontent.com/Fincer/central-management-of-multiple-servers/master/images/saltstack_module/screen-3.png)
*Heti alussa moduulin shell-skripti tulostaa viestin, jossa käyttäjälle kerrotaan lyhyesti, mitä moduuli tekee. Samalla kysytään käyttäjän varmistusta jatkaa moduulin suoritusta*
![screen4](https://raw.githubusercontent.com/Fincer/central-management-of-multiple-servers/master/images/saltstack_module/screen-4.png)
*Moduuli lataa uusimman Salt Masterin version SaltStackin pakettivarastoista. On ensisijaisen tärkeää varmistua, että Salt minioneiden ja masterin versio täsmäävät keskenään. Moduulin shell-skriptistä voidaan kytkeä SaltStackin varasto pois päältä.*
![screen8](https://raw.githubusercontent.com/Fincer/central-management-of-multiple-servers/master/images/saltstack_module/screen-8.png)
*Moduuli tekee paikalliselle tietokoneelle oletuskonfiguraation Salt Minionille 'defaultMinion', minkä jälkeen moduuli tarkistaa saatavien minion-tietokoneiden olemassaolon ja hyväksyy koneet. Shell-skriptissä voidaan määritellä, että moduuli hyväksyy koneet joko automaattisesti tai käyttäjän erikseen hyväksyminä*
*Koska moduuli joutuu latamaan hyvin paljon Windows-kohtaisia asennustiedostoja (~ 1 gigatavu), on moduuliin implementoitu erillinen tarkistus sille, onko Windows-koneita minion-koneiden joukossa*
![screen12](https://raw.githubusercontent.com/Fincer/central-management-of-multiple-servers/master/images/saltstack_module/screen-12.png)
*Windows-koneiden tarkastuksen jälkeen päivitetään pakettivarastot LASTools:n ja CloudComparen lähdekoodista kasaamista varten. Ohjelmat on pakko kasata lähdekoodista, koska tutkimuksista huolimatta ajantasaisia ja saatavilla olevia pakettivarastoja ohjelmien binääreille ei ole. Ohjelmien kasaaminen lähdekoodista usean koneen tapauksessa on hyvin riskialtista, ja vaatisi ehdottomasti laajempaa testausta.*
![screen-17](https://raw.githubusercontent.com/Fincer/central-management-of-multiple-servers/master/images/saltstack_module/screen-17.png)
*Salt Masterille täytyy asentaa aimo tukku paketteja, jotta minioneille kohdistettujen ohjelmien onnistunut asennus menisi onnistuneesti maaliin. Asennuksessa kestää jonkin aikaa.*
![screen-61](https://raw.githubusercontent.com/Fincer/central-management-of-multiple-servers/master/images/saltstack_module/screen-61.png)
*CloudCompare on pakko kasata lähdekoodista .deb-paketiksi, mikäli se halutaan asentaa Ubuntu salt-minion -tietokoneille. Windowsille moduuli lataa ohjelmakehittäjän tarjoaman binäärin.*
![screen105](https://raw.githubusercontent.com/Fincer/central-management-of-multiple-servers/master/images/saltstack_module/screen-105.png)
*CloudComparen kasaaminen lähdekoodista kestää arviolta noin 10 minuuttia, riippuen kasauksessa käytettävistä optimointiparametreista, saatavien prosessorien lukumäärästä jne. Moduuliin on implementoitu ominaisuus, joka tarkastaa, onko CloudCompare jo kasattu, jolloin ohjelman kasaus voidaan mahdollisesti ohittaa. Moduuli tekee kylläkin vielä lisätarkistuksen, mikäli pakettivarastoista saatavat kehittäjäpaketit on päivitetty ja kasaa ohjelman tarvittaessa uudelleen.*
![screen117](https://raw.githubusercontent.com/Fincer/central-management-of-multiple-servers/master/images/saltstack_module/screen-117.png)
*Moduuli ottaa järjestyksessä yhteyden minion-tietokoneisiin CloudComparen kasauksen jälkeen, testaten yhteyden ja tarkistamalla minionin Salt-version. Tämän jälkeen moduuli käy järjestyksessä läpi kaikki hyväksytyt minion-tietokoneet, ilmoittaen minionilta saadut IP-tiedot, ID-tunnuksen sekä järjestysnumeron. Ajossa minionin grains- ja pillars-tiedot päivitetään sekä ajetaan moduulin määrittelemät Salt-tilat (myös pillar:t) sisään minionille*
![screen178](https://raw.githubusercontent.com/Fincer/central-management-of-multiple-servers/master/images/saltstack_module/screen-178.png)
*Koska moduulin asentamien GIS-pakettien lataus- ja asennuskoko huitelee useissa sadoissa megatavuissa, havaittiin selkeitä ongelmia Salt masterin ja minion -koneen välisissä kutsuissa. Moduuliin on määritelty jo kasvatettu timeout-arvo, jotta Master ei katkaisisi yhteyttä minioneihin. Siitäkin huolimatta kuvassa näkyviä puutteita havaittiin yhteydenpidossa.*
![screen183](https://raw.githubusercontent.com/Fincer/central-management-of-multiple-servers/master/images/saltstack_module/screen-183.png)
*Ratkaisuna yhteysongelmiin moduuliin voisi implementoida tuen seuraaville: 1) Salt Master tarjoaa paketit suoraan minioneille lokaalista varastosta, toimii eritoten lokaaleissa verkoissa (vähentää myös tilojen ajoaikaa, koska nyt ajasta merkittävä osa menee siihen, että minionit lataavat masterin määrittelemät paketit itsekseen) 2) Master ajaa minionien asennustoimenpiteet rinnakkain, ei peräkkäin (onko ongelmatonta?)*
![screen189](https://raw.githubusercontent.com/Fincer/central-management-of-multiple-servers/master/images/saltstack_module/screen-189.png)
*Huolimatta edellä kuvatuista ongelmista, master kykeni ajamaan Salt-tilat sisään minionille*
![screen343](https://raw.githubusercontent.com/Fincer/central-management-of-multiple-servers/master/images/saltstack_module/screen-343.png)
*Minion-tietokoneista Windows tuotti toistuvasti ns. false-positive -tuloksia Salt-tilojen sisäänajosta. Tilassa määritellyt neljä asennusohjelmaa palauttavat samaan aikaan retcode 2:n (virhe) sekä sanallisen viestin 'install_status: success'. Nämä ovat SaltStack:ssa ilmenneitä ongelmia olleet ilmeisesti jo vuosien ajan ja niitä on ajan saatossa korjattu, mutta näköjään kaikkia virhetilanteita ei ole saatu pois. Asiaa tutkittiin (NSIS -asennuspaketeista lähtien), mutta asiaa ei kyetty ratkaisemaan moduulin nykyiseen versioon.*
*Moduuli ilmoittaa ajon lopussa, kuinka moneen Salt-minioniin tilojen sisäänajo onnistui, ja kuinka moneen epäonnistui. Lisäksi epäonnistuneiden minioneiden osalta moduuli ilmoittaa epäonnistuneen minionin ID:n ja saadut IP-osoitteet vikatilanteiden jatkoselvitystä varten.*
-------------------
## Miltä näyttää minion-koneilla?
Moduulin ajon jälkeen tilanne näyttää seuraavalta minion-koneilla:
### Microsoft Windows 7 - 64-bit
![winminion-programs](https://raw.githubusercontent.com/Fincer/salt_gisworkstation/master/sample_images/screen_windows-final.png)
*Salt-moduulissa määritellyt ohjelmat on onnistuneesti asennettu sisään Windows-minion -tietokoneelle. Lisäksi Salt-pillar:ssa määritelty testitiedosto on oikealla sisällöllä ajettu onnistuneesti sisään*
![winminion-lastools](https://raw.githubusercontent.com/Fincer/salt_gisworkstation/master/sample_images/screen_windows-final-2.png)
*Salt-moduulissa QGIS-ohjelmaan määritelty LAStools-työkalujen konfigurointi on onnistuneesti sisällä kaikille käyttäjille*
### Linux Lubuntu 18.04 LTS - 64-bit
![ubuntuminion-programs](https://raw.githubusercontent.com/Fincer/salt_gisworkstation/master/sample_images/screen_ubuntu-final.png)
*Salt-moduulissa määritellyt ohjelmat onnistuneesti asennettuna Linux Lubuntu -minion-tietokoneen sisään. Lisäksi Salt-pillar:ssa määritelty testitiedosto on oikealla sisällöllä ajettu onnistuneesti sisään ja LAStools on onnistuneesti esikonfiguroitu QGIS-ohjelmaan*
![ubuntumaster-programs](https://raw.githubusercontent.com/Fincer/salt_gisworkstation/master/sample_images/screen_ubuntu-master-final.png)
*Salt Masterilla on sama tilanne kuin ylhäällä Ubuntu minion-tietokoneella, koska master-koneelle oli määritelty myös oma minion-asennus, johon moduuli kohdisti toimenpiteitä*
-------------------
## Huomioita moduulin ajosta
### Ajoaika
Moduulin kylmiltä ajo kestää tällä hetkellä huomattavan kauan. Merkittävä osa ajasta menee seuraaviin asioihin:
- asennuspakettien latausaika
- suurimmat paketit ovat kooltaan useita satoja megatavuja. Esimerkiksi LASTools yli 300 mt.
- Kaiken kaikkiaan asennettavia paketteja on noin 1,3 gigatavun edestä.
- ratkaisu: lataa paketit Salt Masterille etukäteen, tiputa ne minioneille.
- Tämä on jo osittain implementoitu. Mikäli moduuli on kertaalleen ajettu ja havaitsee asennuspaketit kansiossa compiled, ei moduuli lataa/kasaa paketteja enää uudelleen
- Ongelma edelleen se, että minion-tietokoneet tekevät vaadittavien riippuvuuspakettien suhteen omat latauksensa (esim. QGIS)
- asennuspakettien asennusaika
- Asennuspakettikokonaisuudet ovat isoja ja vievät paljon prosessointiaikaa niin masterilta kuin minionilta. Masteria tämä tosin valtaosin koskee moduulin ensimmäistä ajokertaa. Minioneiden osalta Ubuntu-koneilla moduulin ajaminen toiseen kertaan on nopeampaa kuin Windows-minioneilla. Moduulin testauksen aikana näytti ilmeiseltä, että SaltStack tukee ja kykenee paremmin kontrolloimaan Linux-ympäristössä tapahtuvia asennuksia
### Ajon luotettavuus
**Ohjelmien kasaus - CloudCompare**
Merkittävin luotettavuuteen liittyvä ongelma on erityisesti CloudComparen kasausprosessi. Ohjelman kasaus on riippuvainen monesta kehittäjäpaketista, joten tietokoneympäristön fragmentoituminen on omiaan lisäämään riskiä siitä, että joillakin minioneilla asennus menee ajan saatossa siihen kuntoon, ettei ohjelma enää käynnisty (esimerkiksi puuttuvan kirjastoriippuvuuden takia). Ohjelman kasausta hallituissa ympäristöissä tulisi välttää viimeiseen saakka.
CloudComparen merkittävin ongelma Linux-ympäristöissä on virallisten pakettilähteiden puute tai vanhentuneisuus. Esimerkiksi Ubuntulle löytyy CloudComparen PPA, mutta se on osoitettu Linux Ubuntu:n versiolle 16.04 LTS ja [toimittaa CloudComparesta version 2.6.0 vuodelta 2014](https://launchpad.net/~romain-janvier/+archive/ubuntu/cloudcompare), siinä missä uusin versio on edelleen kehityksessä oleva 2.10 Alpha.
CloudCompare on merkittävä avoimen lähdekoodin ohjelma pistepilvien prosessointiin. Eräs vaihtoehtoinen, joskaan ei niin spesifisesti laserkeilausdatan käsittelyyn tarkoitettu ohjelma, on [MeshLab](http://www.meshlab.net/). MeshLab:sta moduulin kirjoittajalla on kokemusta, ja se ei tuotantoympäristössä ole riittävän vakaa ohjelma raskaiden datamassojen prosessointiin (siinä, missä CloudCompare on).
**Ohjelmien kasaus - LAStools**
LAStoolsia vaivaa sama ongelma kuin CloudComparea, mitä tulee joidenkin Linux-jakeluiden pakettivarastoihin. LAStools tuskin kuitenkaan hajoaa niin helposti kuin CloudCompare, koska vaaditut ulkopuoliset kehittäjäpakettiriippuvuudet on minimissään rajoittuen likipitäen _make_ -binäärin löytyvyyteen.
**Salt-tilojen aikakatkaisu**
Salt-tilojen ajon aikana havaittiin huolestuttavia viestejä yhteysongelmasta Salt Masterin ja minioneiden välillä. Ongelma liittyy isojen asennuspakettien lataukseen ja asennukseen, eikä tule juurikaan ilmi pienien järjestelmämuutoksien toteutuksessa tai pieniä asennuspaketteja asentaessa. *Tämä on ongelma, joka pitää ratkaista, mikäli moduuli otetaan laajemmassa tuotantoympäristössä käyttöön.*
Aikakatkaisuun kehitysehdotuksia on lueteltu ylhäällä otsikon "Ajoaika" alla.
-------------------
## Moduulin hyvät puolet
- Asentaa GIS-ohjelmat Ubuntu- ja Windows -käyttöympäristöihin
- Laajennettavissa helposti
- Potentiaali: vähentää GIS-työasemien asennukseen kuluvaa aikaa
- Jonkin verran kustomoitavissa (shell-skriptit mm.)
## Moduulin huonot puolet
- Ajo kestää kauan
- Mikäli kaikki paketit ladataan verkosta, kestää 3 minionin kuntoon laittaminen automatiikalla noin 1 tunnin.
- Rajoittaa mm. moduulin skaalautuvuutta laajempiin ympäristöihin
- Shell-skriptien luotettavuus
- Edellyttäisi pidempiaikaista ja vaativampaa testausta
- Bugit mahdollisia
- Tuetut minion-ympäristöt hyvin rajoittuneet
- Laajempi käyttöjärjestelmätuki vaadittaisiin
- Testausympäristö oli moduulin ajossa rajoittunut
- Edelleen, vaatisi ajan kanssa testausta laajemmassa ympäristössä
- Koneet, joissa Salt masterin kanssa konfliktissa oleva minion-versio
- Osittainen tuki tehty, mutta vielä olisi tehtävää
-------------------
## Moduulin kehittämistarpeet
Moduulissa on paljon kehittämistarpeita, joskin myös potentiaalia. Kriittisiin kohtiin olisi puututtava, mm.
- ajoajan hitauteen
- master- ja minion -tietokoneiden yhteyden luotettavuuteen
- ohjelmien kasauksen minimointiin
jne. Enemmän kehittämistarpeita on lueteltu ylhäällä otsikon "Moduulin huonot puolet" alla sekä shell-skriptissä '[runme.sh](https://github.com/Fincer/salt_gisworkstation/blob/master/runme.sh)' (alussa oleva TODO-lista).
Lisäksi olisi hyvin tärkeää, että Salt Minion -konfiguraatiot tehdään SSH-yhteyden yli kohdekoneille. Tällä erää aika ei riittänyt tämän toiminnallisuuden toteuttamiseen, vaikkakin näkemys tämän toteuttamiseksi on kohtalaisen selkeä.

+ 0
- 1
images/.gitignore View File

@ -1 +0,0 @@

Loading…
Cancel
Save