将事实注入文件内容 - 没有将哈希隐式转换为字符串



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

它适用于$fqdn,因为facter fqdn返回字符串

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

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

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

并在运行时收到此错误消息puppet agent -t

错误:无法应用目录:参数内容在 上失败 文件[/tmp/README.md]:值的蒙格失败 {"architecture"=>"x86_64", "family"=>"RedHat", "hardware"=>"x86_64", "name"=>"CentOS", "release"=>{"full"=>"7.4.1708", "major"=>"7", "minor"=>"4"}, "selinux"=>{"config_mode"=>"enforcing", "config_policy"=>"定向", "current_mode"=>"强制", "enabled"=>true, "enforced"=>true, "policy_version"=>"28"}} in class 内容:没有将哈希隐式转换为字符串(文件:/etc/puppetlabs/code/environment/production/manifests/site.pp, line: 2(

如何将哈希转换为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(,例如

$os_str = inline_template("<%= @os.to_s %>")
file { '/tmp/README.md':
ensure => file,
content => $os_str,
}

这实际上导致自Ruby以来的Hash格式略有不同,而不是Puppet进行格式化:

{"name"=>"Darwin", "family"=>"Darwin", "release"=>{"major"=>"14", "minor"=>"5", "full"=>"14.5.0"}}

相关内容

  • 没有找到相关文章

最新更新