Powershelliä UNIX-ylläpitäjille, osa 8
Tietyn nimisten tiedostojen (tai tyyppisten) poistaminen hakemistosta on melko suoraviivaista GNU findilla:
$ ls
README.txt stderr.log stdout.log
$ find . -maxdepth 1 -type f -name "*.log" -exec rm -f {} +
$ ls
README.txt
Valinta “maxdepth 1” estää findia poistamasta tiedostoja mahdollisista alihakemistoista.
Toinen vaihtoehto on putkittaa tiedostolistaus xargsille:
$ ls
README.txt stderr.log stdout.log
$ ls *.log|xargs rm -f
$ ls
README.txt
Tässä ei kuitenkaan erotella toisistaan tiedostoja ja hakemistoja, joten myös mahdolliset .log -päätteiset hakemistot yrittäisiin poistaa siinä epäonnistuen.
Powershelliä UNIX-ylläpitäjille, osa 6
UNIX-tyyppisissä käyttöjärjestelmissä on tulee usein tarve etsiä jostain hakemistosta lähiaikoina (alla minuutin sisällä) muuttuneet tiedostot:
$ find /var/log/ -mmin -1
/var/log/debug
/var/log/user.log
/var/log/auth.log
/var/log/syslog
Sama onnistuu myös Powershellissä ainakin kahdella tavalla, joista ensimmäinen on toiminnallisesti identtinen yllä olevan komennon kanssa:
PS C:UsersAdministratorDownloads> Get-ChildItem . -Recurse|Where-Object { $_.LastWriteTime -ge $(Get-Date).AddMinutes(-120) }|Select LastWriteTime, Name
LastWriteTime Name
------------- ----
6/18/2015 install.bat
Yllä oleva komento käy läpi koko hakemiston rekursiivisesti tarkistaen jokaisen tiedoston kohdalla viimeisimmän kirjoitusajan ja verraten sitä Date-objektiin, jossa nykyisestä kellonajasta on vähennetty 120 minuuttia. Toisin sanoen komento näyttää ne tiedostot tai hakemistot, joita on muokattu viimeisen 120 minuutin sisällä. Selkeyden vuoksi tiedostojen tiedoista näytetään selkeyden vuoksi vain nimi ja kirjoitusaika.
Powershelliä UNIX-ylläpitäjille, osa 7
Tulosteiden uudelleenohjaus ja paluuarvojen käsittely toimii lähes samoin *NIX-shelleissä ja Windowsin Powershellissä. Alla tarkistetaan Linuxin systemctl-komennolla olemassa olevan (“openvpn”) ja olemattoman (“fake”) palvelun tila, ohjataan sekä tuloste että virhetuloste bittitaivaaseen ja tulostetaan komennon paluuarvo:
$ systemctl status openvpn > /dev/null 2>&1
$ echo $?
0
$ systemctl status fake > /dev/null 2>&1
$ echo $?
3
Kuten näkyy, paluuarvo on 0 jos palvelu on olemassa ja 3 jos sitä ei löydy.
Useiden resurssien luonti lista-parametrien avulla
Toisinaan tulee tarve luoda useita samankaltaisia resursseja, joissa vain jonkin yksittäisen ominaisuuden arvo muuttuu. Esimerkiksi intranetin webbipalvelimeen voi joutua sallimaan yhteydet palomuurin läpi sekä sisäverkon että VPN:n osoiteavaruudesta. Vaikka Puppet ei suoraan tuekaan iteraatiota, sitä voi emuloida antamalla resurssin nimeksi ($title) listan merkkijonon sijaan.
Esimerkiksi Puppet-Finlandin webserver-moduulissa on parametrit $allow_address_ipv4 ja $allow_address_ipv6. Ne voivat saada arvokseen joko merkkijonon (‘192.168.55.0/24’) tai listan ([‘192.168.55.0/24’, ‘10.69.0.0/16’]):
class webserver::packetfilter
(
$allow_address_ipv4,
$allow_address_ipv6
) inherits webserver::params
Kummankin parametrin arvo annetaan ::webserver::packetfilter::allow_ip -resurssin nimeksi ($title):
Powershelliä UNIX-ylläpitäjille, osa 5
Windowsissa tekstimuotoisia lokitiedostoja UNIX:in tapaan ole, vaan niitä vastaa EventLog, jonka sisältöä voi tutkia kätevästi PowerShellillä. EventLogin lokit (Logs) voi listata seuraavasti:
PS C:> Get-EventLog -List
Max(K) Retain OverflowAction Entries Log
------ ------ -------------- ------- ---
20 480 0 OverwriteAsNeeded 3 787 Application
20 480 0 OverwriteAsNeeded 0 HardwareEvents
512 7 OverwriteOlder 0 Internet Explorer
20 480 0 OverwriteAsNeeded 0 Key Management Service
20 480 0 OverwriteAsNeeded 2 606 Security
20 480 0 OverwriteAsNeeded 1 684 System
15 360 0 OverwriteAsNeeded 4 823 Windows PowerShell
Halutun lokin (alla System) viimeisimmät kirjaukset (alla 10) saa näytettyä -Newest -vivulla:
Puppet-moduulien laadunvarmistus, osa 1: automaattiset tarkistustyökalut
Puppet-moduulien laatu pysyy korkeana, kun syntaksi- ja tyylivirheitä päästetä edes versionhallintaan asti. Puppet-koodin syntaksivirheet löytyvät helposti:
$ puppet parser validate tiedosto
ERB-templateiden virheet saa selvitettyä seuraavalla tavalla:
$ erb -P -x -T '-' tiedosto|ruby -c
JSON-tiedostojen (metadata.json) virheet etsiminen vaatii hieman kikkailua:
$ cat tiedosto|json_pp -f json -t null
Tyylivirheitä voi etsiä puppet-lint -työkalulla:
$ puppet-lint tiedosto
$ puppet-lint .
Puppet-lint tunnistaa myös puppet-koodin, joka on eteenpäin tai taaksepäin epäyhteensopivaa. Onkin hyvin järkevää ajaa puppet-koodi aina puppet-lintin läpi ennen suuria Puppet-ympäristön päivityksiä.
Käyttöjärjestelmäerojen hallinta Puppetissa, osa 1
Puppet-moduulit on melko helppo rakentaa siten, että ne saa helposti toimimaan eri käyttöjärjestelmissä ja käyttöjärjestelmäversioissa. Alla ovat itse hyväksi toteamani kolme korkea tason tapaa käyttöjärjestelmäerojen hallintaan kevyimmästä raskaimpaan:
- Params-luokan käyttö
- Käyttöjärjestelmäriippuvaisten aliluokkien käyttö
- Uuden moduulin rakentaminen
Menetelmillä 1 ja 2 pystyy käytännössä hallitsemaan kaikki Unix-tyyppisten käyttöjärjestelmien väliset erot. Menetelmää 3 ei juuri tarvita, paitsi jos jokin käyttöjärjestelmä (lue: Windows) eroa muista käytössä olevista huomattavan paljon.
Pieniin eroihin riittää siis params-luokan käyttö. Otetaan esimerkiksi vaikkapa Puppet-Finlandin ntp-moduuli:
Augeas-resurssien luonnista ja debuggaamisesta
NOTE: this article is now also available in English.
Puppetin Augeas-resurssilla voidaan muokata konfiguraatiotiedostojen osia sen sijaan, että hallittaisiin koko tiedostoa esim. templatella tai staattisella tiedostolla. Koko tiedoston hallinta tuottaa yleensä varmemmin ja vähemmällä vaivalla halutun lopputuloksen, mutta erityisesti luettelomaisten konfiguraatiotiedostojen tapauksessa Augeas-resurssi on erittäin käyttökelpoinen. Augeaksen käyttö ei-triviaaleissa tapauksissa on kuitenkin varsin haastavaa, ja usein onkin hyödyllistä rakentaa oikeat komennot käsin “augtool”-kehotteessa ja vasta sitten muuntaa ne Puppetin Augeas-resurssiksi.
Aluksi kannattaa tutkia, mikä Augeaksen näkemys jonkin konfiguraatiotiedoston rakenteesta on (ylimääräisiä rivejä on poistettu):
Powershelliä UNIX-ylläpitäjille, osa 3
Powershelliä konffatessa on tullut taas törmättyä useisiin varsin käyttökelpoisiin komentoihin. Alla ei-kattava lista, sillä lisää on luvassa sopivalla hetkellä.
Hakemiston poistaminen rekursiivisesti:
$ rm -rf hakemisto
> Remove-Item -Recurse -Path hakemisto
Tiedoston viimeisten rivien näyttäminen:
$ cat tiedosto|tail -n <rivien_määrä>
> Get-Content tiedosto -Last <rivien_määrä>
Tiedoston ensimmäisten rivien näyttäminen
$ cat tiedosto|head -n <rivien_määrä>
> Get-Content tiedosto -First <rivien_määrä>
Tiedoston rivien määrän laskeminen:
Powershelliä UNIX-ylläpitäjille, osa 4
Lisävinkkejä tuli keksittyä nopeammin kuin alunperin osasin uumoillakaan. Näille on ollut käyttöä jo useaan kertaan.
Prosessin ID:n löytäminen:
$ ps aux|grep nimi
> Get-Process -Name nimi
Prosessin tappaminen PID:n perusteella
$ kill pid
> Stop-Process -Id pid
Prosessin tappaminen nimen perusteella
$ pkill nimi
> Stop-Process -Name nimi