Puppet:编写一个 repo 资源,但将其包含在多个地方而不会重复

Puppet: write a repo resource but include it in multiple places without duplication

我正在为我的应用程序编写一个 puppet 模块,几天后我一直在研究如何管理 repo。

我有puppet 4.10,所有节点都是Centos 7

我的应用模块中的init.pp文件是:

 class my_app{
   anchor { '::my_app::begin': } ->
   class { '::my_app::repo': } ->
   class { '::my_app::install': } ->
   class { '::my_app::config': } ->
   class { '::my_app::service': } ->
   anchor { '::my_app::end': }
}

repo.pp class 是:

class my_app::repo{
  if ! defined(Yumrepo[my_app]) {
    yumrepo {'my_app' :
      ensure   => 'present',
      descr    => 'my_app RPM repository',
      baseurl  => 'http://my_repo_server.com/repos/my_app',
      gpgcheck => 0
    }
  }
}

init.pp class安装在所有的服务器上,现在的问题是所有的客户端,也许还有一些服务器也需要有my_app_client.pp:

class my_app::my_app_client{
  include my_app::repo
  [...]
}

代码 returns 一个错误 已经声明 因为我声明了 class my_app::repo两次。

我不认为在这种情况下定义 2 个 repo 定义是正确的,并且将其声明为 Defined Resource Types 似乎也不起作用。

我该如何解决这个问题?在这种情况下,好的做法是什么?

提前致谢。

这里的问题是你不能使用

class { '::my_app::repo': }

include my_app::repo

在同一组清单中。

相关文档位于 https://puppet.com/docs/puppet/5.3/lang_classes.html#declaring-classes。结果是你只能为每个 class 使用一次类似资源的声明(所以,class)并且你不能将它与 include 混合使用,但你可以 include a class 次数不限。

对于您的情况,我建议您重构以在整个 my_app classes 中使用 include