微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

条件资源属性 Hiera代码段:类示例:

如何解决条件资源属性 Hiera代码段:类示例:

要安装软件包,我将数据从Hiera输入到for循环中。一些软件包需要其他参数。对于不需要参数的软件包,我将其值设置为undef,但是Chocolatey读取undef并抱怨。

当空白的packageinstall_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 举报,一经查实,本站将立刻删除。