Puppet:组织模块依赖关系(如果包存在则复制文件)

Puppet:组织模块依赖关系(如果包存在则复制文件)
  • 我有一些服务器(www 等)
  • 我有一个监控系统
  • 如果一台机器需要由 apache 监控,则需要安装一些文件。

所以我有一个apache模块(用于安装 Apache),我正在编写一个monitoring模块。该monitoring模块将复制所需的文件,仅有的如果安装了 apache 包(或者定义了 apache 模块,或类似情况)。mysql 包等也一样。

上述设计是个好主意吗?这种依赖关系的最佳方法是什么?

答案1

在 extdata 中,创建一个变量来定义是否需要监控服务器。以下是默认启用监控和针对特定服务器禁用监控的示例。

扩展数据/common.csv

use_monitoring,true

extdata/ephemeral.example.com.csv

use_monitoring,false

在每个服务的类中,查找是否启用了监控。如果启用了,请包含负责监控该服务的类。这可能看起来像

class apache {

  # Manage your apache setup here

  if extlookup("use_monitoring") == 'true' {
    include monitoring::apache
  }

}

class monitoring::apache {
  # Manage your apache monitoring setup here
}

更新:当我第一次看到你的问题时,我以为你是在问如何启用对部分 Apache 服务器(但不是全部)的监控。如果你想监控所有服务器,你甚至不需要使用 extlookup。只需将你的监控类拆分为特定于服务的类,并将它们包含在服务的类中。

答案2

在您的 apache 类中,您可以定义一个变量,并在测试中使用该变量来查看是否应该提供监控文件。

class apache {
  $apacheconfigured = true;
}

class monitor {
  if $apache::apacheconfigured {
    file {'blah': ... }
  }
}

答案3

您需要虚拟资源或者定制事实。如果一个主机的配置会改变另一个主机的配置,那么你需要出口资源。事实上,这些东西我都有。以下是一些示例。

虚拟资源

在监控类上:

@file { '/path/to/apache/monitoring/conf': 
    ensure => file,
    source => 'puppet:///modules/monitoring/apache.conf',
    tag    => 'apache-extras',
}

在 Apache 类上:

File <| tag == 'apache-extras' |>
Exec <| tag == 'apache-extras' |>
etc...

定制事实

声明这样的事实,并将其放在适当的位置(参见上面的链接):

# apache2.rb
Facter.add("apache2") do
        setcode do
                %x{/usr/bin/test -x /etc/init.d/apache2 && /bin/echo yes || /bin/echo no}.chomp
        end
end

在监控类中,使用:

if $apache2 == 'yes'   {
   # include configuration for apache
}

导出资源

关于Apache类,在Apache服务器中包含:

@@exec { "config-web $fqdn": 
            tag => "monitoring-server", 
    }

在监控类上,包括在监控服务器中:

<<| tag == 'monitoring-server' |>>

答案4

为什么不只require => Package['apache']在监控模块中关注资源?如果节点中添加了apachemonitoring,则依赖 apache 的文件将被安装(前提是安装成功)。如果没有(例如包安装失败,或者 apache 模块未添加到节点,监控类将失败)。

或者,如果您不想让它失败,您可以使用类似下面的方法:

if defined(Package['apacge']) {
    file {...}
    <and so on>
}

相关内容