【问题标题】:Puppet - how to set up a conditional to check if a package is installed and in case of not installed, I need to skipped it?Puppet - 如何设置条件来检查是否安装了软件包,如果未安装,我需要跳过它?
【发布时间】:2021-09-28 09:02:20
【问题描述】:

抱歉,我是在 puppet 上开始我的 jorny 的,我正面临着使用该工具的第一个挑战。 我想检查 puppet 是否在服务器上安装了一个包,如果是,请保证它正在运行,如果没有安装,则跳到下一个任务。

class profile::windows::rapid7 {
 
  $manage_rapid7  = lookup('manage_rapid7',         Optional[Boolean], 'first', true)
  $rapid7_filepath = 'C:\Program Files\Rapid7\Insight Agent\ir_agent.exe'
 
  $rapid7_service_exists = find_file($rapid7_filepath)
 
  if $facts['kernel'] == 'Windows' {
 
    if $manage_rapid7 {
      if($rapid7_service_exists){
        service { 'ir_agent':
          ensure  => 'running',
          enable  => 'true',
        }
      }
    }
  }
}

正如你在上面看到的,如果安装了 rapid7,我会确定它正在运行,但现在我有一些服务器没有这个包,因此,我得到了错误。 所以我的问题是: 如果未安装此 pkg,是否可以跳过此任务?

最好的问候,

【问题讨论】:

  • 这不是声明性语言的工作方式。您将编写该类以安装软件包并启动服务,然后仅将该类应用于满足您希望在该节点上配置此软件的任何条件的节点。

标签: conditional-statements puppet


【解决方案1】:

我想检查 puppet 是否在服务器上安装了一个包,如果是,则保证它正在运行,如果没有安装,则跳到下一个任务。

最合适的方法是让 Puppet 根据节点身份知道是否应该安装包。这是node classification 的领域,一般通过node blocksexternal node classifier 和/或通过节点特定的external data 实现。使用这些工具,您将在目录构建期间通知 Puppet 是否应用管理相关服务的类,以及使用哪些类参数。在相同的基础上选择是否应用管理包本身的类是典型的。您可以在 the Forge 上找到许多这种方法的示例。

但您确实需要将有关节点当前状态的数据输入到目录构建过程中,服务的 Puppet 机制是facts。可以编写自定义或外部事实来测试软件包是否已安装。然后,您可以编写 Puppet 条件语句,以根据该事实的值影响节点目录的内容。但是请注意,这与运行前的节点状态有关,如果您希望 Puppet 管理包的安装状态,这也是多余的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    相关资源
    最近更新 更多