Puppet 将键追加到数组的顶部

Puppet 将键追加到数组的顶部,puppet,Puppet,我有一些类似于以下的hiera(我知道这是无效的hiera,有两把钥匙…我赤裸着): 我试图将其转换为yaml文件(关键是文件名)。现在我知道这是无效的hiera,我可以删除groups键以使其正常工作(这正是我所做的),但是当我尝试将其重新插入数组时,我无法正确设置格式。下面是我正在使用的木偶代码: $alert_files = hiera('an::example::rule_files'), $alert_files.each | String $alerts_file_name,

我有一些类似于以下的hiera(我知道这是无效的hiera,有两把钥匙…我赤裸着):

我试图将其转换为yaml文件(关键是文件名)。现在我知道这是无效的hiera,我可以删除groups键以使其正常工作(这正是我所做的),但是当我尝试将其重新插入数组时,我无法正确设置格式。下面是我正在使用的木偶代码:

  $alert_files = hiera('an::example::rule_files'),
  $alert_files.each | String $alerts_file_name, Array $alert_config_pre | {
    $prefix = [ "groups:" ]
    $alert_config = $prefix + $alert_config_pre
    file { "/etc/prometheus/${alerts_file_name}.rules":
      ensure  => file,
      content => $alert_config.to_yaml,
    }
  }
以下是我想要的:

cat /etc/prometheus/my_rules.rules
---
groups:
  - name: my_rules
    rules:
    - alert: highCPU
      expr: CPU > 90
      for: 5m
      annotations:
        summary: CPU is too high
        description: CPU should be less than 90

下面是我得到的:

---
- 'groups:'
- name: my_rules
  rules:
  - alert: highCPU
    expr: CPU > 90
    for: 5m
    annotations:
      summary: CPU is too high
      description: CPU should be less than 90

任何帮助都将不胜感激。我觉得这应该很简单,但我还没有真正取得任何进展(我甚至不能删除单词组中的引号)。如果这在hiera或puppet中都是可能的(也许我对hiera的定义是错误的),那么就太好了;我将非常感激我能以任何方式取得的任何进步。

。。。取决于与key
an::example::rule_files
关联的数据是否是具有字符串键和数组值的哈希。在问题顶部显示的YAML中,该项是一个具有字符串键和散列值的散列。由于数据似乎与所需的文件内容相匹配,问题似乎不在YAML(不一致的缩进除外),而在于Puppet代码

要按照您希望的方式使用所需的数据,Puppet代码可能更像这样:

  $alert_files = lookup('an::example::rule_files'),
  $alert_files.each |String $alerts_file_name, Hash $alert_config| {
    file { "/etc/prometheus/${alerts_file_name}.rules":
      ensure  => 'file',
      content => $alert_config.to_yaml,
    }
  }

请注意,我已经从弃用的
hiera()
函数切换到了它的替换函数。

我在您开始介绍的YAML中看到的唯一问题是缩进不一致。缩进级别在YAML中很重要,其方式类似于Python中的缩进级别。至于Hiera,除了它是有效的YAML之外,它在其一个数据源中对YAML本身没有任何要求。可能存在数据未按使用它的伪代码所需建模的问题,但这不是关于Hiera是否有效的问题。我将修复缩进。将代码的“groups”部分保留在第一个示例中的位置会导致使用哈希(而不是“--”)的完全空文件。删除groups部分会导致错误:
需要一个哈希值,get Tuple
。顺便说一句,如果我将单词groups保留在中并尝试再次使用array,我会得到:
需要一个数组值,get Struct
@user3229731,a
Struct
是一个
哈希值,因此“需要一个数组值,get Struct”与我在数据中包含
groups:
键时对数据类型的解释一致。您确定您完全按照上面的指定修改了puppet代码吗?空文件可能是由于混淆了
$alert\u config\u pre
(在上述版本中不再使用)和
$alert\u config
。哈哈,这太尴尬了!非常感谢-工作得很好。我想我只是误解了哈希/数组中不允许这样做。这太完美了。谢谢
  $alert_files = hiera('an::example::rule_files'),
  $alert_files.each | String $alerts_file_name, Array $alert_config_pre | {
  $alert_files = lookup('an::example::rule_files'),
  $alert_files.each |String $alerts_file_name, Hash $alert_config| {
    file { "/etc/prometheus/${alerts_file_name}.rules":
      ensure  => 'file',
      content => $alert_config.to_yaml,
    }
  }