环境配置导致的 Puppet HTTP 400 错误

环境配置导致的 Puppet HTTP 400 错误

我已将我的 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 的缓存

在整个过程中,我都在观察奇怪的行为,但当删除缓存后,这些行为就消失了。

相关内容