Upgrade from facter 3.11.14 to 4.2.5 (puppet-agent 5 to 7) broke some of our custom facts, that use other (custom) facts.
Managed to find the smallest examples of two custom facts that reproduce the problem.
First fact, that uses a core fact:
Facter.add(:my_fact) do
hostname=Facter.value(:networking)['hostname']
setcode do
hostname
end
end
Second fact, that uses the first fact:
my_fact = Facter.value(:my_fact)
Facter.add(:my_new_fact) do
setcode do
my_fact
end
end
The first fact works, it's the second one that stops working with puppet7/facter4.
puppet5/facter3:
amvdi-it133:~# facter -p my_fact my_new_fact
my_fact => amvdi-it133
my_new_fact => amvdi-it133
puppet7/facter4:
mvdi-it133:~# facter -p my_fact my_new_fact
my_fact => amvdi-it133
my_new_fact =>
Seems to have to do with calling Facter.vaiue in the first fact.
This still does not work:
Facter.add(:my_fact) do
unused=Facter.value(:networking)['hostname']
hostname="testing"
setcode do
...
But this does:
Facter.add(:my_fact) do
hostname="testing"
setcode do
...
# facter -p my_fact my_new_fact
my_fact => testing
my_new_fact => testing
Also found that it works if I change the second fact to do the Facter.value inside the setcode block:
Facter.add(:my_new_fact) do
setcode do
my_fact = Facter.value(:my_fact)
my_fact
end
end
Learning this I went back to the first fact and changed it to do the Facter.value inside the setcode block too like this:
Facter.add(:my_fact) do
setcode do
hostname=Facter.value(:networking)['hostname']
hostname
end
end
That also makes it work regardless of where I do Facter.value in the second fact.
I'm at a loss as to what the fact is going on here. Is it a bug? Or is there a reasonable explanation for it? (I'm a complete Ruby noob, )
Regards,
Mark.