Eu escrevi um fato personalizado do Puppet que requer que a ferramenta biosdevname
seja instalada. Não tenho certeza de como configurar as coisas corretamente, para que essa ferramenta seja instalada antes que facter tente instanciar o fato personalizado.
Os fatos são carregados no início do processo, então não posso simplesmente colocar um package { biosdevname: ensure => installed }
no manifesto, já que até o momento em que o Puppet chegar até aqui, o costume já falhou.
Eu estava curioso para saber se poderia resolver isso através dos estágios do Puppet. Eu tentei:
stage { pre: before => Stage[main] }
class { biosdevname: stage => pre }
E:
class biosdevname {
package { biosdevname: ensure => installed }
}
Mas isso não funciona ... O Puppet carrega os fatos antes de entrar no estágio pre
:
info: Loading facts in physical_network_config
./physical_network_config.rb:33: command not found: biosdevname -i eth0
info: Applying configuration version '1320248045'
notice: /Stage[pre]/Biosdevname/Package[biosdevname]/ensure: created
Etc. Existe alguma maneira de fazer isso funcionar?
EDIT : Eu devo deixar claro que eu entendo, dada uma declaração package
adequada, que o fato será executado corretamente em subseqüentes execuções. A dificuldade aqui é que isso faz parte do nosso processo inicial de configuração. Estamos executando o Puppet no kickstart e queremos que a configuração de rede esteja em vigor antes da primeira reinicialização.
Parece que a única solução viável é simplesmente executar o Puppet duas vezes durante a configuração inicial do sistema, o que garantirá que os pacotes necessários estejam no lugar.
Além disso, para Zoredache:
# This produces a fact called physical_network_config that describes
# the number of NICs available on the motherboard, on PCI bus 1, and on
# PCI bus 2. The fact value is of the form <x>-<y>-<z>, where <x>
# is the number of embedded interfaces, <y> is the number of interfaces
# on PCI bus 1, and <z> is the number of interfaces on PCI bus 2.
em = 0
pci1 = 0
pci2 = 0
Dir['/sys/class/net/*'].each {
|file| devname=File.basename(file)
biosname=%x[biosdevname -i #{devname}]
case
when biosname.match('^pci1')
pci1 += 1
when biosname.match('^pci2')
pci2 += 1
when biosname.match('^em[0-9]')
em += 1
end
}
Facter.add(:physical_network_config) do
setcode do
"#{em}-#{pci1}-#{pci2}"
end
end