deployment - 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 定义是不正确的,并且将其声明为已定义资源类型似乎也不起作用。
我应该如何解决这个问题?在这种情况下有什么好的做法?
提前致谢。
解决方案
这里的问题是你不能使用
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
课程中使用。
推荐阅读
- context-free-grammar - 用抽引引理证明一种语言是否是上下文无关的
- php - “InvalidArgumentException”请在 Laravel 8 中提供有效的缓存路径
- javascript - 仅展平嵌套的 JSON 二级
- vba - 解决对象类型评估的性能问题 (Scripting.Dictionary)
- javascript - momentjs 两次错误的差异计算
- xamarin - vs2019中的项目无法开始调试xamarin.android
- unity3d - 如何手动创建有效的蒙皮网格渲染器?
- r - 在公共服务器上的我的目录上安装 R 4.1.1,gcc 编译器
- javascript - curl文件上传和进度条
- c - 如何在c中将模式打印为函数