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

  • exactly same issue, how did you solve it? – Dejan Jun 14 '19 at 19:00
  • @Dejan Hi, see the answer's comments. – Sraw Jun 15 '19 at 5:00
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,
  },
  ...
}
| improve this answer | |
  • I find a better way to achieve this. use generate function, e.g. $result = generate("bash", "-c", "'test -e /path && echo -n true'"). And then if ($result != "true") or something else. Still thank you. – Sraw Sep 1 '17 at 10:24
  • Unless you're always using puppet apply on the target host, generate() will otherwise run on your puppetmaster host so it won't be testing the target host. – bodgit Sep 1 '17 at 10:30
  • You are right, but as puppet always is compiled on master host. Did I need to add a equivalent script in extra files? – Sraw Sep 1 '17 at 14:07
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.

| improve this answer | |
  • Surely I know, but I want to check if another file/directory exists, not the target file. Further, I want to know how to use condition in this way. – Sraw Sep 1 '17 at 7:28

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.