根据puppet中的条件执行类

时间:2017-04-20 08:57:31

标签: puppet

我想只在没有特定的rpm版本时才执行某些类。

例如:

class base{
  if specified_rpm_absent {
    include base::class1
    include base::class2
  }
  else {
    notify {"Already there":}
  }
}

1 个答案:

答案 0 :(得分:2)

你可以做的是定义一个custom fact,根据RPM的存在与否,返回true或false,然后在条件逻辑中使用它,即

事实代码:

Facter.add(:specified_rpm_absent) do
  setcode do
    # Some Ruby code to return true or false depending on RPM package
    # Facter::Core::Execution.exec() can be used to execute a shell
    # command.
  end
end

Puppet 4

class base {
  if $facts['specified_rpm_absent'] {
    include base::class1
    include base::class2
  }
  else {
    notify {"Already there":}
  }
}

Puppet 3

class base {
  if $::specified_rpm_absent {
    include base::class1
    include base::class2
  }
  else {
    notify {"Already there":}
  }
}

OP在下面论述,最好在这里使用木偶函数,函数也允许参数。

问题在于Functions execute on the Puppet master. They do not execute on the Puppet agent. Hence they only have access to the commands and data available on the Puppet master host

如果使用了Masterup Puppet,Puppet不支持,可以使用函数来实现此目的,Jussi Heinonen的书“Learning Puppet(2015)”中描述了这个用例。

出于以下几个原因,我不推荐这种方法:

  • Puppet不支持它,因此不能保证未来版本的Puppet不会使这个变得不可能。
  • 代码不可移植。也就是说,代码无法在Puppet Forge上共享,也无法迁移到传统的Master / Puppet设置。
  • 这不是惯用的,会让知道Puppet的人感到困惑,即违反了Principle of Least Astonishment

最后,应该指出的是,设计中可能存在一些更根本的错误,这些设计涉及根据是否安装了RPM来做出决策。为什么Puppet不知道RPM是否已安装?