Puppet:制作自定义函数取决于资源

lar*_*sks 2 ruby dependencies puppet

我有一个Puppet自定义函数,它返回有关在OpenStack的Keystone身份服务中定义的用户的信息.用法是这样的:

$tenant_id = lookup_tenant_by_name($username, $password, "mytenant")
Run Code Online (Sandbox Code Playgroud)

问题是此查询($username)中使用的凭据应该在Puppet运行期间由另一个资源创建(Keystone_user来自puppet-keystone的资源).据我所知,在lookup_tenant_by_name发生任何资源排序之前,正在评估对函数的调用,因为调用代码中的任何依赖项都不能强制在执行此函数之前创建凭据.

通常,可以编写自定义函数 - 或者将它们适当地放在清单中 - 以便在实例化某些指定资源之后它们不会被Puppet执行?

Fel*_*ank 5

简短回答:你不能让你的清单的行为取决于它内部声明的资源.

答案长:在编译阶段调用解析器函数(如果使用一个,则在主服务器上调用,如果使用,则调用代理puppet apply).在任何情况下它都不能在任何资源同步之前运行,因为这将在编译器完成所有工作(包括调用函数)之后发生.

要从代理计算机查询信息,通常需要使用自定义事实.尽管如此,即使编译器运行,也会填充这些内容.

在这种情况下,最好的方法可能是使清单容忍缺少信息,以便lookup_tenant_by_name只有在该值可用时才会评估依赖于函数返回值的任何内容.这通常是在第二次Puppet运行期间.

if $tenant_id == "" {
  notify { "cannot yet find tenant $username": }
}
else {
  # your code using the tenant ID
}
Run Code Online (Sandbox Code Playgroud)