14

I've been trying to figure out a way to test if a resource is already defined in another file, and if not create it? A quick example:

  if File[$local_container] {
    alert("Testing - It existed $local_container")
  } else {
    file{ "$local_container":
      ensure => directory,
    }
  }

However - File[$local_container] always seems to evaluate to true. Is there a way to do this?

gnarf
  • 713
  • 3
  • 8
  • 21

4 Answers4

15

Do you mean "test if a resource is already defined"? If you define a resource (ie, file {}, etc) Puppet will create what you're describing if doesn't already exist (assuming you pass ensure => present, of course).

To check if a resource is already defined in the catalog or not:

mark-draytons-macbook:~ mark$ cat test.pp 
file { "/tmp/foo": ensure => present }

if defined(File["/tmp/foo"]) {
  alert("/tmp/foo is defined")
} else {
  alert("/tmp/foo is not defined")
}

if defined(File["/tmp/bar"]) {
  alert("/tmp/bar is defined")
} else {
  alert("/tmp/bar is not defined")
}

mark-draytons-macbook:~ mark$ puppet test.pp 
alert: Scope(Class[main]): /tmp/foo is defined
alert: Scope(Class[main]): /tmp/bar is not defined
notice: //File[/tmp/foo]/ensure: created

Note: defined() is dependent on parse order.

user35042
  • 2,681
  • 12
  • 34
  • 60
markdrayton
  • 2,449
  • 1
  • 20
  • 24
10

The better way of doing this is by making use of ensure_resource function from puppetlabs stdlib

It takes a resource type, title, and a list of attributes that describe a resource as parameters.

say you have test case to only create the resource if it does not already exist-

ensure_resource('package', 'test-pkg', {'ensure' => 'present'})
Utkarsh
  • 216
  • 2
  • 5
2

Or....

unless File["${local_container}"] {
  file{ "${local_container}":
     ensure => directory,
  }
}

And do keep an eye on those quotes and curly braces....

nzidol
  • 21
  • 1
-3

simply,

file{ "$local_container":
  ensure => directory,
  replace => false,
}
Michael Hampton
  • 244,070
  • 43
  • 506
  • 972
  • Nope, if the `"$local_container"` file was already defined somewhere else (like say by something that wanted to control the permissions/owner) you can't define the same resource twice. – gnarf Jun 03 '14 at 18:37