Reputation: 630
What I want to do is quite simple :
1.
Copy /source/file
to /target/file
. I achieve this using the following:
file { 'my_file_copy':
ensure => file,
source => 'file:/source/file',
path => "/target/file",
}
2.
However, if file /source/file
does not exist, I do NOT want it to perform this task.
I am really struggling with this logic. I attempted the solution below but it throws exceptions during puppet run.
puppet: if one file exists then copy another file over
Is there a better way of achieving this task ? Ideally, I would like to only use "file" and avoid using "exec". But at this point I would settle for a solution !
Upvotes: 3
Views: 34098
Reputation: 31
In my case work only with if
if (find_file("/source/file")) {
file { "/source/file":
ensure => present,
mode => '0644',
owner => root,
group => root,
}
}
Upvotes: 1
Reputation: 4757
You could use this logic:
$file = "/source/file"
exec { "chk_${file}_exist":
command => "true",
path => ["/usr/bin","/usr/sbin", "/bin"],
onlyif => "test -f ${file}"
}
file {"/target/file":
ensure => file,
source => 'file:/source/file',
owner => 'root',
group => 'root',
mode => '0750',
require => Exec["chk_${file}_exist"],
}
Upvotes: 1
Reputation: 15472
Because Puppet is a declarative language where only the end-state is declared, imperative logic such as what you've described - if A, do X - is often hard to express.
Personally, I would try to simply avoid this requirement of having file B copied if and only if file A exists. Often there's a better way.
If the requirement needs to stay, however, then use of Exec here sounds like a pretty good option to me.
exec { 'my_file_copy':
command => 'cp /source/file /target/file',
onlyif => 'test -e /source/file',
creates => '/target/file',
path => '/bin',
}
Upvotes: 8