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ファイルをロードし、正しいハッシュオブジェクトを取得します。
誰か助けてもらえますか?
最後に、これは可変スコープの問題であることがわかりました。正しい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
}
}
ネストされたハッシュでも同じ問題に直面しました。 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