Infrakoodi ja useita porkkanoita ylempää.
Tämän viikon raportissa tutustutaan saltin käyttölogiikkaan syvemmin, tehdään tilafunktioista esimerkit ja luodaan ylin tiedosto jonka alta hallittavat löytävät tarvitsemansa. Aluksi voisin kuitenkin avata saltin reseptiajattelua.
Reseptit
Eli oletuksena salt hakee services /srv/salt kansiosta tiloja joita jakaa hallittaville koneille. Tämä voidaan tehdä ’toiminta.sls’ kirjana jolloin tietyttyjen hallittavien koneiden ’reseptit’ voidaan helpommin hallita omille tasoilleen. Kokonaisuus voidaan myös ajaa vain ylemmän hierarkian kautta - jolloin puhutaan top mallista. Tällöin ajettavat ajetaan hierarkisesti kansion alapuolelta.
Esim Hallittavat koneeni > Reseptit1.sls ja Reseptit2.sls
Tulevaisuudessa, kun teemme ctf konettamme tai infraa, niin voimme jakaa ctf ja tekoälyaspektit esimerkiksi omiin kokonaisuuksiin ja päättää per rauta mitä tulee mihinkin. Näihinkin voidaan seurata ehtoja.
Tässä top.sls toimii koko reseptikirjaston sisällysluettelona.
Seuraavat tehty suoraan raudalle ilman virtualisointia.
Esimerkkikokonaisuus
Tehdään tällä ajatuskokonaisuudella viisi tärkeintä pkg, file, service, user ja cmd funktiokutsua, tehdään kokonaisuus toppina ja tarkastetaan idempotentti.
Haluamme asentaa hallittaville koneillemme suosikki top-ohjelmani: btop. Tehdään myös moitiedosto, tarkastetaan, että cron toimii (edellisviikon alhainen hedelmä). Luodaan käyttäjä Mervinille (masentunut robootti) ja asetetaan järjestelmälle aikavyöhyke.
Eli luon jokaiselle oman kansion ja init.sls tiedoston joka ohjeistaa toiminnon.

Näytän kuvan vain yhdestä, mutta ohessa jokaisen init.sls tiedoston kokonaisuus.
# Varmistetaan, että btop-paketti on asennettu järjestelmään.
btop:
pkg.installed:
- name: btop
# Luodaan tiedosto /tmp/moro.txt ja määritellään sen sisältö.
moro:
file.managed:
- name: /tmp/moro.txt
- contents: 'Täällä Salt, kiitos kaloista!'
# Varmistetaan, että cron-palvelu on käynnissä ja
käynnistyy automaattisesti järjestelmän mukana.
cron:
service.running:
- name: cron
- enable: True
# Luodaan käyttäjä mervin_robotti ja asetetaan hänen koko nimensä.
# Luodaan myös kotihakemisto ja määritellään oletuskomentotulkki.
user:
user.present:
- name: mervin_robotti
- fullname: 'Mervin Masentunut Robotti'
- shell: /bin/zsh
- createhome: True
# Asetetaan järjestelmän aikavyöhyke Helsinkiin.
'unless' varmistaa, että komentoa ei ajeta, jos aikavyöhyke on jo oikein.
# Tämä tekee tilasta idempotenttisen.
tz:
cmd.run:
- name: 'timedatectl set-timezone Europe/Helsinki'
- unless: 'timedatectl status | grep "Time zone: Europe/Helsinki"'

Tehdään vielä salt-juureen top.sls jossa määritetään alapuolella tapahtuvat. Tehdään nyt vain yksi taso niin käytetään saltin omaa ohjeistusta ’base’.
’/srv/salt/top.sls’
base:
'*':
- btop
- cron
- moro
- tz
- user
Tämän jälkeen pyöritetään salt-call käyntiin. Etsin virallisista dokumenteista verbose tasot ja tähän voidaan kokeilla ’info’ tasoa joka näyttää yleisesti mitä tapahtuu.
sudo salt-call -l info --local state.apply

Mervin robotic errori tulee kun en tarkastanut sudolla. Nähdään kuitenkin, että kansio on paikallaan 👍🏼
Yhdistelmä ja idempotenttisuus
Tehdään myös vähän laajempi kokonaisuus yteen kutsuun. Esimerkkinä hyvä käyttää jotain vähän käytännöllisempää. Apache olkoot hyvä esimerkki. Kommentit mukana.
# /srv/salt/apache2/init.sls
# Apache2 paketti sisään
apache2:
pkg.installed:
- name: apache2
# Muokataan perus-etusivua
apache_etusivu:
file.managed:
- name: /var/www/html/index.html
- source: salt://apache2/index.html # tiedosto eri paikasta huom salt: hakee saltin päähakemistosta suoraan - kätevä setti.
# Vaaditaan, että apache2-paketti on asennettu ensin.
# Muuten /var/www/html -hakemistoa ei välttämättä ole.
- require:
- pkg: apache2
# Varmistetaan päälläolo
apache_palvelu:
service.running:
- name: apache2
- enable: True
# Tarkkaillaan (watch) etusivun muutoksia. Jos se muuttuu,
# käynnistä tämä palvelu uudelleen.
- watch:
- file: apache_etusivu
Sitten luodaan sivu ’apache2/index.html’ kansioon.
<!-- /srv/salt/apache2/index.html -->
<h1>Tämä on Saltin konfiguroima web-palvelin!</h1>
<p>Tila on idempotenttinen.</p>
Lisään myös top-tiedostoon apache2-tilan aktiiviseksi.

Kokeilen myös syvempää vebose-tilaa. Debug:
sudo salt-call -l debug --local state.apply

Ajan myös toisen kerran ja todistetaan idempotenssi.

Hyvin toimii ja kaikki selkeää. Kuvista ei nyt selviä, mutta debug toistaa KAIKEN konsoliin. Info toimii useammin hyvin jos epävarma omasta reseptistä.
Kommentit
Olen tosissaan itse käyttänyt ansiblea ennen ja täytyy sanoa, että saltin käyttölogiikka tuntuu kivalta ja yksinkertaiselta. Näen jo valtavasti potenttiaalia tämän käytössä.
Lähteet
Teron salt settiä. Nano ihan hyvä :D https://terokarvinen.com/2024/hello-salt-infra-as-code/
Salt docs - hyvä vilkuilla aina kun tarvis https://docs.saltproject.io/en/latest/contents.html
Kuvat optimoitu https://optimage.app
Käytetty aika: 30min