2016-10-16 48 views
-1

我有两个傀儡模块m1m2。请参阅以下具有相同资源类型和名称的示例模块:包含/声明两个包含相同资源和名称的类

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

我是新来的傀儡。我试图设计出第三个模块与普通的资源类型,并继承该第三模块m3m1m2后,它给我的错误Parameter 'ensure' is already set on Service puppet

我如何设计我的模块来摆脱这些错误的? 我不想创建单个模块,因为对于某些节点,我只想应用m1m2而不是两者。

+1

一类被禁用和停止'firewalld'和其他是启用和启动'firewalld'。从完全Puppet不可知的角度来看这些,这些是单个系统的互不兼容的配置。木偶在这里做正确的事情,并阻止这种不可能的状态。 –

+0

@MattSchuchard - 即使我改变了像“确保”这些属性的值,我也得到了同样的错误。 – kd12

回答

1

每个资源只能存在于每个节点的一个地方。即使它们匹配也是如此。

我会建议将多个模块所需的资源移动到他们自己的模块,并将include从其他模块移走。在这种情况下,这意味着创建一个firewalld模块。

+0

...因为使用了类似于包含类的声明(这是关键),所以第三个模块的类的任何类参数自定义都是通过自动数据绑定完成的。 –

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 
相关问题