根据puppet中的条件执行类

根据puppet中的条件执行类,puppet,Puppet,我只想在没有特定rpm版本的情况下执行一些类 例如: class base{ if specified_rpm_absent { include base::class1 include base::class2 } else { notify {"Already there":} } } 您可以做的是定义一个根据RPM的存在或不存在返回true或false的值,然后在条件逻辑中使用它,即 事实代码: Facter.add(:specified_rpm_

我只想在没有特定rpm版本的情况下执行一些类

例如:

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

您可以做的是定义一个根据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
傀儡4

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

class base {
  if $::specified_rpm_absent {
    include base::class1
    include base::class2
  }
  else {
    notify {"Already there":}
  }
}
OP在下面指出,这里最好使用puppet函数,函数也允许参数

问题是

但是,如果使用不受Puppet支持的无主人木偶,则可以使用函数实现此目的,Jussi Heinonen的书《学习木偶》(2015)中描述了此用例

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

  • 它不受Puppet的支持,因此不能保证未来版本的Puppet不会使这成为不可能
  • 代码将不可移植。也就是说,代码不能在Puppet Forge上共享,也不能迁移到传统的主/伪设置
  • 它不是惯用语,会使认识木偶的人感到困惑,即违反了法律

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

您所能做的是定义一个根据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
傀儡4

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

class base {
  if $::specified_rpm_absent {
    include base::class1
    include base::class2
  }
  else {
    notify {"Already there":}
  }
}
OP在下面指出,这里最好使用puppet函数,函数也允许参数

问题是

但是,如果使用不受Puppet支持的无主人木偶,则可以使用函数实现此目的,Jussi Heinonen的书《学习木偶》(2015)中描述了此用例

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

  • 它不受Puppet的支持,因此不能保证未来版本的Puppet不会使这成为不可能
  • 代码将不可移植。也就是说,代码不能在Puppet Forge上共享,也不能迁移到传统的主/伪设置
  • 它不是惯用语,会使认识木偶的人感到困惑,即违反了法律

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

任何其他不需要自定义事实的解决方案?如果您的需求是仅在缺少特定rpm版本时执行类,那么这通常可以使用自定义事实来实现。我想不出任何其他方法可以做到这一点。@Alexarey我们可以将参数传递给外部事实吗?不,但是如果你在Puppet 4中,你可以有结构化的事实,例如,你可以让事实返回一个查找表。请注意,如果您需要根据已安装的RPM.Bro版本做出决策,我怀疑有更根本的错误。我写了一个木偶函数。那容易多了。它也接受参数,任何其他不需要自定义事实的解决方案?如果您的需求是仅在缺少特定rpm版本时执行类,那么这通常可以使用自定义事实来实现。我想不出任何其他方法可以做到这一点。@Alexarey我们可以将参数传递给外部事实吗?不,但是如果你在Puppet 4中,你可以有结构化的事实,例如,你可以让事实返回一个查找表。请注意,如果您需要根据已安装的RPM.Bro版本做出决策,我怀疑有更根本的错误。我写了一个木偶函数。那容易多了。它也接受论点,