【问题标题】:Puppet 5 Iterate over HashPuppet 5 迭代哈希
【发布时间】:2020-07-04 08:41:36
【问题描述】:

如何使用迭代(未定义的资源)在 Puppet 5 中迭代以下层次

编辑了更多信息

我想创建一个文件,其中包含配置文本作为传递给模板的内容

这是我的工作。

希拉

appname::app_config:
  "/tmp/application.properties":
    config_text:
      - "# First Line"
      - "Second Line"
      - ""
      - "So forth"

  "/tmp/database.properties":
    config_text:
      - "Test Line"
      - "Another Test Line"

该层次的 Puppet 迭代配置

  $appname_config.each | $config_file, Hash $config_text| {
    file { "$config_file" :
      ensure => present,
      content => template('modulename/generic_config.epp'),
      }
    }

模板

<% @config_text.each do |key, value| -%>
<% value.each do |key,value| -%>
<%= key %>
<% end %>
<% end -%>

但我需要使用以下格式层次

appname::app_config:
  file: "/tmp/dummy.config"
  config_text:
        - "Application Properties"
        - "TimePeriod = 1"
 
   file: "/tmp/second.txt"
   config_text:
        - "Application Properties"
        - "TimePeriod = 1"

提前致谢

【问题讨论】:

  • 您能否提供更多关于您希望如何使用这些数据以及您尝试了什么的信息?这个问题非常笼统:事实上,我只能说“使用each()”。
  • sorta required”是什么意思?希望这意味着与“必需”不同的东西,因为您不能拥有带有重复键的散列。至少,没有用处。但是您可以使用类似于您显示的 Hiera 格式,其中值是一个数组或散列而不是单个散列。

标签: iteration puppet


【解决方案1】:

第一个块中的任何内容都不会被返回,例如 file 只会返回 /tmp/second.txt,它是一个哈希值,你有重复的键,所以它只会被覆盖。 为了更好地了解正在发生的事情,您可能需要运行类似

class appname  (
  $app_config
){
  notify { $app_config[file]: }
  $app_config[config_text].each |$item| {
    notify { $item: message => $item }
  }
}

这是一个哈希,因此您可以使用它的密钥访问其中的任何内容。

【讨论】:

    【解决方案2】:

    但我需要使用以下格式层次

    appname::app_config:
      file: "/tmp/dummy.config"
      config_text:
            - "Application Properties"
            - "TimePeriod = 1"
     
       file: "/tmp/second.txt"
       config_text:
            - "Application Properties"
            - "TimePeriod = 1"
    

    您不能有效地使用该格式来传达有关多个文件的信息,因为这将需要使用重复的哈希键,正如您的示例所展示的那样。最接近的方法是将数据构造为散列数组而不是单个散列:*

    appname::app_config:
       - file: "/tmp/dummy.config"
         config_text:
            - "Application Properties"
            - "TimePeriod = 1"
       - file: "/tmp/second.txt"
         config_text:
            - "Application Properties"
            - "TimePeriod = 1"
    

    然后您可以像这样在清单中对其进行迭代:

      $appname::app_config.each | $config_hash | {
        $config_file = $config_hash['file']
        $config_text = $config_hash['config_text']
    
        file { "$config_file" :
          ensure  => 'present',
          content => template('modulename/generic_config.erb'),
        }
      }
    

    此外,每个条目的config_text 都显示为字符串数组,不仅在我的示例中,而且在您的示例中也是如此。但是,您的模板会尝试将其作为散列的散列进行迭代,但这是行不通的。这将是一个更合适的模板:

    <% @config_text.each do |line| -%>
    <%= line %>
    <% end -%>
    

    但是如果你需要做的只是输出一系列这样的行,那么模板就太过分了。 Puppet 内置的join 函数会更清楚地做到这一点,使用它可以让您免于维护单独的模板:

    # ...
    content => join($config_text, "\n"),
    # ...
    

    *但如果为这些数据选择 Hiera 表示,那么我会选择更接近你所说的为你工作的形式。

    【讨论】:

    • 太棒了,非常感谢及时的反馈!
    猜你喜欢
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 2014-12-15
    • 2017-09-02
    • 1970-01-01
    相关资源
    最近更新 更多