Puppet&Hiera:$variable 在访问时不是散列或数组

txw*_*ing 6 puppet hiera

我使用的是 Puppet 3.2.2 和 Hiera 1.2.1。我写了一个 puppet 模块,init.pp 的内容是:

class install(
  $common_instanceconfig = hiera_hash('common_instanceconfig'),
  $common_instances = hiera('common_instances')
)
{

  define instances {

    common { $title:
      name       => $title,
      path       => $common_instanceconfig[$title]['path'],
      version    => $common_instanceconfig[$title]['version'],
      files      => $common_instanceconfig[$title]['files'],
      pre        => $common_instanceconfig[$title]['pre'],
      after      => $common_instanceconfig[$title]['after'],
      properties => $common_instanceconfig[$title]['properties'],
      require    => $common_instanceconfig[$title]['require'] ,

    }
  }

  instances {$common_instances:}
}
Run Code Online (Sandbox Code Playgroud)

而 hieradata 文件是:

classes:
  - install

common_instances:
  - common_instance_1
  - common_instance_2

common_instanceconfig:
  common_instance_1
    path      : '/opt/common_instance_1'
    version   : 1.0
    files     : software-1.bin
    pre       : pre_install.sh
    after     : after_install.sh
    properties: "properties"

common_instance_2:
    path      : '/opt/common_instance_2'
    version   : 2.0
    files     : software-2.bin
    pre       : pre_install.sh
    after     : after_install.sh
    properties: "properties"
Run Code Online (Sandbox Code Playgroud)

当 puppet 代理运行时,我总是收到一条错误消息

Error: common_instanceconfig String is not an hash or array when accessing it with common_instance_1 at /etc/puppet/modules/install/manifests/init.pp:16 on node puppet.agent1.tmp
Run Code Online (Sandbox Code Playgroud)

似乎$common_instances可以正确获取,但$commono_instanceconfig始终将其视为字符串。

我曾经YAML.load_file加载 hieradata 文件,并获得了正确的哈希对象。

有人可以帮忙吗?

txw*_*ing 4

最后我发现这是一个变量范围的问题,正确的init.pp应该是:

class install(
  $common_instances = hiera_array('common_instances'),
  $common_instanceconfig = hiera_array('common_instanceconfigs'),
) 
{
  define instances (
  $common_instanceconfig
  ) {   

  common { $common_instances[0]: 
    name       => $title,
    path       => $common_instanceconfig[0],
    version    => $common_instanceconfig[1],
    files      => $common_instanceconfig[2],
    pre        => $common_instanceconfig[3],
    after      => $common_instanceconfig[4],
    properties => $common_instanceconfig[5],
    require    => $common_instanceconfig[$title]['require'] ,
   }   
  }

  instances {$common_instances: 
    common_instanceconfig => $common_instanceconfig
  }

}
Run Code Online (Sandbox Code Playgroud)