在puppet清单中迭代深度嵌套的hiera哈希

时间:2016-11-15 17:19:32

标签: puppet hiera

我正在为我的网络服务器构建一个结构。我在hiera中设置了我的设置,但我似乎无法让傀儡回馈正确的类型。

共同的.yaml

vhosts:
  hostname:
    sitename:
      app_url: value
      app_type: value

每个vhost和多个vhost都有多个站点。在我的清单中,我将创建文件夹结构和其他设置任务,但是现在我甚至无法在网站上进行迭代。

当前清单:

define application($app_name, $app_url) {
  notice("App Type: ${app_type}")
  notice("App Url: ${app_url}")
}

$vhosts = hiera('vhosts')

$vhosts.each |$vhost| {
  create_resources(application, $vhost)
}

我得到的错误是create_resources需要哈希。但是,如果我输入强制转换$vhost,我认为它不是哈希而是元组。

我如何从我的yaml哈希中获取一个元组?有没有更好的方法来迭代这个数据集以获得我需要的东西?

1 个答案:

答案 0 :(得分:8)

第二个例子中https://docs.puppet.com/puppet/latest/reference/function.html#each解释了为什么你有一个元组。

给出一个Hiera哈希:

vhosts:
  hostname:
    sitename:
      app_url: value
      app_type: value

您可以像下面这样迭代它:

hiera_hash('vhosts').each |String $hostname, Hash $hostname_hash| {
  # $hostname is 'hostname'
  # $hostname_hash is { hostname => { sitename => { app_url => value, app_type => value } } }
  $hostname_hash.each |String $sitename, Hash $sitename_hash| {
    # $sitename is 'sitename'
    # $sitename_hash is { sitename => { app_url => value, app_type => value } }
    $sitename_hash.each |String $key, String $value| {
      # first loop $key is app_url and $value is 'value'
      # second loop $key is app_type and $value is 'value'
    }
  }
}

当然,您可以在任何位置访问哈希值,例如

hiera_hash('vhosts')['hostname']['sitename']['app_url']

将导致value

如果您尝试执行create_resources(),那么您可能希望将哈希构造为资源哈希的哈希值。例如,Hiera:

packages:
  gcc:
    ensure: installed
  gfortran:
    ensure: absent

与Puppet:

create_resources(hiera_hash('packages'))