我正在尝试完成首批练习之一,其中包括hostname
中的osname
和/etc/motd
个事实。我根本无法使其正常工作。我无法从哈希中获取元素。
我在木偶上使用虚拟机,复制和粘贴对我不起作用,所以我会使用截图。
所以我创建了motd.pp
:
但在运行puppet apply motd.pp
后,我看到了这一点:
我试过了:
$os[name]
$os['name']
${os}[name]
${os}['name']
$facts['os']['name']
$::os['name']
$::os[name]
几乎我能想到的每一个排列,它总是忽略变量的[name]
或[os][name]
部分。
答案 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不会将字符串中的下标运算符识别为变量,因此它会插入整个哈希的字符串值,并将下标作为纯文本附加。