【问题标题】:puppet concat Duplicate declarationpuppet concat 重复声明
【发布时间】:2015-06-02 14:07:19
【问题描述】:

我的一个 puppet 模块出现以下错误:

Error: Could not retrieve catalog from remote server: Error 400 on SERVER: Duplicate declaration: Concat[/etc/auto.master] is already declared in file /etc/puppetlabs/puppet/environments/development/modules/autofs/manifests/mount.pp:16; cannot redeclare at /etc/puppetlabs/puppet/environments/development/modules/autofs/manifests/mount.pp:16 on node nbsrvadm-02v.diasemi.com

我对 puppet 很陌生,不知道我做错了什么,下面是模块文件:

初始化.pp

class autofs ($master=$autofs::params::master) inherits autofs::params {
  concat { "$master":
    owner  => 'root',
    group  => 'root',
    mode   => '0644',
    notify => Service[$autofs::params::service],
  }
  anchor { 'autofs::begin': }
  class { 'autofs::install': } ->
  class { 'autofs::config': } ~>
  class { 'autofs::service': }
  anchor { 'autofs::end': }
}

mount.pp 类被 config 类调用:

 class autofs::config {
  $map_options = hiera('mapOptions')
  create_resources( 'autofs::mount', $map_options)
}

那么 mount.pp 如下所示:

define autofs::mount (
  $mount,
  $mapfile,
  $options,
  $order,
) {
  include autofs::params

  concat::fragment { 'autofs::fragment preamble $autofs::params::master':
    ensure  => present,
    target  => "$autofs::params::master",
    content => "${mount} ${mapfile}.$::site_shortname ${options} \n",
    order   => $order,
  }

  file { $mount:
    ensure => directory,
  }

  file { "${mapfile}.$::site_shortname":
    ensure  => link,
    target => "/usr/share/centrifydc/etc/adauto.pl",
    notify  => Service[$autofs::params::service],
  }

}

还有参数类:

==> params.pp <==

class autofs::params {

  case $::operatingsystem {
     RedHat: {
       case $::operatingsystemmajrelease {
         5: {
              $package_version="5.0.1-0.rc2.184.el5"
           }
         6: {
              $package_version="5.0.5-109.el6_6.1"
           }
         default: {
              fail("Module ${module_name} is not supported on ${::operatingsystem} version ${::operatingsystemmajrelease}")
           }
         }
           $master="/etc/auto.master"
           $service="autofs"
           $package="autofs"
           $hasrestart="true"
           $hasstatus="true"
      }
     default: {
       fail("Module ${module_name} is not supported on ${::operatingsystem}")
      }
   }
}

最后是hiera中的数据:

---
classes:
  - autofs
mapOptions:
  archived:
    mount: '/archived'
    mapfile: '/etc/auto.archived'
    options: 'ro,defaults,_netdev,tcp'
    order: 01
  cad:
    mount: '/cad'
    mapfile: '/etc/auto.cad'
    options: 'defaults,_netdev,tcp'
    order: 02

当 hiera 中只配置一个条目时,模块会按预期工作。任何帮助将非常感激。

【问题讨论】:

    标签: puppet


    【解决方案1】:

    我认为问题出在这一行:

    concat::fragment { 'autofs::fragment preamble $autofs::params::master':
    

    改成:

    concat::fragment { "autofs::fragment preamble ${autofs::params::master}":
    

    您使用了单引号,因此将评估变量。 更多关于在 puppet 中引用 here.

    更新:

    另一个问题 - 您从未更改过 $autofs::params::master 的值。 这就是为什么每次创建 autofs::mount 对象的实例时,它都会包含一个

    的实例
    Concat::Fragment ["autofs::fragment preamble /etc/auto.master"] 
    

    autofs::params::master 更改为每个autofs::mount 实际不同的变量,例如:

    concat::fragment { "autofs::fragment preamble ${mount}":
    

    【讨论】:

    • 嗨,我改变了这个,但仍然得到一个类似的错误:重复声明:Concat::Fragment[autofs::fragment preamble /etc/auto.master] 已经在文件 /etc/puppetlabs 中声明/puppet/environments/development/modules/autofs/manifests/mount.pp:16;无法在节点 nbsrvadm-02v.diasemi.com 上的 /etc/puppetlabs/puppet/environments/development/modules/autofs/manifests/mount.pp:16 重新声明警告:未在失败的目录上使用缓存错误:无法检索目录;跳过跑步
    • 是的。通常,您希望在定义的类型内的资源名称中使用$title(或$name)变量,以便保证每个声明的资源本身都有一个唯一的标题。
    【解决方案2】:

    如果你的模块还没有类autofs,它应该得到它。将concat 资源移到那里。

    class autofs($master=$autofs::params::master) inherits autofs::params {
      concat { "$master":
        owner  => 'root',
        group  => 'root',
        mode   => '0644',
        notify => Service[$autofs::params::service],
      }
    }
    

    你可以从你定义的类型中include这个类。

    始终将单例资源(每个节点不得多次声明的东西)放在类中。

    【讨论】:

    • 嗨,这没有帮助,我现在将我的 init.pp 添加到您的更改的原始帖子中。错误还是一样。
    • 嗯,它不可能字面上相同,因为文件位置会改变。您也可以重新粘贴错误吗?检查@kkamilpl 的答案现在是否适用。
    • 嗨,我检查了上面的帖子进行了更改并将错误添加为评论。
    猜你喜欢
    • 1970-01-01
    • 2016-04-10
    • 2016-03-09
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    • 2020-08-08
    • 2021-09-21
    • 1970-01-01
    相关资源
    最近更新 更多