安装了Puppet 5,并且Puppet代理-t不应用更改,也没有错误

Sem*_*nie 3 puppet

我在主服务器和服务器上安装了puppet 5,并从代理安装了设置/签名证书...现在我想尝试运行一个简单的代理...

我遵循了也测试Hiera 5的人偶官方文档(下面的链接):https : //docs.puppet.com/puppet/5.0/hiera_quick.html

但是当我运行时,代理永远不会应用更改:

# puppet agent -t
Info: Using configured environment 'production'
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Caching catalog for xxxxxx.xxx.xxx
Info: Applying configuration version '1504530655'
Notice: Applied catalog in 0.04 seconds
Run Code Online (Sandbox Code Playgroud)

在主服务器上,当我运行puppet时,应用/[manifest-location]/manifest.pp可以正常工作。

我的主人puppet.conf:

[main]
   server = puppet-master-test.xxx.xxx
   dns_alt_names = puppet-master-test.xxx.xxxx
   certificate_revocation = false
   modulepath = /etc/puppetlabs/code/environments/production/modules

   [master]
   certname = puppet-master-test.xxx.xxx
   vardir = /opt/puppetlabs/server/data/puppetserver
   logdir = /var/log/puppetlabs/puppetserver
   rundir = /var/run/puppetlabs/puppetserver
   pidfile = /var/run/puppetlabs/puppetserver/puppetserver.pid
   codedir = /etc/puppetlabs/code
   environment_timeout = unlimited
Run Code Online (Sandbox Code Playgroud)

特工的puppet.conf:

[main]
    server = puppet-master-test.xxx.xxx

[master]
  certname = puppet-master-test.xxx.xxx

[agent]
        environment = production
        certname = puppet-client.xxx.xxx
        server = puppet-master-test.xxx.xxx
Run Code Online (Sandbox Code Playgroud)

有人可以建议吗?提前致谢。

编辑:

我创建了一个简单的模块:

#/etc/puppetlabs/code/environments/production/modules/profile/manifests/hiera_test.pp
class profile::test {
  file { '/tmp/hiera_test.txt':
    ensure  => file,
    owner   => root,
    mode => '0755',
  }
}
Run Code Online (Sandbox Code Playgroud)

init.pp:

#/etc/puppetlabs/code/environments/production/modules/profile/manifests/init.pp
include profile::test
Run Code Online (Sandbox Code Playgroud)

我在以下位置有一个site.pp:/etc/puppetlabs/code/environments/production/manifests/site.pp

node 'puppet-client.xxx.xxx' {
  include profile
}
Run Code Online (Sandbox Code Playgroud)

输出:

#puppet config print modulepath --section master --environment production
/etc/puppetlabs/code/environments/production/modules

#puppet config print manifest --section master --environment production
/etc/puppetlabs/code/environments/production/manifests/site.pp
Run Code Online (Sandbox Code Playgroud)

当我使用主人时:

#puppet apply /etc/puppetlabs/code/environments/production/modules/profile/manifests/init.pp
Notice: Compiled catalog for puppet-master-test.xxx.xxx in environment production in 0.07 seconds
Notice: /Stage[main]/Profile::Test/File[/tmp/hiera_test.txt]/ensure: created
Notice: Applied catalog in 0.11 seconds
Run Code Online (Sandbox Code Playgroud)

但是,puppet agent -t on agent不会在/ tmp下创建文件... / tmp权限为1777,能否让我知道是否需要更多信息?

谢谢。

Joh*_*ger 6

正如我从评论开头说的那样,如果在给定的目录运行中,代理未尝试将任何资源应用于目标计算机,并且未发出任何诊断,则说明目标计算机已经完全同步与目录一起送达它。该代理会缓存目录(详细信息取决于Puppet版本),因此您可以检查实际包含了哪些资源。有时困扰Puppet站点(尤其是新站点)的问题之一是,代理实际上收到了空目录。这通常归因于母版中设置的相关清单中的缺陷。

重要的是要理解,主服务器从站点清单开始为代理程序的环境构建目录(这不一定是这样puppet apply做的方式),并且只有通过该过程发现的为给定节点声明的类和资源,包含在其目录中。同样重要的是要了解代理和主服务器都执行各种形式的缓存-前者可以在主服务器不可用时强制执行配置,后者可以提高容量和性能。

假设站点清单中的节点块将与该代理程序配置为用作其证书名的标识符相同的标识符指定为节点名,则清单集(尽管确实存在缺陷)不应成功地为此生成空目录目标节点。您可以考虑在调试时通过添加或切换到默认节点块来取消使用节点名称:

node default {
  include profile
}
Run Code Online (Sandbox Code Playgroud)

由于将主服务器的环境缓存超时设置为无限制(默认值),因此,如果自启动主服务器以来已修改清单集,则服务器可能仍会提供空目录。您可以手动使主服务器过期,或者更容易地,您可以重新启动主服务器服务。如果愿意,还可以通过将缓存超时设置为0(然后重新启动服务)来禁用环境缓存。

至于清单集中的缺陷,至少存在三个关键问题:

  1. 木偶的include函数声明class。为此,它可能会导致清单文件被评估,但不应将其解释为对清单的词法内插álàC预处理程序#include指令。它更类似于Python的import命令。

  2. 在站点清单之外,清单中除了顶级类别的类或定义的类型定义外,不应该包含任何其他内容。它们尤其不应包含该范围内的类或资源声明;这些清单中的此类声明应仅出现在类或定义的类型定义的内部。声明可以出现在站点清单内的任何范围内,但在这种情况下,它们通常应出现在节点块中。

  3. 为了让Puppet查找类和定义的类型定义,它们必须驻留在正确定位的命名文件中

关于(1),您的站点清单包含一个执行的节点块include profile。这声明类“配置文件”应包含在目标节点的目录中,但不存在此类。Puppet将在其中查找类定义的清单的内容(production/modules/profile/manifests/init.pp)而是在顶级范围内包含类的声明profile::test(请参阅(2))。目录构建器应在缺少请求的类时进行故障转移。它没有这样做,这告诉我要么根本不查看您的节点块(也许节点名称不匹配),要么它正在使用不受该问题困扰的环境的缓存版本首先(但也不会导致包含想要的类)。

您似乎想要的modules/profile/manifests/init.pp

class profile {
  include profile::test
}
Run Code Online (Sandbox Code Playgroud)

请注意,该include语句出现在类'profile'的定义内,该类又是Puppet将在该特定文件中查找的类的名称。这与直接使用来应用此清单所需的内容有所不同puppet apply

或者,您可以完全跳过此简单的“ profile”类,而只是让节点块直接声明“ profile :: test”,尽管有些人可能会基于风格批评这种方法。

但这还不是全部。您确实提供了class的可行定义profile::test,但您将其描述在名称不对应的文件中。木偶找不到它production/modules/profile/manifests/hiera_test.pp; 它需要production/modules/profile/manifests/test.pp改为(3)。