给定令人困惑的错误消息:
错误:无法从远程服务器检索目录:上的错误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}"的某些值必须重复两次。