【问题标题】:Iterate over an array of hashes in puppet遍历 puppet 中的哈希数组
【发布时间】:2018-11-19 11:35:13
【问题描述】:

我在 puppet 中有 hiera 数据如下:

elasticsearch::cluster_name: 'elasticsearch-dev'
elasticsearch::masterlist: [ "elasticsearchdev01.domain.com", "elasticsearchdev02.domain.com", "elasticsearchdev03.domain.com" ]
elasticsearch::kibanalist: [ "kibanadev01.domain.com" ]

我的清单包含以下内容:

  $masterlist = hiera('elasticsearch::masterlist')
  $kibanalist = hiera('elasticsearch::kibanalist')

  if ( $::fqdn in $masterlist ) or ( $::fqdn in $kibanalist ) {
    $cluster_name = hiera('elasticsearch::cluster_name')
  }

  else {
    notify { 'No cluster for node':
      message => "${::fqdn} is not configured to be in any cluster in the hiera data",
    }
  }

我想修改它以允许为单个环境配置多个集群,但我不确定实现它的最佳方法。我希望能够将主列表与其对应的集群名称分组,然后为每个节点调用相关的集群名称。

我想也许我需要使用哈希数组并对其进行迭代,但我不知道如何在清单中涵盖这一点。

【问题讨论】:

  • 我想知道Puppet docs on iteration 是否有帮助?你可能需要一个最近的 Puppet 才能工作。
  • 我将向您指出文档,因为这是一个理论问题:puppet.com/docs/puppet/5.5/lang_iteration.html。如果你把问题具体化,那么我们可以给你一个具体的答案。不过,该文档目前将是朝着正确方向迈出的一步。

标签: arrays hash puppet


【解决方案1】:

您可能希望将数据重组为哈希的哈希:

elasticsearch::clusters:
  'elasticsearch-dev':
    masterlist: [ "elasticsearchdev01.domain.com", "elasticsearchdev02.domain.com", "elasticsearchdev03.domain.com" ]
    kibanalist: [ "kibanadev01.domain.com" ]

然后在您的清单中添加:

$clusters = hiera('elasticsearch::clusters')

$mycluster = $clusters.filter |$cluster, $data| {
  ($::fqdn in $data['masterlist']) or ($::fqdn in $data['kibanalist'])
}

if ($mycluster.empty) {
  notify { 'No cluster for node':
    message => "${::fqdn} is not configured to be in any cluster in the hiera data",
  }
}

$cluster_name = $mycluster.keys[0]
notice($cluster_name)

您可能还想考虑用lookup() 替换已弃用的hiera() 调用,并使用$facts['networking']['fqdn'] 代替旧的$::fqdn

【讨论】:

  • 这给了我一个很好的起点。在实现这个之后,我认为我真正想要做的是编写一个函数,它将搜索节点的 fqdn 的分层数据(给定多个集群配置)中的所有主/kibana 列表。如果不存在则发送通知,如果存在则返回相应的集群名称、masterlist 和 kibanalist。我可以看到我可以根据您上面的建议搜索列表,但是我似乎无法使用迭代之外设置的任何变量。
  • 哦,我明白了。我在想你只是不知道如何构造数据。实际上是可以做到的。让我重构。
  • @clp,我想这就是你的意思?