将数组中的元素作为键

时间:2018-01-24 17:39:29

标签: puppet

我在尝试执行我的木偶模块时遇到错误:

Error 400 on SERVER: certificatefqdn is not a hash or array when accessing it with certificatefile

这就是我的hiera文件:

testmodule::install::certificates:
  test1.domain.com:
    certificatefile: 'certificate1.crt'
    certificatepass: 'testpass1'
  test2.domain.com:
    certificatefile: 'certificate2.crt'
    certificatepass: 'testpass2'
  test3.domain.com:
    certificatefile: 'certificate3.crt'
    certificatepass: 'testpass3'

我模块中的init.pp如下所示:

class testmodule (
  $certificates = hiera('testmodule::install::certificates'), 
 )
{
    $domains = [
      test1.domain.com',
      test2.domain.com',
      test3.domain.com',
    [

  testmodule::install { $domains:
    certificates => $certificates,
  }
}

我模块中的install.pp如下所示:

define testmodule::install ($certificates)

    {
       $domain = $name
       $certificatefqdn = $certificates["$domain"]
       $certificatefile = $certificatefqdn['certificatefile']
       $certificatepass = $certificatefqdn['certificatepass']
       notify{"This is the certificate file: $certificatefile" :}
    }

我希望看到域数组中每个元素都有这样的输出:

Notice: This is the certificate file: certificate2.crt
Notice: /Stage[main]/Testmodule/Testmodule::Install[certificate2.crt]/Notify[This is the certificate file: certificate2.crt]/message: defined 'message' as 'This is the certificate file: certificate2.crt'

相反,我看到了这一点:

Notice: This is the certificate file: test2.domain.com['certificatefile']
Notice: /Stage[main]/Testmodule/Testmodule::Install[test2.domain.com]/Notify[This is the certificate file: test2.domain.com['certificatefile']]/message: defined 'message' as 'This is the certificate file: test2.domain.com['certificatefile']'

如何使用域中的元素作为初始键正确访问hiera中嵌套哈希中的键?

1 个答案:

答案 0 :(得分:0)

代码似乎已经正确。

我根据你的问题设置了这个:

1 /

# manifests/init.pp
class test (
  $certificates = hiera('test::install::certificates'), 
) {
  $domains = [
    'test1.domain.com',
    'test2.domain.com',
    'test3.domain.com',
  ]

  test::install { $domains:
    certificates =>  $certificates,
  }
}

2 /

# manifests/install.pp 
define test::install ($certificates) {
  $domain = $name
  $certificatefqdn = $certificates["$domain"]
  $certificatefile = $certificatefqdn['certificatefile']
  $certificatepass = $certificatefqdn['certificatepass']
  notify{"This is the certificate file: $certificatefile" :}
}

3 /

# spec/fixtures/hiera/data/common.yaml 
---
test::install::certificates:
  test1.domain.com:
    certificatefile: 'certificate1.crt'
    certificatepass: 'testpass1'
  test2.domain.com:
    certificatefile: 'certificate2.crt'
    certificatepass: 'testpass2'
  test3.domain.com:
    certificatefile: 'certificate3.crt'
    certificatepass: 'testpass3'

4 /

# spec/fixtures/hiera/hiera.yaml 
---
version: 5
defaults:
  datadir: data
  data_hash: yaml_data
hierarchy:
  - name: "All levels"
    paths:
    - common.yaml

编译并申请:

$ bundle exec puppet apply --modulepath spec/fixtures/modules --hiera_config spec/fixtures/hiera/hiera.yaml -e 'include test'
Warning: The function 'hiera' is deprecated in favor of using 'lookup'. See https://docs.puppet.com/puppet/5.3/reference/deprecated_language.html
   (file & line not available)
Notice: Compiled catalog for alexs-macbook-pro.local in environment production in 0.14 seconds
Notice: This is the certificate file: certificate1.crt
Notice: /Stage[main]/Test/Test::Install[test1.domain.com]/Notify[This is the certificate file: certificate1.crt]/message: defined 'message' as 'This is the certificate file: certificate1.crt'
Notice: This is the certificate file: certificate2.crt
Notice: /Stage[main]/Test/Test::Install[test2.domain.com]/Notify[This is the certificate file: certificate2.crt]/message: defined 'message' as 'This is the certificate file: certificate2.crt'
Notice: This is the certificate file: certificate3.crt
Notice: /Stage[main]/Test/Test::Install[test3.domain.com]/Notify[This is the certificate file: certificate3.crt]/message: defined 'message' as 'This is the certificate file: certificate3.crt'
Notice: Applied catalog in 0.04 seconds

所以我无法重现这一点。