前缀:我搜索了这个问题,但事实上有很多事情可能导致这个问题,所以我无法找到这个特殊情况的解决方案。
我有一个 Puppet Master(3.0.2-1;RHEL6),并且 /etc/puppet/manifests/site.pp 文件包含以下内容:
import 'nodes/nodes.pp'
$puppetserver = 'puppet.example.dom'
当然,服务器域名不是正在使用的,而是为了保护无辜者而被更改。
nodes/nodes.pp 文件包含:
node 'agent1.example.dom' {
include users,
}
用户类位于 /etc/puppet/modules/users 下。manifests/init.pp 文件包含:
class users {
group { 'admins':
ensure => 'present',
gid => '501',
}
user { 'user1':
ensure => 'present',
uid => '10000',
gid => '501',
home => '/home/user1',
password_max_age => '60',
password_min_age => '1',
shell => '/bin/bash',
}
}
如果我从 nodes.pp 文件中删除“包括用户”行,则目录将应用:
Info: Retrieving plugin
Info: Caching catalog for agent1.example.dom
Info: Applying configuration version '1357858753'
Notice: Finished catalog run in 0.02 seconds
但是,当我将其包含时出现以下错误:
[root@agent1 ~]# puppet agent --test --noop
Info: Retrieving plugin
Error: Could not retrieve catalog from remote server: Error 400 on SERVER: Could not
parse for environment production: Syntax error at '}' at
/etc/puppet/manifests/nodes/nodes.pp:3 on node agent1.example.dom
Warning: Not using cache on failed catalog
Error: Could not retrieve catalog; skipping run
这让我觉得 init.pp 文件中存在语法错误,但我不知道是什么错误。也许我没有正确配置它,或者我错误地链接了各个部分?
我尝试过在 nodes.pp 文件中不使用逗号,也尝试过使用逗号。我还尝试过在用户 init.pp 文件的最后一行不使用逗号,也尝试过使用逗号。我尝试过在组定义和用户定义之间使用一个空行。无论我做了什么微小的更改,我都会得到相同的结果。
我也尝试将节点定义直接放入 site.pp 文件中,但出现相同的错误。只是位置与之前不同(site.pp 与 nodes/nodes.pp)。
已经使用从 agent1 到 puppet master 上的端口 8140 的 telnet 验证了与服务器的连接。
有什么想法吗?代理也是 v3.0.2-1,但是是 RHEL5。我还没有测试过 RHEL6 代理。
编辑:我使用 --debug 选项运行了测试。输出如下:http://pastebin.com/zNs5DvCD
编辑 2:在尝试此操作之前,我没有声明类/模块。我在puppet apply /etc/puppet/modules/users/manifests/users.pp
更改文件名后声明了该类/模块。这现在给我以下错误:
[root@agent1 puppet]# puppet agent --test --noop
Info: Retrieving plugin
Error: Could not retrieve catalog from remote server: Error 400 on SERVER: Could not
find class users for agent1 on node agent1
Warning: Not using cache on failed catalog
Error: Could not retrieve catalog; skipping run
所以,有些事情发生了变化。语法错误消失了,但找不到该类。
答案1
我把它发布在http://ask.puppetlabs.com正如 Sirex 在聊天中所建议的。有人指出,我已将文件模块清单重命名为 users.pp,但根据 Puppet 内置的类和子类自动加载功能,它应该是 init.pp。
答案2
删除,
之后include users
- 那只是我能用眼睛看到的。
ensure => present
你也可以选择
尝试使用 puppet 解析器验证 .pp
尝试 puppet-lint
答案3
首先,您必须将该类重命名回 init.pp,否则 Puppet 将无法找到它。
其次,使用定义该类的文件运行 puppet apply没有什么。如果你想使用 puppet apply 来测试你的类,你可以把它放在 tests/init.pp 中
include users
然后,你可以使用以下命令测试该类:
puppet apply modules/users/tests/init.pp
第三,include 语句(nodes.pp)后面的 , 需要去掉。
亲切的问候,Ger。