PH – h5

Harjoitus on osa kurssia Palvelinten hallinta: http://terokarvinen.com/2020/configuration-managment-systems-palvelinten-hallinta-ict4tn022-spring-2020/

h5 Muotteja ja moduleja

Aloitin harjoituksen tekemisen n. klo 9.15 ja lopetin n. klo 13.00.

Jos saisin itse antaa arvosanan harjoituksesta, antaisin itselleni ehkä 3 (asteikolla 1-5), koska, vaikka tein jokaisen tehtävän, en tehnyt niitä kaikkia yhtä hyvin ja joissakin vain jätin kesken ajatuksella, että jatkaisin myöhemmin. Kävi kuitenkin niin, että vähän unohdin jatkaa ja tehtävät jäivät osittain kesken.

a) Hello templates! Tee muotilla esimerkkitiedosto, jossa on muuttujien (esim grains) arvoja.

Tein tämän omalle virtuaalipalvelimelleni. Tämä tehtävä onnistui muutaman mutkan kautta hyvin. Käytin apuna opettajan ohjeita: http://terokarvinen.com/2018/make-a-million-of-those-jinja-templating-salt-states

Tein ensiksi tuon opettajan ohjeiden mukaan muotin, joka loisi tekstitiedostoja ja vasta sitten tein oman muotin. Asensin jinja2, koska sitä tarvitaan näiden muottien tekemiseen.

Seuraavaksi:

  • sudo mkdir -p /srv/salt/multi
    • kansio, jonne sijoitan muotin
  • sudoedit /srv/salt/multi/init.sls
    • luo ”salt state”

init.sls tekstitiedoston sisälle:

{% for file in [’foo.txt’, ’bar.txt’, ’kala.txt’] %}
/tmp/moikat/{{ file }}:
file.managed:
– source: salt://multi/moikka.txt
– makedirs: True
– template: jinja
– context:
file: {{ file }}
{% endfor %}

Tuo ylempi luo kolme tekstitiedostoa ja luo /tmp -hakemistoon /moikat -hakemiston.

Vielä tehdään tiedostomuotti: $sudoedit /srv/salt/multi/moikka.txt. Tämän sisään kirjoita: Moikka Tämä on {{ file }}.

{{ xxx }} ovat muuttujia, joihin tulee tässä tapauksessa tiedoston nimi.

Testi: $ sudo salt-call –local state.apply multi. Kaikki näytti vihreätä, joten sen ajo onnistui. Menen katsomaan /tmp -hakemistoon, mitä sinne tapahtui. Siellä oli se kansio /moikat, jossa oli ne kolme .txt-tiedostoa: bar, foo, kala. Jokaisessa oli myös oma tiedoston nimi tekstissä:

Seuraavaksi luon oman muotin. Käytin apuna tätä sivua: https://docs.saltstack.com/en/latest/topics/grains/

Katso ensiksi, mitä grainseja orjista on saatavilla: $ sudo salt ’*’ grains.ls. Valitsen listasta ipv4:n ja ipv6:n (jos sellainen tieto on saatavilla).

Luon hakemiston, jonne sijoitan muotin: $ sudo mkdir -p /srv/salt/grains.

Seuraavaksi salt tila: $ sudoedit init.sls (/grains-hakemistossa).

Katsotaan, toimiiko tällainen:

Tämän jälkeen tajusin heti jonkun virheen (mitä en nyt tarkalleen muista): ”ei kun nyt tajusin virheen pitää laittaa sinne ipv4 ja se ipv6” (ote muistiinpanoistani).

Päätin kokeilla ensiksi pelkällä ipv4:lla:

Seuraavaksi ip.txt-tiedoston tekeminen, jonne kirjoitin: {{ ipv4 }} on tämän tietokoneen ipv4-osoite.

Testaa paikallisesti: $sudo salt-call –local state.apply grains. -> ERROR Template was specified incorrectly

Näin nyt heti, että siellä oli kirjoitusvirhe: makedeirs -> makedirs.

Korjaa se ja testaa uudestaan. Taas Error:

  • Template was specified incorrectly: False
  • local:
  • Data failed to compile:
  • ———-
  • No matching sls found for ’grains’ in env ’base’

En tiennyt, mitä tämä tarkoitti. Arvelin ehkä, että siinä on joku viittausvirhe. Nyt tajusin, että molemmat .sls ja .txt tiedostot olivat /srv/salt hakemistossa eikä /srv/salt/grains hakemistossa. Siirsin ne sinne (tai ensiksi yritin komennolla sudo mv init.sls /grains ja sudo mv ip.txt /grains, mutta ne eivät menneet sinne, vaan katosivat kuka tietää minne, joten lopulta kirjoitin ne uudestaan /grains hakemistoon).

Taas ajo paikallisesti: [ERROR   ] Rendering exception occurred: Jinja variable ’ipv4’ is undefined

Nyt on helpompi korjata tilanne, kun on kyse ipv4 muuttujasta. Käytin apuna tätä sivua: https://stackoverflow.com/questions/18360528/how-to-get-ip-address-of-hostname-inside-jinja-template

Käytin muuttujana tätä: {{ grains[’ipv4’][0] }}

ip.txt-tiedostosta tuli tällainen siis: {{ grains[’ipv4’][0] }} on tämän tietokoneen ipv4-osoite

Lopullisesta init.sls tiedostosta tuli tällainen:

Nyt ajo paikallisesti onnistui.

Käydään katsomassa /tmp -hakemisto. Sinne tuli se ipvt-kansio, jossa sisällä on tekstitiedosto, mutta sen kansion nimi on 10.19.0.7 ja sen sisällä teksti tuon ip-osoitteen kanssa. Tuo on yksityisen verkon ip-osoite.

Kokeilin tämän https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters_ipaddr.html neuvojen mukaan tällaista muuttujaa: {{ ipaddr(’address’) }}

Ajo paikallisesti, mutta tuli erroria: Rendering exception occurred: Jinja variable ’ipaddr’ is undefined

Kokeilin sitten tuota aiempaa ilman sitä [0] siellä perässä. Ajo paikallisesti onnistui, mutta nyt /tmp/ipvt hakemistossa oli uusi tiedosto, jonka nimenä on kolme ipv4-osoitetta, tuo private network, localhost ja julkinen ip-osoite: ’[’\”10.19.0.7’\”, ’\”127.0.0.1’\”, ’\”134.122.80.89’\”]’.

Kokeilin ensin ratkaista ottamalla ne ’ ’ pois sen ipv4 ympäriltä ja laittaa nollan tilalle kaksi (koska ohjelmointikielessä laskeminen aloitetaan nollasta ja haluan tuon kolmannen ip-osoitteen): {{ grains[ipv4][2] }}

Ei taaskaan onnistunut: [ERROR   ] Rendering exception occurred: Jinja variable ’dict object’ has no attribute ’ipv4.txt’

Palaan askeleissa taaksepäin (eli tilanteeseen, jossa se toimi) ja laitan ’ ’ takaisin paikoilleen. Nyt testiajo onnistui!

Mennään katsomaan /tmp/ipvt -> sinne oli tullut taas uusi tiedosto, jonka nimenä on se julkinen ip-osoite. Jee! Vähäisestä koodausosaamisestani oli siis jotakin hyötyä.

Lopullinen tulos:

b) Message of the Day. Sisäänkirjautuessa näytetään päivän viesti. Lisää päivän viestiin tietoa ympäristöstä käyttäen muotteja. Sopiva tiedosto on /etc/motd.

Tätä en saanut onnistumaan ja ajatuksena oli palata myöhemmin tekemään se loppuun, mutta en sitten tullutkaan. Sain sen joten kuten tehtyä, ja ratkaisu olisi varmasti löytynyt tarpeeksi googlettelemalla.

Tee ensiksi tehtävälle kansio: $ sudo mkdir -p /srv/salt/motd, jonne teen init.sls tiedoston.

Käytin harjoituksessa tätä https://docs.saltstack.com/en/latest/topics/jinja/index.html apuna sekä tätä https://ownyourbits.com/2017/04/05/customize-your-motd-login-message-in-debian-and-ubuntu/

Tuossa toisessa kerrottiin näin: “/etc/motd – The classic, static file. Does not exist anymore in Ubuntu 16.04 LTS, not even as a symbolic link to /var/run/motd. If it is created, however its contents will be printed too.”

Tuon lihavoidun lauseen perusteella ajattelin, että tämän pitäisi onnistua jos saisin luotua sinne sen motd-hakemiston. Olin kuitenkin muistiinpanoihin kirjoittanut, että ”olen vähän hukassa mitä teen, mutta katsotaan.”

/srv/salt/motd/init.sls: (varmaan väärin)

$ sudoedit /srv/salt/motd/motd.txt: Moikka

Testiajo: sudo salt-call –local state.apply motd. Muistiinpanoistani: ”Täh se onnistui :D”

Katsotaan siis, mitä tapahtuu kun kirjaudun sisään: ei tullut sitä Moikka-tervehdystä sinne.

Menin katsomaan /etc -hakemistoa, jonne oli ilmestnyt /motd ja motd.txt.

Käytin seuraavaksi tätä sivua apunani: https://github.com/philwelz/salt-motd-formula/commit/fde7d6e1369496a6b50e85e26deed08332a9597c

Muokkasin init.sls -tiedostoa ja lisäsin sinne: – replace: True. Testiajo paikallisesti ja kirjaudu sisään. Ei tullut Moikka-tervehdystä.

En myöskään tiennyt, saako siitä motd-viestistä poistettua kaiken salt tilalla vai pitääkö se manuaalisesti tehdä. Luin opettajan ohjeista (http://terokarvinen.com/2018/message-of-the-day-on-ubuntu-sudoedit-etcmotd-chmod-ugo-x-etcupdate-motd-d), josta löysin komennon: $ sudo chmod ugo-x /etc/update-motd.d/*

Sitten ajoin motd:n paikallisesti ja kirjauduin sisään. Nyt ei tullut muuta kuin Last login.

Tämän hetkinen motd:n init.sls:

Tässä vaiheessa olin vähän hakusessa, että mitä pitäisi tehdä. Minulla on se /etc/motd-hakemisto, jossa on se motd.txt tiedosto, mutta se ei tule, kun kirjautuu sisään. Se salt moduuli saa sen luotua sinne, mutta mitään ei tapahdu kirjautuessa, vaikka pitäisi.

Löysin aiemman kurssin opiskelijan harjoituksen https://lahdemi.wordpress.com/2018/04/15/3-viikkotehtava/ jossa oli yksinkertaisempi init.sls, jota matkin:

Taas ajo paikallisesti. (*lisäsin tuohon init.sls ensimmäiselle riville /etc/motd/motd). Kirjauduin sisään, mutta ei taaskaan mitään.

Tässä vaiheessa annoin olla ja siirryin seuraavaan tehtävään. Eli tehtävä jäi osittain tekemättä.

c) Bash. Tee bashiin asetuksia Saltilla. Ensin käsin, vasta toimivaa automatisoidaan. Muista testata lopputulos käyttäjän näkökulmasta.

Jos ymmärsin tehtävänannon oikein, ensiksi teemme bash-tiedoston. Sitten laitamme sen moduuliin, joka sitten antaa saman bashin orjille? Tai ajaa sen komentona orjille? Katsotaan…

Eli ensiksi luo jokin bash-asetus (käytin apuna sivua https://www.linux.fi/wiki/Bash-skriptaus )

Luo kansio tälle tehtävälle: $ cd /srv/salt, $sudo mkdir -p bash, $ cd /bash

Luo bash: sudoedit eka.sh:

#!/bin/bash
echo ”Hei, $(whoami), mitä kuuluu”
echo ”Olet hakemistossa $(pwd), tiedostolistaus:”
ls

Testaus: $bash eka.sh -> listaa kaiken, mitä sen pitikin.

Seuraavaksi käytin apuna tätä sivua: https://stackoverflow.com/questions/47842414/running-a-bash-script-in-salt-minions

, jossa neuvotaan, miten luodaan bash skripti orjille.

Lopputulos:

Aja paikallisesti: sudo salt-call –local state.apply bash

Ajo onnistui.

Sitten ajetaan se orjalle: $ sudo salt emma state.apply bash

Se näytti saman tekstin kun tuossa kuvassa (mutta orjakoneen tiedoilla).

Sitten kirjauduin orjakoneelle ja ajoin $ bash eka.sh, mutta mitään ei tapahtunut. Sitten tajusin, että tässä vain ajetaan se komento orjalla, mutta sitä ei laiteta sen muistiin.

Tai niin ainakin toivon, että tehtiin, koska en tehnyt mitään muuta.

d) Nginx. Tee nginx-weppipalvelimeen asetuksia Saltilla. Voit esimerkiksi tehdä uuden site:n, niin että etusivu vaihtuu. Kun nginx on todennäköisesti sinulle uusi palvelin, tässä tehtävässä on siis ensin laaja osuus valita sopiva asetus nginx:lle ja saada se toimimaan käsin. Vasta toimivaa, käsin kokeiltua kannattaa automatisoida. Muista lopputuloksen testaus käyttäjän näkökulmasta.

Tässä en tiedä, menikö tämän tehtävän tekeminen oikein. En yhtään tykkää luoda www-palvelimia saltilla. En tykkää niistä muutenkaan. Toivotaan, että tämä jotenkin ainakin onnistui.

Käytin apuna tätä sivua: https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-18-04

Tein tämän kaiken ensiksi master-koneelle. Asensin nginx:n. Tein palomuuriin reiän (sudo ufw allow ’Nginx HTTP’). Testaa, onnistuiko asennus: $ curl localhost ja $ curl *ip-osoite. Molemmissa näkyin nginx default etusivu.

Sitten luomaan salt moduuli. Tein /srv/salt/nginx -hakemiston. Tein init.sls -tiedoston. Tässä kohtaa en tiennyt, pitääkö moduuliin laittaa jotakin palomuurista, mutta annoin asian olla siksi aikaa.

Päätin kokeilla etusivun asettamisa, kun en sitä apachella ollut harjoitellut. Luo /srv/salt/nginx-hakemistoon default-index.html: Heippa hei

Täällä https://www.digitalocean.com/community/tutorials/saltstack-infrastructure-creating-salt-states-for-nginx-web-servers neuvottiin, miten luodaan salt state nginx:lle, mutta se vaikutti aika hankalata, joten kokeilin helpomman kautta.

init.sls tiedosto:

Moduulin ajo paikallisesti: sudo salt-call –local state.apply nginx

 Comment: The following requisites were not found:

watch:

file: /etc/nginx/nginx.conf

file: /etc/nginx/sites-available/default

Mielestäni nuo molemmat kansiot ja tiedostot löytyivät, mutta en nyt oikein ymmärrä, miksi se antaa tuollaisen kommentin.

Päätin siirtyä tästä vain eteenpäin.

init.sls tiedosto seuraavaksi:

Testiajo: kaksi noista onnistui, kaksi epäonnistui. Service.running oli toinen ja file.symlink oli toinen:

ID: /etc/nginx/sites-enabled/default
Function: file.symlink
   Result: False
  Comment: The following requisites were not found:
                              require:
                                  file: /etc/nginx/sites-available/default
  Changes: 

Mutta kun kokeilin $ curl localhost, sain vastaukseksi Heippa hei:n. Eli se oli onnistunut vaihtamaan sen etusivun.

En nyt tiennyt, miksi se ei löydä niitä. Se target näköjään löytyi, mutta ei tuo require, vaikka se on sama. Hmm… Poistan sen siitä .sls tiedostosta sekä laitan service.running omaksi erilleen.

Ajoin sen ilman tuota require ja nyt onnistui (vain service taas epäonnistui). Otan sen service kohdan pois.

init.sls nyt:

Ajo orjalla seuraavaksi: sudo salt emma state.apply nginx

Ajo onnistui mutkitta, ja kun menin orjakoneelle ja ajoin komennon curl localhost sain vastaukseksi sen Heippa hei:n.

Eli onnistuin kai tehtävän tekemisessä? Ei se ollutkaan niin vaikea kuin ehkä odotin.

Jätä kommentti

Design a site like this with WordPress.com
Aloitus