Puppet 将facter注入到文件内容中-没有将哈希隐式转换为字符串

Puppet 将facter注入到文件内容中-没有将哈希隐式转换为字符串,puppet,facter,Puppet,Facter,我想将facter中的一些值注入到文件内容中 它与$fqdn一起工作,因为facter fqdn返回字符串 node default { file {'/tmp/README.md': ensure => file, content => $fqdn, # $(facter fqdn) owner => 'root', } } 但是,它不适用于哈希对象(facter os): 并在运行puppet agent-t时获取此错误消息: 错误

我想将
facter
中的一些值注入到文件内容中

它与
$fqdn
一起工作,因为
facter fqdn
返回字符串

node default {
  file {'/tmp/README.md':
    ensure  => file,
    content => $fqdn, # $(facter fqdn)
    owner   => 'root',
  }

}
但是,它不适用于哈希对象(
facter os
):

并在运行
puppet agent-t
时获取此错误消息:

错误:未能应用目录:上的参数内容失败 文件[/tmp/README.md]:对值进行mung失败 {“体系结构”=>“x86_64”、“系列”=>“RedHat”、“硬件”=>“x86_64”, “name”=>“CentOS”,“release”=>{“full”=>“7.4.1708”,“major”=>“7”, “次要”=>“4”},“selinux”=>{“配置模式”=>“强制执行”, “配置策略”=>“目标”,“当前模式”=>“强制”, 类中的“enabled”=>true,“exforced”=>true,“policy_version”=>“28”} 内容:没有将哈希隐式转换为字符串(文件: /etc/puppetlabs/code/environments/production/manifests/site.pp,行: (二)


如何将哈希转换为
pp
文件中的字符串

如果您的Puppet>=4.5.0,现在可以将各种数据类型本机转换为清单中的字符串(即pp文件中的字符串)。转换函数已记录在案

这将满足您的要求:

file { '/tmp/README.md':
  ensure  => file,
  content => String($os),
}
或者更好:

file { '/tmp/README.md':
  ensure  => file,
  content => String($facts['os']),
}
在我的Mac OS X上,这会导致一个包含以下内容的文件:

{'name' => 'Darwin', 'family' => 'Darwin', 'release' => {'major' => '14', 'minor' => '5', 'full' => '14.5.0'}}
请查看所有这些文档,因为有很多选项可能对您有用

当然,如果您想要$os事实中的密钥

file { '/tmp/README.md':
  ensure  => file,
  content => $facts['os']['family'],
}
现在,如果您没有最新的Puppet,也没有字符串转换函数,那么旧的方法是通过模板和嵌入式Ruby(ERB),例如


可能重复的不是相关问题的重复。我很快会给出答案。我很确定这适用于任何未过时的木偶,而不仅仅是最新的木偶。该功能是在木偶4.5.0中引入的。我刚查过。
file { '/tmp/README.md':
  ensure  => file,
  content => $facts['os']['family'],
}
$os_str = inline_template("<%= @os.to_s %>")
file { '/tmp/README.md':
  ensure => file,
  content => $os_str,
}
{"name"=>"Darwin", "family"=>"Darwin", "release"=>{"major"=>"14", "minor"=>"5", "full"=>"14.5.0"}}