Puppet清单有一个文件声明,它以某种方式复制了自己



给定令人困惑的错误消息:

错误:无法从远程服务器检索目录:上的错误400SERVER:重复声明:文件[/etc/logstash/conf.d]已存在在文件中声明/var/lib/puppet/envs/SYS_15378/modules/logstash/manifests/config.pp第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'
  ...
}

定义的类型不应声明公共资源,这意味着这些资源不是从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

多次包含一个类不会带来任何问题,并且完全解决了这个问题(以及其他问题)。

这可能意味着您要包含两次该文件。您在任何地方都包含两次logstash模块吗?您可能打算将其包含两次,但使用不同的配置目录。如果你不小心用同一个配置目录包含了它两次,那么你会得到错误。

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

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

当您想像循环一样多次运行"文件{}"块时,就会发生此错误。

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

文件{"文件块名称":…..}

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

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

最新更新