puppet - 将因子注入文件内容 - 没有将哈希隐式转换为字符串
问题描述
我想从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”=>”的Munging失败x86_64", "name"=>"CentOS", "release"=>{"full"=>"7.4.1708", "major"=>"7", "minor"=>"4"}, "selinux "=>{"config_mode"=>"enforcing", "config_policy"=>"targeted", "current_mode"=>"enforcing", "enabled"=>true, "enforced"=>true, "policy_version"=>类内容中的“28”}}:没有将哈希隐式转换为字符串(文件:/etc/puppetlabs/code/environments/production/manifests/site.pp,行: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"}}
推荐阅读
- javascript - 打字稿,对象的类型数组。只需要一个对象的属性设置为 true
- google-apps-script - 如何在 Google Apps 脚本中解析这个对象?
- javascript - 通过跨度创建点不是从css中的反应生成的
- python - 使用 50x50 阵列的慢速 keras 拟合方法,我怎样才能让它更快?
- prolog - swipl - prolog 将所有成员加入列表
- java - 在 webService 上调用 jni4net 时出错,URI 方案不是“文件”
- javascript - 在 TypeScript 中使用“替代模式”混合
- python - 如何分发 Python 虚拟环境?
- javascript - React hook useState 改变一个常量数组
- angular - 不管 observables 是否存在都运行代码,但如果存在则等待它们?