安装了 Puppet 5,并且 puppet agent -t 不应用更改并且没有错误

Installed Puppet 5, and puppet agent -t doesn't apply changes and no errors

我在主服务器和服务器上安装了 puppet 5 并 setup/signed 来自代理的证书...现在我想尝试一个简单的代理 运行...

我也遵循了测试 Hiera 5 的 puppet 官方文档(link): 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

当我 运行 puppet 应用 /[manifest-location]/manifest.pp 时在 master 上工作正常。

我的主人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

代理的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

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

编辑:

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

#/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',
  }
}

init.pp:

#/etc/puppetlabs/code/environments/production/modules/profile/manifests/init.pp
include profile::test

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

node 'puppet-client.xxx.xxx' {
  include profile
}

输出:

#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

我用的时候在master上:

#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

但是,puppet agent -t on agent 不会在 /tmp 下创建文件.../tmp 权限为 1777,如果您需要更多信息,可以告诉我吗?

谢谢。

正如我在评论开头所说的那样,如果在给定的目录 运行 上,代理不尝试将任何资源应用于目标机器并且不发出任何诊断信息,那么它将遵循目标机器已经与提供给它的目录完全同步。代理缓存目录(详细信息取决于 Puppet 版本),因此您可以检查实际包含哪些资源。有时困扰 Puppet 站点(尤其是新站点)的问题之一是代理实际上收到空目录。这通常是由于 master 的相关清单集存在缺陷。

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

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

node default {
  include profile
}

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

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

  1. Puppet 的 include 函数 声明 classes。为了支持这一点,它可能会导致评估清单文件,但不应将其解释为执行清单的词法插值 là C 预处理器的 #include 指令。它更类似于 Python 的 import 命令。

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

  3. 要让 Puppet 找到 class 和定义的类型定义,它们必须位于 a correctly located and named file 中。

关于 (1),您的站点清单包含执行 include profile 的节点块。这声明 class 'profile' 应该包含在目标节点的目录中,但不存在这样的 class。 Puppet 将在其中查找 class 定义 (production/modules/profile/manifests/init.pp) 的清单内容包含 class profile::test 声明 顶级范围(见(2))。目录构建器应该在缺少请求 class 的情况下进行故障转移。它没有这样做告诉我它根本没有查看您的节点块(可能节点名称不匹配),或者它正在使用不会遇到该问题的缓存版本的环境首先(但也不会导致包含想要的 class)。

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

class profile {
  include profile::test
}

请注意,include 语句出现在 class 'profile' 的定义中,它又是 Puppet 将在其中查找的 class 的名称特定文件。这与您希望直接使用 puppet apply.

应用此清单的方式不同

或者,您可以完全跳过这个简单的 'profile' class,只让节点块直接声明 'profile::test',尽管有些人可能会从风格上批评这种方法。

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