我有两个木偶模块m1
和m2
。请参阅下面的示例模块,其中包含相同的资源类型和名称:
class m1 {
service {'firewalld':
ensure => 'stopped',
enable => 'false',
}
... // more resource types
}
class m2 {
service {'firewalld':
ensure => 'running',
enable => 'true',
hasrestart => true,
subscribe => Exec['firewall-cmd'],
}
package {'httpd':
ensure => 'present',
}
exec { 'firewall-cmd':
command => "firewall-cmd --zone=public --add-port=80/tcp --add-port=443/tcp --permanent",
path => "/usr/bin/",
refreshonly => true,
subscribe => Package['httpd'],
}
... // more resource types
}
我想将这两个模块应用于多个节点。当我尝试应用这些模块时,它会给出错误Duplicate Declaration for resource type
我是傀儡新手。我试图设计具有公共资源类型的第三个模块,并且在将第三个模块m3
继承到m1
和m2
之后,它给出了错误Parameter 'ensure' is already set on Service puppet
如何设计我的模块以摆脱这些错误?
我不想创建单个模块,因为对于某些节点,我只想应用m1
或m2
,而不是两者都适用。
答案 0 :(得分:1)
每个资源只能存在于每个节点的一个位置。即使它们匹配也是如此。
我建议将多个模块所需的资源移动到他们自己的模块,并include
将其从其他模块中移除。在这种情况下,这意味着创建一个firewalld
模块。
答案 1 :(得分:0)
这种做法很丑但有效。无论如何,这可能是通过声明或hiera查找传递的类参数最有效地解决的。
class m(Boolean $firewall) {
if $firewall {
service {'firewalld':
ensure => 'running',
enable => 'true',
hasrestart => true,
subscribe => Exec['firewall-cmd'],
}
package {'httpd':
ensure => 'present',
}
exec { 'firewall-cmd':
command => "firewall-cmd --zone=public --add-port=80/tcp --add-port=443/tcp --permanent",
path => "/usr/bin/",
refreshonly => true,
subscribe => Package['httpd'],
}
}
else {
service {'firewalld':
ensure => 'stopped',
enable => 'false',
}
}
... // more resource types
}
然后将其声明为:
class { 'm': firewall => true }
或:
include m
与hiera:
m::firewall: true