Tämä kirjoitus on kotitehtäväpalautus Haaga-Helian Tero Karvisen kurssille ICT4TN011 Linuxin keskitetty hallinta. Tehtävänanto on seuraavanlainen:

  1. Asenna Salt (Helium tai uudempi).
  2. Package-File-Service. Tee oma Package-File-Service tyylinen tila Saltille.

1 Lähtötilanne

Teen harjoituksen ja muutkin tulevat harjoitukset Digitalocean.com virtuaalipalvelimella jotta vältyn VirtualBoxin kanssa puljaamiselta ja voin tehdä harjoitukset joko työkoneella (MacBook Pro) tai kotikoneella (iMac) helposti ilman linuxin asennusta kumpaankaan. Haaga-Helian opiskelijana saa Githubin Student Developer Pack:n kautta 100$ krediittiä DigitalOceanin palveluun, joten tämä on käytännössä ilmaista.

Lähtötilanteessa on tehtynä jo seuraavaa:

  • Virtuaalikone (droplet) on luotu DigitalOceanin web-käyttöliittymän kautta Lontoon palvelinkeskukseen. Hostname on “gru”, julkinen IP-osoite 178.62.126.210 ja käyttöjärjestelmänä DigitalOceanin asentama Ubuntu 14.04 x64. Palvelin löytyy kätevästi hostnamella gru.jkw.fi.
  • Olen luonut palvelimelle omat käyttäjätunnukseni (jkw) ja asentanut julkiset avaimeni tiedostoon (~/.ssh/authorized_keys) jotta pääsen yhdistämään palvelimelle ssh:lla ilman salasanan syöttämistä.
  • Palvelimelle on asennettu uusimmat päiv≤≤itykset (sudo apt-get update && sudo apt-get dist-upgrade) ja palvelin on sen jälkeen uudelleenkäynnistetty.

2 Saltin asennus

Seurasin Saltin virallisia ohjeita Ubuntulle.

Ensiksi lisäsin SaltStackin reposirotyn GPG-avaimen käyttöjärjestelmäni luotettuihin avaimiin komennolla wget -O - https://repo.saltstack.com/apt/ubuntu/ubuntu14/latest/SALTSTACK-GPG-KEY.pub | sudo apt-key add -. Tiedostan kyllä että näin tekemällä avainta ei edes tarkisteta eikä sen lisäämisestä ole mainittavaa hyötyä. Olen sitä mieltä Saltin pitäisi muokata dokumentaatiotaan tämän osalta.

Seuraavaksi muokkasin ohjeen mukaisesti apt:n pakettilähdeluetteloa /etc/apt/sources.list. Tein muokkauksen tiedostoon manuaalisesti nano-editorilla. Editorin tarvitsee sudo-oikeudet tiedoston muokkaamiseen joten se pitää käynnistää komennolla sudo nano /etc/apt/sources.list. Lisäsin tiedoston viimeiseksi riviksi deb http://repo.saltstack.com/apt/ubuntu/ubuntu14/latest trusty main

Tämän jälkeen päivitin käytössä olevat paketit komennolla sudo apt-get update.

Ennen varsinaista asennusta on hyvä testata lähtötilanne, jotta voidaan Saltin asennuksen toimivuuden lisäksi varmistua siitä että Salt ei toiminut ennen tätä meidän tekemää asennusta. Ilman tällaista testiä, ei voida varmuudella sanoa etteikö salt olisi ollut (kenties manuaalisesti käännettynä ja pathiin lisättynä) asennettu jo valmiiksi. Vaikka tietysti which salt komennolla voidaan jälkikäteen tarkistaa mitä saltia käytetään. Testataan kuitenkin toimiiko salt. Käytetään komentoa salt -v

salt version - not installed

Ei toimi, hyvä. Lopuksi asensin salt-masterin riippuvuuksineen komennolla sudo apt-get install salt-master ja testasin toimivuuden sen jälkeen uudelleen.

Tässä vaiheessa tietysti huomasin, että oikea komento Saltin versionumeron tulostamiseen ei ole salt -v vaan salt --version. Tässä tilaneessa sillä ei ole kuitenkaan niin väliä, koska ennen asennusta salt -v sanoi “program salt not installed” ja asennuksen jälkeen se listaa kaikki Saltin komennot. Oikealla komennolla saadaan nyt versiokin näkyviin:

salt version - installed

Ensimmäinen tehtävä suoritettu. Aikaa osion suorittamiseen meni kirjoittaminen ja julkaisuun käytettävän Jekyllin kanssa kikkailu mukaan lukien noin tunti.

3 Tee oma Package-File-Service tyylinen tila Saltille.

Termi package/file/service tulee kaiketi Puppet-maailmasta (1. osuma Googlessa) ja sillä tarkoitetaan eräänlaista keskitetyn hallinnan (ainakin palvelinpuolella) peruskaavaa:

  • Varmistetaan että jokin ohjelmisto on asennettu.
  • Varmistetaan että ko. ohjelmiston vaatima kofiguraatiotiedosto / muut tiedostot ovat paikoillaan ja konfiguroitu kuten halutaan.
  • Varmistetaan että ko. ohjelmisto on käynnissä.

Pelkkä paketin (vaikkapa Apache) asennus Saltia käyttäen ei siis vielä täytä tehtävänantoa. Asiaan löytyy selostus ja ohjeistus kurssin opettajan sivuilta mutta Ruby-ympäristössä yleisiin YAML-tiedostoihin tottuneena suoraan pythonin kirjoittaminen näyttää tuskallisen kamalalta joten seuraan Saltin omia ohjeita ja kirjoitan konfiguraation YAML:lla.

Valitsin tehtäväkseni toisen web-serverin, Nginx:n asentamisen koska sitä käytetään monessa paikassa mutta en ole koskaan kokeillut sitä. Vain Apache on minulle tuttu joten halusin nähdä miten Nginx-konfiguraatio toimii.

3.1 Alkuvalmistelut

Päätin tehdä koko tehtävän saman tien vähän laajempana, koska loin jo viime tunnilla myös pari minion-palvelinta kevin.jkw.fi ja bob.jkw.fi. En aja Saltia lokaalisti vaan suoraan näillä palvelimilla masterilta käsin.

Asensin molemmille palvelimille Saltin samalla tavalla kuin masterille, paitsi että loppujen lopuksi ei asenneta pakettia salt-master vaan salt-minion.

Tämän jälkeen seurasin Saltin Configurin Salt -ohjetta. Lisäsin molemmilla minion-palvelimilla tiedostoon /etc/salt/minion rivin master: gru.jkw.fi jotta minionit ottavat yhteyttä oikeaan masteriin. Tämän jälkeen uudelleenkäynnistin molemmat minionit komennolla sudo service salt-minion restart ja siirryin master-koneelle.

Tässä vaiheessa siirryin käyttämään Master-koneella root-käyttäjää (komennolla sudo su) koska oletuksena salt-komennot toimivat vain sillä. Master-koneella näkyikin heti molempien minionien yhteysyritykset:

salt minion keys - unaccepted

Ohjeen mukaisesti ajoin molemmilla minoneilla komennon sudo salt-call --local key.finger ja vertasin avaimia salt-masterin näyttämiin, ja ne täsmäsivät. Koska kaikki on kunnossa, lisätään minioneiden avaimet luotetuiksi:

salt minion keys - accepted

Seuraavaksi pystyinkin jo testaamaan yhteyttä ja testikomennon suoritusta kaikilla tunnetuilla minioneilla (valinta ‘*’):

test.ping

3.2 Ohjelman asentaminen

Googletin “salt example” ja löysin DigitalOceanin ohjeen How To Create Your First Salt Formula jossa selkeästi kerrotaan ohjelman asennus. Mahdollista jatkokäyttö varten pidän salt-tiedostoni Githubissa joten ensimmäiseki hain jo tunnilla tekemäni lähes tyhjän repositoryn kotihakemistooni komennolla git clone https://github.com/jannewaren/salt-configs.git. Huom: Jos teet tehtävää esim. puhtaalla Ubuntun asennuksella DigitalOceanin sijaan, ei gitiä välttämättä ole valmiiksi asennettuna.

Seuraavaksi loin git:n hakemaan salt-configs hakemistoon tiedoston “nginx.sls” ja laitoin sen sisällöksi ohjetta mukaillen

nginx:
  pkg:
    - installed

Seuraavaksi testasin komennolla /etc/init.d/nginx start että nginx ei ole jo valmiiksi asennettuna. Sain vastaukseksi “-bash: /etc/init.d/nginx: No such file or directory” josta päättelin että nginx ei ole asennettuna.

Sitten yritin ensimmäistä kertaa tehdä jotain oikeasti Saltilla. Yritin ajaa tekemäni YAML-tiedoston:

test.ping

Ei mennyt ihan putkeen. Luultavasti tiedostoni nginx.sls on nyt väärässä paikassa. Tutoriaalissa neuvotaan laittamaan tiedosto hakemistoon /srv/salt/ - minä taas laitoin sen kotihakemistooni /home/jkw/salt-configs. Siirretään oikeaan paikkaan ja mietitään gitiä myöhemmin.

Loin hakemiston /srv/salt/ ja siirsin tiedoston nginx.sls sinne. Tämän jälkeen edellinen komento toimi ongelmitta ja ilmoitti pakettien asentamisesta molemmilla minioneilla.

Testasin toimivuuden toisella minioneista:

nginx start

Toki toimivuus näkyy heti myös selaimella:

nginx default page in browser

3.3 Konfiguraatiotiedosto

Seuraava askel on lisätä/muokata pakettiin liittyvä konfiguraatiotiedosto Saltin avulla. Tähän ei DigitalOceanin ohjeesta löydy apuja, joten Googlettamaan. DigitalOeanin artikkeli SaltStack Infrastructure: Creating Salt States for Nginx Web Servers näytti lupaavalta joten sovelsin sitä. Ajanpuutteen takia päätin muuttaa harjoituksen vuoksi vain yhtä tiedostoa. Oletusasetuksilla nginx toimii ok ja tarjoilee sivua polusta /usr/share/nginx/html/index.html joten päätin muuttaa tiedoston sisältöä.

Ohjetta mukaillen muokkasin masterilla tiedostoa /srv/salt/nginx.conf lisäten sinne seuraavaa:

/usr/share/nginx/html/index.html:
  file.managed:
    - source: salt://nginx/index.html.jinja
    - template: jinja
    - user: root
    - group: root
    - mode: 644

Oleellisimpana ensimmäisellä rivillä kerrotaan missä polussa tiedoston on minionilla ja kolmannella rivillä missä ko. tiedoston template on master-koneella. Prefiksi salt:// osoittaa automaattisesti hakemistoon /srv/salt/ joten tässä tapauksessa template-tiedoston on hakemistossa /srv/salt/nginx/index.html.jinja.

Laitoin template-tiedoston sisällöksi:

<!DOCTYPE html>
<html>
  <head>
    <title>Welcome to nginx!</title>
  </head>
  <body>
    <h1>Welcome to nginx!</h1>
    <p>This is being served from:</p> <b>{{ grains['fqdn'] }}</b>
  </body>
</html>

Kohta {{ grains['fqdn'] }} päätellään Saltin toimesta joka koneelle erikseen. Tähän kohtaan pitäisi tulostua koneen hostname / FQDN. Tämän jälkeen koitin ajaa samaa salt-tilaa kaikille minioneille uudelleen, ja homma toimi heittämällä:

file changed with salt

Selaimen uudelleenlataamalla muutos näkyi myös selaimessa ja hostnamen / FQDN:n haku toimii myös:

fqdn in nginx html

3.4 Service käyntiin

Viimeisessä osuudessa varmistetaan että asennettu palvelu on päällä. Kokeillaan ensin että nginx:n saa stopattua eikä Salt-tilan ajaminen käynnistä sitä uudelleen. Stoppasin ensin nginx:n toisella koneista kevin.jkw.fi komennolla sudo /etc/init.d/nginx stop ja sitten kokeilin:

service not restarted

Kaikki hyvin, nginx-service koneella kevin.jkw.fi ei uudelleenkäynnistynyt, koska palvelu ei vastaa portista 80. Kone bob.jkw.fi vastaa edelleen. Lisäsin masterilla nginx.sls tiedostoon service.running määrityksen Saltin dokumentaation mukaisesti jolloin tiedosto näyttää tältä:

nginx:
  pkg:
    - installed
  service.running:
    - enable: True

/usr/share/nginx/html/index.html:
  file.managed:
    - source: salt://nginx/index.html.jinja
    - template: jinja
    - user: root
    - group: root
    - mode: 644

Toistin testin eli ajoin Salt-tilan uudestaan ja nginx-palvelimella kevin käynnistyi taas:

service started

Aikaa tämän osion suorittamiseen meni noin pari-kolme tuntia kirjottamisineen.