从 puppet 的 facter 命令行工具中提取嵌套哈希事实。怎么做?

从 puppet 的 facter 命令行工具中提取嵌套哈希事实。怎么做?

这可能很明显。但是,在搜索了 facter 的帮助、puppetlab 的网站和 Google 之后,我仍然无法弄清楚如何检索嵌套的 facter 。

例如,我可以这样做:

>facter os

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

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

答案1

可以在 CLI 中通过在变量之间使用点来查看嵌套事实值

os['release']['minor']例如,要在 CLI 类型中 检索:facter os.release.minor

编辑: 显然,这只适用于 facter 3.x。

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

遗留事实注意:从 Facter 3 开始,遗留事实(例如架构)默认隐藏,以减少 Facter 默认命令行输出中的噪音。这些较旧的事实现在是更有用的结构化事实的一部分;例如,架构现在是操作系统事实的一部分,可以作为 os.architecture 访问。您仍然可以在 Puppet 清单 ($architecture) 中使用这些遗留事实,在命令行上请求它们(facter architecture),并将它们与结构化事实一起查看(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

答案2

这不是facter应该做的。如果您puppet按预期使用它,则可以单独访问每个事实。

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

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

如果您有可用的 CLI JSON 解析器,一切皆有可能。

使用jq

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

相关内容