是否可以在自定义类型定义中使用自定义函数?

时间:2015-02-04 16:16:46

标签: puppet

我编写将定义新类型的模块。在newproperty定义里面我想使用自定义函数(也在这个模块中提供),它将使munge传递值:

功能

#lib/puppet/parser/functions/my_custom_function.rb
module Puppet::Parser::Functions
  newfunction(:my_custom_function, :type => :rvalue) do |args|
    ...
  end
end

类型

#lib/puppet/type/new_type.rb
Puppet::Type.newtype(:new_type) do
  newparam(:name) do
    munge do |value|
      my_custom_function(value)
    end
  end
end

但是当我尝试在上面的类型中使用函数时,我得到undefined local variable or method

我也无法访问自定义类型中的stdlib函数,但这些函数在清单文件中可用。

有人可以提供如何在类型定义中执行自定义函数的示例,尤其是在munge块中吗?

2 个答案:

答案 0 :(得分:1)

自定义函数是解析器函数,仅用于清单。

类型代码仅由代理使用,在初始化资源时不会加载解析器函数。

您必须复制您的代码。如果这不可行,您可能必须在自定义Ruby库中实现它,并在自定义函数和类型中使用它。在这种情况下,需要在主服务器和代理程序上安装库。

答案 1 :(得分:0)

您需要将自定义函数中的代码提取到一个单独的位置,然后从自定义函数和类型/提供程序中调用该共享代码。您需要将代码拉入单独的gem来执行此操作,将代码本地保存到模块中相当容易。

将您自己的Ruby类放在模块的lib/puppet/util/目录中。然后,您应该能够从自定义函数和类型/提供程序require 'puppet/util/my_class' {{1}}。您可以在我的模块jboss-puppet_admin中看到我如何完成此操作的示例。