Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Puppet manifest has a file declaration that somehow duplicates itself

Tags:

puppet

Given the confusing error message:

err: Could not retrieve catalog from remote server: Error 400 on SERVER: Duplicate declaration: File[/etc/logstash/conf.d] is already declared in file /var/lib/puppet/envs/SYS_15378/modules/logstash/manifests/config.pp at line 54; cannot redeclare at /var/lib/puppet/envs/SYS_15378/modules/logstash/manifests/config.pp:54 on node foo.bar.com

Questions:

  • If this is really duplicating a file, how do I go about debugging it (finding the file)?
  • If not... what is this actually communicating?

Notice:

  • the duplicate declaration is on line 54
  • the file it is duplicating is defined on... line 54
  • line 54 is the same line as line 54

The line in question is the closing brace of:

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

where

class logstash::params {
 $config_dir = '/etc/logstash/conf.d'
  ...
}
like image 619
MonkeyWidget Avatar asked Oct 19 '25 10:10

MonkeyWidget


1 Answers

Defined types should not declare common resources, meaning such that are not derived from the define instances $name.

In your example, the directory is a resource that many instances of your define need. It should therefor move to a (perhaps dedicated) class.

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

In your define, you just

include logstash::config_dir

Including a class multiple times poses no problem and solves exactly that problem (among others).

like image 61
Felix Frank Avatar answered Oct 22 '25 04:10

Felix Frank



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!