As part of magically provisioning dependencies on Nodepool instances (eg https://gerrit.wikimedia.org/r/#/c/274675/ ) I have found out Hiera was falling due to empty files (fixed: T128846: DIB images have /puppet/hieradata files that are empty).
While debugging, I also found that Hiera lookup is broken on Nodepool instances. Namely it is missing the fact for labsproject:
$ /puppet/utils/hiera_lookup --fqdn=`hostname --fqdn` labs project $ facter labsproject $
The hiera configuration file references ::labsproject and since it is empty, a wild range of Hiera hierarchy is not traversed. Relevant conf from hiera.yaml
:hierarchy:
- "labs/hosts/%{::hostname}"
- "labs/%{::labsproject}/host/%{::hostname}"
- "labs/%{::labsproject}/common"
- "labs"
- "secret/%{::labsproject}"
- "private/%{::labsproject}"
- common
- "secret/common"
- "private/common"Using hiera_lookup in verbose mode (-v):
jenkins@ci-jessie-wikimedia-45448:~$ /puppet/utils/hiera_lookup --fqdn=`hostname --fqdn` labsproject -v DEBUG: 2016-03-07 16:38:25 +0000: Looking up labsproject DEBUG: 2016-03-07 16:38:25 +0000: Loading info from hosts/ci-jessie-wikimedia-45448 for labsproject DEBUG: 2016-03-07 16:38:25 +0000: The source is: hosts/ci-jessie-wikimedia-45448 DEBUG: 2016-03-07 16:38:25 +0000: Cannot find datafile /puppet/hieradata/hosts/ci-jessie-wikimedia-45448.yaml, skipping DEBUG: 2016-03-07 16:38:25 +0000: Searching for labsproject in DEBUG: 2016-03-07 16:38:25 +0000: Loading info from regex/ci-jessie-wikimedia-45448.eqiad.wmflabs for labsproject DEBUG: 2016-03-07 16:38:25 +0000: Regex match going on - using regex.yaml DEBUG: 2016-03-07 16:38:25 +0000: Searching for labsproject in /puppet/hieradata/regex.yaml DEBUG: 2016-03-07 16:38:25 +0000: Loading file /puppet/hieradata/regex.yaml <snip Scanning label foo> DEBUG: 2016-03-07 16:38:25 +0000: Loading info from eqiad/labs for labsproject DEBUG: 2016-03-07 16:38:25 +0000: The source is: eqiad/labs DEBUG: 2016-03-07 16:38:25 +0000: Cannot find datafile /puppet/hieradata/eqiad/labs.yaml, skipping DEBUG: 2016-03-07 16:38:25 +0000: Searching for labsproject in DEBUG: 2016-03-07 16:38:25 +0000: Loading info from eqiad for labsproject DEBUG: 2016-03-07 16:38:25 +0000: The source is: eqiad DEBUG: 2016-03-07 16:38:25 +0000: Searching for labsproject in /puppet/hieradata/eqiad.yaml DEBUG: 2016-03-07 16:38:25 +0000: Loading file /puppet/hieradata/eqiad.yaml DEBUG: 2016-03-07 16:38:25 +0000: Loading info from private/eqiad/labs for labsproject DEBUG: 2016-03-07 16:38:25 +0000: The source is: eqiad/labs DEBUG: 2016-03-07 16:38:25 +0000: Cannot find datafile /puppet/hieradata/eqiad/labs.yaml, skipping DEBUG: 2016-03-07 16:38:25 +0000: Searching for labsproject in DEBUG: 2016-03-07 16:38:25 +0000: Loading info from private/eqiad for labsproject DEBUG: 2016-03-07 16:38:25 +0000: The source is: eqiad DEBUG: 2016-03-07 16:38:25 +0000: Searching for labsproject in /puppet/hieradata/eqiad.yaml DEBUG: 2016-03-07 16:38:25 +0000: Loading file /puppet/hieradata/eqiad.yaml DEBUG: 2016-03-07 16:38:25 +0000: Loading info from common for labsproject DEBUG: 2016-03-07 16:38:25 +0000: The source is: common DEBUG: 2016-03-07 16:38:25 +0000: Searching for labsproject in /puppet/hieradata/common.yaml DEBUG: 2016-03-07 16:38:25 +0000: Loading file /puppet/hieradata/common.yaml DEBUG: 2016-03-07 16:38:25 +0000: Loading info from private/common for labsproject DEBUG: 2016-03-07 16:38:25 +0000: The source is: common DEBUG: 2016-03-07 16:38:25 +0000: Searching for labsproject in /puppet/hieradata/common.yaml DEBUG: 2016-03-07 16:38:25 +0000: Loading file /puppet/hieradata/common.yaml jenkins@ci-jessie-wikimedia-45448:~$
Facter is unahppy:
$ facter hostname realm labsproject labsprojectfrommetadata hostname => ci-jessie-wikimedia-45448 labsproject => nil labsprojectfrommetadata => nil realm => nil
It seems labsproject and realm are populated from puppet.git manifests/realm.pp which we might not include.
The labsprojectfrommetadata would be shipped via modules/base/lib/facter/labsprojectfrommetadata.rb:
Facter.add(:labsprojectfrommetadata) do
And we can't really include ::base because it ships too much unrelated stuff that ends up breaking puppet provisioning on the very lightweight image.