我试图创建一个新的自定义类型/提供程序但不能确保。
我已经检查过exec和augeas类型,但是当我们没有定义可保护模式时,我无法清楚地弄清楚类型和提供者之间的整合是如何工作的。
类型:
Puppet::Type.newtype(:ptemplates) do
newparam(:name) do
desc ""
isnamevar
end
newproperty(:run) do
defaultto 'now'
# Actually execute the command.
def sync
provider.run
end
end
end
提供者:
require 'logger'
Puppet::Type.type(:ptemplates).provide(:ptemplates) do
desc ""
def run
log = Logger.new(STDOUT)
log.level = Logger::INFO
log.info("x.....................................")
end
但我不知道提供商为何被执行两次
root@puppet:/# puppet apply -e "ptemplates { '/tmp': }" --environment=production
Notice: Compiled catalog for puppet.localhost in environment production in 0.12 seconds
I, [2017-07-30T11:00:15.827103 #800] INFO -- : x.....................................
I, [2017-07-30T11:00:15.827492 #800] INFO -- : x.....................................
Notice: /Stage[main]/Main/Ptemplates[/tmp]/run: run changed 'true' to 'now'
Notice: Applied catalog in 4.84 seconds
另外,我必须定义 defaultto 来强制执行 provider.run 方法。
我错过了什么?
最诚挚的问候。
答案 0 :(得分:0)
首先,您应该花一些时间阅读此博客http://garylarizza.com/blog/2013/11/25/fun-with-providers/以及Gary Larizza的两篇博客。它为木偶类型/提供者提供了非常好的介绍。
您的日志正在执行两次,因为您在调用运行定义的类型中进行了def同步,其次是当puppet尝试确定运行属性的值时。
为了编写不可保证的类型/提供者,您需要执行以下操作:
<强>类型:强>
Puppet::Type.newtype(:ptemplates) do
@doc = ""
newparam(:name, :namevar => true) do
desc ""
end
newproperty(:run) do
desc ""
newvalues(:now, :notnow)
defaultto :now
end
end
<强>提供者:强>
Puppet::Type.type(:ptemplates).provide(:ruby) do
desc ""
def run
#Do something to determine if run value and is now or notnow and return it
end
def run= value
#Do something to set the value of run
end
end
请注意,所有类型提供程序必须能够确定属性的值并能够设置它。可保护类型和不可保证类型/提供者之间的区别在于可保证类型/证明者能够创建和销毁它,fx删除用户或添加用户。不可保证的类型/提供者无法创建和销毁属性,fx selinux,您可以设置其值,但不能删除selinux。