Puppet:虚拟资源和mysql_grant

时间:2016-10-26 07:49:21

标签: puppet

我遇到虚拟资源和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;。

你有什么建议吗?

1 个答案:

答案 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@%/*.*']声明为虚拟资源,其中username属性派生自周围范围内的变量$user的值。您提供的错误消息表明$name实际上未定义或在该范围内使用空值定义,这完全合理。

然后通过具有属性覆盖的收集器实现该资源:

Mysql_grant <| tag == 'admin' |> { user => "bar@%",}

你已经覆盖了属性&#34; user&#34;的声明值,但没有覆盖属性&#34; name&#34;的声明值。如果这些要求相互对应,那么这似乎不太可行,除非纯粹运气。

如果可以的话,最好先声明所需的username属性。如果必须对收集器执行覆盖,则必须单独覆盖要覆盖的每个属性。例如,

Mysql_grant <| tag == 'admin' |> {
  user => "bar@%",
  name => "bar@%/*.*",
}