我已将我的 puppet (v3.6.2) 服务器 (RHEL 7.1) 重新配置为支持环境,如下所示。
/etc/puppet
puppet.conf
auth.conf
environments
Project_A
modules
manifests/site.pp
environment.conf
Project_B
modules
manifests/site.pp
environment.conf
environment.conf 文件包括
modulepath=/etc/puppet/environments/$environment/modules
manifest=/etc/puppet/environments/$environment/manifests/site.pp
每个环境的 site.pp 文件包含以下内容
include 'nodes.pp'
include 'selinux.pp'
include 'check_mode.pp'
$puppetserver=<SERVER>
Package {
allow_virtual=>true,
}
当我运行命令时在代理上
puppet agent --no-daemonize --trace --debug --noop --verbose
我得到了错误
错误:无法从远程服务器检索目录:服务器上出现错误 400:无法在 <'SERVER'> 上找到 <'SERVER'> 的类节点
在 /var/log/puppet/masterhttp.log 中我收到错误
[2015-09-09 15:43:12] <'IP'> - - [2015/09/09:15:43:12 AEST] “POST /Project_A/catalog/<'SERVER'> HTTP/1.1 400 21
每个代理的配置与 Puppet 具有单个环境时相同,但添加了“environment = 'PROJECT_A'”
如果我将 site.pp 中的 nodes.pp 从 include 更改为 import import 'nodes.pp' ,错误将更改为
错误:无法从远程服务器检索目录:服务器上出现错误 400:在 <'SERVER'> 上找不到 <'SERVER'> 的类 selinux.pp
当 puppet 为单一环境配置时,同样的结构可以正常工作。在单一环境下,所有内容都配置如下:
/etc/puppet
puppet.conf
auth.conf
environments
modules
manifests/site.pp
我怀疑我可能需要修改我的 auth.conf 文件,但不知道需要做哪些更改。目前该文件是默认配置。
我尝试过添加
path /environments
allow *
没有喜悦
并已添加到 fileserver.conf
path /etc/puppet/environments
allow *
再次没有喜悦。
记录中主 puppet.conf 文件是
[main]
logdir = /var/log/puppet
rundir = /var/run/puppet
ssldir = $vardir/ssl
always_cache_features = true
server = <'PUPPET SERVER'>
environmentpath = $confdir/environments
[master]
ca = true
dns_alt_names = <'SAN DNS ENTRIES'>
certname = <'PUPPET MASTER'>
ssl_client_header = SSL_CLIENT_S_DN
ssl_client_verify_header = SSL_CLIENT_VERIFY
environment = master
[agent]
classfile = $vardir/classes.txt
localconfig = $vardir/localconfig
environment = Project_A
代理使用相同的配置文件,但没有 [master]
谁能看到我的配置中哪里出错了?
更新:我已在调试模式下启动了 puppetmaster,并从代理尝试连接到服务器。在调试输出中,这让我怀疑它是 auth.conf
Notice: Starting Pppet master version 3.6.2
Debug: Routes Registered
Debug: Route /^\/v2\.0/
Debug: Route /.*/
Debug: Evaluating match for Route /^\/v2\.0/
Debug: Did not match path ("/Project_A/node/<SERVER A>")
Debug: Evaluating match for Route /.*/
Info: access[^/catalog/([^/]+)$]: allowing 'method' find
Info: access[^/catalog/([^/]+)$]: allowing $1 access
Info: access[^/node/([^/]+)$]: allowing 'method' find
Info: access[^/node/([^/]+)$]: allowing $1 access
Info: access[/certificate_revocation_list/ca]: allowing 'method' find
Info: access[/certificate_revocation_list/ca]: allowing * access
Info: access[/^/report/([^/]+)$]: allowing 'method' save
Info: access[/^/report/([^/]+)$]: allowing $1 access
Info: access[/file]: allowing * access
Info: access[/certificate/ca]: adding authentication any
Info: access[/certificate/ca]: adding 'method' find
Info: access[/certificate/ca]: adding * access
Info: access[/certificate/]: adding authentication any
Info: access[/certificate/]: adding 'method' find
Info: access[/certificate/]: adding * access
Info: access[/certificate_request]: adding authentication any
Info: access[/certificate_request]: adding 'method' find
Info: access[/certificate_request]: adding 'method' save
Info: access[/certificate_request]: adding * access
Info: access[/v2.0/environments]: adding 'method' find
Info: access[/v2.0/environments]: adding * access
Info: access[/]: adding authentication any
Info: Inserting dfault '/status' (auth true) ACL
Info: Caching node for <SERVER A>
Debug: Failed to load library 'msgpack' for feature 'msgpack'
Debug: Puppet::Network::Format [msgpack]: feature msgpack is missing
Debug: node supports formats: pson b64_zlib_yaml yaml raw
Debug: Routes Register:
Debug: Routes /^\/v2\.0/
Debug: Route /.*/
Debug: Evaluating match for Route /^\/v2\.0/
Debug: Did not match path ("/Project_A/file_metadatas/plugins")
Debug: Evaluating match for Route /.*/
更新:
我已经让它工作了。
在重新阅读了 puppetlabs 文档中的环境部分后,它指出必须有一个名为 production 的环境。因此我创建了
/etc/puppet/environments/production
| modules
| manifests
| environment.conf
虽然目录中目前没有文件,但其配置与其他环境相同。
代理人保持不变。
现在,当我运行代理时,它运行起来没有错误。唯一的问题是它正在从 puppet root /etc/puppet/modules 和 /etc/puppet/manifests 收集信息,并且如果主机未在 /etc/puppet/manifests/site.pp 中定义,则代理运行时不会执行任何操作。
在 puppetmaster 调试输出中,对主机的所有引用都定义为 Project_A,并且有日志条目
通知:在 0.00 秒内已在环境 Project_A 中编译 <'SERVER_A'> 的目录
来自代理商
Notice: /Stage/[main]/ntp::Config/File[/etc/ntp.conf]/content: content changed '{md5}<md5sum>' to '{md5}<md5sum>'
Info: /Stage/[main]/ntp::Config/File[/etc/ntp.conf]: Scheduling refresh of Service{ntpd}
总而言之。
客户端被识别为属于主服务器上的环境“Project_A”。尽管配置为使用“Project_A”environment.conf 文件中的路径 /etc/puppet/environments/$environment/{modules|manifests/site.pp}。
实际上使用的是 /etc/puppet/{modules|manifests/site.pp}
答案1
您是否检查过目录权限?Web 服务器可能无法访问目录。
答案2
感谢所有回答的人。
这个问题已经解决。
实施环境时适用以下规定
- 需要默认的生产环境(根据文档)
- 尽管它可能在 puppet.conf 中配置,但通过命令行测试时包括“--server <'SERVER'> 和 --environment <'ENVIRONMENT'>”
- 清除位于 /var/opt/lib/puppet/client_data/catalog/<'SERVER NAME'>.json 的缓存
在整个过程中,我都在观察奇怪的行为,但当删除缓存后,这些行为就消失了。