1
exec { "check_presence":
    command => "/bin/true",
    onlyif => '/usr/bin/test -e /path',
}

file {"/home/user/test.txt":
    ensure => file,
    require => Exec["check_presence"]
}

I can't figure out what's wrong with my script. I use puppet apply test.pp to run this script. But no matter /path exists or not, the file test.txt was created.

I was using puppet 3.4.3. Any help is appreciated.

Related answer: https://serverfault.com/a/516919/428218

Sraw
  • 57

2 Answers2

2

The only way to do this (i.e. manage the target file only if some other condition is true or false) is to create a custom fact for that condition/test and then use it to either wrap the resource in a conditional block, or use it to influence a property/parameter of the resource. For example:

if $::mycustomfact {
  file { '/home/user/test.txt':
    ensure => file,
    ...
  }
}

Or:

file { '/home/user/test.txt':
  ensure => $::mycustomfact ? {
    true    => file,
    default => absent,
  },
  ...
}
bodgit
  • 4,871
0

You don't need to check if a file already exists before managing it with Puppet, if it already exists, Puppet will impose the configured state. If it doesn't exist, Puppet will create it with your configured state.

If you don't specify content/owner/group/mode, Puppet will only ensure that the file exists, and will create an empty file if it does not.

Craig Watson
  • 9,790