我无法弄清楚 Puppet 如何实现模块的继承和自动包含。
我有一个 Puppet 类,当我在“本地”测试它时它按预期工作,但是当我通过 Puppet 服务器将它推送到我的节点时它失败了。
“本地”表示通过正确的本地模块路径运行puppet apply
并发送。
以下是类及其发生情况的示例。我试图将其精简到产生此问题的最少数量,但我承认我不确定我是否会遗漏一些重要的东西。
我想要实现的目标是为现有模块编写新组件,同时不破坏已包含旧模块的节点的向后兼容性。我正在将编写不当的模块迁移到更合适的模块,并且希望分阶段推出它,而不会破坏现有安装。
我的节点声明如下:
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”。新的模块类“next”,删除这个文件。
当我使用“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
在 Puppetmaster 运行时是否存在某种与本地puppet apply
运行不同的 Puppet 清单继承和/或自动包含?
如果我包括只是例如,include myclass::my_subclass
在 Puppet 清单的节点声明中,子类是否应该始终引用父类?我不记得在此示例之前看到过这种行为,而且我也找不到回答此问题的明确文档。(不过,用 Google 搜索这个有点困难)
答案1
我无法弄清楚 Puppet 如何实现模块的继承和自动包含。
您的示例中没有继承、子类或父类,我认为不是那样。命名与继承无关,它不应该暗示父类包含在目录中。
在 Puppetmaster 运行时是否存在某种 Puppet 清单继承和/或自动包含,与本地 Puppet 应用运行不同?
- 站点清单可能位于您的 Puppet Master 上,但您在本地
apply
运行中未使用它们。这些清单可能直接或间接地通过hiera_include
或类似方式包含该类。hiera_include
如果适用,请检查任何站点清单和数据文件的使用情况。 - 可以在主节点上配置外部节点分类器,并附带要包含在节点上的类列表。
尝试向该类添加调试myclass
以显示它从哪里被包含进来:
notice("myclass included by $caller_module_name")
(https://docs.puppet.com/puppet/latest/reference/lang_facts_and_builtin_vars.html#compiler-variables)
如果包含 ENC,则可能不会显示任何内容。