在 Puppet 应用期间找不到 class

Can not find class during Puppet apply

我的人偶结构如下

/puppet
    /manifests
        /nodes
            redis.pp
        site.pp
    /modules

site.pp 类似于

class base {
  include ml-basefw
  include ml-users
  include ml-filelimits
  include repoforge
  include epel

class { 'ml-yumrepo':
  base_url => "http://${puppet_server}/yumrepo"
 }
}
import 'nodes/*.pp'

node default {
   include base
}

当我运行

puppet apply  --modulepath=/puppet/modules:/puppet/manifests --noop --debug /puppet/manifests/nodes/redis.pp

我收到

Error: Could not find class base for redis-1.test.ml.com on node redis-1.test.ml.com

是否有关于我的文件布局的非标准内容阻止我使用应用程序?

我不是人偶模块的维护者,所以我无法更改文件结构或布局。

有很多相关问题,但我无法将它们与我遇到的问题联系起来。

编辑 1:添加 redis.pp

node /^redis-\d+(.stage)?(.test)?(.aws)?.ml.com$/ {
include base
include epel

class { 'redis':
package_ensure => '2.8.15-1.el6.remi',
service_ensure => 'running',
conf_bind => '0.0.0.0',
conf_port => '6379',
}

firewall { '176 allow port 6379 for redis traffic':
chain => 'INPUT',
state => ['NEW'],
dport => '6379',
proto => 'tcp',
action => 'accept'
 }
}

当您 运行 puppet 改为针对您的 site.pp 文件应用时会发生什么?您的 redis.pp 文件中可能没有节点定义(也不应该)。

这确实看起来有点混乱和令人费解。

你想要的是

  • 一个实际的 base 模块
  • /puppet/modules/base/manifests/init.pp
  • 中定义 class base

您还应该通过更好地安排清单来放松 import 声明。如果您的 Puppet 版本足够新(我认为 3.6+),只需查看 the docs.

首先,puppet 有入口清单文件。 在主模式下,条目是 site.pp 并且 puppet deprated 从 3.5 版本开始弃用它,它开始自动导入指定目录中的所有清单文件。 在应用模式下,条目是您命令中指定的文件。

因此它在您的生产环境中运行良好,puppet master 读取 site.pp(包含 class 基础)并导入节点/*.pp(redis.pp,包含节点定义)。但是当你使用 "puppet apply /puppet/manifests/nodes/redis.pp" 时,puppet 只是读取 redis.pp,没有人告诉 puppet 基础 class 在哪里。