Puppet 3.8.# inline_template 无法获取 hieradata
Puppet 3.8.# inline_template fails to pickup hieradata
我正在创建一个人偶模块。我的 puppet 版本是 3.8.7,升级是不可能的。我的 hieradata 和 init.pp 文件的相关内容复制在下面以供参考。
---------Hiera Data---------
my_hieradata:
blue: http://foobar.com
red: http://barfoo.com
----------------------------
---------My_init.pp---------
$my_hieradata= hiera('my_hieradata')
.
.
if $my_hieradata{ $my_site = inline_template('<% if @my_hieradata-%><% @my_hieradata.each do |key, value| -%><%= key %>,<% end -%><% end -%>')
$my_array = split($my_site,',')
mymodule::my.log { $my_array:;
}
.
.
.
define mymodule::my_log {
file { '/foo/bar/log/${name}.log':
ensure => 'file',
mode => '0644',
owner => 'zeus',
group => 'zeus',
}
}
----------------------------
我希望这会根据我的 hieradata 生成两个文件
/foo/bar/log/blue.log
/foo/bar/log/red.log
然而当我做人偶时 运行 它失败并出现以下错误。
Error: Could not retrieve catalog from remote server: Error 400 on SERVER: Duplicate declaration: File[/foo/bar/log/${name}.log] is already declared in file /etc/puppet/modules/mymodule/manifests/init.pp:100; cannot redeclare at /etc/puppet/modules/mymodule/manifests/init.pp:100 on node cc1.prodops.tllsc.net
Warning: Not using cache on failed catalog
从错误中我可以看出变量 ${name} 无法从 hieradata 中获取值。它将 varibale 视为字符串并按原样打印。请这里的专家帮助我为什么varibale没有从hiera中获取价值。
主要问题是您使用的是文字字符串(单引号)作为文件标题 object,而不是内插字符串(双引号)。将您的文件 object 更新为以下内容,我认为它应该可以工作
define mymodule::my_log {
file { "/foo/bar/log/${name}.log":
ensure => 'file',
mode => '0644',
owner => 'zeus',
group => 'zeus',
}
}
然而,正如 Matt Schuchard 提到的,如果您有未来的解析器,您可以使用键函数并将代码简化为
my_hieradata:
blue: http://foobar.com
red: http://barfoo.com
define mymodule::my_log {
file { "/tmp/${name}.log":
ensure => 'file',
mode => '0644',
}
}
$my_hieradata = hiera('my_hieradata')
mymodule::my_log{$my_hieradata.keys(): }
我正在创建一个人偶模块。我的 puppet 版本是 3.8.7,升级是不可能的。我的 hieradata 和 init.pp 文件的相关内容复制在下面以供参考。
---------Hiera Data---------
my_hieradata:
blue: http://foobar.com
red: http://barfoo.com
----------------------------
---------My_init.pp---------
$my_hieradata= hiera('my_hieradata')
.
.
if $my_hieradata{ $my_site = inline_template('<% if @my_hieradata-%><% @my_hieradata.each do |key, value| -%><%= key %>,<% end -%><% end -%>')
$my_array = split($my_site,',')
mymodule::my.log { $my_array:;
}
.
.
.
define mymodule::my_log {
file { '/foo/bar/log/${name}.log':
ensure => 'file',
mode => '0644',
owner => 'zeus',
group => 'zeus',
}
}
----------------------------
我希望这会根据我的 hieradata 生成两个文件
/foo/bar/log/blue.log
/foo/bar/log/red.log
然而当我做人偶时 运行 它失败并出现以下错误。
Error: Could not retrieve catalog from remote server: Error 400 on SERVER: Duplicate declaration: File[/foo/bar/log/${name}.log] is already declared in file /etc/puppet/modules/mymodule/manifests/init.pp:100; cannot redeclare at /etc/puppet/modules/mymodule/manifests/init.pp:100 on node cc1.prodops.tllsc.net
Warning: Not using cache on failed catalog
从错误中我可以看出变量 ${name} 无法从 hieradata 中获取值。它将 varibale 视为字符串并按原样打印。请这里的专家帮助我为什么varibale没有从hiera中获取价值。
主要问题是您使用的是文字字符串(单引号)作为文件标题 object,而不是内插字符串(双引号)。将您的文件 object 更新为以下内容,我认为它应该可以工作
define mymodule::my_log {
file { "/foo/bar/log/${name}.log":
ensure => 'file',
mode => '0644',
owner => 'zeus',
group => 'zeus',
}
}
然而,正如 Matt Schuchard 提到的,如果您有未来的解析器,您可以使用键函数并将代码简化为
my_hieradata:
blue: http://foobar.com
red: http://barfoo.com
define mymodule::my_log {
file { "/tmp/${name}.log":
ensure => 'file',
mode => '0644',
}
}
$my_hieradata = hiera('my_hieradata')
mymodule::my_log{$my_hieradata.keys(): }