Puppet模块的问题只包括一个子类,这似乎是在隐式包含父类

我无法弄清楚Puppet如何inheritance和自动包含模块。

我有一个Puppet类,当我testing“本地”,但当我通过Puppet服务器将其推送到我的节点失败时,按预期工作。

“本地”意味着通过puppet apply运行并发送正确的本地模块path。

这是一个类的例子,发生了什么。 我试图把这个问题解决到产生这个问题的最less的事情,但是我承认我并不积极地认为我可以省略一些重要的东西。

我想要实现的是为现有模块编写新组件,而不会破坏已经包含旧模块的节点的向后兼容性。 我正在将一个写得不好的模块迁移到一个更合适的写法,我想分阶段推出它,而不会破坏现有的安装。

我的节点声明如下:

 node /myserver.*/ { include myclass::server } 

清单声明如下:

 # File "myclass/manifests/init.pp" class myclass { file { '/etc/oldconfig.conf': ensure => file, owner => root, group => root, mode => '0644', source => 'puppet:///files/oldconfig.conf', } } # File "myclass/manifests/server.pp" class myclass::server { include myclass::next } # File "myclass/manifests/next.pp" class myclass::next { # Remove clutter file { '/etc/oldconfig.conf': ensure => absent } ... more stuff, not relevant ... } 

综上所述,原始的init.pp包含一个“oldconfig.conf”文件。 新的模块类,“下一个”, 删除这个文件。

当我使用“puppet apply”(即本地)运行模块时,我不会遇到任何冲突,运行以零退出状态结束。

但是当我在真正的节点上运行puppet agent -t ,这是从puppet服务器拉出清单时,我得到以下结果:

 Error: Could not retrieve catalog from remote server: Error 400 on SERVER: Duplicate declaration: File[/etc/oldconfig.conf] is already declared in file /etc/puppet/environments/common/myclass/manifests/init.pp:48; cannot redeclare at /etc/puppet/environments/common/myclass/manifests/next.pp:4 on node mynode01.example.com 

是否有某种木偶清单inheritance和/或自动包含发生在与当地puppet apply运行不同的puppet apply大师的运行?

如果我在Puppet清单的节点声明中include myclass::my_subclass子类(例如, include myclass::my_subclass ,我应该期望子类总是引用父类吗? 我不记得在这个例子之前看到这个行为,我也找不到明确的文件回答这个问题。 (虽然这对Google很难)

我无法弄清楚Puppet如何inheritance和自动包含模块。

在你的例子中没有inheritance,子类或父类,我不认为这是。 命名与inheritance是分开的,它不应该暗示父类包含在目录中。

是否有某种木偶清单inheritance和/或自动包含发生在与当地木偶应用运行不同的木偶大师的运行?

  1. 站点清单可能在您的Puppet主站上,而不是在您的本地apply运行中使用。 这些可能包括直接的类,或通过hiera_include或类似的间接。 检查任何网站清单和使用hiera_include和您的数据文件(如果适用)。
  2. 外部节点分类器可以在主节点上configuration,包含在节点上的类列表。

尝试添加debugging到myclass类,以显示它包含在哪里:

 notice("myclass included by $caller_module_name") 

https://docs.puppet.com/puppet/latest/reference/lang_facts_and_builtin_vars.html#compiler-variables

如果包含在ENC中,这可能不会显示任何内容。