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ä.