From 933081975589f6b7fe4e59bbb3e82a78ac1815f1 Mon Sep 17 00:00:00 2001 From: Fincer Date: Wed, 15 Aug 2018 19:53:19 +0300 Subject: [PATCH] Move exercises to their own subfolder --- README.md | 14 +- exercises/h1.md | 664 +++++++++++++++++++++++++++ exercises/h2.md | 1064 +++++++++++++++++++++++++++++++++++++++++++ exercises/h3.md | 836 ++++++++++++++++++++++++++++++++++ exercises/h4.md | 504 ++++++++++++++++++++ exercises/h5.md | 148 ++++++ exercises/h6.md | 107 +++++ exercises/module.md | 587 ++++++++++++++++++++++++ images/.gitignore | 1 - 9 files changed, 3917 insertions(+), 8 deletions(-) create mode 100644 exercises/h1.md create mode 100644 exercises/h2.md create mode 100644 exercises/h3.md create mode 100644 exercises/h4.md create mode 100644 exercises/h5.md create mode 100644 exercises/h6.md create mode 100644 exercises/module.md delete mode 100644 images/.gitignore diff --git a/README.md b/README.md index 4425d88..7b6bd4f 100644 --- a/README.md +++ b/README.md @@ -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) diff --git a/exercises/h1.md b/exercises/h1.md new file mode 100644 index 0000000..5ef91d0 --- /dev/null +++ b/exercises/h1.md @@ -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 "" | 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 +``` diff --git a/exercises/h2.md b/exercises/h2.md new file mode 100644 index 0000000..dbbd397 --- /dev/null +++ b/exercises/h2.md @@ -0,0 +1,1064 @@ +Palvelinten hallinta - Harjoitus 2 +============== + +*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) Laita käyttäjien kotisivut toimimaan Apachella - Salt](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/h2.md#b-laita-k%C3%A4ytt%C3%A4jien-kotisivut-toimimaan-apachella---salt) + +- [c) Laita PHP toimimaan käyttäjien kotisivuilla - Salt (Huomaa, että PHP toimii oletuksena kaikkialla muualla kuin käyttäjien public_html-kotisivuilla.)](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/h2.md#c-laita-php-toimimaan-k%C3%A4ytt%C3%A4jien-kotisivuilla---salt-huomaa-ett%C3%A4-php-toimii-oletuksena-kaikkialla-muualla-kuin-k%C3%A4ytt%C3%A4jien-public_html-kotisivuilla) + +- [d) Rakenna tila (state), joka tekee Apachelle uuden nimipohjaisen virtuaalipalvelimen (name based virtual hosting). Voit simuloida nimipalvelun toimintaa hosts-tiedoston avulla.](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/h2.md#d-rakenna-tila-state-joka-tekee-apachelle-uuden-nimipohjaisen-virtuaalipalvelimen-name-based-virtual-hosting-voit-simuloida-nimipalvelun-toimintaa-hosts-tiedoston-avulla) + +- [e) Tee tila, joka laittaa esimerkkikotisivun uusille käyttäjille. Voit laittaa esimerkkikotisivu /etc/skel/:iin, niin se tulee automaattisesti ‘adduser tero’ komennolla käyttäjiä luodessa.](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/h2.md#e-tee-tila-joka-laittaa-esimerkkikotisivun-uusille-k%C3%A4ytt%C3%A4jille-voit-laittaa-esimerkkikotisivu-etcskeliin-niin-se-tulee-automaattisesti-adduser-tero-komennolla-k%C3%A4ytt%C3%A4ji%C3%A4-luodessa) + +- [f) Eri asetukset. Tee Package-File-Service tilalla eri asetuksia kuin ne, mitä tehtiin tunnilla; ja eri kuin mitä teit/teet h2 muissa kohdissa. Voit muuttaa jotain toista asetusta samoista demoneista tai valita kokonaan eri demonit.](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/h2.md#f-eri-asetukset-tee-package-file-service-tilalla-eri-asetuksia-kuin-ne-mit%C3%A4-tehtiin-tunnilla-ja-eri-kuin-mit%C3%A4-teitteet-h2-muissa-kohdissa-voit-muuttaa-jotain-toista-asetusta-samoista-demoneista-tai-valita-kokonaan-eri-demonit) + +b) Laita käyttäjien kotisivut toimimaan Apachella - Salt +-------------- + +**Vastaus:** + +Olemme tässä vaiheessa luoneet perusedellytykset Masterille ja Minione(ille). Ks. [harjoitus 1](https://github.com/Fincer/central-management-of-multiple-servers/blob/master/h1.md) + +Luodaan Master-koneen kansioon _/srv/salt_ state-tiedosto *0_create_indexhtml.sls* komennolla *sudo nano /srv/salt/0_create_indexhtml.sls* ja täydennetään se sisällöllä: + +``` +# This is a Salt script for installing Apache HTTP daemon with +# default userdir configuration to minion computers +# Author: Pekka Helenius (~Fincer), 2018 + +######################################### +# Install Apache HTTP daemon to minions + +install_httpd_daemon: + pkg.installed: + - pkgs: + - apache2 + +######################################### +# Enable Apache userdir module + +httpd_userdir: + cmd.run: + - name: /usr/sbin/a2enmod userdir + - require: + - pkg: install_httpd_daemon + +######################################### +# Replace default index.html content + +httpd_foo-index: + cmd.run: + - name: /bin/echo "foo" > /var/www/html/index.html + - require: + - cmd: httpd_userdir + - pkg: install_httpd_daemon + +######################################### +# Execute public_html script + +execute_public_html: + cmd.script: + - name: salt://0_create_indexhtml.sh + - runas: root + +######################################### +# Restart Apache HTTP daemon + +httpd_service_restart_userdir: + service.running: + - name: apache2.service + - watch: + - cmd: httpd_userdir + +``` + +Tiedoston oikeudet tulisi olla: u=rw, g=r, o=r (0644) + +Harjoituksessa käytetään Debian-pohjaisia Xubuntu-käyttöjärjestelmiä (18.04 LTS). + +Varmistetaan, että "orja" -alkuisiin orjakoneisiin (minions) saadaan yhteys suorittamalla master-koneella esim. komento: + +``` +[09/04/2018 22:01:26 - fincer: ~ ]$ sudo salt 'orja*' grains.item osrelease +orjakone: + ---------- + osrelease: + 18.04 +``` + +Luodaan master-koneelle seuraava shell-skripti */srv/salt/0_create_indexhtml.sh*, joka tuottaa kaikille orjakoneen käyttäjille kansion *public_html* testisivuineen: + +``` +#!/bin/sh + +# Find home folders of system users (who are using bash as their default shell) +for userhome in $(grep -E "\/bin\/bash" /etc/passwd | grep -v root | awk -F ':' '{print $(NF - 1)}'); do + + # Create public_html for found user + if [ ! -d "${userhome}"/public_html ]; then + mkdir -p "${userhome}"/public_html + + # Promote this user to be the owner of the created directory + chown $(stat --format "%u:%g" ${userhome}) "${userhome}"/public_html + + # Touch default index file for testing purposes + echo "This is my test site. I am user $(stat --format \"%U\" ${userhome}). Happy coding!" > "${userhome}"/public_html/index.html + fi + +done +``` + +Suoritetaan tehtävänannossa edellytetty Apache HTTP-daemonin asennus minion-koneille: + +``` +sudo salt 'orja*' state.apply 0_create_indexhtml +``` + +Esimerkki-output (masterilla): + +``` +[09/04/2018 21:45:41 - fincer: salt ]$ sudo salt 'orja*' state.apply 0_create_indexhtml +orjakone: +---------- + ID: install_httpd_daemon + Function: pkg.installed + Result: True + Comment: All specified packages are already installed + Started: 03:06:06.583325 + Duration: 377.198 ms + Changes: +---------- + ID: httpd_userdir + Function: cmd.run + Name: /usr/sbin/a2enmod userdir + Result: True + Comment: Command "/usr/sbin/a2enmod userdir" run + Started: 03:06:06.962361 + Duration: 19.784 ms + Changes: + ---------- + pid: + 20406 + retcode: + 0 + stderr: + stdout: + Module userdir already enabled +---------- + ID: httpd_foo-index + Function: cmd.run + Name: /bin/echo "foo" > /var/www/html/index.html + Result: True + Comment: Command "/bin/echo "foo" > /var/www/html/index.html" run + Started: 03:06:06.982499 + Duration: 3.978 ms + Changes: + ---------- + pid: + 20411 + retcode: + 0 + stderr: + stdout: +---------- + ID: execute_public_html + Function: cmd.script + Name: salt://0_create_indexhtml.sh + Result: True + Comment: Command 'salt://0_create_indexhtml.sh' run + Started: 03:06:06.986594 + Duration: 415.176 ms + Changes: + ---------- + pid: + 20432 + retcode: + 0 + stderr: + stdout: +---------- + ID: httpd_service_restart_userdir + Function: service.running + Name: apache2.service + Result: True + Comment: Service restarted + Started: 03:06:07.435663 + Duration: 124.998 ms + Changes: + ---------- + apache2.service: + True + +Summary for orjakone +------------ +Succeeded: 5 (changed=4) +Failed: 0 +------------ +Total states run: 5 +Total run time: 941.134 ms +``` + +Minion-koneelta voimme tarkastaa, onko kansio *public_html* ja tiedosto *index.html* luotu (esim. orjakone:en käyttäjälle fincer): + +``` +[09/04/2018 21:46:59 - fincer: salt ]$ sudo salt 'orjakone' cmd.run 'cat /home/fincer/public_html/index.html' +orjakone: + This is my test site. I am user "fincer". Happy coding! +``` + +c) Laita PHP toimimaan käyttäjien kotisivuilla - Salt (Huomaa, että PHP toimii oletuksena kaikkialla muualla kuin käyttäjien public_html-kotisivuilla.) +-------------- + +**Vastaus:** + +Tehtävässä pitää orjakoneilta (minions) kytkeä PHP päälle userdir-moduulin kanssa editoimalla konfiguraatiotiedostoa /etc/apache2/mods-available/php*.conf (missä * on php-versio). +Tämä vaihe voidaan tehdä kahdella tavalla: + +- 1) Luodaan master-koneelle uusi konfiguraatiotiedosto (php*.conf) samalla sisällöllä, mutta kommentoidaan userdir-moduulin edellyttämät rivit tiedostosta (tiedostossa on selkeät ohjeet tähän) + +- 2) Luodaan skripti, jonka tehtävänä on lisätä kommenttimerkit orjakoneiden php*.conf -tiedoston relevanttiin osioon + +Molemmat vaihtoehdot määritetään suoritettavaksi master:lla Saltin state-tiedostossa. Toteutetaan vaihtoehto 2. + +Luodaan master-koneella shell-skripti */srv/salt/1_enable_php-for-userdir.sh* sisällöllä: + +``` +#!/bin/sh + +# Enable PHP for userdir module in Apache +# Author: Pekka Helenius, 2018 + +PHP_CONF_FILE="$(ls /etc/apache2/mods-available/php*.conf)" + +IFS=" +" + +for line in $(cat "${PHP_CONF_FILE}" | sed -n '/\/,/\<\/IfModule>/p;/\<\/IfModule>/q'); do + sed_line=$(echo "${line}" | sed 's!\*!\\*!g;') + sed -ir "s!${sed_line}!#${sed_line}!" "${PHP_CONF_FILE}" +done + +unset IFS + +``` + +Luodaan master-koneella toinenkin shell-skripti */srv/salt/1_create_indexphp.sh* seuraavalla sisällöllä: + +``` +#!/bin/sh + +# Find home folders of system users (who are using bash as their default shell) +for userhome in $(grep -E "\/bin\/bash" /etc/passwd | grep -v root | awk -F ':' '{print $(NF - 1)}'); do + + # Create public_html for found user + if [ ! -d "${userhome}"/public_html ]; then + mkdir -p "${userhome}"/public_html + + # Promote this user to be the owner of the created directory + chown $(stat --format "%u:%g" ${userhome}) "${userhome}"/public_html + + # Rename existing index.html if exists + if [ -f "${userhome}"/public_html/index.html ]; then + mv "${userhome}"/public_html/index.html "${userhome}"/public_html/index.html.old + fi + + # Touch default index PHP file for testing purposes + echo "" > "${userhome}"/public_html/index.php + fi + +done + +``` + +Luodaan master-koneelle state-määritystiedosto */srv/salt/1_create_indexphp.sls* sisällöllä: + +``` +# Author: Pekka Helenius (~Fincer), 2018 + +######################################### +# Variables + +# PHP module for Apache in Debian +{% set ENABLE_PHP_MODULE = "/usr/sbin/a2enmod $(a2query -m | awk '{print $1}' | grep php)" %} + +{% set USERDIR_ENABLE_STATUS = "a2query -m | grep userdir | grep 'enabled by' &>/dev/null || /usr/sbin/a2enmod userdir" %} + +######################################### +# Install PHP addons for Apache HTTP daemon (with dependencies) + +install_httpd_php: + pkg.installed: + - pkgs: + - apache2 + - libapache2-mod-php + +######################################### +# Find if userdir module is enabled + +check_userdir_status: + cmd.run: + - name: {{ USERDIR_ENABLE_STATUS }} + - require: + - pkg: install_httpd_php + +######################################### +# Enable PHP for users + +execute_userdir_php_script: + cmd.script: + - name: salt://apache/1_enable_php-for-userdir.sh + - runas: root + - require: + - cmd: check_userdir_status + +add_indexphp_files: + cmd.script: + - name: salt://apache/1_create_indexphp.sh + - runas: root + - require: + - cmd: execute_userdir_php_script + +######################################### +# Enable PHP module (should be done already, though) + +enable_httpd_php: + cmd.run: + - name: {{ ENABLE_PHP_MODULE }} + +######################################### +# Restart Apache HTTP daemon + +httpd_service_restart_php: + service.running: + - name: apache2.service + - watch: + - cmd: check_userdir_status + - cmd: execute_userdir_php_script + +``` + +Esimerkki-output master-koneella: + +``` +[09/04/2018 23:13:27 - fincer: ~ ]$ sudo salt 'orjakone' state.apply 1_create_indexphp +orjakone: +---------- + ID: install_httpd_php + Function: pkg.installed + Result: True + Comment: All specified packages are already installed + Started: 03:12:05.777863 + Duration: 387.502 ms + Changes: +---------- + ID: check_userdir_status + Function: cmd.run + Name: a2query -m | grep userdir | grep 'enabled by' &>/dev/null || /usr/sbin/a2enmod userdir + Result: True + Comment: Command "a2query -m | grep userdir | grep 'enabled by' &>/dev/null || /usr/sbin/a2enmod userdir" run + Started: 03:12:06.167690 + Duration: 37.4 ms + Changes: + ---------- + pid: + 20663 + retcode: + 0 + stderr: + stdout: + userdir (enabled by site administrator) +---------- + ID: execute_userdir_php_script + Function: cmd.script + Name: salt://1_enable_php-for-userdir.sh + Result: True + Comment: Command 'salt://1_enable_php-for-userdir.sh' run + Started: 03:12:06.206077 + Duration: 192.94 ms + Changes: + ---------- + pid: + 20690 + retcode: + 0 + stderr: + stdout: +---------- + ID: add_indexphp_files + Function: cmd.script + Name: salt://1_create_indexphp.sh + Result: True + Comment: Command 'salt://1_create_indexphp.sh' run + Started: 03:12:06.399689 + Duration: 142.251 ms + Changes: + ---------- + pid: + 20734 + retcode: + 0 + stderr: + stdout: +---------- + ID: enable_httpd_php + Function: cmd.run + Name: /usr/sbin/a2enmod $(a2query -m | awk '{print $1}' | grep php) + Result: True + Comment: Command "/usr/sbin/a2enmod $(a2query -m | awk '{print $1}' | grep php)" run + Started: 03:12:06.542066 + Duration: 68.876 ms + Changes: + ---------- + pid: + 20741 + retcode: + 0 + stderr: + stdout: + Considering dependency mpm_prefork for php7.2: + Considering conflict mpm_event for mpm_prefork: + Considering conflict mpm_worker for mpm_prefork: + Module mpm_prefork already enabled + Considering conflict php5 for php7.2: + Module php7.2 already enabled +---------- + ID: httpd_service_restart_php + Function: service.running + Name: apache2.service + Result: True + Comment: Service restarted + Started: 03:12:06.635009 + Duration: 87.188 ms + Changes: + ---------- + apache2.service: + True + +Summary for orjakone +------------ +Succeeded: 6 (changed=5) +Failed: 0 +------------ +Total states run: 6 +Total run time: 916.157 ms +``` + +d) Rakenna tila (state), joka tekee Apachelle uuden nimipohjaisen virtuaalipalvelimen (name based virtual hosting). Voit simuloida nimipalvelun toimintaa hosts-tiedoston avulla. +-------------- + +**Vastaus:** + +**HUOM!** Tämän olisi voinut tehdä myös luomalla esim. index.html- ja sivustokonfiguraatiotiedostot masterilla, josta ne siirrettäisiin minioneille (file). Nämä määritykset tehdään state-tiedostossa, luonnollisesti. Paljon parempi tapa, jos on esimerkiksi tarkoitus laittaa juuri samansisältöinen _/etc/apache2/sites-available/*.conf_ -tiedosto/template ja samansisältöinen, masterilta päivitettävissä oleva index.html -tiedosto minioneille. Tein nyt huvikseni seuraavalla tavalla, vaikka tiedän, ettei se nyt ihan nappiin menekkään. + +Luodaan master-koneen */srv/salt/* -kansioon state/konfiguraatiotiedosto *apache_virtualhost_example.sls* sisällöllä: + +``` +# Author: Pekka Helenius (~Fincer), 2018 + +######################################### +# Install Apache HTTP daemon to minions + +install_httpd_daemon: + pkg.installed: + - pkgs: + - apache2 + +######################################### + +copy_httpd_defaultsite: + cmd.run: + - name: '[ ! -f /etc/apache2/sites-available/$(hostname)-example.conf ] && cd /etc/apache2/sites-available && cp 000-default.conf $(hostname)-example.conf || false' + - require: + - pkg: install_httpd_daemon + +create_site_rootdir: + cmd.run: + - name: /bin/mkdir -p /var/www/html/$(hostname) + - require: + - pkg: install_httpd_daemon + +enable_httpd_servername: + cmd.run: + - name: /bin/sed -i "s/#ServerName www\.example\.com/ServerName $(hostname).example.com/" /etc/apache2/sites-available/$(hostname)-example.conf + - require: + - cmd: copy_httpd_defaultsite + +change_defaultsite_root: + cmd.run: + - name: /bin/sed -i "s/DocumentRoot \/var\/www\/html/DocumentRoot \/var\/www\/html\/$(hostname)/" /etc/apache2/sites-available/$(hostname)-example.conf + - require: + - cmd: enable_httpd_servername + +enable_httpd_defaultsite: + cmd.run: + - name: /usr/sbin/a2ensite $(hostname)-example.conf + - require: + - cmd: change_defaultsite_root + - cmd: copy_httpd_defaultsite + - pkg: install_httpd_daemon + +add_virtualhost_string: + cmd.run: + - name: /bin/echo "127.0.0.1 $(hostname).example.com" > /etc/hosts + - require: + - cmd: enable_httpd_defaultsite + +add_defaultsite_indexfile: + cmd.run: + - name: '[ ! -f /var/www/html/$(hostname)/index.html ] && /bin/echo "This is default HTML template for $(hostname) ($(hostname).example.com), created on $(date \"+%d-%m-%Y at %X\")" > /var/www/html/$(hostname)/index.html' + - require: + - cmd: create_site_rootdir + - cmd: add_virtualhost_string + - cmd: enable_httpd_defaultsite + +restart_httpd_service: + service.running: + - name: apache2.service + - watch: + - cmd: enable_httpd_defaultsite + - cmd: add_defaultsite_indexfile +``` + +Ajetaan em. state masterilta minion-koneelle nimeltä "orjakone" (vain tälle yhdelle koneelle, ei muita orjia nyt!): + +``` +[10/04/2018 00:13:12 - fincer: ~ ]$ sudo salt 'orjakone' state.apply apache_virtualhost_example +orjakone: +---------- + ID: install_httpd_daemon + Function: pkg.installed + Result: True + Comment: All specified packages are already installed + Started: 05:20:27.160570 + Duration: 360.254 ms + Changes: +---------- + ID: copy_httpd_defaultsite + Function: cmd.run + Name: [ ! -f /etc/apache2/sites-available/$(hostname)-example.conf ] && cd /etc/apache2/sites-available && cp 000-default.conf $(hostname)-example.conf || false + Result: False + Comment: Command "[ ! -f /etc/apache2/sites-available/$(hostname)-example.conf ] && cd /etc/apache2/sites-available && cp 000-default.conf $(hostname)-example.conf || false" run + Started: 05:20:27.522609 + Duration: 4.361 ms + Changes: + ---------- + pid: + 22444 + retcode: + 1 + stderr: + stdout: +---------- + ID: create_site_rootdir + Function: cmd.run + Name: /bin/mkdir -p /var/www/html/$(hostname) + Result: True + Comment: Command "/bin/mkdir -p /var/www/html/$(hostname)" run + Started: 05:20:27.527146 + Duration: 3.26 ms + Changes: + ---------- + pid: + 22446 + retcode: + 0 + stderr: + stdout: +---------- + ID: enable_httpd_servername + Function: cmd.run + Name: /bin/sed -i "s/#ServerName www\.example\.com/ServerName $(hostname).example.com/" /etc/apache2/sites-available/$(hostname)-example.conf + Result: False + Comment: One or more requisite failed: apache_virtualhost_example.copy_httpd_defaultsite + Changes: +---------- + ID: change_defaultsite_root + Function: cmd.run + Name: /bin/sed -i "s/DocumentRoot \/var\/www\/html/DocumentRoot \/var\/www\/html\/$(hostname)/" /etc/apache2/sites-available/$(hostname)-example.conf + Result: False + Comment: One or more requisite failed: apache_virtualhost_example.enable_httpd_servername + Changes: +---------- + ID: enable_httpd_defaultsite + Function: cmd.run + Name: /usr/sbin/a2ensite $(hostname)-example.conf + Result: False + Comment: One or more requisite failed: apache_virtualhost_example.copy_httpd_defaultsite, apache_virtualhost_example.change_defaultsite_root + Changes: +---------- + ID: add_virtualhost_string + Function: cmd.run + Name: /bin/echo "127.0.0.1 $(hostname).example.com" > /etc/hosts + Result: False + Comment: One or more requisite failed: apache_virtualhost_example.enable_httpd_defaultsite + Changes: +---------- + ID: add_defaultsite_indexfile + Function: cmd.run + Name: [ ! -f /var/www/html/$(hostname)/index.html ] && /bin/echo "This is default HTML template for $(hostname) ($(hostname).example.com), created on $(date \"+%d-%m-%Y at %X\")" > /var/www/html/$(hostname)/index.html + Result: False + Comment: One or more requisite failed: apache_virtualhost_example.add_virtualhost_string, apache_virtualhost_example.enable_httpd_defaultsite + Changes: +---------- + ID: restart_httpd_service + Function: service.running + Name: apache2.service + Result: False + Comment: One or more requisite failed: apache_virtualhost_example.add_defaultsite_indexfile, apache_virtualhost_example.enable_httpd_defaultsite + Changes: + +Summary for orjakone +------------ +Succeeded: 2 (changed=2) +Failed: 7 +------------ +Total states run: 9 +Total run time: 367.875 ms +``` + +Hups! Epäonnistumisia, emämunaus. Ihan odotettua, sillä... + +...epäonnistumiset johtuvat siitä, että olen määritellyt tietyt ID:t, kuten tässä tapauksessa ehkä kriittisimpänä copy_httpd_defaultsite:n, palauttamaan komennon suorittamisesta arvon false, mikäli mm. tiedosto $(hostname)-example.conf on jo olemassa. Koska kyseinen ID on riippuvuutena alemmille ID:ille, ja nämä ID:t edelleen riippuvuutena eteenpäin muille ID:lle, syntyy ketjureaktio, jossa epäonnistuneita tiloja tulee suuri määrä. Tässä tapauksessa 7 kpl. Tulos oli odotettu _tässä konfiguraatiossa_. + +Orjakoneen selainnäkymässä (*xdg-open http://$(hostname).example.com*) ajettuna lopputulos näyttää tältä: + +![minion-virtualhost](https://raw.githubusercontent.com/Fincer/central-management-of-multiple-servers/master/images/minion-example.png) + +e) Tee tila, joka laittaa esimerkkikotisivun uusille käyttäjille. Voit laittaa esimerkkikotisivu /etc/skel/:iin, niin se tulee automaattisesti ‘adduser tero’ komennolla käyttäjiä luodessa. +-------------- + +**Vastaus:** + +**HUOM!** Tämä on osittain tehtynä jo vastauksissa b) ja c) (Mitä on tehty: On luotu jokaiselle käyttäjälle index.html (b) ja PHP:n kytkemisen yhteydessä index.php (c)) + +**HUOM!** Tässä olisi voinut hyödyntää esim. kansiorakennetta _/srv/salt/apache_, jonne laitettu state-tiedostot. Nyt toimitaan vielä yksinkertaisemmalla pohjalla, minkä takia state-tiedostoissa esiintyy päällekkäisyyttä. Monimutkaisemmissa konfiguraatioissa puu-rakennetta olisi hyvä harkita (mandatory?). + +Lisätään state *2_apache_skelsite.sls*, joka lisää esimerkkikotisivun määriteltyjen minion-koneiden hakemistoon _/etc/skel_ (teemme alihakemiston *public_html* tänne state-tiedostossa...): + +``` +# Author: Pekka Helenius (~Fincer), 2018 + +######################################### +# Install Apache HTTP daemon to minions + +install_httpd_daemon: + pkg.installed: + - pkgs: + - apache2 + +######################################### +# Enable Apache userdir module + +httpd_userdir: + cmd.run: + - name: /usr/sbin/a2enmod userdir + - require: + - pkg: install_httpd_daemon + +######################################### +# Replace default index.html content + +httpd_foo-index: + cmd.run: + - name: /bin/echo "foo" > /var/www/html/index.html + - require: + - cmd: httpd_userdir + - pkg: install_httpd_daemon + +######################################### +# Restart Apache HTTP daemon + +httpd_service_restart_skelsite: + service.running: + - name: apache2.service + - watch: + - cmd: httpd_userdir + +######################################### +# Create /etc/skel/public_html +apache_add_skel_html_dir: + cmd.run: + - name: /bin/mkdir -p /etc/skel/public_html + - require: + - service: httpd_service_restart_skelsite + +######################################### +# Add index.html +apache_default_userindex_file: + cmd.run: + - name: /bin/echo "Empty HTML template" > /etc/skel/public_html/index.html + - require: + - cmd: apache_add_skel_html_dir + +``` + +Master-koneen output: + +``` +[10/04/2018 01:15:01 - fincer: ~ ]$ sudo salt 'orjakone' state.apply 2_apache_skelsite +orjakone: +---------- + ID: install_httpd_daemon + Function: pkg.installed + Result: True + Comment: All specified packages are already installed + Started: 03:46:46.743389 + Duration: 368.537 ms + Changes: +---------- + ID: httpd_userdir + Function: cmd.run + Name: /usr/sbin/a2enmod userdir + Result: True + Comment: Command "/usr/sbin/a2enmod userdir" run + Started: 03:46:47.113788 + Duration: 21.611 ms + Changes: + ---------- + pid: + 21155 + retcode: + 0 + stderr: + stdout: + Module userdir already enabled +---------- + ID: httpd_foo-index + Function: cmd.run + Name: /bin/echo "foo" > /var/www/html/index.html + Result: True + Comment: Command "/bin/echo "foo" > /var/www/html/index.html" run + Started: 03:46:47.135793 + Duration: 4.274 ms + Changes: + ---------- + pid: + 21160 + retcode: + 0 + stderr: + stdout: +---------- + ID: httpd_service_restart_skelsite + Function: service.running + Name: apache2.service + Result: True + Comment: Service restarted + Started: 03:46:47.161935 + Duration: 103.555 ms + Changes: + ---------- + apache2.service: + True +---------- + ID: apache_add_skel_html_dir + Function: cmd.run + Name: /bin/mkdir -p /etc/skel/public_html + Result: True + Comment: Command "/bin/mkdir -p /etc/skel/public_html" run + Started: 03:46:47.265901 + Duration: 73.066 ms + Changes: + ---------- + pid: + 21178 + retcode: + 0 + stderr: + stdout: +---------- + ID: apache_default_userindex_file + Function: cmd.run + Name: /bin/echo "Empty HTML template" > /etc/skel/public_html/index.html + Result: True + Comment: Command "/bin/echo "Empty HTML template" > /etc/skel/public_html/index.html" run + Started: 03:46:47.341257 + Duration: 13.803 ms + Changes: + ---------- + pid: + 21185 + retcode: + 0 + stderr: + stdout: + +Summary for orjakone +------------ +Succeeded: 6 (changed=5) +Failed: 0 +------------ +Total states run: 6 +Total run time: 584.846 ms +``` + +Minion-koneelta tarkistusta (master-koneella katsottuna): + +``` +[10/04/2018 02:54:51 - fincer: ~ ]$ sudo salt 'orjakone' cmd.run '/bin/ls /etc/skel && [ -d /etc/skel/public_html ] && /bin/cat /etc/skel/public_html/*' +orjakone: + index.html + public_html + Empty HTML template +``` + +f) Eri asetukset. Tee Package-File-Service tilalla eri asetuksia kuin ne, mitä tehtiin tunnilla; ja eri kuin mitä teit/teet h2 muissa kohdissa. Voit muuttaa jotain toista asetusta samoista demoneista tai valita kokonaan eri demonit. +-------------- + +**Vastaus:** + +Toteutetaan Knock daemonin (knockd - small port-knock daemon) -asennus. + +Luodaan master-koneelle tiedosto */srv/salt/knockd.conf*, joka annetaan valituille minioneille (asennetaan polkuun */etc/knockd.conf*) + +Haluttu *knockd.conf*:n sisältö (_/srv/salt/knockd.conf_): + +``` +[options] + UseSyslog + +[openSSH] + sequence = tcp:7065,udp:2431,tcp:421,tcp:4113 + seq_timeout = 5 + command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT + tcpflags = syn + +[closeSSH] + sequence = tcp:4113,tcp:421,udp:2431,tcp:7065 + seq_timeout = 5 + command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT + tcpflags = syn + +``` + +Luodaan master-koneelle state-tiedosto _/srv/salt/install_knockd.sls_: + +``` +# Author: Pekka Helenius (~Fincer), 2018 + +######################################### +# Install Knock daemon to minions + +check_ssh: + pkg.installed: + - pkgs: + - ssh + +install_knockd: + pkg.installed: + - pkgs: + - knockd + +# Deliver Knock daemon configuration file to minions +deliver_knockd-conf: + file.managed: + - name: /etc/knockd.conf + - user: root + - group: root + - mode: 644 + - source: salt://knockd.conf + - require: + - pkg: install_knockd + +# Do not proceed if any SSH sessions are open in minion's side. This is just to avoid any harmful effects +prevent_if_ssh_sessions_open: + cmd.run: + - name: 'if [ $(/bin/netstat -tnpa | grep "ESTABLISHED.*sshd" | wc -l) -gt 0 ]; then false; fi' + - require: + - pkg: check_ssh + +# PROCEED ONLY IF NO SSH SESSIONS ARE OPEN +# +# Drop SSH port connections. Use port which is defined in minion's /etc/ssh/sshd_config file +drop_ssh_port: + cmd.run: + - name: /sbin/iptables -A INPUT -p tcp --dport $(grep -E ^[#P]+ort /etc/ssh/sshd_config | awk '{print $2}') -j DROP + - require: + - cmd: prevent_if_ssh_sessions_open + - pkg: check_ssh + - file: deliver_knockd-conf + +# Change default SSH port 22 in minion's /etc/knockd.conf file: +post-configure_knockd-conf: + cmd.run: + - name: /bin/sed -i "s/dport 22/dport $(grep -E ^[#P]+ort /etc/ssh/sshd_config | awk '{print $2}')/" /etc/knockd.conf + - require: + - pkg: check_ssh + - file: deliver_knockd-conf + +# Enable knockd daemon +enable_knockd_service: + cmd.run: + - name: /bin/systemctl enable knockd.service + - require: + - pkg: install_knockd + +# Restart knockd daemon +restart_knockd_service: + service.running: + - name: knockd.service + - watch: + - cmd: post-configure_knockd-conf +``` + +Esimerkki-output master-koneella ajettuna: + +``` +[10/04/2018 06:17:11 - fincer: ~ ]$ sudo salt 'orjakone' state.apply install_knockd +orjakone: +---------- + ID: check_ssh + Function: pkg.installed + Result: True + Comment: All specified packages are already installed + Started: 06:25:12.849731 + Duration: 366.695 ms + Changes: +---------- + ID: install_knockd + Function: pkg.installed + Result: True + Comment: The following packages were installed/updated: knockd + Started: 06:25:13.216541 + Duration: 53498.645 ms + Changes: + ---------- + knockd: + ---------- + new: + 0.7-1ubuntu1 + old: +---------- + ID: deliver_knockd-conf + Function: file.managed + Name: /etc/knockd.conf + Result: True + Comment: File /etc/knockd.conf updated + Started: 06:26:06.717147 + Duration: 17.544 ms + Changes: + ---------- + diff: + --- + +++ + @@ -1,15 +1,14 @@ + [options] + - UseSyslog + + UseSyslog + + [openSSH] + - sequence = 7000,8000,9000 + - seq_timeout = 5 + - command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT + - tcpflags = syn + + sequence = tcp:7065,udp:2431,tcp:421,tcp:4113 + + seq_timeout = 5 + + command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT + + tcpflags = syn + + [closeSSH] + - sequence = 9000,8000,7000 + - seq_timeout = 5 + - command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT + - tcpflags = syn + - + + sequence = tcp:4113,tcp:421,udp:2431,tcp:7065 + + seq_timeout = 5 + + command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT + + tcpflags = syn +---------- + ID: prevent_if_ssh_sessions_open + Function: cmd.run + Name: if [ $(/bin/netstat -tnpa | grep "ESTABLISHED.*sshd" | wc -l) -gt 0 ]; then false; fi + Result: True + Comment: Command "if [ $(/bin/netstat -tnpa | grep "ESTABLISHED.*sshd" | wc -l) -gt 0 ]; then false; fi" run + Started: 06:26:06.735404 + Duration: 59.527 ms + Changes: + ---------- + pid: + 23916 + retcode: + 0 + stderr: + stdout: +---------- + ID: drop_ssh_port + Function: cmd.run + Name: /sbin/iptables -A INPUT -p tcp --dport $(grep -E ^[#P]+ort /etc/ssh/sshd_config | awk '{print $2}') -j DROP + Result: True + Comment: Command "/sbin/iptables -A INPUT -p tcp --dport $(grep -E ^[#P]+ort /etc/ssh/sshd_config | awk '{print $2}') -j DROP" run + Started: 06:26:06.795619 + Duration: 457.367 ms + Changes: + ---------- + pid: + 23927 + retcode: + 0 + stderr: + stdout: +---------- + ID: post-configure_knockd-conf + Function: cmd.run + Name: /bin/sed -i "s/dport 22/dport $(grep -E ^[#P]+ort /etc/ssh/sshd_config | awk '{print $2}')/" /etc/knockd.conf + Result: True + Comment: Command "/bin/sed -i "s/dport 22/dport $(grep -E ^[#P]+ort /etc/ssh/sshd_config | awk '{print $2}')/" /etc/knockd.conf" run + Started: 06:26:07.253529 + Duration: 16.545 ms + Changes: + ---------- + pid: + 23963 + retcode: + 0 + stderr: + stdout: +---------- + ID: enable_knockd_service + Function: cmd.run + Name: /bin/systemctl enable knockd.service + Result: True + Comment: Command "/bin/systemctl enable knockd.service" run + Started: 06:26:07.270551 + Duration: 539.568 ms + Changes: + ---------- + pid: + 23968 + retcode: + 0 + stderr: + stdout: +---------- + ID: restart_knockd_service + Function: service.running + Name: knockd.service + Result: True + Comment: Started Service knockd.service + Started: 06:26:08.461999 + Duration: 168.812 ms + Changes: + ---------- + knockd.service: + True + +Summary for orjakone +------------ +Succeeded: 8 (changed=7) +Failed: 0 +------------ +Total states run: 8 +Total run time: 55.125 s +``` + +Esimerkkikuva minion-koneen Knock daemonin konfiguraatiotiedostosta, jossa on vaihdettu porttinumero sen mukaan kuin se on määritelty minion-koneen SSH-asetuksissa: + +![minion-knockd-sample](https://raw.githubusercontent.com/Fincer/central-management-of-multiple-servers/master/images/minion-knockd-example.png) diff --git a/exercises/h3.md b/exercises/h3.md new file mode 100644 index 0000000..6970b16 --- /dev/null +++ b/exercises/h3.md @@ -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 %} +``` diff --git a/exercises/h4.md b/exercises/h4.md new file mode 100644 index 0000000..fd0fb54 --- /dev/null +++ b/exercises/h4.md @@ -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 %} + + ServerName {{ servername }} + ServerAlias {{ serveralias }} + ServerAdmin webmaster@localhost + DocumentRoot {{ ('/var/www/html/' + grains['id'] + '/') }} + ErrorLog /error.log + CustomLog /access.log combined + +{{ 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 +``` diff --git a/exercises/h5.md b/exercises/h5.md new file mode 100644 index 0000000..de888e1 --- /dev/null +++ b/exercises/h5.md @@ -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) diff --git a/exercises/h6.md b/exercises/h6.md new file mode 100644 index 0000000..a46f374 --- /dev/null +++ b/exercises/h6.md @@ -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. diff --git a/exercises/module.md b/exercises/module.md new file mode 100644 index 0000000..9e9c116 --- /dev/null +++ b/exercises/module.md @@ -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ä. diff --git a/images/.gitignore b/images/.gitignore deleted file mode 100644 index 8b13789..0000000 --- a/images/.gitignore +++ /dev/null @@ -1 +0,0 @@ -