Dns Puppet在多个模块中调用相同的服务?

Dns Puppet在多个模块中调用相同的服务?,dns,puppet,puppet-enterprise,puppetlabs-aws,Dns,Puppet,Puppet Enterprise,Puppetlabs Aws,我有一个木偶模块a。 在该模块中,我为文件中的更改重新启动了服务 class A::test1{ include::corednsclient 服务{'sshd': 确保=>正在运行, enable=>true, } } 现在,我有一个不同的木偶模块B。 在该模块中,我还必须为另一个文件中的更改重新启动相同的服务 现在,问题是我得到了以下信息: 重复声明错误 当我执行/opt/puppetlabs/bin/puppet应用时--modulepath=/abc xyz/site.pp 如果我以

我有一个木偶模块a。 在该模块中,我为文件中的更改重新启动了服务

class A::test1{
include::corednsclient
服务{'sshd':
确保=>正在运行,
enable=>true,
}
}
现在,我有一个不同的木偶模块B。 在该模块中,我还必须为另一个文件中的更改重新启动相同的服务

现在,问题是我得到了以下信息:

重复声明错误
当我执行/opt/puppetlabs/bin/puppet应用时--modulepath=/abc xyz/site.pp

如果我以puppet-e“include moduleA”的形式独立运行每个模块木偶应用-e'include moduleB',两者都可以正常工作。 但木偶全球应用似乎正在失败

任何帮助都将不胜感激

Error:求值错误:求值资源语句时出错,
重复声明:文件中已声明服务[sshd]
/export/content/ucm/puppet/modules/coresshd/manifests/configure.pp:28;不能
重新申报
/export/content/ucm/puppet/modules/corednsclient/manifests/daemon_reload.pp:10 at
/export/content/ucm/puppet/modules/corednsclient/manifests/daemon_reload.pp:10:3 on
节点lor1-0002276.int.xxx.com。

是的,这是正常的。Puppet只允许声明一次资源。通常,如果您有如下代码:

aaa级{
通知{'xxx':消息=>'yyy'}
}
bbb级{
通知{'xxx':消息=>'yyy'}
}
包括aaa
包括bbb
如果应用该选项,您将看到如下错误:

Error:求值错误:求值资源语句时出错,
重复声明:通知[xxx]已在(文件:…test.pp)中声明,
第2行);无法重新声明(文件:…test.pp,第6行)(文件:…test.pp,第6行,
列:3)在节点上。。。
权变措施 解决方案1进行重构,使两个类都继承第三个类 通常,解决此问题的最佳方法是重构代码,以便有第三个类包含复制的资源,其他类包括使用此函数的类,如下所示:

ccc级{
通知{'xxx':消息=>'yyy'}
}
aaa级{
包括ccc
}
bbb级{
包括ccc
}
包括aaa
包括bbb
那很好

请注意,这只是因为可以调用
include
函数任意次数,这与资源声明不同,也与类似资源的类声明不同

您可以阅读更多关于“类include like v资源类声明”的内容

解决方案2使用虚拟资源 您也可以使用。像这样重构:

ccc级{
@通知{'xxx':消息=>'yyy'}
}
aaa级{
包括ccc
实现通知['xxx']
}
bbb级{
包括ccc
实现通知['xxx']
}
包括aaa
包括bbb
此方法的另一个优点是,您可以使用资源收集器,并仅从一组虚拟资源中选择特定资源,如下所示:

ccc级{
@通知{'ppp':消息=>'xxx'}
@通知{'qqq':消息=>'yyy'}
@通知{'rrr':消息=>'zzz'}
}
aaa级{
包括ccc
通知
}
bbb级{
包括ccc
通知
}
包括aaa
包括bbb
如果您在这里不需要此功能,那么您可能应该使用第一个方案

解决方案3确保资源的使用 另一个选项是stdlib中的
确保资源
功能:

aaa级{
确保_资源('notify',{'xxx'=>{'message'=>'yyy'}})
}
bbb级{
确保_资源('notify',{'xxx'=>{'message'=>'yyy'}})
}
包括aaa
包括bbb
解决方案4使用定义 从历史上看,这是强烈反对的,尽管文档没有提到任何不使用它的理由。可以像这样使用:

aaa级{
如果!已定义(通知['xxx']){
通知{'xxx':消息=>'yyy'}
}
}
bbb级{
如果!已定义(通知['xxx']){
通知{'xxx':消息=>'yyy'}
}
}
包括aaa
包括bbb

这样,仅当资源不在目录中时,才会将其添加到目录中。

是的,这是正常的。Puppet只允许声明一次资源。通常,如果您有如下代码:

aaa级{
通知{'xxx':消息=>'yyy'}
}
bbb级{
通知{'xxx':消息=>'yyy'}
}
包括aaa
包括bbb
如果应用该选项,您将看到如下错误:

Error:求值错误:求值资源语句时出错,
重复声明:通知[xxx]已在(文件:…test.pp)中声明,
第2行);无法重新声明(文件:…test.pp,第6行)(文件:…test.pp,第6行,
列:3)在节点上。。。
权变措施 解决方案1进行重构,使两个类都继承第三个类 通常,解决此问题的最佳方法是重构代码,以便有第三个类包含复制的资源,其他类包括使用此函数的类,如下所示:

ccc级{
通知{'xxx':消息=>'yyy'}
}
aaa级{
包括ccc
}
bbb级{
包括ccc
}
包括aaa
包括bbb
那很好

请注意,这只是因为可以调用
include
函数任意次数,这与资源声明不同,也与类似资源的类声明不同

您可以阅读更多关于“类include like v资源类声明”的内容

解决方案2使用虚拟资源 您也可以使用。像这样重构:

ccc级{
@通知{'xxx':消息=>'yyy'}
}
aaa级{
包括ccc
实现通知['xxx']
}
bbb级{
包括ccc
实现通知['xxx']
}
包括aaa
包括bbb
此方法的另一个优点是,您可以使用资源收集器,并仅从一组虚拟资源中选择特定资源,如下所示:

ccc级{
@通知{'ppp':消息=>'xxx'}
@通知{'qqq':