web-dev-qa-db-ja.com

Puppet&Hiera:$ variableはアクセス時にハッシュまたは配列ではありません

Puppet 3.2.2とHiera 1.2.1を使用していました。そして私はパペットモジュールを書きました、そして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:}
}

そして、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"

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

そうみたいです $common_instancesは正しく取得できますが、$commono_instanceconfigは常に文字列として扱われます。

YAML.load_file hieradataファイルをロードし、正しいハッシュオブジェクトを取得します。

誰か助けてもらえますか?

6
txworking

最後に、これは可変スコープの問題であることがわかりました。正しい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
  }

}
3
txworking

ネストされたハッシュでも同じ問題に直面しました。 nginx vhostsを作成するコードを作成する必要がありました。これは私のYAMLファイルです

vhost_array:
 - Host1
 - Host2

vhost_hash:
  Host1:
        hostname: "one"
        docroot: "england"
        php_fpm: 2097
        db_name: "noidea"
        db_passwd: "sheeit"

  Host2:
        hostname: "two"
        docroot: "nagaland"
        php_fpm: 3000
        db_name: "awesm"
        db_passwd: "pisss"

そして、これは私のマニフェストです

$vhost_array = hiera_array("vhost_array")

define hash_extract(){
                $vhost_hash = hiera_hash("vhost_hash")
                $vhost = $vhost_hash[$name]     ## TRICK lies in $name variable
                notice($vhost['hostname'])
                notice($vhost['docroot'])
                notice($vhost['php_fpm'])
                notice($vhost['db_name'])
                notice($vhost['db_passwd'])
}

hash_extract{$vhost_array:}

$ nameは配列から値を取得する変数であり、それらの値はハッシュへのアクセスに使用されています。$ name変数の詳細については、こちらをご覧ください http://docs.puppetlabs.com/puppet/2.7/ reference/lang_defined_types.html

4
EquinoX