在 puppet 目录编译期间使事实可用

Make fact available during puppet catalog compilation

我在 puppet 中有两个 classes。

这是第一个:

class nagios::is_production {

  file { '/etc/puppetlabs/facter/':
    ensure  => directory,
  }
  file { '/etc/puppetlabs/facter/facts.d/':
    ensure => directory,
  }
  file { '/etc/puppetlabs/facter/facts.d/production.txt':
    ensure  =>  file,
    content =>  epp('nagios/production.epp')
  }

}

这将创建一个自定义事实(production=yes/no 基于节点名称) class 本身就正确地分配了事实。

第二个class:

class nagios::client {

  if $facts[production] =~ yes {
    @@nagios_host {"${::hostname}":
      ensure                => present,
      address               => $::ipaddress,
      hostgroups            => "production, all-servers",
      notifications_enabled => $notifications_enabled,
      use                   => 'generic-server',
    }
  } else {
    @@nagios_host {"${::hostname}":
      ensure                => present,
      address               => $::ipaddress,
      hostgroups            => "non-production, all-servers",
      notifications_enabled => $notifications_enabled,
      owner                 => root,
      use                   => 'generic-server',
    } 
  }
}

这将为主机创建导出资源并将其添加到 production/non-production 主机组。

如果存在自定义事实,则主机会正确创建主机组。

我创建了第 3 个 class 来引入这两个只是为了让我自己更容易跟踪它:

class nagios::agent {

  Class['nagios::is_production']->Class['nagios::client']

  include nagios::is_production
  include nagios::client

}

这似乎应该使 ::is_production 运行 在 ::client 之前。当我在人偶 运行 的节点上包含此 class 时,出现此错误:

Error: Could not retrieve catalog from remote server: Error 500 on SERVER: Server Error: Evaluation Error: Left match operand must result in a String value. Got an Undef Value. at /etc/puppetlabs/code/environments/production/modules/nagios/manifests/client.pp:3:6 on node

所以事实似乎是没有设置导致主机导出失败。

我错过了什么?

跟进回答

我正在尝试这样做: 如果域名包含 'something' 生产=是 别的 生产=否

然后在nagios模块中, 如果 $facts[production] =~ 是 分配给生产主机组。

Bash:

#!/bin/bash
if  [[ $(hostname) =~ '512' ]] ; then
echo production=yes
else
echo production=no
fi

我希望能够在这里使用 $facts[something] 来创建其他基于 OS 和 IP 之类的事实。

我在这里阅读:Custom Facts Walkthrough

但我无法理解自定义事实加载路径,因为我没有该目录。我对木偶很陌生...

也是堆栈溢出的新手...我做对了吗?

谢谢

事实是在 pluginsync 期间生成的。由于您试图在目录执行期间放置外部事实,因此它在目录编译期间不可用,这发生在 pluginsync 之后。

您需要删除您的 nagios::production class 并将您的外部事实直接放在模块中以利用 pluginsync。它应该位于您的模块结构中,如下所示:

nagios
|__facts.d
  |__production.txt

然后在 pluginsync 期间复制外部事实并生成事实。稍后在目录编译期间将可用。 Facter 会期望你的 production.txt 也是 key:value 对。

在此处查看有关正确使用外部事实的更多信息:https://docs.puppet.com/facter/3.5/custom_facts.html#external-facts