自定义类型/提供程序无法保证

时间:2017-07-30 11:06:38

标签: puppet

我试图创建一个新的自定义类型/提供程序但不能确保。

我已经检查过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 方法。

我错过了什么?

最诚挚的问候。

1 个答案:

答案 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。