Powershelliä UNIX-ylläpitäjille, osa 11
Windowsin tuoteavain (“Product Key”) löytyy esiasennetuissa koneissa usein koneen pohjasta, mutta entäpä jos Windows onkin jälkiasennettu, tai koneen pohjassa oleva tarra ei edustakaan todellisuutta? Jos tällainen kone soseutuu, ei tuoteavainta löydy tietenkään mistään fyysisestä paikasta, ja tuloksena on kone ilman Windowsia; tämä voi toki olla toivottavakin asiaintila, mutta lähdetään siitä oletuksesta, ettei näin ole.
Tuoteavain on onneksi tallennettu Windowsin rekisteriin, mistä sen saa otettua talteen useilla eri tavoilla. Koska tässä blogissa keskitytään automaatioon ja Powershellin, mitkään graafiset kikkareet eivät luonnollisestikaan tule kyseeseen. Onneksi homma hoituu myös alla olevalla Powershell-skriptillä (lähde):
Powershelliä UNIX-ylläpitäjille, osa 9
Toisinaan on tarpeen lisätä tekstitiedoston loppuun rivejä. UNIX:ssa tämä onnistuu helposti echo-komennolla:
$ echo matti >> vpn.pass
$ echo salasana >> vpn.pass
$ cat vpn.pass
matti
salasana
Sama onnistuu Powershellissä, mutta ei suinkaan Write-Host -komennolla, joka olisi echo-komennon lähin vastine, vaan Add-Content -komennolla:
> Add-Content vpn.pass -Value matti
> Add-Content vpn.pass -Value salasana
> Get-Content vpn.pass
matti
salasana
Toinen melko yleinen tarve on tiedostojen lataaminen verkosta suoraan komentoriviltä. UNIX:ssa tämä onnistuu helpoiten wget-komennolla:
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):