我遇到虚拟资源和mysql_grant资源的问题。我有以下代码:
@mysql_grant { "foo@%/*.*":
user => "$user",
name => "$user/*.*",
table => '*.*',
privileges => ['ALL'],
options => ['GRANT'],
tag => 'admin',
}
Mysql_grant <| tag == 'admin' |> { user => "bar@%",}
用户变量的插值正确,但名称不是:
Error: Validation of Mysql_grant[foo@%/*.*] failed: name must match user and table parameters: $name = /*.* / $user = bar@% at /tmp/vagrant-puppet/manifests-0ad5afab2ae36c0b761cc49e6f9f9bf9/development.db_slave.pp:103
我添加了一些调试输出,$ name:&#34; /*.*"一个缺少$ user部分,但正如你可以看到$ user变量设置正确:$ user =&#34; bar @%&#34;。
你有什么建议吗?
答案 0 :(得分:0)
用户变量插值正确,但名称不是
我没有看到任何证据支持这种说法,但我确实看到了一些证据表明你有些误解。具体来说,你说:
我添加了一些调试输出,$ name:&#34; / 。&#34;一个缺少$ user部分,但正如你可以看到$ user变量设置正确:$ user =&#34; bar @%&#34;。
...但您提供的代码既没有定义也没有使用任何名为$user
的变量,虽然使用变量$name
,但它不会定义那个变量。假设Mysql_grant
是一个已定义的类型,这些变量存在于其定义的主体内,但这是一个完全独立的范围。我想你是否正在尝试编码一个规则,即资源的name
属性应该具有从其user
属性派生的值,但它只是不起作用那样。
以下是一些需要理解的关键事项:
资源声明(包括虚拟资源和导出资源)不会建立新的变量范围,也不会在资源声明中定义任何在该定义之外没有相同定义的变量。
资源声明(包括虚拟资源和导出资源)在它们出现的范围内进行全面评估,而不是声明资源实现/导入的范围(如果不同)。
因此,鉴于你的声明:
@mysql_grant { "foo@%/*.*":
user => "$user",
name => "$user/*.*",
# ...
}
您将资源Mysql_grant['foo@%/*.*']
声明为虚拟资源,其中user
和name
属性派生自周围范围内的变量$user
的值。您提供的错误消息表明$name
实际上未定义或在该范围内使用空值定义,这完全合理。
然后通过具有属性覆盖的收集器实现该资源:
Mysql_grant <| tag == 'admin' |> { user => "bar@%",}
你已经覆盖了属性&#34; user&#34;的声明值,但没有覆盖属性&#34; name&#34;的声明值。如果这些要求相互对应,那么这似乎不太可行,除非纯粹运气。
如果可以的话,最好先声明所需的user
和name
属性。如果必须对收集器执行覆盖,则必须单独覆盖要覆盖的每个属性。例如,
Mysql_grant <| tag == 'admin' |> {
user => "bar@%",
name => "bar@%/*.*",
}