从puppet的facter命令行工具中提取嵌套的散列事实。 怎么样?

这可能是显而易见的。 然而,通过facter的帮助,puppetlab的网站和谷歌search后,我仍然无法弄清楚如何检索嵌套的事实。

例如,我可以这样做:

>facter os

{"release"=>{"major"=>"6", "minor"=>"7", "full"=>"6.7"}, "family"=>"RedHat", "name"=>"CentOS"}

如何通过命令行检索os['name']os['release']['minor']或任意嵌套的事实?

通过在variables之间使用点,可以在CLI中查看嵌套的事实值

例如在CLItypes中检索os['release']['minor']facter os.release.minor

编辑: Apperently这只适用于facter 3.x.

这篇文档简要介绍了如何访问这些结构化(又名嵌套)事实( http://docs.puppetlabs.com/facter/3.1/core_facts.html ):

旧版事实注意:从第3版开始,架构等遗留事实默认隐藏,以减lessFacter默认命令行输出中的噪音。 这些较旧的事实现在是更有用的结构化事实的一部分; 例如,体系结构现在是OS事实的一部分,可以作为OS体系结构访问。 您仍然可以在Puppet清单($ architecture)中使用这些遗留事实,在命令行(facter体系结构)请求它们,并在结构化事实(facter –show-legacy)旁边查看它们。

不幸的是,我找不到使用旧版本访问嵌套事实的信息。

在v3中,您可以执行以下操作:

 facter os { architecture => "amd64", distro => { codename => "trusty", description => "Ubuntu 14.04.3 LTS", id => "Ubuntu", release => { full => "14.04", major => "14.04" } }, family => "Debian", hardware => "x86_64", name => "Ubuntu", release => { full => "14.04", major => "14.04" }, selinux => { enabled => false } } 

 facter os.release { full => "14.04", major => "14.04" } 

 facter os.release.major 14.04 

这不是什么facter应该做的。 如果您按照预期在puppet内使用它,您可以分别访问每个事实。

在某种程度上,如果你使用JSON输出你可以解决这个问题:

 facter --json os | grep major "major": "6", 

如果你有一个可用的CLI JSONparsing器,一切都是可能的。

使用jq

 facter --json os | jq .os.release.minor "6"