Puppet feladvány

Fórumok

Pár órája azon pörgök a puppet manifestek fölött, hogy mi van akkor, ha az alant lévő szerkezetben a kernel paramétereihez több modul is hozzá akarja tenni a magáét..?Tehát:

modules/grub2/manifests/init.pp


class grub2 {
  grub2::config {'default': }
}

modules/grub2/manifests/config.pp


define grub2::config ($grub_cmdline_linux_default = [], $append = []) {
  file {'/etc/default/grub':
    content => template('grub2/default.erb'),
  }
}

modules/grub2/templates/default.erb


GRUB_CMDLINE_LINUX_DEFAULT="quiet <% grub_cmdline_linux_default.each do |line| -%><%= line %><% end -%>"
<% append.each do |appendline| -%>
<%= appendline %>
<% end -%>

modules/ipmi/manifests/init.pp


class ipmi {
  class grub_override inherits grub2 {
    Grub2::Config['default'] {
      grub_cmdline_linux +> ['console=tty0 console=ttyS0,115200n8'],
    }
  }
  include grub_override
}

manifests/site.pp


if $has_bmc {    # custom fact
  include ipmi
}

node 'whitedwarf.local' {
  include whitedwarf
}

manifests/whitedwarf.pp


class whitedwarf {
  # XXX ennek a node-nak kell a mem=4096 kernel parameter; NOW WHAT?

  class grub_override inherits grub2 {
    Grub2::Config['default'] {
      append => ['# end of file'],
    }
  }
  include grub_override
}

A grub2 modulban lévő class-define szörnyeteg a http://projects.puppetlabs.com/issues/5517 eredménye. Ha néhol mesterkéltnek tűnik a probléma, az azért van, mert az is. A valódi modulok ennél bonyolultabbak, ott értelmet nyer ami itt fölöslegesnek tűnik.

Van pár megoldásom, de egyik sem igazán tetszik, te hogy csinálnád?

Hozzászólások

Te mondd, nem overkill ez kicsit? Ha az ember nagy(obb) rendszert uzemeltet, akkor illene arra torekedni, hogy nagyjabol egyforma configjai legyenek pl kernel teren. Nyilvan van 1-2 kivetel, de ilyen szinten szetbontani szerintem tobb meloval jar, mint haszonnal.

Egyebkent ilyen helyzetben tipikusan nem szokott eleg lenni a Puppet belso tudasa, vagy irsz hozza egy libet, vagy ha van az stdlibben megfelelo modul, akkor azt hasznalod. (En a concat modul kornyeken nezelodnek.)

Az alapeset persze az, hogy nem kell egyetlen kernel paraméter sem, itt épp a kivételekről van szó, merthogy azokat is meg kell oldani valahogy.

Az egyik vélt megoldás az, hogy a grub2 modul a fact vagy az ipmi class jelenléte alapján döntse el, hogy kell-e a console=ttyS0,115200n8 a kernelnek. Ettől azért fázom kicsit, mert nem igazán az ő dolga. Egy újrafelhasználhatónak szánt grub modulba kell a fenének mindenféle IPMI kötődés..

Concat(hoz hasonló) modult már használok, de hogy 1 sort is azzal rakjak össze, az már kicsit overkill, bár tény, ez is megoldás.

Az ujrafelhasznalhatosag szep dolog, de egy olyan komplex cuccnal mint a GRUB igen konnyen atlathatatlan lesz a dolog. A kerdes igazabol az, hogy a belefektetett energia barmikor is megterul-e az ujrafelhasznalhatosag reven? Mert ha minden alkalommal csak 5 perc megcsinalni ezt a configot, most viszont egy hetet toltesz vele, akkor jo esely van ra, hogy soha az eletben nem fog megterulni.

Egyebkent meg az jutott eszembe, hogy tudsz egy tombot csinalni es azon vegig iteralni sortoresek nelkul. Persze nem tudom, hogy segit-e neked, de lehet ilyen iranyba turni.

Azért pörgöm túl kicsit, mert ez már többször felmerült probléma (a grub csak az állatorvosi ló), már nagyon ideje, hogy egy mintát alkossak a megoldására és nagyon nem mindegy, hogy rossz vagy jó lesz az a minta.

A tömbön gondolkoztam, de nem látom, hogy hogy tudnám több modulból manipulálni. Mindenesetre minden arra mutat, hogy a concat modul a legjobb megoldás, a fragmentekből összeállított sor. Ott legalább a paraméterek sorrendje is determinisztikus lesz (a fragment neve nyomán).