包含/声明两个包含相同资源和名称的类

时间:2016-10-16 18:16:10

标签: puppet

我有两个木偶模块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

我是傀儡新手。我试图设计具有公共资源类型的第三个模块,并且在将第三个模块m3继承到m1m2之后,它给出了错误Parameter 'ensure' is already set on Service puppet

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

2 个答案:

答案 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