Puppet “require” ignore if “exec” succeed

puppet

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

Best Answer

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,
  },
  ...
}