Deployment Puppet:编写一个回购资源,但将其包含在多个位置而不重复

Deployment Puppet:编写一个回购资源,但将其包含在多个位置而不重复,deployment,puppet,Deployment,Puppet,我正在为我的应用程序编写一个puppet模块,从几天开始,我一直在研究如何管理回购协议 我有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::co

我正在为我的应用程序编写一个puppet模块,从几天开始,我一直在研究如何管理回购协议

我有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:

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

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

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


提前谢谢

这里的问题是你不能使用

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

在同一组清单中

这方面的文档位于。结果是,您只能对每个类使用一次类似于资源的声明(因此,
class
),并且不能将其与
include
混合使用,但您可以根据需要多次使用
include


在你的例子中,我建议你重构,在你的
my_app
类中使用
include

你在某种程度上歪曲了你的情况,因为傀儡类是幂等的。多次声明同一个类与仅声明一次没有任何额外的效果。解决这类问题的主要方法通常是做您已经在做的事情:将资源声明放入一个类中,并(仅)通过该类获得它。因此,我倾向于猜测,事实上,您确实在某个地方有一个重复的声明,大概在您的另一个类中。如果您有不同的想法,那么我们需要看到一个帮助您解决问题。是的,问题是我不能包含类
my_app::repo
,因为puppet会抱怨错误:
error:无法从远程服务器检索目录:服务器上的错误400:评估错误:评估资源语句时出错,重复声明:类[My_app::Repo]已声明;无法重新声明
根据您的建议,我更改了
类{'::my_app::repo':}
,将include放在类的顶部,并使用
类['my_app::repo']->将依赖项保留在锚中。非常好用,谢谢!这是一个很好的观察结果,但并不完全正确。可以在同一清单集中使用同一类的类资源声明和类包含声明。此外,如果同一类有多个声明,那么仅仅选择一种或另一种形式是不够的。实际的规则是,如果同一个类有多个声明,那么只有第一个要求值的声明才能具有类似资源的形式。不过,我同意您的建议。我经常建议强烈推荐include-like表单,这就是为什么。如果使用了类似资源的表单,则应将其限制为从自己的模块中声明私有类的类,前提是这些类可以确保公共模块类的受支持使用不会遇到此重复类声明问题。
class { '::my_app::repo': }
include my_app::repo