首页 > 解决方案 > Puppet:编写一个 repo 资源,但在多个地方包含它而不重复

问题描述

我正在为我的应用程序编写一个 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 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安装在所有服务器上,现在的问题是所有客户端,也许还有一些服务器也需要my_app_client.pp

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

代码返回错误已声明,因为我两次声明了my_app::repo类。

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

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

提前致谢。

标签: deploymentpuppet

解决方案


这里的问题是你不能使用

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

include my_app::repo

在同一组清单中。

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

就您而言,我建议您重构以include在整个my_app课程中使用。


推荐阅读