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

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

我无法弄清楚 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 应用运行不同?

  1. 站点清单可能位于您的 Puppet Master 上,但您在本地apply运行中未使用它们。这些清单可能直接或间接地通过hiera_include或类似方式包含该类。hiera_include如果适用,请检查任何站点清单和数据文件的使用情况。
  2. 可以在主节点上配置外部节点分类器,并附带要包含在节点上的类列表。

尝试向该类添加调试myclass以显示它从哪里被包含进来:

notice("myclass included by $caller_module_name")

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

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

相关内容