Puppet清单有一个文件声明,它以某种方式重复自身

时间:2014-09-15 23:24:02

标签: puppet

鉴于令人困惑的错误消息:

  

错误:无法从远程服务器检索目录:错误400开启   SERVER:重复声明:文件[/etc/logstash/conf.d]已经存在   在文件中声明   /var/lib/puppet/envs/SYS_15378/modules/logstash/manifests/config.pp at   第54行;无法重新声明   /var/lib/puppet/envs/SYS_15378/modules/logstash/manifests/config.pp:54   在节点foo.bar.com上

问题:

  • 如果这真的是重复文件,我该如何调试它(查找文件)?
  • 如果不是......这实际上是在沟通什么?

注意:

  • 重复声明在第54行
  • 它正在重复的文件在...第54行
  • 上定义
  • 第54行是与第54行相同的行

有问题的一行是关闭括号:

file { "${logstash::params::config_dir}":
   ensure  => directory,
   owner   => root,
   group   => root,
   mode    => '0755',
   purge   => true,
}

,其中

class logstash::params {
 $config_dir = '/etc/logstash/conf.d'
  ...
}

4 个答案:

答案 0 :(得分:4)

定义的类型不应声明公共资源,这意味着不是从define实例$name派生的。

在您的示例中,该目录是您define的许多实例所需的资源。因此应该转移到(也许是专门的)班级。

class logstash::config_dir {
    file { "${logstash::params::config_dir}":
        ensure  => directory,
        owner   => root,
        group   => root,
        mode    => '0755',
        purge   => true,
    }
}

define中,您只需

include logstash::config_dir

多次包括一个类没有问题,并且正好解决了这个问题(等等)。

答案 1 :(得分:1)

这可能意味着你要包含两次文件。您是否在任何地方都包含了两次logstash模块?你有意将它包含两次,但配置目的地不同。如果您不小心使用相同的配置目录将其包含两次,那么您将收到错误。

答案 2 :(得分:0)

如果您将清单目录中的现有文件复制到另一个名称(供参考),但保留" .pp"后缀,Puppet将尝试再次包含它,并会抱怨重复。尝试重命名为" .pp_OLD"

答案 3 :(得分:0)

使用create_resource()时,我也会遇到同样的问题。

当您想像循环一样多次运行“ file {}”块时,会发生此错误。

在创建“文件{}”块的多个副本时,我们必须确保文件块的名称是唯一的,即

文件{“文件名”:.....}

如果重复相同的名称,则会出现上述错误。

在您的情况下,某些值“ $ {logstash :: params :: config_dir}”必须重复两次。