木偶清单中的哈希元素引用

时间:2016-11-26 03:00:11

标签: puppet

我正在尝试完成首批练习之一,其中包括hostname中的osname/etc/motd个事实。我根本无法使其正常工作。我无法从哈希中获取元素。

我在木偶上使用虚拟机,复制和粘贴对我不起作用,所以我会使用截图。

enter image description here

所以我创建了motd.pp

enter image description here

但在运行puppet apply motd.pp后,我看到了这一点:

enter image description here

我试过了:

$os[name]
$os['name']
${os}[name]
${os}['name']
$facts['os']['name']
$::os['name']
$::os[name]

几乎我能想到的每一个排列,它总是忽略变量的[name][os][name]部分。

2 个答案:

答案 0 :(得分:2)

有两种方法可以做到这一点。有Puppet 4 / Facter 3方式:

file { '/etc/motd':
  ensure  => file,
  owner   => 'root',
  group   => 'root',
  content => "${facts['networking']['fqdn']} OS name is ${facts['os']['name']}\n",
}

和Puppet 3 / Facter 2的方式是:

file { '/etc/motd':
  ensure  => file,
  owner   => 'root',
  group   => 'root',
  content => "$::fqdn OS name is ${::os['name']}\n",
}

您也可以使用Puppet 4和Facter 2执行此操作。它可以使用第一个示例中的语法,但第二个示例中的事实位置。

file { '/etc/motd':
  ensure  => file,
  owner   => 'root',
  group   => 'root',
  content => "${facts['fqdn']} OS name is ${facts['os']['name']}\n",
}

答案 1 :(得分:2)

将散列中的值插入到字符串中,您需要将整个表达式括在花括号内的$之后。或者,您可以对普通变量引用使用相同的表单(在某些情况下,您必须这样做以避免变量的名称被误解):

file { '/etc/motd':
  ensure  => file,
  owner   => 'root',
  group   => 'root',
  content => "${::fqdn} OS name is ${::os['name']}\n",
}

散列键周围是否存在单引号并不重要,但我推荐引用的表单作为更好的样式。

如果没有大括号,Puppet不会将字符串中的下标运算符识别为变量,因此它会插入整个哈希的字符串值,并将下标作为纯文本附加。