我有一个Puppet自定义函数,它返回有关在OpenStack的Keystone身份服务中定义的用户的信息。用法类似于:
$tenant_id = lookup_tenant_by_name($username, $password, "mytenant")
问题是此查询中使用的凭据($username
)应该在Puppet运行期间由另一个资源创建(来自puppet-keystone的Keystone_user
资源)。据我所知,在发生任何资源排序之前,正在评估对lookup_tenant_by_name
函数的调用,因为调用代码中的任何依赖项都不能强制在执行此函数之前创建凭据
通常,可以编写自定义函数 - 或者将它们正确地放在清单中 - 这样在实例化某些指定资源之前它们才会被Puppet执行?
答案 0 :(得分:5)
简短回答:您无法使清单的行为取决于其中声明的资源。
长答案:在编译阶段调用解析器函数(如果使用,则在主服务器上调用;如果使用puppet apply
,则调用代理程序)。在任何情况下都不能在任何资源同步之前运行,因为这将在编译器完成所有工作(包括调用函数)之后发生。
要查询代理计算机中的信息,通常需要使用custom facts。不过,即使编译器运行,这些也会被填充。
在这种情况下,最好的方法可能是让清单容忍信息的缺失,这样只有在lookup_tenant_by_name
函数返回的值时,才会评估任何依赖于if $tenant_id == "" {
notify { "cannot yet find tenant $username": }
}
else {
# your code using the tenant ID
}
函数返回值的内容。这通常是在第二次Puppet运行期间。
{{1}}