Custom faktojen luonti ohjelmallisesti

Staattisten faktojen kirjoittaminen on varsin helppoa melko vähäisinkin Ruby-taidoin. Alla esimerkki faktasta, joka palauttaa true tai false riippuen siitä, onko noodilla /boot-osiota:

Facter.add(:has_bootfs) do
 setcode do
 if Facter.value(:mountpoints)['/boot'].nil?
 false
 else
 true
 end
 end
 end

Kuten yltä näkyy, itse tieto löytyi jo valmiiksi Facterin "mountpoints"-faktan sisältä: yllä sen sisältöä vain muunnettiin erilliseksi, helposti käsiteltäväksi faktaksi visualisointia ja skriptausta helpottamaan.

Mountpoints-fakta sisältää myös paljon muuta kiinnostaa tietoa, kuten sen, miten suuri osio on ja paljonko siellä on tilaa vapaana. Jos näistäkin tiedoista halutaan luoda samaan tapaan erilliset faktat, voidaan ne helposti luoda dynaamisesti:

if Facter.value(:has_bootfs)
 facts = [ 'size','available']
 
 facts.each do |fact|
 Facter.add("bootfs_#{fact}") do
 setcode do
 Facter.value(:mountpoints)['/boot'][fact]
 end
 end
 end
 end

Yllä oleva koodi siis luo kaksi uutta faktaa mutta vain jos /boot-osio on olemassa:

  • bootfs_size: sama kuin $facts['mountpoints']['/boot']['size']
  • bootfs_available: sama kuin $facts['mountpoints']['/boot']['available']

Näitä faktoja voidaan käyttää normaaliin tapaan:

$ facter -p has_bootfs
 true
 $ facter -p bootfs_size
 235.32 MiB
 $ facter -p bootfs_available
 111.28 MiB

Vaikka yllä olevassa esimerkissä ei varsinaisesti luoda mitään uutta dataa, voi samalla strategialla muodostaa räätälöityjä faktoja dynaamisesta sisällöstä. Alla luodaan erillinen fakta ("user_<username>_is_present") jokaisesta *NIX-järjestelmässä olevasta käyttäjästä pois lukien järjestelmäkäyttäjät:

require 'etc'
 
 Etc.passwd do |entry|
 # Normal users have IDs in this range in /etc/login.defs
 if entry.uid >= 1000 and entry.uid <= 60000
 Facter.add("user_#{entry.name}_is_present") do
 setcode do
 true
 end
 end
 end
 end

Näiden dynaamisesti luotujen faktojen käyttö on helppoa:

$ facter -p user_john_is_present
 true
 $ facter -p user_jack_is_present
 
 $ facter -p user_jane_is_present
 true

Ainoa rajoitus on se, että datasta, jota ei ole olemassa, ei voida tietenkään luoda faktaa. Esimerkiksi yllä fakta käyttäjästä "jack", jota ei ole olemassa, saa tyhjän arvon (undef/nil) sen sijaan, että se palauttaisi totuusarvon false. Tällä ei Puppet-koodin tai faktojen visualisoinnin kannalta ole kuitenkaan suurta merkitystä.

menucross-circle