我编写了一个自定义 puppet 函数,它运行良好,依赖于 cloudservers gem(Rackspace 客户端库)。如果我在运行 puppet 之前在服务器上预先安装了 gem,那么这很好,但如果我没有安装 gem,那么就会完全崩溃,因为该函数似乎在“编译”扫描期间运行,远在我的包定义实现之前。这是我的 .pp 的样子,get_hosts 是需要 cloudservers gem 的函数。
package { "rubygems":
ensure => installed,
provider => "gem";
}
package { "cloudservers":
ensure => installed,
provider => "gem",
require => Package["rubygems"];
}
class hosts::us {
$hosts = get_hosts("us")
hostentry { $hosts: }
}
define hostentry() {
$parts = split($name, ',')
$address = $parts[0]
$ip = $parts[1]
$aliases = $parts[2]
host{ $address: ip => $ip, host_aliases => $aliases }
}
有没有办法阻止函数过早运行,或者至少让它的运行依赖于正在安装的库。或者,有没有办法在函数文件夹中的某个位置添加可供函数使用的依赖项?
答案1
您所能做的就是将 包装require
在一个rescue LoadError
块中,该块返回一个空列表或任何简单的、不会引起错误的返回值。这必须在您的函数内部完成,因为函数所在的文件只会加载一次,但函数内部的代码将在每次调用该函数时运行。