如何解决条件资源属性 Hiera代码段:类示例:
要安装软件包,我将数据从Hiera输入到for循环中。一些软件包需要其他参数。对于不需要参数的软件包,我将其值设置为undef
,但是Chocolatey读取undef
并抱怨。
当空白的package
或install_options
时,如何获取undef
资源以忽略它?
Hiera代码段:
profile::business::packages:
office365business:
version: latest
provider: chocolatey
arguments: ['/productid:O365BusinessRetail']
xmind:
version: latest
provider: chocolatey
arguments: undef
slack:
version: latest
provider: chocolatey
arguments: undef
类示例:
class profile::business(
Hash $packages,){
if $::kernel == 'windows' {
$packages.each | $key,$value | {
package { "install_${key}" :
name => $key,ensure => $value['version'],provider => $value['provider'],install_options => $value['arguments'],notify => Reboot['after_profile_business'],}
}
reboot { 'after_profile_business' :
apply => finished,message => 'Reboot: Business profile applied.'
}
}
}
我能想到的最好的方法是使用if子句,根据package
的值,使用有无install_options
的{{1}}资源的不同实例:
arguments
但是,这似乎很笨拙,我希望有人可以向我展示更好的方法?
我已经看到了Puppet Selector条件示例,但是我不知道这是否对我有用。
T.I.A
解决方法
这个YAML片段...
arguments: undef
...将'arguments'
键的值设置为 string 'undef'
。但这并不意味着在Puppet方面与Puppet文字undef
相同。
有解决方案。最好的国际海事组织(IMO)都围绕通过善意缺乏数据来代表缺乏数据。这样就不需要任何特殊的保留字。因此,假设您的数据如下所示:
profile::business::packages:
office365business:
version: latest
provider: chocolatey
arguments: ['/productid:O365BusinessRetail']
xmind:
version: latest
provider: chocolatey
slack:
version: latest
provider: chocolatey
请注意,实际上没有要指定的参数,没有条目带有arguments
键。如果您严格定义数据类型,那么您可能需要针对这些数据调整数据类型以适应这种情况,但这要好得多,因为这样可以更好地描述实际的数据语义。 数据修改本身可能会解决您的问题,因为在存在的散列中查找不存在的键会产生undef
(如果还存在dig()
未定义性可能会在较高级别的深度数据结构中发生。
但是,请考虑一下,Puppet具有一个快捷方式,用于声明资源属性值是从哈希值中提取的。因为您的密钥与所需的属性名称不同,所以这不太适合您当前的数据,但是您可以更改数据中的密钥或将其映射到Puppet级别。后者可能看起来像这样:
# Defining the key / property name mappings here makes them clear,and is easy to
# change if you need to update the mappings
$mappings = { 'version' => 'ensure','arguments' => 'install_options' }
$packages.each |$package,$properties| {
# map the keys appearing in the data to Puppet property names,based on
# the hash defined above
$filtered_props = $properties.reduce({}) |$memo,$pair| {
$mapped_key = $pair[0] in $mappings ? { true => $mappings[$pair[0]],default => $pair[0] }
$memo + { $mapped_key => $pair[1] }
}
# one declaration covering all cases
package { "install_${package}" :
name => $package,provider => $value['provider'],notify => Reboot['after_profile_admin'],* => $filtered_props,}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。