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
  • 37
  • 10

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,751
  • 16
  • 27
  • 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 01 '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 01 '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 01 '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.

Craig Watson
  • 9,575
  • 3
  • 32
  • 47
  • 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 01 '17 at 07:28